Manim Video

FlowOps — Motor de Enrutamiento Inteligente

Storyboard + plan de escenas + script Manim listo para renderizar.
Explica en 40 s cómo un ticket llega, se clasifica y se asigna en menos de 2 segundos.

Cliente: FlowOps (SaaS B2B) Duración: ~40 s · 6 escenas Formato: 16:9 MP4 Estilo: Técnico-limpio Uso: Landing hero + LinkedIn
🎯
Tesis visual central
"FlowOps convierte caos en claridad: cada ticket encuentra al agente correcto en < 2 segundos, sin intervención humana."
Storyboard · 6 escenas
#1042 #1043 #1044 #1045 BANDEJA DE ENTRADA 4 tickets sin asignar Escena 1 — El problema
Escena 01 · 0:00 – 0:05
El caos sin sistema
Tickets cayendo en una bandeja desordenada. Números apilándose, sin dueño, sin prioridad.
Prueba: El equipo pierde tiempo asignando manualmente.
Ticket #1046 DETECTOR Tipo · Urgencia Canal · Cliente 🔴 Urgente Técnico Chat Escena 2 — Detección
Escena 02 · 0:06 – 0:12
Detección automática
El motor lee el ticket: extrae tipo, urgencia, canal y datos del cliente en milisegundos.
Prueba: FlowOps entiende el contexto sin configuración manual.
¿Tipo? urgente/std Urgente SLA <1h Normal SLA <8h Ana M. Luis P. Marta S. Carlos R. Escena 3 — Árbol de decisión
Escena 03 · 0:13 – 0:20
Árbol de decisión
El motor recorre reglas: urgencia → tipo → disponibilidad. Cada nodo revela la lógica paso a paso.
Prueba: El enrutamiento es transparente y auditable, no una caja negra.
Ana M. 3 tickets 44% carga Luis P. 7 tickets 84% carga Marta S. 2 tickets 28% carga SELECCIONADA Escena 4 — Disponibilidad
Escena 04 · 0:21 – 0:28
Check de disponibilidad
Los agentes aparecen con su carga actual. FlowOps selecciona al de menor ocupación que cumple el skill requerido.
Prueba: La asignación balancea carga real, no rotación ciega.
#1046 Urgente Ana M. ✓ Asignado ⚡ 1.4 segundos Escena 5 — Asignación
Escena 05 · 0:29 – 0:35
Asignación en 1.4 s
El ticket vuela hacia Ana. Un temporizador muestra el tiempo real de asignación. La pantalla celebra con el check verde.
Prueba: La velocidad es medible: < 2 segundos garantizados.
ANTES Asignación: ~12 min Errores asignación: 23% Satisfacción: 71% AHORA Asignación: 1.4 s Errores asignación: 0% Satisfacción: 94% Prueba FlowOps gratis → Escena 6 — Impacto
Escena 06 · 0:36 – 0:42
Antes vs. Ahora
Comparativa lado a lado: 12 min → 1.4 s, 23% errores → 0%, satisfacción 71% → 94%. CTA final.
Prueba: El cambio es medible y el ROI es inmediato.
Script Manim — flowops_routing.py
flowops_routing.py
# FlowOps — Motor de Enrutamiento Inteligente
# Manim CE | manim -qh flowops_routing.py FlowOpsRouting

from manim import *

class FlowOpsRouting(Scene):
    def construct(self):
        # ── Paleta ─────────────────────────────────────────
        BG     = "#0F172A"
        GREEN  = "#22C55E"
        AMBER  = "#F59E0B"
        BLUE   = "#3B82F6"
        MUTED  = "#64748B"
        self.camera.background_color = BG

        # ── ESCENA 1: El caos ───────────────────────────────
        tickets = VGroup(*[
            RoundedRectangle(width=1.6, height=0.7, corner_radius=0.08,
                color=BLUE, fill_color="#1E3A5F", fill_opacity=1)
            for _ in range(4)
        ]).arrange(RIGHT, buff=0.3).to_edge(UP, buff=1)
        labels = VGroup(*[
            Text(f"#104{i+2}", font_size=18, color=MUTED).move_to(t)
            for i, t in enumerate(tickets)
        ])
        inbox = RoundedRectangle(width=8, height=1.2, corner_radius=0.15,
            color=MUTED, fill_color="#1E293B", fill_opacity=1).to_edge(DOWN, buff=1.5)
        inbox_txt = Text("BANDEJA DE ENTRADA", font_size=24, color=MUTED).move_to(inbox)
        self.play(FadeIn(tickets, shift=DOWN*0.3), FadeIn(labels))
        self.play(Create(inbox), Write(inbox_txt))
        arrows_in = VGroup(*[Arrow(t.get_bottom(), inbox.get_top(), buff=0.1,
            color=BLUE, stroke_width=2) for t in tickets])
        self.play(Create(arrows_in))
        self.wait(1)
        self.play(*[FadeOut(m) for m in [tickets, labels, inbox, inbox_txt, arrows_in]])

        # ── ESCENA 2: Detección ─────────────────────────────
        ticket_in = RoundedRectangle(width=1.8, height=0.9, corner_radius=0.1,
            color=BLUE, fill_color="#1E3A5F", fill_opacity=1).to_edge(LEFT, buff=1.2)
        t_label = Text("#1046", font_size=22, color=BLUE).move_to(ticket_in)
        detector = RoundedRectangle(width=2.4, height=1.6, corner_radius=0.15,
            color=AMBER, fill_color="#1E293B", fill_opacity=1).move_to(ORIGIN)
        det_txt = Text("DETECTOR", font_size=22, color=AMBER).move_to(detector)
        tags = VGroup(
            Text("🔴 Urgente", font_size=18, color="#EF4444"),
            Text("🔧 Técnico", font_size=18, color=BLUE),
            Text("💬 Chat", font_size=18, color=GREEN),
            Text("⭐ Pro plan", font_size=18, color=AMBER),
        ).arrange(DOWN, buff=0.25).to_edge(RIGHT, buff=1.5)
        self.play(FadeIn(ticket_in), FadeIn(t_label))
        self.play(Create(detector), Write(det_txt))
        arrow1 = Arrow(ticket_in.get_right(), detector.get_left(), color=BLUE, buff=0.1)
        self.play(GrowArrow(arrow1))
        for tag in tags:
            self.play(FadeIn(tag, shift=RIGHT*0.2), run_time=0.4)
        self.wait(0.8)
        self.play(*[FadeOut(m) for m in [ticket_in, t_label, detector, det_txt, arrow1, tags]])

        # ── ESCENA 3: Árbol de decisión ─────────────────────
        # ... (ver repo completo) ...

        # ── ESCENA 5: Asignación ─────────────────────────────
        timer_val = ValueTracker(0)
        timer_disp = always_redraw(lambda: DecimalNumber(
            timer_val.get_value(), num_decimal_places=1,
            color=GREEN, font_size=60).move_to(DOWN*1.5))
        unit_txt = Text(" s", font_size=48, color=MUTED).next_to(timer_disp, RIGHT)
        self.add(timer_disp)
        self.play(FadeIn(unit_txt),
            timer_val.animate.set_value(1.4), run_time=1.4)
        flash_txt = Text("⚡ Asignado", font_size=40, color=GREEN).to_edge(UP)
        self.play(FadeIn(flash_txt, scale=1.3))
        self.wait(1)
Plan de renderizado
1

Smoke test — baja calidad

Verifica composición y timing antes de renderizar en alta. Rápido (< 30 s).

manim -ql flowops_routing.py FlowOpsRouting
2

Render final — 1080p

Producción. Genera el MP4 en media/videos/. Usar después de validar el smoke test.

manim -qh flowops_routing.py FlowOpsRouting
3

Thumbnail poster frame

Exporta el frame de la escena 5 (asignación) como imagen social 1280×720.

manim -s flowops_routing.py FlowOpsRouting
4

Post-process con ffmpeg

Añade fade in/out, normaliza audio si hay narración, recorta a 42 s exactos.

ffmpeg -i FlowOpsRouting.mp4 -vf "fade=in:0:15,fade=out:st=39:d=1" -t 42 flowops_final.mp4
Recomendaciones de polish
🎨

Tipografía

Usar Inter o Geist Mono para labels técnicos. Evitar la fuente predeterminada de Manim en pantalla final.

Ritmo

Las escenas 3 y 4 deben durar max 2 s cada una. Si el árbol de decisión se siente lento, reducir nodos a 3.

🎵

Audio

Añadir un track instrumental lo-fi o beep UI sutiles en los momentos clave (detección, asignación).

📐

Variante vertical

Para LinkedIn Reels/Shorts, adaptar a 9:16 colapsando el árbol de decisión en una lista vertical.