
Content Creation
- 2 installs
- 3 repo stars
- Updated August 5, 2026
- broomva/skills
content-creation is a Claude skill that runs an eight-phase pipeline turning an idea or reference into a published blog post with AI images, TTS audio, Remotion video, and social distribution copy.
About
content-creation is an eight-phase pipeline that turns a reference post or an idea into a published multimedia content package: reference, research, narrative, visual assets, audio, video, social, deploy. It orchestrates AI visual generation (Nano Banana, Veo 3.1), text-to-speech narration (Voicebox, kokoro-tts, Edge TTS), Remotion video composition, and social copy for X threads and Instagram carousels. A developer uses it to go from a writing idea to a blog post plus audio, video, and cross-platform social content. It matters because it packages long-form writing and its derivatives in one workflow.
- Eight-phase pipeline from a reference or idea to a published blog post with audio, video, and social copy
- Orchestrates AI images (Nano Banana, Veo 3.1), TTS (Voicebox, kokoro-tts, Edge TTS), and Remotion video
- Includes a prerequisite check and tiered setup for tools and API keys before running
Content Creation by the numbers
- 2 all-time installs (skills.sh)
- Ranked #1,166 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
content-creation capabilities & compatibility
Core tools are free; needs a free GEMINI_API_KEY, with FAL_KEY and ELEVENLABS_API_KEY optional
- Capabilities
- blog post generation · image generation · tts narration · video generation · social content
- Use cases
- copywriting · image generation · video generation · transcription · marketing
- Pricing
- Bring your own API key
What content-creation says it does
Eight-phase workflow: reference/idea → published multimedia content package with social distribution.
REFERENCE (optional) → RESEARCH → NARRATIVE → VISUAL ASSETS → AUDIO → VIDEO → SOCIAL → DEPLOY
Free tier: ~500 image gen/day, video gen included, no credit card needed
npx skills add https://github.com/broomva/skills --skill content-creationAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2 |
|---|---|
| repo stars | ★ 3 |
| Last updated | August 5, 2026 |
| Repository | broomva/skills ↗ |
What it does
Turn an idea or reference into a published blog post with AI images, audio narration, video, and social distribution copy.
Who is it for?
Solo creators and developers turning writing into a full multimedia + social content package
Skip if: Teams that only need plain text drafting without AI media, TTS, or video generation
When should I use this skill?
Creating a blog post or case study, turning an idea into narrative, generating AI visuals or audio narration, or making social content from long-form writing.
What you get
A single idea or reference becomes a published multimedia package with images, narration, video, and social copy.
- blog post
- audio narration
- video
By the numbers
- 8-phase content pipeline
- 3 TTS engines (Voicebox, kokoro-tts, Edge TTS)
Files
Content Creation Pipeline
Eight-phase workflow: reference/idea → published multimedia content package with social distribution.
REFERENCE (optional) → RESEARCH → NARRATIVE → VISUAL ASSETS → AUDIO → VIDEO → SOCIAL → DEPLOYSetup & Onboarding
Before using the pipeline, the agent MUST check which tools are available and guide the user through setup for any missing ones. Run the checklist below at the start of every content creation session.
Prerequisite Check (run this first)
# Check what's already available
echo "=== Required ==="
which yt-dlp && echo "✓ yt-dlp" || echo "✗ yt-dlp — needed for video download"
which ffmpeg && echo "✓ ffmpeg" || echo "✗ ffmpeg — needed for video processing"
echo ""
echo "=== API Keys ==="
[ -n "$GEMINI_API_KEY" ] && echo "✓ GEMINI_API_KEY set" || echo "✗ GEMINI_API_KEY — needed for Nano Banana, Veo 3.1, Gemini analysis"
[ -n "$FAL_KEY" ] && echo "✓ FAL_KEY set" || echo "✗ FAL_KEY — optional, for fal.ai multi-provider"
[ -n "$ELEVENLABS_API_KEY" ] && echo "✓ ELEVENLABS_API_KEY set" || echo "✗ ELEVENLABS_API_KEY — optional, for voiceover"
echo ""
echo "=== TTS (Audio Narration) ==="
which kokoro-tts && echo "✓ kokoro-tts" || echo "✗ kokoro-tts — pip install kokoro-tts"
curl -sf http://localhost:17493/health > /dev/null 2>&1 && echo "✓ Voicebox server running" || echo "✗ Voicebox — optional, for premium TTS (voicebox.sh)"
which edge-tts && echo "✓ edge-tts" || echo "✗ edge-tts — pip install edge-tts (fallback TTS)"
echo ""
echo "=== Optional ==="
which agent-browser && echo "✓ agent-browser" || echo "✗ agent-browser — optional, for screenshots"
which nano-banana && echo "✓ nano-banana CLI" || echo "✗ nano-banana CLI — optional, Gemini SDK works without it"
which xurl && echo "✓ xurl" || echo "✗ xurl — optional, for X posting"Tier 1: Core (required for any content creation)
| Tool | Install | Purpose |
|---|---|---|
| yt-dlp | brew install yt-dlp | Download video from X, YouTube, any platform |
| ffmpeg | brew install ffmpeg | Video processing, format conversion, GIF creation |
| Remotion | bun add remotion @remotion/cli (per project) | Programmatic video composition |
Tier 2: AI Generation (required for AI-powered assets)
| Tool | Setup | Purpose |
|---|---|---|
| GEMINI_API_KEY | Get free key at aistudio.google.com → API keys | Nano Banana images, Veo 3.1 video, Gemini analysis, embeddings |
| @google/genai | bun add @google/genai (per project) | SDK for all Gemini models |
How to get GEMINI_API_KEY: 1. Go to aistudio.google.com 2. Click "Get API key" → "Create API key" 3. Set it: export GEMINI_API_KEY="your-key" (add to .zshrc for persistence) 4. Free tier: ~500 image gen/day, video gen included, no credit card needed
Tier 3: Enhanced (optional, for specific features)
| Tool | Setup | Purpose | When needed |
|---|---|---|---|
| FAL_KEY | Sign up at fal.ai, get key from dashboard | Multi-provider: Veo, Sora, Kling via one API | When you want to swap between video models |
| ELEVENLABS_API_KEY | Sign up at elevenlabs.io | AI voiceover generation | When video needs narration |
| kokoro-tts | pip install kokoro-tts | CLI TTS generation (82M model) | Default audio narration for posts |
| Voicebox | voicebox.sh or docker compose up | Premium local TTS with voice cloning | When best quality audio needed |
| edge-tts | pip install edge-tts | Microsoft Neural voices (free, unofficial) | Fallback when no GPU available |
| agent-browser | npm install -g @anthropic-ai/agent-browser | Screenshots, web interaction | When capturing live app screenshots |
| nano-banana CLI | npm install -g @the-focus-ai/nano-banana | Quick CLI image generation | Convenience; SDK works without it |
| xurl | brew install --cask xdevplatform/tap/xurl | Post directly to X | When publishing X threads |
| TweetSave MCP | claude mcp add -s user tweetsave -- npx -y mcp-remote https://mcp.tweetsave.org/sse | Read X posts from Claude Code | For reference extraction without yt-dlp |
| mcp-veo3 | uvx mcp-veo3 --output-dir ~/Videos/Generated | Veo 3.1 via MCP | When generating video from Claude Code |
| @aeven/nanobanana-mcp | Add to Claude MCP config | Nano Banana via MCP | When generating images from Claude Code |
Agent Behavior
When the skill is triggered, the agent should:
1. Run the prerequisite check silently (don't dump output unless something is missing) 2. If critical tools are missing (yt-dlp, ffmpeg, GEMINI_API_KEY), tell the user what's needed and offer to install/configure:
- For CLI tools: offer the
brew installcommand - For API keys: explain where to get them and how to set them
- For npm packages: offer to install in the current project
3. If optional tools are missing, proceed without them and mention alternatives:
- No
agent-browser? Use FxTwitter API + yt-dlp for extraction - No
FAL_KEY? Use@google/genaidirectly - No
xurl? Generate the post copy for manual publishing
4. Never fail silently — if an API call fails due to missing key, explain which key is needed and how to get it 5. Adapt the pipeline to available tools — use the best available method, not the ideal one
Phase 0: Reference Extraction (when user provides a link)
When the user provides a URL to a post, video, or thread as creative reference, extract and analyze it before anything else. See references/x-content-extraction.md and references/reference-based-content-creation.md for full details.
Step 1: Extract content from the link
X/Twitter posts (fastest — no auth required):
# Extract tweet text, images, video URLs, engagement metrics
TWEET_ID="2034332847893574080" # from the URL path
curl -s "https://api.fxtwitter.com/status/$TWEET_ID" | jq .
# Download video directly
yt-dlp "https://x.com/user/status/$TWEET_ID" -o reference_video.mp4
# Or via FxTwitter direct download
curl -sL "https://d.fxtwitter.com/user/status/$TWEET_ID" -o reference_video.mp4YouTube / other platforms:
yt-dlp "URL" -o reference_video.mp4Any URL with agent-browser (screenshot + text extraction):
agent-browser open "URL" && agent-browser wait --load networkidle
agent-browser screenshot reference_screenshot.png --full
agent-browser get text body > reference_text.txtStep 2: Analyze with Gemini (video understanding + style extraction)
Upload the downloaded video to Gemini for deep analysis:
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const file = await ai.files.upload({ file: "reference_video.mp4", config: { mimeType: "video/mp4" } });
const analysis = await ai.models.generateContent({
model: "gemini-2.5-flash",
contents: [
{ fileData: { fileUri: file.uri, mimeType: file.mimeType } },
{ text: `Analyze this video as a content creation reference. Extract:
1. Visual Style: color palette (hex values), lighting, camera angles, framing
2. Pacing: shot durations, rhythm, fast/slow sections with timestamps
3. Transitions: types used (cuts, fades, zooms) and when
4. Text Overlays: fonts, positioning, animation, timing
5. Structure: hook (first 3s), body, CTA placement
6. Audio: music style, SFX, voiceover style
7. Engagement Hooks: techniques for retention
Return as structured JSON.` },
],
});For text/image posts, use Gemini or Claude directly on the extracted text + screenshot to analyze hook type, structure, messaging, and CTA pattern.
Step 3: Generate a style brief
The analysis produces a style brief that guides all downstream phases:
- Narrative phase: match hook type, structure, CTA pattern
- Visual phase: match color palette, typography, layout
- Video phase: match pacing, transitions, aspect ratio, duration
- Social phase: match platform conventions and engagement patterns
Multimodal Embedding (for similarity search)
Use Gemini Embedding 2 to find similar content in your library:
// Embed a reference video into the same space as your content
const embedding = await ai.models.embedContent({
model: "gemini-embedding-2-preview",
contents: [{ inlineData: { mimeType: "video/mp4", data: videoBase64 } }],
config: { outputDimensionality: 768 },
});
// Compare with cosine similarity against your content embeddingsSupports text, images, video (up to 120s), audio (up to 80s), and PDFs in a single vector space.
---
Phase 1: Research
Gather evidence, capture production state, pull metrics. Never write without data.
Compounding skills: /deep-research, /agent-browser, /competitor-intel, curl/API data pulls.
Checklist:
- [ ] Core claim identified (what are you proving?)
- [ ] 3-5 validating data points gathered
- [ ] Production screenshots captured (full-page + detail)
- [ ] Metrics pulled from APIs (never fabricate numbers)
- [ ] Target audience and their concerns identified
- [ ] Reference post analyzed (if provided) — style brief generated
Phase 2: Narrative
Structure using a proven framework. See references/storytelling.md for full guides.
| Content Type | Framework | Structure |
|---|---|---|
| Case study | PSI | Challenge → Solution → Quantified results |
| Industry highlight | ABT | Context AND, BUT challenge, THEREFORE outcome |
| Technical deep dive | 1-3-1 | One idea, three evidence points, one takeaway |
| Product launch | Pixar Spine | Once upon a time... Every day... Until one day... |
| Data story | Data Arc | Context → Tension → Resolution |
Blog Post Structure
frontmatter (title, summary, date, published, tags)
Hook (1-2 sentences — open loop or surprising claim)
Hero media (video or key image)
Numbers section (table with headline metrics)
Problem section + image
Solution section + image + progressive detail image
Evidence section + dashboard screenshots + data visualizations
Context section + variant screenshots
Practice section + animated GIF
Generalization section
Closing (memorable one-liner)Rules: Lead with numbers. One image per ~300 words. Bold key terms on first use. 3-4 sentence paragraphs max. Use <video> for MP4,  for images/GIFs.
Output: MDX file at apps/chat/content/writing/{slug}.mdx.
Phase 3: Visual Assets
Compounding skills:
/agent-browser— production screenshots, UI workflows/pencil(MCP) — design social cards, diagrams, slides in.penfilesget_guidelines(topic)for design-system/landing-page/slides guidanceget_style_guide(tags)for visual consistencybatch_designfor multi-element compositionsget_screenshotto export assets/before-and-after— visual diffs for transformation stories/frontend-design— custom visual components/arcan-glass— BroomVA brand styling
AI-Generated Assets
See references/ai-video-generation.md for full API details, code examples, and Remotion integration patterns.
Image generation (Nano Banana / Gemini):
# CLI: quick hero images, social cards, diagrams
nano-banana "A hero image for {topic}, dark theme, glass effects, 1080x1080"
# SDK: @google/genai with model "gemini-3.1-flash-image" (Nano Banana 2)
# MCP: @aeven/nanobanana-mcp for Claude Code integrationVideo generation (Veo 3.1):
# MCP server for Claude Code
uvx mcp-veo3 --output-dir assets/ai-clips/
# SDK: @google/genai with model "veo-3.1-generate-preview"
# Capabilities: 4K, native audio, image-to-video, frame interpolation
# Duration: 4-8s per clip, chain up to 20 extensions (~148s)Multi-provider (fal.ai):
# Single API for Veo 3.1, Sora 2 Pro, Kling 3 Pro, 600+ models
bun add @fal-ai/client
# Swap models by changing endpoint string, no code changesPreprocessing AI clips for Remotion (critical):
ffmpeg -i ai_clip.mp4 -c:v libx264 -crf 18 -movflags +faststart -r 30 processed.mp4Manual Asset Pipeline
Image pipeline:
magick input.png -resize 1200x -quality 85 output-opt.png
magick f1.png f2.png f3.png -resize 1200x675! -set delay 200 -loop 0 flow.gif
mkdir -p apps/chat/public/images/writing/{slug}/Naming: {subject}-{descriptor}-opt.png
Checklist: Hero image/video, 1 image per section (5-7 min), 1+ animated GIF, all < 500KB, descriptive alt text.
Phase 4: Audio Narration
Generate TTS audio for each post so readers can listen. Pre-generate at pipeline time, not on-demand. See references/tts-audio-generation.md for full engine comparison, API details, and batch scripts.
Compounding skills: /openrocket-sim (batch scripting patterns), /remotion-best-practices (media pipeline).
TTS Engine Selection
| Engine | When to use |
|---|---|
| Voicebox (localhost:17493) | Best quality. Voice cloning. GPU available. POST /generate → GET /audio/{id} |
| kokoro-tts | Fast batch default. CLI-first. kokoro-tts input.txt output.wav --voice af_sarah |
| Edge TTS | No local GPU. edge-tts --text "..." --voice en-US-AndrewNeural --write-media out.mp3 |
Quick Generation
# Strip frontmatter from MDX, generate audio
slug="my-post"
sed '1{/^---$/!q;};1,/^---$/d' apps/chat/content/writing/$slug.mdx \
| kokoro-tts - /tmp/$slug.wav --voice af_sarah
ffmpeg -i /tmp/$slug.wav -codec:a libmp3lame -b:a 128k apps/chat/public/audio/writing/$slug.mp3Integration
1. Place MP3 at public/audio/writing/{slug}.mp3 2. Add audio: /audio/writing/{slug}.mp3 to post frontmatter 3. ContentArticle component renders <audio> player with full controls (play/pause, seek, skip ±10s) 4. Falls back to Web Speech API if no audio file
Checklist:
- [ ] TTS engine running (Voicebox server or kokoro-tts installed)
- [ ] Audio generated and placed in
public/audio/writing/{slug}.mp3 - [ ]
audiofield added to post frontmatter - [ ] Audio plays correctly on the deployed page
Phase 5: Video
Compounding skills: /remotion-best-practices — read rules for animations, sequencing, transitions, images, text. Audio from Phase 4 can be used as voiceover track in Remotion compositions.
Video structure (15-30s):
Title (3-4s) → Stats (3s) → Screenshots (2-3s each) → Workflow (3-4s) → Closing (3-4s)Key Remotion rules: Use Img + staticFile() (never <img>). Use spring() for organic motion. Use Sequence with premountFor. No CSS transitions or Tailwind animation classes.
Hybrid AI + Remotion Pipeline
Combine AI-generated footage with Remotion motion graphics for production-quality output:
Nano Banana → hero images, backgrounds, social cards
Veo 3.1 → cinematic B-roll clips (8s each, 4K, with audio)
Remotion → motion graphics, titles, transitions, data viz
FFmpeg → preprocess AI clips, final GIF conversionIn Remotion compositions:
// AI-generated video as background layer
<OffthreadVideo src={staticFile("assets/veo-clip.mp4")} style={{ objectFit: "cover" }} />
// AI-generated image
<Img src={staticFile("assets/nano-banana-hero.png")} />
// Dynamic duration from AI clips
// Use @remotion/media-parser parseMedia() with calculateMetadataUse `<TransitionSeries>` from `@remotion/transitions` to blend AI clips with motion graphics scenes via fade/wipe/slide transitions.
Render Commands
cd /tmp/{project}-remotion && bun install
npx remotion render {Id} --output out/video.mp4
ffmpeg -y -i out/video.mp4 -vf "fps=12,scale=960:-1:flags=lanczos" -c:v gif out/video.gifPhase 6: Social Distribution
See references/social-distribution.md for copy patterns and references/social-publishing.md for CLI/MCP tool setup.
X Thread (5-8 tweets)
1. Hook — surprising stat, contrarian claim, or earned insight (50% of effort here) 2. Context — set the scene 3-6. Key insights — one per tweet, image every 2-3 tweets 7. Strongest evidence 8. CTA — link, follow, or question
Publishing: Use xurl CLI or Twitter MCP server to post directly.
xurl post "1/7 — [Hook tweet text]"
xurl media upload hero-image.png # returns MEDIA_ID
xurl post "2/7 — [Context]" --media-id MEDIA_IDInstagram Carousel (8-12 slides, 1080x1350px)
Use /pencil to design slides. Cover → Problem → Insights (1/slide) → Stat → Summary → CTA.
Publishing: Use Instagram MCP server (ig-mcp) or Meta Graph API.
LinkedIn Post
Hook in first 210 chars. 2-3 paragraphs + bullet list + CTA. 3-5 hashtags.
Publishing: Use LinkedIn MCP server (linkedin-mcp) or REST API with OAuth token.
Phase 7: Deploy
git checkout -b content/{slug}
git add apps/chat/content/writing/{slug}.mdx apps/chat/public/images/writing/{slug}/
git commit -m "content: add {title}"
git push -u origin content/{slug}
gh pr create --title "content: {short title}" --body "..."Dependency Map
┌─ REFERENCE EXTRACTION ──────────────────────────────────────────┐
│ FxTwitter API (no auth) yt-dlp /agent-browser │
│ TweetSave MCP Gemini 2.5 (video understanding) │
│ Gemini Embedding 2 (multimodal similarity) │
├─ RESEARCH ──────────────────────────────────────────────────────┤
│ /deep-research /agent-browser /competitor-intel curl │
├─ AI GENERATION ─────────────────────────────────────────────────┤
│ Nano Banana (@google/genai) Veo 3.1 (@google/genai) │
│ fal.ai (@fal-ai/client) ElevenLabs (voiceover) │
│ nano-banana CLI mcp-veo3 (MCP server) │
│ @aeven/nanobanana-mcp veo-mcp-server │
├─ AUDIO (TTS) ──────────────────────────────────────────────────┤
│ Voicebox (localhost:17493) kokoro-tts CLI edge-tts │
│ mlx-audio (Apple Silicon) ffmpeg (WAV→MP3) │
├─ DESIGN ────────────────────────────────────────────────────────┤
│ /pencil (MCP) /before-and-after /frontend-design │
│ /arcan-glass magick/ffmpeg │
├─ VIDEO ─────────────────────────────────────────────────────────┤
│ /remotion-best-practices /skills-showcase /json-render-remotion │
│ @remotion/media-parser @remotion/transitions │
├─ NARRATIVE ─────────────────────────────────────────────────────┤
│ references/storytelling.md references/social-distribution.md │
│ references/visual-content.md │
├─ PUBLISH ───────────────────────────────────────────────────────┤
│ xurl (X CLI) twitter-mcp-server linkedin-mcp │
│ ig-mcp Ayrshare MCP (multi-platform) │
├─ DEPLOY ────────────────────────────────────────────────────────┤
│ git + gh CLI /vercel-cli Vercel preview CI/CD │
└─────────────────────────────────────────────────────────────────┘Reference Files
- references/storytelling.md — narrative frameworks with examples
- references/visual-content.md — image placement, optimization, GIF vs video
- references/social-distribution.md — platform copy patterns, carousels, atomization
- references/social-publishing.md — CLI tools, MCP servers, OAuth setup for X, LinkedIn, Instagram
- references/ai-video-generation.md — Nano Banana, Veo 3.1, Remotion integration, fal.ai multi-provider
- references/x-content-extraction.md — extracting text, images, video from X/Twitter posts (FxTwitter API, yt-dlp, TweetSave MCP)
- references/reference-based-content-creation.md — style briefs, content templates, Gemini video analysis, multimodal embedding, end-to-end reference workflows
- references/tts-audio-generation.md — TTS engine comparison (Voicebox, kokoro-tts, Edge TTS, cloud APIs), batch generation scripts, storage options, site integration
<svg width="700" height="320" viewBox="0 0 700 320" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2862_30)">
<rect width="700" height="320" rx="16" fill="url(#paint0_linear_2862_30)"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="white"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="url(#paint1_radial_2862_30)"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="black" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M311.889 247.3C283.097 247.215 258.226 231.466 246.292 201.629C234.357 171.793 238.02 134.523 253.414 101.112C282.206 101.197 307.077 116.945 319.011 146.782C330.946 176.619 327.283 213.888 311.889 247.3Z" fill="url(#paint2_linear_2862_30)" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M311.72 247.034C283.108 246.887 258.409 231.208 246.538 201.531C234.656 171.825 238.271 134.702 253.583 101.377C282.195 101.524 306.894 117.203 318.765 146.88C330.647 176.586 327.031 213.709 311.72 247.034Z" stroke="url(#paint3_linear_2862_30)" stroke-opacity="0.05" stroke-width="0.530516"/>
<path d="M305.839 247.174C343.92 237.419 377.154 210.619 393.585 171.64C410.017 132.661 405.98 90.1988 386.347 56.1934C348.266 65.9477 315.032 92.7486 298.601 131.728C282.169 170.706 286.206 213.168 305.839 247.174Z" fill="white"/>
<path d="M305.839 247.174C343.92 237.419 377.154 210.619 393.585 171.64C410.017 132.661 405.98 90.1988 386.347 56.1934C348.266 65.9477 315.032 92.7486 298.601 131.728C282.169 170.706 286.206 213.168 305.839 247.174Z" fill="url(#paint4_radial_2862_30)"/>
<path d="M393.341 171.537C376.971 210.369 343.89 237.091 305.969 246.867C286.462 212.959 282.476 170.663 298.845 131.831C315.215 92.9978 348.295 66.2765 386.217 56.5004C405.724 90.4077 409.71 132.704 393.341 171.537Z" stroke="url(#paint5_linear_2862_30)" stroke-opacity="0.05" stroke-width="0.530516"/>
<path d="M305.686 246.995C329.749 266.114 361.965 272.832 393.67 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.045 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="white"/>
<path d="M305.686 246.995C329.749 266.114 361.965 272.832 393.67 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.045 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="url(#paint6_radial_2862_30)"/>
<path d="M305.686 246.995C329.749 266.114 361.965 272.832 393.67 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.045 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="black" fill-opacity="0.2" style="mix-blend-mode:hard-light"/>
<path d="M305.686 246.995C329.749 266.114 361.965 272.832 393.67 262.129C425.376 251.426 449.499 225.691 461.03 194.556C436.967 175.437 404.751 168.719 373.045 179.422C341.34 190.125 317.217 215.86 305.686 246.995Z" fill="url(#paint7_linear_2862_30)" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M393.586 261.878C362.034 272.529 329.98 265.88 306.002 246.907C317.534 215.919 341.57 190.327 373.13 179.673C404.681 169.023 436.735 175.671 460.714 194.644C449.181 225.632 425.145 251.224 393.586 261.878Z" stroke="url(#paint8_linear_2862_30)" stroke-opacity="0.05" stroke-width="0.530516"/>
<g opacity="0.8" filter="url(#filter0_f_2862_30)">
<circle cx="660" cy="-60" r="160" fill="#18E244" fill-opacity="0.4"/>
</g>
<g opacity="0.8" filter="url(#filter1_f_2862_30)">
<circle cx="20" cy="213" r="160" fill="#18CAE2" fill-opacity="0.33"/>
</g>
<g opacity="0.8" filter="url(#filter2_f_2862_30)">
<circle cx="660" cy="480" r="160" fill="#18E2B2" fill-opacity="0.52"/>
</g>
<g opacity="0.8" filter="url(#filter3_f_2862_30)">
<circle cx="20" cy="413" r="160" fill="#4018E2" fill-opacity="0.22"/>
</g>
<path opacity="0.2" d="M0 50H700" stroke="url(#paint9_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.1" d="M0 82H700" stroke="url(#paint10_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.2" d="M239 0L239 320" stroke="url(#paint11_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.1" d="M271 0L271 320" stroke="url(#paint12_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.2" d="M461 0L461 320" stroke="url(#paint13_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.1" d="M429 0L429 320" stroke="url(#paint14_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.2" d="M0 271H700" stroke="url(#paint15_radial_2862_30)" stroke-dasharray="4 4"/>
<path opacity="0.1" d="M0 239H700" stroke="url(#paint16_radial_2862_30)" stroke-dasharray="4 4"/>
<g style="mix-blend-mode:overlay" opacity="0.1">
<path d="M0 160H700" stroke="url(#paint17_linear_2862_30)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.2">
<path d="M511 -1L189 321" stroke="url(#paint18_linear_2862_30)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.2">
<path d="M511 321L189 -1" stroke="url(#paint19_linear_2862_30)"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<circle cx="350" cy="160" r="111" stroke="white"/>
</g>
<g style="mix-blend-mode:overlay" opacity="0.1">
<circle cx="350" cy="160" r="79" stroke="white"/>
</g>
</g>
<defs>
<filter id="filter0_f_2862_30" x="260" y="-460" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_30"/>
</filter>
<filter id="filter1_f_2862_30" x="-380" y="-187" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_30"/>
</filter>
<filter id="filter2_f_2862_30" x="260" y="80" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_30"/>
</filter>
<filter id="filter3_f_2862_30" x="-380" y="13" width="800" height="800" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="120" result="effect1_foregroundBlur_2862_30"/>
</filter>
<linearGradient id="paint0_linear_2862_30" x1="1.04308e-05" y1="320" x2="710.784" y2="26.0793" gradientUnits="userSpaceOnUse">
<stop stop-color="#18E299" stop-opacity="0.09"/>
<stop offset="0.729167" stop-color="#0D9373" stop-opacity="0.08"/>
</linearGradient>
<radialGradient id="paint1_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(208.697 189.703) rotate(-10.029) scale(169.097 167.466)">
<stop stop-color="#00B0BB"/>
<stop offset="1" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint2_linear_2862_30" x1="306.587" y1="93.5598" x2="252.341" y2="224.228" gradientUnits="userSpaceOnUse">
<stop stop-color="#18E299"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint3_linear_2862_30" x1="311.84" y1="123.717" x2="253.579" y2="224.761" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint4_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(313.407 243.64) rotate(-75.7542) scale(203.632 223.902)">
<stop stop-color="#00BBBB"/>
<stop offset="0.712616" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint5_linear_2862_30" x1="308.586" y1="102.284" x2="383.487" y2="201.169" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint6_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(311.446 249.925) rotate(-20.3524) scale(174.776 163.096)">
<stop stop-color="#00B0BB"/>
<stop offset="1" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint7_linear_2862_30" x1="395.842" y1="169.781" x2="332.121" y2="263.82" gradientUnits="userSpaceOnUse">
<stop stop-color="#00B1BC"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint8_linear_2862_30" x1="395.842" y1="169.781" x2="370.99" y2="271.799" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint9_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(350 50) scale(398.125 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint10_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(350 82) scale(398.125 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint11_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(239 160) rotate(90) scale(182 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint12_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(271 160) rotate(90) scale(182 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint13_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(461 160) rotate(90) scale(182 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint14_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(429 160) rotate(90) scale(182 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint15_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(350 271) scale(398.125 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<radialGradient id="paint16_radial_2862_30" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(350 239) scale(398.125 182)">
<stop offset="0.348958" stop-color="#84FFD3"/>
<stop offset="0.880208" stop-color="#18E299" stop-opacity="0"/>
</radialGradient>
<linearGradient id="paint17_linear_2862_30" x1="0" y1="160" x2="700" y2="160" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.1"/>
<stop offset="0.5" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="paint18_linear_2862_30" x1="511" y1="-1" x2="189" y2="321" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.1"/>
<stop offset="0.5" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="paint19_linear_2862_30" x1="511" y1="321" x2="189" y2="-0.999997" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.1"/>
<stop offset="0.5" stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0.1"/>
</linearGradient>
<clipPath id="clip0_2862_30">
<rect width="700" height="320" rx="16" fill="white"/>
</clipPath>
</defs>
</svg>
<svg width="160" height="24" viewBox="0 0 160 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.95343 21.1394C4.89586 21.1304 2.25471 19.458 0.987296 16.2895C-0.280118 13.121 0.108924 9.16314 1.74363 5.61504C4.8012 5.62409 7.44235 7.29648 8.70976 10.465C9.97718 13.6335 9.58814 17.5913 7.95343 21.1394Z" fill="white"/>
<path d="M7.95343 21.1394C4.89586 21.1304 2.25471 19.458 0.987296 16.2895C-0.280118 13.121 0.108924 9.16314 1.74363 5.61504C4.8012 5.62409 7.44235 7.29648 8.70976 10.465C9.97718 13.6335 9.58814 17.5913 7.95343 21.1394Z" fill="url(#paint0_radial_115_109)"/>
<path d="M7.95343 21.1394C4.89586 21.1304 2.25471 19.458 0.987296 16.2895C-0.280118 13.121 0.108924 9.16314 1.74363 5.61504C4.8012 5.62409 7.44235 7.29648 8.70976 10.465C9.97718 13.6335 9.58814 17.5913 7.95343 21.1394Z" fill="black" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M7.95343 21.1394C4.89586 21.1304 2.25471 19.458 0.987296 16.2895C-0.280118 13.121 0.108924 9.16314 1.74363 5.61504C4.8012 5.62409 7.44235 7.29648 8.70976 10.465C9.97718 13.6335 9.58814 17.5913 7.95343 21.1394Z" fill="url(#paint1_linear_115_109)" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M7.9354 21.1112C4.89702 21.0957 2.27411 19.4306 1.01347 16.279C-0.248375 13.1244 0.135612 9.18218 1.76165 5.64327C4.80004 5.65882 7.42295 7.32385 8.68359 10.4755C9.94543 13.63 9.56144 17.5723 7.9354 21.1112Z" stroke="url(#paint2_linear_115_109)" stroke-opacity="0.05" stroke-width="0.056338"/>
<path d="M7.31038 21.2574C11.3543 20.2215 14.8836 17.3754 16.6285 13.2361C18.3735 9.09671 17.9448 4.58749 15.8598 0.976291C11.8159 2.01214 8.2866 4.85826 6.54167 8.99762C4.79674 13.137 5.2254 17.6462 7.31038 21.2574Z" fill="white"/>
<path d="M7.31038 21.2574C11.3543 20.2215 14.8836 17.3754 16.6285 13.2361C18.3735 9.09671 17.9448 4.58749 15.8598 0.976291C11.8159 2.01214 8.2866 4.85826 6.54167 8.99762C4.79674 13.137 5.2254 17.6462 7.31038 21.2574Z" fill="url(#paint3_radial_115_109)"/>
<path d="M16.6025 13.2251C14.8642 17.349 11.3512 20.1866 7.32411 21.2248C5.25257 17.624 4.82926 13.1324 6.56764 9.00855C8.30603 4.88472 11.819 2.04706 15.8461 1.00889C17.9176 4.60967 18.3409 9.10131 16.6025 13.2251Z" stroke="url(#paint4_linear_115_109)" stroke-opacity="0.05" stroke-width="0.056338"/>
<path d="M7.23368 21.2069C9.78906 23.2373 13.2102 23.9506 16.5772 22.8141C19.9441 21.6775 22.5058 18.9445 23.7304 15.6382C21.175 13.6078 17.7538 12.8944 14.3869 14.031C11.0199 15.1676 8.45822 17.9006 7.23368 21.2069Z" fill="white"/>
<path d="M7.23368 21.2069C9.78906 23.2373 13.2102 23.9506 16.5772 22.8141C19.9441 21.6775 22.5058 18.9445 23.7304 15.6382C21.175 13.6078 17.7538 12.8944 14.3869 14.031C11.0199 15.1676 8.45822 17.9006 7.23368 21.2069Z" fill="url(#paint5_radial_115_109)"/>
<path d="M7.23368 21.2069C9.78906 23.2373 13.2102 23.9506 16.5772 22.8141C19.9441 21.6775 22.5058 18.9445 23.7304 15.6382C21.175 13.6078 17.7538 12.8944 14.3869 14.031C11.0199 15.1676 8.45822 17.9006 7.23368 21.2069Z" fill="black" fill-opacity="0.2" style="mix-blend-mode:hard-light"/>
<path d="M7.23368 21.2069C9.78906 23.2373 13.2102 23.9506 16.5772 22.8141C19.9441 21.6775 22.5058 18.9445 23.7304 15.6382C21.175 13.6078 17.7538 12.8944 14.3869 14.031C11.0199 15.1676 8.45822 17.9006 7.23368 21.2069Z" fill="url(#paint6_linear_115_109)" fill-opacity="0.5" style="mix-blend-mode:hard-light"/>
<path d="M16.5682 22.7874C13.2176 23.9184 9.81361 23.2124 7.2672 21.1975C8.49194 17.9068 11.0444 15.189 14.3959 14.0577C17.7465 12.9266 21.1504 13.6326 23.6968 15.6476C22.4721 18.9383 19.9196 21.656 16.5682 22.7874Z" stroke="url(#paint7_linear_115_109)" stroke-opacity="0.05" stroke-width="0.056338"/>
<path d="M34.2124 19V5.4H39.4924L41.6924 12.2L42.3724 14.74L43.0524 12.2L45.2524 5.4H50.4124V19H46.3324L46.5924 9.98L45.5324 13.68L43.7924 19H40.8324L39.0524 13.6L38.0324 10.02L38.2924 19H34.2124ZM52.4155 7.3V4.6H56.2955V7.3H52.4155ZM52.4155 19V8.14H56.2955V19H52.4155ZM58.1038 19V8.14H61.9838V9.58C62.6638 8.34 63.7438 7.76 65.0038 7.76C66.9638 7.76 68.6238 8.98 68.6238 11.78V19H64.7438V12.56C64.7438 11.34 64.3038 10.86 63.4838 10.86C62.6038 10.86 61.9838 11.58 61.9838 12.88V19H58.1038ZM70.9327 15.22V11.06H69.7327V8.14H70.9327V5.62H74.8127V8.14H76.9327V11.06H74.8127V14.6C74.8127 15.5 75.0327 16.06 76.2127 16.06H76.9327V19C76.4927 19.2 75.6727 19.38 74.6527 19.38C72.1527 19.38 70.9327 17.88 70.9327 15.22Z" fill="url(#paint8_radial_115_109)"/>
<path d="M87.232 10.519C87.232 13.687 94.1125 11.2285 94.1125 15.832C94.1125 17.9935 92.3635 19.198 89.971 19.198C87.562 19.198 85.912 18.0925 85.417 15.832H87.001C87.364 17.1685 88.3705 17.8945 89.9875 17.8945C91.6705 17.8945 92.5615 17.152 92.5615 16.03C92.5615 12.598 85.681 15.1555 85.681 10.618C85.681 9.001 87.034 7.582 89.509 7.582C91.6705 7.582 93.403 8.6215 93.8155 11.014H92.215C91.8685 9.529 90.9115 8.8855 89.476 8.8855C88.057 8.8855 87.232 9.529 87.232 10.519ZM96.2499 16.4755V11.3935H95.0289V10.2385H96.2499V8.2255H97.7019V10.2385H99.6324V11.3935H97.7019V16.4755C97.7019 17.5315 98.0154 18.0265 99.3024 18.0265H99.5994V19.066C99.4344 19.1485 99.0714 19.198 98.6589 19.198C97.0254 19.198 96.2499 18.3235 96.2499 16.4755ZM102.516 13.093H101.064C101.345 11.1625 102.615 10.024 104.76 10.024C107.103 10.024 108.242 11.3935 108.242 13.4395V16.888C108.242 17.8945 108.324 18.5215 108.555 19H107.021C106.856 18.6535 106.806 18.142 106.79 17.614C106.047 18.7195 104.859 19.198 103.803 19.198C101.988 19.198 100.767 18.3565 100.767 16.69C100.767 15.4855 101.427 14.611 102.714 14.182C103.902 13.786 105.107 13.687 106.79 13.6705V13.4725C106.79 12.0535 106.13 11.278 104.628 11.278C103.374 11.278 102.698 11.971 102.516 13.093ZM102.252 16.657C102.252 17.4655 102.929 17.944 103.952 17.944C105.569 17.944 106.79 16.6735 106.79 15.172V14.7595C103.061 14.7925 102.252 15.5845 102.252 16.657ZM110.787 19V10.2385H112.239V11.5915C112.833 10.519 113.774 10.024 114.83 10.024C115.176 10.024 115.49 10.1065 115.655 10.2385V11.542C115.407 11.4595 115.094 11.4265 114.747 11.4265C112.998 11.4265 112.239 12.5155 112.239 14.0995V19H110.787ZM117.305 16.4755V11.3935H116.084V10.2385H117.305V8.2255H118.757V10.2385H120.688V11.3935H118.757V16.4755C118.757 17.5315 119.071 18.0265 120.358 18.0265H120.655V19.066C120.49 19.1485 120.127 19.198 119.714 19.198C118.081 19.198 117.305 18.3235 117.305 16.4755ZM129.809 16.1455C129.33 18.1915 127.862 19.198 125.865 19.198C123.324 19.198 121.79 17.482 121.79 14.6275C121.79 11.6575 123.324 10.024 125.783 10.024C128.258 10.024 129.743 11.7235 129.743 14.512V14.875H123.275C123.357 16.8385 124.281 17.944 125.865 17.944C127.103 17.944 127.977 17.35 128.291 16.1455H129.809ZM125.783 11.278C124.38 11.278 123.539 12.1525 123.324 13.786H128.225C128.027 12.169 127.152 11.278 125.783 11.278ZM131.843 19V10.2385H133.295V11.5915C133.889 10.519 134.829 10.024 135.885 10.024C136.232 10.024 136.545 10.1065 136.71 10.2385V11.542C136.463 11.4595 136.149 11.4265 135.803 11.4265C134.054 11.4265 133.295 12.5155 133.295 14.0995V19H131.843ZM141.763 19V7.78H143.281V13.192L148.413 7.78H150.327L145.047 13.291L150.459 19H148.413L143.281 13.621V19H141.763ZM152.06 9.067V7.12H153.512V9.067H152.06ZM152.06 19V10.2385H153.512V19H152.06ZM156.178 16.4755V11.3935H154.957V10.2385H156.178V8.2255H157.63V10.2385H159.56V11.3935H157.63V16.4755C157.63 17.5315 157.943 18.0265 159.23 18.0265H159.527V19.066C159.362 19.1485 158.999 19.198 158.587 19.198C156.953 19.198 156.178 18.3235 156.178 16.4755Z" fill="white" fill-opacity="0.55"/>
<defs>
<radialGradient id="paint0_radial_115_109" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(-3.00503 15.023) rotate(-10.029) scale(17.9572 17.784)">
<stop stop-color="#00B0BB"/>
<stop offset="1" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint1_linear_115_109" x1="7.39036" y1="4.81308" x2="1.62975" y2="18.6894" gradientUnits="userSpaceOnUse">
<stop stop-color="#18E299"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint2_linear_115_109" x1="7.94816" y1="8.01562" x2="1.7612" y2="18.746" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint3_radial_115_109" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(8.11404 20.8822) rotate(-75.7542) scale(21.6246 23.7772)">
<stop stop-color="#00BBBB"/>
<stop offset="0.712616" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint4_linear_115_109" x1="7.60205" y1="5.8709" x2="15.5561" y2="16.3719" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint5_radial_115_109" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(7.84537 21.5181) rotate(-20.3525) scale(18.5603 17.32)">
<stop stop-color="#00B0BB"/>
<stop offset="1" stop-color="#00DB65"/>
</radialGradient>
<linearGradient id="paint6_linear_115_109" x1="16.8078" y1="13.0071" x2="10.0409" y2="22.9937" gradientUnits="userSpaceOnUse">
<stop stop-color="#00B1BC"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint7_linear_115_109" x1="16.8078" y1="13.0071" x2="14.1687" y2="23.841" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-opacity="0"/>
</linearGradient>
<radialGradient id="paint8_radial_115_109" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(47.2781 7) rotate(19.0047) scale(67.5582 85.7506)">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0.5"/>
</radialGradient>
</defs>
</svg>
BroomVA Agent OS Stack — Product Launch Content Package
Content Inventory
LinkedIn Posts (5 posts)
| # | File | Topic | Angle |
|---|---|---|---|
| 1 | posts/linkedin-launch-post.md — Post 1 | Main launch announcement | Full stack overview with numbers |
| 2 | posts/linkedin-launch-post.md — Post 2 | Architecture deep dive | 6-layer technical walkthrough |
| 3 | posts/linkedin-launch-post.md — Post 3 | Skills layer | 16 skills across 6 layers |
| 4 | posts/linkedin-launch-post.md — Post 4 | Why Rust | Systems programming for agents |
| 5 | posts/linkedin-launch-post.md — Post 5 | Product showcase | 5 products built on the stack |
| 6 | posts/linkedin-consciousness-post.md | Agent consciousness | Three-substrate memory architecture |
| 7 | posts/linkedin-skills-post.md — Post 1 | Skills composability | Why skills beat prompts |
| 8 | posts/linkedin-skills-post.md — Post 2 | Arcan Glass design system | AI-native visual identity |
| 9 | posts/linkedin-rust-post.md | Why Rust for agents | Systems programming argument |
X Threads (3 threads)
| # | File | Posts | Topic |
|---|---|---|---|
| 1 | posts/x-thread-launch.md | 12 + 6 reply templates | Main launch thread |
| 2 | posts/x-thread-technical.md | 8 | Control theory for AI agents |
| 3 | posts/x-thread-products.md | 7 | Products built on Agent OS |
Video (Remotion)
| File | Duration | Resolution | Content |
|---|---|---|---|
video/ | 30s | 1080×1080 | Animated stack walkthrough |
Scenes: 1. Intro (4s) — Brand + title + metrics pills 2. 7× Layer scenes (2.5s each, 17.5s) — Kernel → Runtime → Persistence → Regulation → Tools → Orchestration → Consciousness 3. Products (5s) — 5 product cards with slide-in animation 4. Outro (4s) — Tagline + CTA + brand
Render commands:
cd video && bun install
npx remotion studio # Preview
npx remotion render BstackLaunch out/bstack-launch.mp4 # H.264
npx remotion render BstackLaunch out/bstack-launch.gif --every-nth-frame=3 # GIF fallbackReply Templates (in x-thread-launch.md)
| Reply to | Key message |
|---|---|
| "Why not LangChain/CrewAI?" | Framework vs OS — we own persistence, regulation, sandbox, governance |
| "37K LOC is a lot" | Infrastructure should be substantial — apps are tiny because OS handles hard parts |
| "Is this production-ready?" | Phase 0, honest about gaps, 1000 tests, security 4/10 |
| "How does this compare to Cursor/Devin?" | Different layer — product vs infrastructure, complementary |
| "Business model?" | Open core + managed SaaS (Symphony Cloud) |
| "How to contribute?" | DMs open, CLAUDE.md per project, make smoke to start |
| "Python interop?" | EGRI skill has Python layer, Praxis executes subprocesses, core stays Rust |
---
Publishing Schedule (Suggested)
Day 1: Launch
- LinkedIn: Main launch announcement (Post 1)
- X: Main launch thread (12 posts) + video attachment on post 1
Day 2: Architecture
- LinkedIn: Architecture deep dive (Post 2)
- X: Control theory thread (8 posts)
Day 3: Products
- LinkedIn: Product showcase (Post 5)
- X: Products thread (7 posts)
Day 4: Why Rust
- LinkedIn: Why Rust post
Day 5: Skills
- LinkedIn: Skills layer post
Day 6: Consciousness
- LinkedIn: Agent consciousness post
Day 7: Design
- LinkedIn: Arcan Glass design system post
---
Key Metrics to Reference
| Metric | Value |
|---|---|
| Lines of Rust | 37,000 |
| Rust crates | 31 |
| Tests passing | 1,000/1,000 |
| Agent skills | 16 |
| Skill layers | 6 |
| Products shipped | 5 |
| Architecture scorecard — Agent Loop | 9/10 |
| Architecture scorecard — Persistence | 10/10 |
| Architecture scorecard — Tool Harness | 9/10 |
| Architecture scorecard — Memory | 8/10 |
| Architecture scorecard — Observability | 8/10 |
| Architecture scorecard — Security | 4/10 |
| Operating modes | 6 |
| Tick lifecycle phases | 8 |
| Autonomic pillars | 3 |
| Consciousness substrates | 3 |
Hashtags
Primary: #AgentOS #Rust #AI #OpenSource Secondary: #AutonomousAgents #LLM #DeveloperTools #SystemsProgramming Topical: #ControlSystems #AgentArchitecture #DesignSystems #Composability
Core Messaging
Tagline: "LLMs are controllers, not chatbots."
One-liner: "37K lines of Rust infrastructure for building autonomous AI agents that actually work in production."
Elevator pitch: "BroomVA's Agent OS stack treats LLMs as controllers in feedback loops — with typed state vectors, event-sourced persistence, homeostatic regulation, and a three-substrate consciousness architecture. 31 Rust crates, 16 composable skills, 5 production applications. Open source."
Contrarian hook: "Most agent frameworks treat the LLM like a chatbot with tools. We treat it like a controller in a feedback loop. The difference matters."
---
Asset Inventory (Final)
Video (Rendered)
| File | Size | Format | Use |
|---|---|---|---|
video/out/bstack-launch.mp4 | 2.7 MB | H.264 1080x1080 30fps 30s | Primary X/LinkedIn video attachment |
video/out/bstack-launch.gif | 4.1 MB | GIF 1080x1080 | Fallback/preview |
assets/skills-showcase.mp4 | 4.5 MB | MP4 | Skills-focused video (X thread 1/12) |
assets/skills-showcase.gif | 6.8 MB | GIF | Skills showcase fallback |
assets/symphony-forge-showcase.mp4 | 5.0 MB | MP4 | Symphony Forge demo video |
assets/symphony-forge-showcase.gif | 1.3 MB | GIF | Symphony Forge quick preview |
Video Frame Stills (1080x1080 PNG)
| File | Scene | Attach to |
|---|---|---|
assets/frame-intro.png | Agent OS title + 5 metrics pills | LinkedIn Post 1, X 1/12 |
assets/frame-kernel-fix.png | KERNEL: aiOS, AgentStateVector, 8-Phase Tick | LinkedIn Post 2, X 3/12 |
assets/frame-runtime-fix.png | RUNTIME: Arcan, Hashline, Multi-Provider | X 3/12 |
assets/frame-persistence-fix.png | PERSISTENCE: Lago, Event Journal, Blob Store | X 4/12 |
assets/frame-regulation-fix.png | REGULATION: Autonomic, Operational/Cognitive/Economic | X 5/12 |
assets/frame-tools-fix.png | TOOLS: Praxis, Blake3, FsPolicy, MCP Bridge | LinkedIn Post 2 |
assets/frame-orchestration-fix.png | ORCHESTRATION: Symphony, Dispatch, Control Gates | X 6/12 |
assets/frame-consciousness-fix.png | CONSCIOUSNESS: Control Metalayer, Knowledge Graph, Episodic Memory | LinkedIn Consciousness post, X 7/12 |
assets/frame-products.png | BUILT ON THE STACK: 5 product cards | LinkedIn Post 5, X 10/12 |
assets/frame-outro.png | "LLMs are controllers. Not chatbots." + CTA | All closing posts |
Symphony Cloud Assets (from existing project)
| File | Content | Use |
|---|---|---|
assets/frame-intro-fix.png | Symphony Forge intro frame | Symphony Cloud posts |
assets/frame-install-fix.png | Installation guide | Technical posts |
assets/frame-commands-fix.png | Command reference | Technical posts |
assets/frame-filetree.png | File tree navigation | Architecture posts |
assets/frame-layers.png | Layer visualization | Architecture diagram |
assets/frame-metalayer.png | Metalayer architecture | Consciousness post |
assets/checks-passed.png | Green checks status | Quality/testing posts |
assets/hero-dark.svg | Dark hero image | Header/banner |
assets/symphony-logo-dark.svg | Symphony logo | Branding |
---
Post → Asset Mapping
Day 1: Launch
LinkedIn Post 1 (Main announcement):
- Attach:
video/out/bstack-launch.mp4(primary) orassets/frame-intro.png(static fallback) - Carousel option:
frame-intro.png→frame-kernel-fix.png→frame-products.png→frame-outro.png
X Thread (12 posts):
- 1/12: Attach
video/out/bstack-launch.mp4 - 3/12 (Arcan): Attach
assets/frame-runtime-fix.png - 7/12 (Consciousness): Attach
assets/frame-consciousness-fix.png - 10/12 (Products): Attach
assets/frame-products.png
Day 2: Architecture
LinkedIn Post 2 (Architecture):
- Carousel:
frame-kernel-fix.png→frame-persistence-fix.png→frame-regulation-fix.png→frame-tools-fix.png→frame-orchestration-fix.png
X Control Theory Thread:
- 1/8: Attach
assets/frame-intro.png - 4/8 (State Vector): Attach
assets/frame-kernel-fix.png - 6/8 (Event Sourcing): Attach
assets/frame-persistence-fix.png
Day 3: Products
LinkedIn Post 5 (Products):
- Attach:
assets/frame-products.png - Alt:
assets/symphony-forge-showcase.gif
X Products Thread:
- 1/7: Attach
assets/frame-products.png - 4/7 (Mission Control): Attach
assets/frame-metalayer.png
Day 4: Why Rust
LinkedIn Rust Post:
- Attach:
assets/frame-outro.png(tagline image)
Day 5: Skills
LinkedIn Skills Post:
- Attach:
assets/skills-showcase.giforassets/skills-showcase.mp4
Day 6: Consciousness
LinkedIn Consciousness Post:
- Attach:
assets/frame-consciousness-fix.png - Alt carousel:
frame-metalayer.png→frame-consciousness-fix.png
Day 7: Design
LinkedIn Arcan Glass Post:
- Attach:
assets/hero-dark.svgorassets/frame-intro.png(brand showcase)
LinkedIn Post — Agent Consciousness: Beyond Stateless Chat
---
Your AI agent forgets everything the moment the session ends.
Ours doesn't.
We built a three-substrate consciousness architecture for persistent AI agents. Here's how it works:
Substrate 1: Control Metalayer (Behavioral Governance) Setpoints define what "good" looks like. Sensors measure reality. Gates enforce policy. Feedback loops close the gap. Think of it as the agent's prefrontal cortex — executive function and impulse control.
Substrate 2: Knowledge Graph (Declarative Memory) Every project has an Obsidian vault with wikilinked documentation — architecture decisions, API contracts, debugging insights. The agent can traverse this graph to recall "what I know about this system." Long-term declarative memory.
Substrate 3: Episodic Memory (Session History) Conversation transcripts are bridged from JSONL logs into searchable markdown docs, symlinked into the knowledge graph. The agent can recall "what happened last time I worked on this." Episodic memory with full context.
The three substrates form a persistence gradient:
Working memory → Auto-memory → Conversation logs → Knowledge graph → Policy rules → Invariants
(ephemeral) (permanent)Each layer is more durable and more abstract than the last. Working memory dies with the session. Policy rules survive forever.
The result: agents that remember context, learn from past sessions, and operate within governed boundaries — across days, weeks, and months of continuous development.
This isn't AGI. It's good engineering applied to a real problem: stateless systems need state management.
We open-sourced the full stack — 3 skills (agent-consciousness, knowledge-graph-memory, control-metalayer-loop) plus the infrastructure to run them.
#AgentMemory #AI #KnowledgeGraph #AutonomousAgents #Consciousness
LinkedIn Launch Post — BroomVA Agent OS Stack
Post 1: Main Launch Announcement
---
We just open-sourced the Agent OS stack we've been building for the past year.
37,000 lines of Rust. 31 crates. 1,000 tests passing. One unified architecture for building autonomous AI agents that actually work in production.
Here's what's inside:
- Arcan — an agent runtime daemon with typed streaming events, content-addressed file edits, and fully replayable sessions
- Lago — append-only event journal with content-addressed blob storage (think Git for agent state)
- Autonomic — three-pillar homeostatic controller that keeps agents stable (operational, cognitive, economic regulation)
- Praxis — sandboxed tool execution engine with workspace isolation
- Symphony — orchestration daemon that coordinates multiple coding agents across repositories
- Spaces — SpacetimeDB-powered communication fabric for distributed agents
The core insight: an agent's message history IS its application state. Every action produces an immutable event. Every session can be replayed from its journal. No hidden state. No surprises.
On top of this, we built 5 production applications:
- chatOS (multi-model AI chat, Next.js 16 + AI SDK v6)
- Symphony Cloud (managed SaaS for agent orchestration)
- Mission Control (Tauri desktop app for terminal + agent management)
- Control (local-first developer cockpit with Git graph visualization)
- Arcan Glass (our design system — frosted glass UI for the AI era)
And 16 agent skills across 6 layers — from safety shields to episodic memory to self-improving EGRI loops.
The fundamental bet: LLMs are controllers, not chatbots. They need plant interfaces, safety shields, typed state vectors, and feedback loops — the same primitives that run industrial control systems.
We're calling it the bstack. It's how we think agents should be built.
Link in comments.
#AgentOS #Rust #AI #OpenSource #AutonomousAgents #LLM #DeveloperTools
---
Post 2: Technical Deep Dive — Architecture
---
Most AI agent frameworks treat the LLM like a chatbot with tools.
We treat it like a controller in a feedback loop.
The difference matters. Here's the architecture behind our Agent OS stack:
Layer 1: Kernel Contract (aiOS) Every agent has an AgentStateVector — a typed struct tracking homeostasis. Six operating modes: Explore, Execute, Verify, Recover, AskHuman, Sleep. An 8-phase tick lifecycle with provenance tracking on every state transition.
Layer 2: Runtime (Arcan) The agent loop is strict: reconstruct state from event journal → call provider → execute tools → stream results. File edits are content-addressed (Blake3 hashes) — the agent can't blindly overwrite files. Multi-provider support (Claude, GPT, Gemini) with unified streaming.
Layer 3: Persistence (Lago) Append-only event journal on redb. Content-addressed blob storage with SHA-256 + zstd compression. Branching filesystem for parallel explorations. RBAC policy enforcement. Everything is an event. Nothing is lost.
Layer 4: Regulation (Autonomic) Three pillars: operational (is the agent healthy?), cognitive (is it making progress?), economic (is it spending wisely?). HysteresisGate prevents mode-flapping. Advisory model — Arcan consults; failures are non-fatal.
Layer 5: Orchestration (Symphony) Poll/dispatch/worker/reconcile pattern for coordinating multiple agents. Control gates prevent unauthorized mutations. Real-time status monitoring via dashboard.
Layer 6: Consciousness Stack Control metalayer (governance) + knowledge graph (Obsidian) + episodic memory (conversation logs). Three substrates that give agents persistent context across sessions.
The architecture scorecard: Agent Loop 9/10, Persistence 10/10, Tool Harness 9/10, Memory 8/10, Observability 8/10.
This isn't theory. It's running. 37K LOC of Rust, 1000 tests passing.
#SystemsEngineering #AgentArchitecture #Rust #ControlSystems #AI
---
Post 3: The Skills Layer — Why 16 Skills Beat 1,000 Prompts
---
We stopped writing prompts and started writing skills.
A skill is a versioned, composable unit of agent capability — with its own context, tools, and evaluation criteria. Think of it as a microservice for agent intelligence.
Here are the 16 skills in the bstack, organized by layer:
Foundation (3 skills)
- Agentic Control Kernel — safety shields, typed plant interfaces, governance
- Control Metalayer Loop — setpoints, sensors, gates, feedback
- Harness Engineering Playbook — deterministic testing, smoke checks, CI gates
Memory & Consciousness (3 skills)
- Agent Consciousness — three-substrate persistent context architecture
- Knowledge Graph Memory — conversation logs → Obsidian wikilinks
- Prompt Library — reusable, versioned agent directives
Orchestration (3 skills)
- Symphony — multi-agent dispatch and coordination
- Symphony Forge — project scaffolding with built-in governance
- Autoany — Evaluator-Governed Recursive Improvement (EGRI)
Research & Intelligence (3 skills)
- Deep Dive Research Orchestrator — multi-dimensional investigation
- Skills catalog — inventory and discovery
- Skills Showcase — presentation and communication
Design & Implementation (2 skills)
- Arcan Glass — AI-native design system (frosted glass, OKLCh colors, P3 gamut)
- Next Forge — production-grade Next.js SaaS template
Platform Specialties (2 skills)
- Alkosto Wait Optimizer — probabilistic decision optimization
- Content Creation — research-to-publishing pipeline
The key principle: skills compose. An agent using Symphony can invoke Autoany to self-improve, consult the Control Kernel for safety, persist findings to the Knowledge Graph, and present results via Content Creation.
Install the full stack: npx skills add broomva/bstack
#AgentSkills #AI #DeveloperExperience #Composability
---
Post 4: Why Rust for Agent Infrastructure
---
"Why Rust for AI agents? Isn't Python the obvious choice?"
We get this question a lot. Here's our answer:
Agents aren't scripts. They're daemons.
They run for hours. They manage state across thousands of events. They execute untrusted tool calls. They need to be restarted without losing context. They coordinate with other agents over networks.
This is systems programming. And Rust is the systems programming language.
Concrete benefits we've seen:
1. Memory safety without GC pauses Our event journal (Lago) handles append-only writes with zero-copy reads. No GC pause spikes during critical agent decisions.
2. Fearless concurrency Symphony coordinates multiple agents with shared state. Rust's ownership model catches data races at compile time — not at 3 AM in production.
3. Predictable performance Autonomic (our homeostasis controller) makes real-time regulation decisions. Consistent sub-millisecond latency, not "usually fast but sometimes 100ms GC."
4. Type-driven design Our 8-phase tick lifecycle and 6 operating modes are encoded in the type system. Invalid state transitions don't compile. The compiler is our first safety shield.
5. Binary deployment One arcand binary. No dependency hell. No pip install nightmares. Ships to any Linux box.
We still use TypeScript where it makes sense — chatOS, Symphony Cloud, Mission Control frontends. But the agent brain, the persistence layer, the orchestrator core — those are Rust.
37K lines. 31 crates. 1,000 tests. Zero segfaults.
The agent OS should be as reliable as a real OS. That means Rust.
#Rust #SystemsProgramming #AI #AgentInfrastructure #Performance
---
Post 5: Product Showcase — What You Can Build
---
Infrastructure is only as good as what you build on it.
Here are 5 products we've shipped on the Agent OS stack:
chatOS — Multi-Model AI Chat Turborepo monorepo with Next.js 16, Vercel AI SDK v6, Better Auth. Supports Claude, GPT, Gemini, and Grok with unified streaming. Multi-platform bots (Slack, Teams, Discord). Full agent-native architecture with control metalayer governance.
Symphony Cloud — Managed Agent Orchestration The SaaS layer on top of our open-source Symphony daemon. Next-forge template, Clerk auth, Stripe billing, Neon PostgreSQL. Lets teams deploy and manage coding agents without running infrastructure.
Mission Control — Desktop Agent Cockpit Tauri 2.0 desktop app with Liquid Glass UI. Terminal multiplexing with per-project PTY sessions. Live git integration (status, commit log, diff viewer). Filesystem watching. Dockable layout persistence. 29 Rust tests, 38 frontend tests.
Control — Local-First Developer Terminal Another Tauri app, focused on the individual developer. SQLite persistence, Git graph visualization with lane assignment, agent run recording, unified timeline. Local HTTP API on port 19420 for CLI and MCP access.
Arcan Glass — AI-Native Design System Not a product you use — a product everything else looks like. 4-layer composable glass system, dark-first with light mode, OKLCh color space with P3 gamut enhancement. Drop-in globals.css for any Next.js + Tailwind v4 + shadcn/ui project.
The pattern: Rust core handles the hard problems (state, safety, persistence). TypeScript handles the interfaces (web, desktop, mobile). Skills handle the intelligence (governance, memory, orchestration).
Everything composes. Everything is governed. Everything is observable.
#ProductDevelopment #FullStack #AI #Tauri #NextJS #DesignSystems
LinkedIn Post — Why We Chose Rust for AI Agent Infrastructure
---
"Why Rust for AI agents? Isn't Python the obvious choice?"
We get this question every week. Here's our answer after building 37K lines of Rust agent infrastructure:
Agents aren't scripts. They're daemons.
They run for hours. Manage state across thousands of events. Execute untrusted tool calls against real codebases. Need to be restarted without losing context. Coordinate with other agents over networks.
This is systems programming. Python is wonderful for ML research. But agent infrastructure is not ML research.
Here's what Rust gives us that nothing else does:
Memory safety without GC pauses. Our event journal (Lago) handles append-only writes with zero-copy reads. No GC pause spikes during critical agent decisions.
Fearless concurrency. Symphony coordinates multiple agents with shared state. Data races are caught at compile time — not at 3 AM in production.
Predictable performance. Autonomic (homeostasis controller) makes real-time regulation decisions. Consistent sub-millisecond latency, not "usually fast but sometimes 100ms."
Type-driven design. Our 8-phase tick lifecycle and 6 operating modes are encoded in the type system. Invalid state transitions don't compile. The compiler is our first safety shield.
Binary deployment. One arcand binary. No dependency hell. No virtualenvs. Ships to any Linux box and just runs.
We still use TypeScript for web UIs and Python for ML tasks. But the agent brain, the persistence layer, the orchestrator core — those are Rust.
31 crates. 1,000 tests. Zero segfaults.
The agent OS should be as reliable as a real OS.
#Rust #SystemsProgramming #AI #AutonomousAgents #Infrastructure
LinkedIn Post — The Skills Layer: Why 16 Composable Skills Beat 1,000 Prompts
---
We stopped writing prompts for our AI agents.
We started writing skills.
A skill is a versioned, composable unit of agent capability — with its own context, tool definitions, and evaluation criteria. Think microservices, but for agent intelligence.
The bstack ships 16 skills across 6 layers:
Foundation — safety shields, control loops, harness engineering Memory — persistent consciousness, knowledge graphs, prompt library Orchestration — agent dispatch, project scaffolding, self-improvement (EGRI) Research — multi-dimensional investigation and discovery Design — Arcan Glass (our frosted-glass design system) Specialty — decision optimization, content pipelines
The key insight: skills compose. An agent running Symphony can invoke Autoany to self-improve, consult the Control Kernel for safety checks, persist findings to the Knowledge Graph, and present results via Content Creation.
No prompt engineering. No copy-pasting system messages. Just: npx skills add broomva/bstack
And the EGRI skill (Evaluator-Governed Recursive Improvement) is the most interesting one. It turns any agent into a self-improving system — with a strict safety law:
"Never mutate the evaluator and artifact in the same trial. Budget fails closed. Rollback always available."
This is how you get agents that get better without getting dangerous.
16 skills. Open source. Ready to install.
#AgentSkills #AI #OpenSource #DeveloperTools #Composability
---
Post: Product Launch — Arcan Glass Design System
---
Every AI tool looks the same.
Dark background. Monospace font. Terminal aesthetic. Copy of a copy of a copy.
We built something different.
Arcan Glass is our design system for the AI era. It's a 4-layer composable glass system:
1. Base glass — frosted translucent surfaces with backdrop-filter blur 2. Depth glass — layered panels with progressive blur reduction 3. Interactive glass — hover/focus states with luminance shifts 4. Accent glass — gradient-bordered highlights for CTAs and active states
Built on:
- OKLCh color space (perceptually uniform, no muddy blends)
- P3 wide gamut with sRGB fallbacks
- Dark-first design with automatic light mode
- Tailwind v4 custom properties
- shadcn/ui full compatibility
Brand colors: AI Blue (#0066FF) + Web3 Green (#00CC66)
Drop-in integration: copy one globals.css file into any Next.js project and you're running the full Arcan Glass design language.
Why does this matter? Because AI products need to feel different from CRUD apps. The glass aesthetic signals: this is something new. This is intelligence, not just data.
Your users can feel it.
Open source. npx skills add broomva/arcan-glass
#DesignSystem #UI #AI #FrostedGlass #Tailwind #NextJS
X Thread — BroomVA Agent OS Stack Launch
Thread: 12 Posts
---
1/12 — Hook (attach video)
We just open-sourced our Agent OS stack.
37K lines of Rust. 31 crates. 1,000 tests. 16 agent skills. 5 production apps.
One unified architecture for building autonomous AI agents that actually work.
Here's the full breakdown:
🧵
---
2/12 — The Core Insight
Most agent frameworks treat LLMs like chatbots with tools.
We treat them like controllers in a feedback loop.
The agent has a typed state vector. Six operating modes. An 8-phase tick lifecycle. Every state transition has provenance.
This isn't a wrapper around an API. It's an operating system.
---
3/12 — Arcan: The Runtime (attach architecture diagram)
Arcan is the agent's brain.
Strict loop: reconstruct state → call provider → execute tools → stream results.
File edits are content-addressed (Blake3). The agent can't blindly overwrite your code.
Multi-provider: Claude, GPT, Gemini. Unified streaming. Fully replayable sessions.
---
4/12 — Lago: The Memory
Lago is Git for agent state.
Append-only event journal on redb. Content-addressed blob storage (SHA-256 + zstd). Branching filesystem for parallel explorations.
Every action is an event. Every session is replayable. Nothing is lost.
---
5/12 — Autonomic: The Self-Regulator
Agents need homeostasis.
Autonomic monitors three pillars:
- Operational: is the agent healthy?
- Cognitive: is it making progress?
- Economic: is it spending wisely?
HysteresisGate prevents mode-flapping. Advisory model — the runtime consults but can't be blocked.
---
6/12 — Symphony: The Orchestrator
One agent is useful. Multiple coordinated agents are transformative.
Symphony: poll/dispatch/worker/reconcile daemon.
Assigns issues to agents. Tracks workspace state. Enforces control gates. Real-time monitoring.
Symphony Cloud: the managed SaaS so teams don't run their own infra.
---
7/12 — The Consciousness Stack (attach diagram)
Agents need memory that persists across sessions.
We built three substrates:
1. Control Metalayer — behavioral governance (setpoints, sensors, gates) 2. Knowledge Graph — declarative memory (Obsidian wikilinks) 3. Episodic Memory — conversation logs bridged to searchable docs
Together: persistent, governable agent consciousness.
---
8/12 — 16 Skills, 6 Layers
Skills are composable units of agent intelligence.
Foundation: safety shields, control loops, harness engineering Memory: consciousness architecture, knowledge graphs, prompt library Orchestration: Symphony, scaffolding, EGRI self-improvement Research: multi-dimensional investigation, discovery Design: Arcan Glass (frosted glass UI), Next.js templates Specialty: decision optimization, content pipelines
---
9/12 — Why Rust
Agents aren't scripts. They're daemons.
They run for hours. Manage thousands of events. Execute untrusted tools. Need restarts without state loss. Coordinate over networks.
Rust gives us: memory safety without GC, fearless concurrency, predictable latency, type-driven invalid-state prevention, single-binary deployment.
---
10/12 — The Products (attach screenshots)
Built on the stack:
- chatOS: multi-model AI chat (Next.js 16, AI SDK v6)
- Symphony Cloud: managed agent orchestration SaaS
- Mission Control: Tauri desktop with Liquid Glass UI
- Control: local-first developer cockpit
- Arcan Glass: AI-native design system
Rust core + TypeScript interfaces + skill intelligence.
---
11/12 — The Architecture Scorecard
Where we stand today:
Agent Loop: 9/10 Persistence: 10/10 Tool Harness: 9/10 Memory: 8/10 Observability: 8/10 Security: 4/10 (OS-level sandbox planned)
Honest about gaps. Shipping anyway. The roadmap has 7 phases — we're on Phase 0 (stabilization).
---
12/12 — CTA
We're building the infrastructure layer for the agent era.
If you believe LLMs are controllers — not chatbots — and agents need real operating system primitives, we'd love your eyes on this.
Install the skill stack: npx skills add broomva/bstack
What would you build on this?
---
Reply Templates
Reply to "Why not just use LangChain/CrewAI/AutoGen?"
Those are orchestration frameworks. We're building an operating system.
The difference: we own the persistence layer (Lago), the regulation layer (Autonomic), the tool sandbox (Praxis), and the governance layer (Control Kernel).
When your agent corrupts its state at 3 AM, do you want a framework or an OS?
Reply to "37K LOC seems like a lot for agents"
Linux kernel: 30M LOC. PostgreSQL: 1.4M LOC. Tokio: 70K LOC.
Infrastructure is supposed to be substantial. The whole point is that application developers write less code because the OS handles the hard parts.
chatOS (our chat app) is tiny. Because Arcan, Lago, and Autonomic handle state, persistence, and regulation.
Reply to "Is this production-ready?"
Phase 0 (stabilization). 1,000 tests passing. Core loop functional. Multi-provider support working.
Known gaps: OS-level sandbox not enforced yet (security 4/10), branching not exposed in API, network isolation declared but not implemented.
We're honest about what works and what doesn't. That's the point of open-sourcing early.
Reply to "How does this compare to Claude Code / Cursor / Devin?"
Those are products. This is infrastructure.
Claude Code is an excellent coding agent. Arcan is the runtime you'd build Claude Code on top of.
Different layer of the stack. Complementary, not competitive.
Reply to "What's the business model?"
Symphony Cloud is the managed SaaS (Stripe billing, Neon PostgreSQL). Open-source engine, proprietary cloud.
Same model as GitLab, Supabase, Neon. Open core with managed service.
Reply to interest in contributing
DMs open. The repo has CLAUDE.md files in every project directory with full context.
Start with make smoke — if all checks pass, you're ready. The harness engineering playbook skill documents the development workflow.
Reply to "What about Python interop?"
The Autoany EGRI kernel has a Python skill layer. Praxis (tool engine) can execute any subprocess.
But the core infrastructure — the event journal, the agent loop, the homeostasis controller — those stay in Rust. Performance and safety guarantees matter at the infrastructure layer.
TypeScript handles web UIs. Python handles ML/data tasks. Rust handles everything that needs to be reliable.
X Thread — Products Built on Agent OS
Thread: 7 Posts
---
1/7 — Hook (attach collage screenshot)
We built 5 products on top of our Rust Agent OS stack.
Each one proves a different thesis about how AI applications should be built.
Here's the product lineup and what we learned from each:
🧵
---
2/7 — chatOS: The Multi-Model Chat
chatOS is a Turborepo monorepo: Next.js 16 + Vercel AI SDK v6 + Better Auth.
Supports Claude, GPT, Gemini, and Grok with unified streaming. Ships with Slack, Teams, and Discord bots.
The lesson: chat is commodity. The moat is the infrastructure underneath — how you persist conversations, govern agent behavior, and compose tools.
---
3/7 — Symphony Cloud: The SaaS Play
Open-source orchestration engine (Symphony) + proprietary cloud layer.
Clerk auth. Stripe billing. Neon PostgreSQL. Drizzle ORM.
The lesson: every serious agent tool needs a managed service. Teams don't want to run daemons. They want a dashboard, billing, and someone to page at 3 AM.
---
4/7 — Mission Control: The Desktop Cockpit (attach screenshot)
Tauri 2.0 desktop app with our Liquid Glass UI design.
Terminal multiplexing (PTY per project). Live git integration. Filesystem watching. Dockable layouts.
29 Rust tests. 38 frontend tests.
The lesson: agents need human oversight, and oversight needs a great interface. Terminal + Git + file explorer in one pane, agent status in the next.
---
5/7 — Control: The Developer Terminal
Local-first Tauri app. SQLite persistence. Git graph visualization with lane assignment. Agent run recording. Unified timeline.
Exposes a local HTTP API (port 19420) for CLI and MCP tool access.
The lesson: the IDE is not enough. Developers working with agents need a dedicated surface for agent state, timeline, and history.
---
6/7 — Arcan Glass: The Design System
Not a product — a visual identity.
4-layer composable glass system. Dark-first with light mode. OKLCh color space with P3 gamut enhancement. Drop-in globals.css.
AI Blue (#0066FF) + Web3 Green (#00CC66).
The lesson: AI tools don't have to look like terminals. The frosted glass aesthetic signals: this is something new. Not another dark mode dashboard.
---
7/7 — The Pattern
Every product follows the same pattern:
Rust core: handles state, safety, persistence (the hard problems) TypeScript shell: handles UI, routing, auth (the solved problems) Skill layer: handles intelligence, governance, memory (the new problems)
Infrastructure should be invisible. The user sees a chat app, a dashboard, a terminal. Underneath: 37K lines of Rust making sure nothing breaks.
What would you build on this stack?
X Thread — Technical Deep Dive: Control Theory for AI Agents
Thread: 8 Posts
---
1/8 — Hook
Hot take: the AI agent industry is recapitulating 50 years of control systems engineering — badly.
We've been applying control theory to LLM agents for the past year. Here's what we learned building 37K lines of Rust infrastructure.
🧵
---
2/8 — The Problem
Every agent framework treats the LLM as a "reasoning engine" that "decides" what to do next.
But that's not what's happening. The LLM is generating the next token given a context window. It's a stateless function. It has no memory. No homeostasis. No stability guarantees.
Sound familiar? It's an open-loop controller.
---
3/8 — Closing the Loop
In control theory, you close the loop by:
1. Defining a plant (the thing being controlled) 2. Measuring the plant state (sensors) 3. Computing an error signal (setpoint - measurement) 4. Applying a control law (the controller) 5. Feeding results back
We did exactly this for AI agents. The "plant" is the codebase. The "sensors" are test results, lint output, type checks. The "setpoint" is "all harness checks pass."
---
4/8 — The Agent State Vector
Every agent in our system has a typed AgentStateVector:
- Operating mode (Explore/Execute/Verify/Recover/AskHuman/Sleep)
- Homeostatic indicators (operational, cognitive, economic health)
- Tick counter with provenance
- Capability set (what tools are available)
Mode transitions are typed. Invalid transitions don't compile. The Rust type system is our first safety shield.
---
5/8 — Homeostasis, Not Just Error Handling
Autonomic monitors three pillars:
Operational: CPU/memory/process health → is the agent physically able to work? Cognitive: progress rate, loop detection, goal proximity → is the agent making progress? Economic: token spend, cost/benefit ratio → is the agent being efficient?
HysteresisGate prevents mode-flapping (the agent equivalent of a thermostat's dead band).
This is PID control adapted for language model agents.
---
6/8 — Event Sourcing as State Estimation
Control systems need accurate state estimation. We use event sourcing.
Lago (our persistence layer) records every agent action as an immutable event. Session state is reconstructed by replaying events — like a Kalman filter, but exact.
Benefits: full auditability, time-travel debugging, branching for parallel exploration, zero hidden state.
---
7/8 — The Safety Shield
Control systems have safety interlocks. Ours:
"Do not grant an agent more mutation freedom than your evaluator can reliably judge."
Concrete rules:
- Never mutate evaluator + artifact in same trial
- Budget fails closed (agent stops, not continues)
- Rollback always available (event journal)
- 2 failed retries → human escalation
This is the EGRI (Evaluator-Governed Recursive Improvement) safety law.
---
8/8 — The Takeaway
AI agent development IS control systems engineering.
Plant = codebase. Sensor = test suite. Controller = LLM. Actuator = tool calls. Setpoint = passing tests. Feedback = event journal.
The frameworks that win will be the ones that internalize this. We're building ours in Rust because infrastructure should be as reliable as the control systems that run power plants.
37K LOC. 31 crates. 1,000 tests. Open source.
What's your take — are agents controllers or reasoners?
{
"name": "bstack-launch-video",
"version": "1.0.0",
"private": true,
"scripts": {
"studio": "remotion studio",
"render": "remotion render BstackLaunch out/bstack-launch.mp4",
"render:gif": "remotion render BstackLaunch out/bstack-launch.gif --every-nth-frame=3",
"render:all": "bun run render && bun run render:gif"
},
"dependencies": {
"@remotion/cli": "^4.0.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"remotion": "^4.0.0"
},
"devDependencies": {
"@types/react": "^19.0.0",
"typescript": "^5.7.0"
}
}
import { Series } from "remotion";
import { IntroScene } from "./scenes/Intro";
import { LayerScene } from "./scenes/LayerScene";
import { ProductsScene } from "./scenes/Products";
import { OutroScene } from "./scenes/Outro";
import { layers, BRAND } from "./data/stack";
const INTRO_DURATION = 120; // 4s
const LAYER_DURATION = 75; // 2.5s each × 7 = 17.5s
const PRODUCTS_DURATION = 150; // 5s
const OUTRO_DURATION = 120; // 4s
// Total: 4 + 17.5 + 5 + 4 = 30.5s = ~900 frames
export const BstackLaunch: React.FC = () => {
return (
<div
style={{
width: 1080,
height: 1080,
backgroundColor: BRAND.bgDark,
fontFamily:
'-apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", sans-serif',
overflow: "hidden",
}}
>
<Series>
<Series.Sequence durationInFrames={INTRO_DURATION}>
<IntroScene />
</Series.Sequence>
{layers.map((layer) => (
<Series.Sequence key={layer.id} durationInFrames={LAYER_DURATION}>
<LayerScene layer={layer} />
</Series.Sequence>
))}
<Series.Sequence durationInFrames={PRODUCTS_DURATION}>
<ProductsScene />
</Series.Sequence>
<Series.Sequence durationInFrames={OUTRO_DURATION}>
<OutroScene />
</Series.Sequence>
</Series>
</div>
);
};
export interface StackLayer {
id: string;
label: string;
description: string;
color: string;
components: string[];
}
export interface Metric {
label: string;
value: string;
}
export const BRAND = {
aiBlue: "#0066FF",
web3Green: "#00CC66",
bgDark: "#0A0A0F",
bgCard: "#12121A",
textPrimary: "#F0F0F5",
textSecondary: "#8888AA",
glassBorder: "rgba(255,255,255,0.08)",
} as const;
export const metrics: Metric[] = [
{ label: "Lines of Rust", value: "37K" },
{ label: "Crates", value: "31" },
{ label: "Tests Passing", value: "1,000" },
{ label: "Agent Skills", value: "16" },
{ label: "Products", value: "5" },
];
export const layers: StackLayer[] = [
{
id: "kernel",
label: "Kernel",
description: "Agent OS contract & typed state vector",
color: "#FF3366",
components: ["aiOS", "AgentStateVector", "8-Phase Tick", "6 Operating Modes"],
},
{
id: "runtime",
label: "Runtime",
description: "Agent daemon with content-addressed edits",
color: "#FF6633",
components: ["Arcan", "Hashline Edits", "Multi-Provider", "SSE Streaming"],
},
{
id: "persistence",
label: "Persistence",
description: "Event-sourced journal & blob storage",
color: "#FFCC00",
components: ["Lago", "Event Journal", "Blob Store", "Branching FS"],
},
{
id: "regulation",
label: "Regulation",
description: "Three-pillar homeostatic controller",
color: "#00CC66",
components: ["Autonomic", "Operational", "Cognitive", "Economic"],
},
{
id: "tools",
label: "Tools",
description: "Sandboxed execution with workspace isolation",
color: "#0066FF",
components: ["Praxis", "Blake3 Hashes", "FsPolicy", "MCP Bridge"],
},
{
id: "orchestration",
label: "Orchestration",
description: "Multi-agent coordination daemon",
color: "#6633FF",
components: ["Symphony", "Dispatch", "Control Gates", "Dashboard"],
},
{
id: "consciousness",
label: "Consciousness",
description: "Persistent three-substrate memory",
color: "#CC33FF",
components: ["Control Metalayer", "Knowledge Graph", "Episodic Memory"],
},
];
export const products = [
{ name: "chatOS", desc: "Multi-model AI chat", tech: "Next.js 16 + AI SDK v6" },
{ name: "Symphony Cloud", desc: "Managed orchestration SaaS", tech: "next-forge + Stripe" },
{ name: "Mission Control", desc: "Desktop agent cockpit", tech: "Tauri 2.0 + Liquid Glass" },
{ name: "Control", desc: "Local-first dev terminal", tech: "Tauri + SQLite + Git graph" },
{ name: "Arcan Glass", desc: "AI-native design system", tech: "Tailwind v4 + OKLCh" },
];
import { registerRoot } from "remotion";
import { RemotionRoot } from "./Root";
registerRoot(RemotionRoot);
import { Composition } from "remotion";
import { BstackLaunch } from "./BstackLaunch";
export const RemotionRoot: React.FC = () => {
return (
<Composition
id="BstackLaunch"
component={BstackLaunch}
durationInFrames={900}
fps={30}
width={1080}
height={1080}
/>
);
};
import {
useCurrentFrame,
useVideoConfig,
spring,
interpolate,
} from "remotion";
import { metrics, BRAND } from "../data/stack";
export const IntroScene: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const titleSpring = spring({ frame, fps, config: { damping: 200 } });
const subtitleSpring = spring({
frame: frame - 15,
fps,
config: { damping: 200 },
});
return (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: BRAND.bgDark,
padding: 60,
}}
>
{/* Logo / Brand Mark */}
<div
style={{
opacity: titleSpring,
transform: `translateY(${interpolate(titleSpring, [0, 1], [40, 0])}px)`,
marginBottom: 20,
}}
>
<div
style={{
width: 80,
height: 80,
borderRadius: 20,
background: `linear-gradient(135deg, ${BRAND.aiBlue}, ${BRAND.web3Green})`,
display: "flex",
alignItems: "center",
justifyContent: "center",
fontSize: 36,
fontWeight: 800,
color: "white",
letterSpacing: -1,
}}
>
B
</div>
</div>
{/* Title */}
<div
style={{
opacity: titleSpring,
transform: `translateY(${interpolate(titleSpring, [0, 1], [40, 0])}px)`,
fontSize: 72,
fontWeight: 800,
color: BRAND.textPrimary,
letterSpacing: -3,
textAlign: "center",
lineHeight: 1.1,
}}
>
Agent OS
</div>
{/* Subtitle */}
<div
style={{
opacity: subtitleSpring,
transform: `translateY(${interpolate(subtitleSpring, [0, 1], [30, 0])}px)`,
fontSize: 28,
color: BRAND.textSecondary,
marginTop: 16,
textAlign: "center",
letterSpacing: 1,
}}
>
The infrastructure layer for autonomous AI agents
</div>
{/* Metrics pills */}
<div
style={{
display: "flex",
flexWrap: "wrap",
gap: 16,
marginTop: 50,
justifyContent: "center",
}}
>
{metrics.map((m, i) => {
const pillSpring = spring({
frame: frame - 30 - i * 6,
fps,
config: { damping: 200 },
});
return (
<div
key={m.label}
style={{
opacity: pillSpring,
transform: `scale(${pillSpring})`,
background: BRAND.bgCard,
border: `1px solid ${BRAND.glassBorder}`,
borderRadius: 12,
padding: "12px 20px",
display: "flex",
flexDirection: "column",
alignItems: "center",
}}
>
<span
style={{
fontSize: 32,
fontWeight: 700,
color: BRAND.aiBlue,
}}
>
{m.value}
</span>
<span
style={{
fontSize: 14,
color: BRAND.textSecondary,
marginTop: 4,
}}
>
{m.label}
</span>
</div>
);
})}
</div>
</div>
);
};
import {
useCurrentFrame,
useVideoConfig,
spring,
interpolate,
} from "remotion";
import type { StackLayer } from "../data/stack";
import { BRAND } from "../data/stack";
interface Props {
layer: StackLayer;
}
export const LayerScene: React.FC<Props> = ({ layer }) => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const enterSpring = spring({ frame, fps, config: { damping: 200 } });
const labelSpring = spring({
frame: frame - 8,
fps,
config: { damping: 200 },
});
return (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: BRAND.bgDark,
padding: 80,
}}
>
{/* Layer color accent bar */}
<div
style={{
width: interpolate(enterSpring, [0, 1], [0, 600]),
height: 4,
backgroundColor: layer.color,
borderRadius: 2,
marginBottom: 40,
}}
/>
{/* Layer label */}
<div
style={{
opacity: labelSpring,
transform: `translateY(${interpolate(labelSpring, [0, 1], [20, 0])}px)`,
fontSize: 20,
fontWeight: 600,
color: layer.color,
textTransform: "uppercase",
letterSpacing: 4,
marginBottom: 12,
}}
>
{layer.label}
</div>
{/* Description */}
<div
style={{
opacity: labelSpring,
transform: `translateY(${interpolate(labelSpring, [0, 1], [20, 0])}px)`,
fontSize: 36,
fontWeight: 700,
color: BRAND.textPrimary,
textAlign: "center",
lineHeight: 1.3,
maxWidth: 800,
marginBottom: 50,
}}
>
{layer.description}
</div>
{/* Components grid */}
<div
style={{
display: "flex",
flexWrap: "wrap",
gap: 16,
justifyContent: "center",
maxWidth: 800,
}}
>
{layer.components.map((comp, i) => {
const chipSpring = spring({
frame: frame - 15 - i * 5,
fps,
config: { damping: 20, stiffness: 200 },
});
return (
<div
key={comp}
style={{
opacity: chipSpring,
transform: `scale(${chipSpring}) translateY(${interpolate(chipSpring, [0, 1], [10, 0])}px)`,
background: `${layer.color}15`,
border: `1px solid ${layer.color}40`,
borderRadius: 10,
padding: "14px 24px",
fontSize: 22,
fontWeight: 600,
color: layer.color,
}}
>
{comp}
</div>
);
})}
</div>
</div>
);
};
import {
useCurrentFrame,
useVideoConfig,
spring,
interpolate,
} from "remotion";
import { BRAND } from "../data/stack";
export const OutroScene: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const mainSpring = spring({ frame, fps, config: { damping: 200 } });
const ctaSpring = spring({
frame: frame - 20,
fps,
config: { damping: 200 },
});
return (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: BRAND.bgDark,
padding: 80,
}}
>
{/* Gradient accent */}
<div
style={{
width: interpolate(mainSpring, [0, 1], [0, 200]),
height: 4,
background: `linear-gradient(90deg, ${BRAND.aiBlue}, ${BRAND.web3Green})`,
borderRadius: 2,
marginBottom: 40,
}}
/>
<div
style={{
opacity: mainSpring,
transform: `translateY(${interpolate(mainSpring, [0, 1], [30, 0])}px)`,
fontSize: 48,
fontWeight: 800,
color: BRAND.textPrimary,
textAlign: "center",
lineHeight: 1.2,
letterSpacing: -2,
}}
>
LLMs are controllers.
{"\n"}
Not chatbots.
</div>
<div
style={{
opacity: mainSpring,
transform: `translateY(${interpolate(mainSpring, [0, 1], [20, 0])}px)`,
fontSize: 24,
color: BRAND.textSecondary,
textAlign: "center",
marginTop: 24,
maxWidth: 600,
lineHeight: 1.5,
}}
>
37K lines of Rust. 31 crates. 16 skills. 5 products.
{"\n"}
One unified architecture.
</div>
{/* CTA */}
<div
style={{
opacity: ctaSpring,
transform: `scale(${ctaSpring})`,
marginTop: 50,
background: `linear-gradient(135deg, ${BRAND.aiBlue}, ${BRAND.web3Green})`,
borderRadius: 14,
padding: "16px 40px",
fontSize: 22,
fontWeight: 700,
color: "white",
letterSpacing: 0.5,
}}
>
npx skills add broomva/bstack
</div>
{/* Brand */}
<div
style={{
opacity: ctaSpring,
marginTop: 30,
fontSize: 16,
color: BRAND.textSecondary,
letterSpacing: 2,
}}
>
BROOMVA
</div>
</div>
);
};
import {
useCurrentFrame,
useVideoConfig,
spring,
interpolate,
} from "remotion";
import { products, BRAND } from "../data/stack";
export const ProductsScene: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const titleSpring = spring({ frame, fps, config: { damping: 200 } });
return (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: BRAND.bgDark,
padding: 60,
}}
>
<div
style={{
opacity: titleSpring,
transform: `translateY(${interpolate(titleSpring, [0, 1], [30, 0])}px)`,
fontSize: 20,
fontWeight: 600,
color: BRAND.aiBlue,
textTransform: "uppercase",
letterSpacing: 4,
marginBottom: 40,
}}
>
Built on the Stack
</div>
<div
style={{
display: "flex",
flexDirection: "column",
gap: 20,
width: "100%",
maxWidth: 800,
}}
>
{products.map((product, i) => {
const cardSpring = spring({
frame: frame - 10 - i * 8,
fps,
config: { damping: 200 },
});
return (
<div
key={product.name}
style={{
opacity: cardSpring,
transform: `translateX(${interpolate(cardSpring, [0, 1], [-40, 0])}px)`,
background: BRAND.bgCard,
border: `1px solid ${BRAND.glassBorder}`,
borderRadius: 16,
padding: "20px 28px",
display: "flex",
alignItems: "center",
justifyContent: "space-between",
}}
>
<div>
<div
style={{
fontSize: 26,
fontWeight: 700,
color: BRAND.textPrimary,
}}
>
{product.name}
</div>
<div
style={{
fontSize: 16,
color: BRAND.textSecondary,
marginTop: 4,
}}
>
{product.desc}
</div>
</div>
<div
style={{
fontSize: 14,
color: BRAND.aiBlue,
fontWeight: 500,
whiteSpace: "nowrap",
}}
>
{product.tech}
</div>
</div>
);
})}
</div>
</div>
);
};
{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "bundler",
"jsx": "react-jsx",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"outDir": "dist"
},
"include": ["src"]
}
{
"lockfileVersion": 1,
"configVersion": 1,
"workspaces": {
"": {
"dependencies": {
"@google/genai": "^1.46.0",
},
},
},
"packages": {
"@google/genai": ["@google/genai@1.46.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "p-retry": "^4.6.2", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-ewPMN5JkKfgU5/kdco9ZhXBHDPhVqZpMQqIFQhwsHLf8kyZfx1cNpw1pHo1eV6PGEW7EhIBFi3aYZraFndAXqg=="],
"@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="],
"@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="],
"@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="],
"@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="],
"@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="],
"@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="],
"@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="],
"@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="],
"@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="],
"@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="],
"@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="],
"@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="],
"agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
"bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
"buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
"data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
"extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
"fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
"formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
"gaxios": ["gaxios@7.1.4", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA=="],
"gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="],
"google-auth-library": ["google-auth-library@10.6.2", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^7.1.4", "gcp-metadata": "8.1.2", "google-logging-utils": "1.1.3", "jws": "^4.0.0" } }, "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw=="],
"google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="],
"https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
"json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="],
"jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="],
"jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="],
"long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
"node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
"p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="],
"protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="],
"retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
"web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
"ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],
}
}
import { GoogleGenAI } from "@google/genai";
import fs from "fs";
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const response = await ai.models.generateContent({
model: "gemini-2.5-flash-image",
contents: "A sleek dark-themed technical hero image for a LinkedIn post about an open source autonomous software development stack. Abstract visualization of interconnected glowing blue (#0066FF) and green (#00CC66) nodes forming a layered architecture against a deep dark background (#0A0A0F). Glass-morphism panels with frosted glass effects. Futuristic, minimal, professional. No text whatsoever. Landscape 1200x628 ratio.",
config: {
responseModalities: ["TEXT", "IMAGE"],
},
});
for (const part of response.candidates[0].content.parts) {
if (part.inlineData) {
const imageData = part.inlineData.data;
const buffer = Buffer.from(imageData, "base64");
fs.writeFileSync("/Users/broomva/broomva/broomva.tech/apps/chat/public/images/writing/open-source-autonomous-stack/hero-social-card.png", buffer);
console.log("Hero image saved!");
}
}
Estoy liberando en Open Source todo mi stack para desarrollo autónomo con agentes de AI.
Esto no es vibe coding. Es una especie nueva.
Construida alrededor de dos ideas: harness engineering — flujos deterministas con gates de seguridad — y orquestación de agentes — un daemon Rust que convierte tickets en PRs autónomos.
Este es el playbook con el que creo sistemas de forma escalable y automática — el mismo flujo con el que desplegamos soluciones que utilizan empresas como FIFA para el Mundial 2026 dentro de Stimulus, y con el que creo proyectos personales en tiempo récord.
bstack — 24 agent skills, 7 capas, un comando: npx skills add broomva/bstack
Life Agent OS — 7 crates de Rust: runtime, persistencia event-sourced, auto-regulación homeostática, tool sandbox, observabilidad OpenTelemetry, finanzas agénticas, networking distribuido.
121 repos. 5,442 contributions. 1.2k commits. Todo documentado, probado en producción, y ahora es Open Source.
Mi sitio personal + blog técnico: https://broomva.tech/writing/open-source-autonomous-stack
El proyecto bstack: https://github.com/broomva/bstack
121 repos públicos — el perfil habla solo: https://github.com/broomva
Updates en X: https://x.com/broomva_tech
PRs y feedback bienvenidos.
#OpenSource #AI #AgenticAI #HarnessEngineering #Rust #AutonomousDevelopment
{
"dependencies": {
"@google/genai": "^1.46.0"
}
}{
"name": "open-source-stack-video",
"version": "1.0.0",
"private": true,
"scripts": {
"studio": "remotion studio",
"render": "remotion render OpenSourceStack out/open-source-stack.mp4",
"render:gif": "remotion render OpenSourceStack out/open-source-stack.gif --every-nth-frame=3",
"render:all": "bun run render && bun run render:gif"
},
"dependencies": {
"@remotion/cli": "^4.0.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"remotion": "^4.0.0"
},
"devDependencies": {
"@types/react": "^19.0.0",
"typescript": "^5.7.0"
}
}
export const BRAND = {
aiBlue: "#0066FF",
web3Green: "#00CC66",
bgDark: "#0A0A0F",
bgCard: "#12121A",
bgSurface: "#1A1A2E",
textPrimary: "#F0F0F5",
textSecondary: "#8888AA",
textMuted: "#6B6B80",
glassBorder: "rgba(255,255,255,0.08)",
accentGradient: "linear-gradient(135deg, #0066FF, #00CC66)",
warning: "#FFD60A",
} as const;
export interface StackLayer {
label: string;
emoji: string;
skills: string[];
color: string;
}
export const stackLayers: StackLayer[] = [
{
label: "Foundation",
emoji: "🏗",
skills: ["Control Metalayer", "Safety Shields", "Harness Gates"],
color: "#FF3366",
},
{
label: "Memory",
emoji: "🧠",
skills: ["Consciousness", "Knowledge Graph", "Prompt Library"],
color: "#FF6633",
},
{
label: "Orchestration",
emoji: "🎼",
skills: ["Symphony", "AutoAny (EGRI)", "Symphony Forge"],
color: "#FFCC00",
},
{
label: "Research",
emoji: "🔬",
skills: ["Deep Research", "Competitor Intel", "Skills Catalog"],
color: "#00CC66",
},
{
label: "Design",
emoji: "🎨",
skills: ["Arcan Glass", "Next.js Templates", "Content Pipeline"],
color: "#0066FF",
},
{
label: "Platform",
emoji: "⚡",
skills: ["Haima (x402 Payments)", "Finance Engine", "Deployment"],
color: "#6633FF",
},
{
label: "Strategy",
emoji: "♟",
skills: ["Pre-mortem", "Drift Check", "Weekly Review"],
color: "#CC33FF",
},
];
export const coreInfra = [
{ name: "Arcan", desc: "Agent Runtime", lang: "Rust" },
{ name: "Lago", desc: "Event-Sourced Persistence", lang: "Rust" },
{ name: "Symphony", desc: "Orchestration Daemon", lang: "Rust" },
{ name: "Autonomic", desc: "Homeostasis Controller", lang: "Rust" },
{ name: "Praxis", desc: "Tool Execution Sandbox", lang: "Rust" },
{ name: "Vigil", desc: "OpenTelemetry Observability", lang: "Rust" },
{ name: "Haima", desc: "Agentic Finance (x402)", lang: "Rust" },
];
export const realWorldProofs = [
{
label: "FIFA World Cup 2026",
detail: "AI procurement agent — thousands of vendor requests",
},
{
label: "Stimulus",
detail: "Enterprise AI solutions at scale",
},
{
label: "broomva.tech",
detail: "Personal projects shipped in record time",
},
];
export const metrics = [
{ label: "Rust Crates", value: "31" },
{ label: "Agent Skills", value: "24" },
{ label: "Stack Layers", value: "7" },
{ label: "Public Repos", value: "30" },
];
import { registerRoot } from "remotion";
import { RemotionRoot } from "./Root";
registerRoot(RemotionRoot);
import { Series } from "remotion";
import { HookScene } from "./scenes/Hook";
import { NotVibeCoding } from "./scenes/NotVibeCoding";
import { StackLayers } from "./scenes/StackLayers";
import { InfraScene } from "./scenes/Infra";
import { RealWorldScene } from "./scenes/RealWorld";
import { OutroScene } from "./scenes/Outro";
import { BRAND } from "./data/content";
const HOOK_DURATION = 105; // 3.5s
const NOT_VIBE_DURATION = 105; // 3.5s
const STACK_DURATION = 210; // 7s
const INFRA_DURATION = 120; // 4s
const REAL_WORLD_DURATION = 105; // 3.5s
const OUTRO_DURATION = 105; // 3.5s
// Total: 750 frames = 25s
export const OpenSourceStack: React.FC = () => {
return (
<div
style={{
width: 1920,
height: 1080,
backgroundColor: BRAND.bgDark,
fontFamily:
'Poppins, -apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", sans-serif',
overflow: "hidden",
}}
>
<Series>
<Series.Sequence durationInFrames={HOOK_DURATION}>
<HookScene />
</Series.Sequence>
<Series.Sequence durationInFrames={NOT_VIBE_DURATION}>
<NotVibeCoding />
</Series.Sequence>
<Series.Sequence durationInFrames={STACK_DURATION}>
<StackLayers />
</Series.Sequence>
<Series.Sequence durationInFrames={INFRA_DURATION}>
<InfraScene />
</Series.Sequence>
<Series.Sequence durationInFrames={REAL_WORLD_DURATION}>
<RealWorldScene />
</Series.Sequence>
<Series.Sequence durationInFrames={OUTRO_DURATION}>
<OutroScene />
</Series.Sequence>
</Series>
</div>
);
};
import { Composition } from "remotion";
import { OpenSourceStack } from "./OpenSourceStack";
export const RemotionRoot: React.FC = () => {
return (
<Composition
id="OpenSourceStack"
component={OpenSourceStack}
durationInFrames={750}
fps={30}
width={1920}
height={1080}
/>
);
};
import {
useCurrentFrame,
useVideoConfig,
spring,
interpolate,
} from "remotion";
import { BRAND, metrics } from "../data/content";
export const HookScene: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const badgeSpring = spring({ frame, fps, config: { damping: 200 } });
const titleSpring = spring({
frame: frame - 10,
fps,
config: { damping: 200 },
});
const subtitleSpring = spring({
frame: frame - 20,
fps,
config: { damping: 200 },
});
return (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: BRAND.bgDark,
position: "relative",
}}
>
{/* Subtle gradient orb background */}
<div
style={{
position: "absolute",
width: 600,
height: 600,
borderRadius: "50%",
background: `radial-gradient(circle, ${BRAND.aiBlue}15, transparent 70%)`,
filter: "blur(80px)",
top: "50%",
left: "50%",
transform: "translate(-50%, -50%)",
}}
/>
{/* Open Source badge */}
<div
style={{
opacity: badgeSpring,
transform: `scale(${badgeSpring})`,
background: `${BRAND.aiBlue}20`,
border: `1px solid ${BRAND.aiBlue}50`,
borderRadius: 100,
padding: "10px 32px",
fontSize: 20,
fontWeight: 600,
color: BRAND.aiBlue,
letterSpacing: 3,
textTransform: "uppercase",
marginBottom: 30,
}}
>
Open Source
</div>
{/* Main title */}
<div
style={{
opacity: titleSpring,
transform: `translateY(${interpolate(titleSpring, [0, 1], [50, 0])}px)`,
fontSize: 80,
fontWeight: 800,
color: BRAND.textPrimary,
textAlign: "center",
lineHeight: 1.1,
letterSpacing: -3,
maxWidth: 1400,
}}
>
Mi Stack Completo para
<br />
<span
style={{
background: BRAND.accentGradient,
WebkitBackgroundClip: "text",
WebkitTextFillColor: "transparent",
}}
>
Desarrollo Autónomo
</span>
</div>
{/* Subtitle */}
<div
style={{
opacity: subtitleSpring,
transform: `translateY(${interpolate(subtitleSpring, [0, 1], [30, 0])}px)`,
fontSize: 28,
color: BRAND.textSecondary,
marginTop: 24,
textAlign: "center",
letterSpacing: 1,
}}
>
El playbook para crear sistemas de forma escalable y automática
</div>
{/* Metrics row */}
<div
style={{
display: "flex",
gap: 24,
marginTop: 50,
}}
>
{metrics.map((m, i) => {
const pillSpring = spring({
frame: frame - 35 - i * 5,
fps,
config: { damping: 200 },
});
return (
<div
key={m.label}
style={{
opacity: pillSpring,
transform: `scale(${pillSpring})`,
background: BRAND.bgCard,
border: `1px solid ${BRAND.glassBorder}`,
borderRadius: 14,
padding: "14px 28px",
display: "flex",
flexDirection: "column",
alignItems: "center",
}}
>
<span
style={{
fontSize: 36,
fontWeight: 700,
color: BRAND.aiBlue,
}}
>
{m.value}
</span>
<span
style={{
fontSize: 14,
color: BRAND.textSecondary,
marginTop: 4,
}}
>
{m.label}
</span>
</div>
);
})}
</div>
</div>
);
};
import {
useCurrentFrame,
useVideoConfig,
spring,
interpolate,
} from "remotion";
import { BRAND, coreInfra } from "../data/content";
export const InfraScene: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const titleSpring = spring({ frame, fps, config: { damping: 200 } });
return (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: BRAND.bgDark,
padding: 60,
}}
>
<div
style={{
opacity: titleSpring,
transform: `translateY(${interpolate(titleSpring, [0, 1], [30, 0])}px)`,
fontSize: 18,
fontWeight: 600,
color: BRAND.web3Green,
textTransform: "uppercase",
letterSpacing: 4,
marginBottom: 12,
}}
>
Life Agent OS
</div>
<div
style={{
opacity: titleSpring,
transform: `translateY(${interpolate(titleSpring, [0, 1], [20, 0])}px)`,
fontSize: 44,
fontWeight: 800,
color: BRAND.textPrimary,
textAlign: "center",
letterSpacing: -1,
marginBottom: 50,
}}
>
7 Rust Crates. Un runtime completo para agentes.
</div>
{/* Crate grid */}
<div
style={{
display: "flex",
flexWrap: "wrap",
gap: 20,
justifyContent: "center",
maxWidth: 1400,
}}
>
{coreInfra.map((crate, i) => {
const cardSpring = spring({
frame: frame - 15 - i * 5,
fps,
config: { damping: 200 },
});
return (
<div
key={crate.name}
style={{
opacity: cardSpring,
transform: `scale(${interpolate(cardSpring, [0, 1], [0.9, 1])}) translateY(${interpolate(cardSpring, [0, 1], [15, 0])}px)`,
background: BRAND.bgCard,
border: `1px solid ${BRAND.glassBorder}`,
borderRadius: 16,
padding: "24px 32px",
width: 280,
display: "flex",
flexDirection: "column",
}}
>
<div style={{ display: "flex", alignItems: "center", gap: 10, marginBottom: 8 }}>
<div
style={{
fontSize: 24,
fontWeight: 700,
color: BRAND.textPrimary,
}}
>
{crate.name}
</div>
<div
style={{
fontSize: 12,
fontWeight: 600,
color: BRAND.warning,
background: `${BRAND.warning}15`,
border: `1px solid ${BRAND.warning}30`,
borderRadius: 6,
padding: "2px 8px",
}}
>
{crate.lang}
</div>
</div>
<div
style={{
fontSize: 16,
color: BRAND.textSecondary,
lineHeight: 1.4,
}}
>
{crate.desc}
</div>
</div>
);
})}
</div>
</div>
);
};
import {
useCurrentFrame,
useVideoConfig,
spring,
interpolate,
} from "remotion";
import { BRAND } from "../data/content";
export const NotVibeCoding: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const strikeSpring = spring({ frame, fps, config: { damping: 200 } });
const newSpeciesSpring = spring({
frame: frame - 20,
fps,
config: { damping: 200 },
});
const pillarsSpring = spring({
frame: frame - 40,
fps,
config: { damping: 200 },
});
const strikeWidth = interpolate(strikeSpring, [0, 1], [0, 100]);
return (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: BRAND.bgDark,
padding: 80,
}}
>
{/* "Vibe Coding" struck through */}
<div
style={{
opacity: strikeSpring,
transform: `translateY(${interpolate(strikeSpring, [0, 1], [30, 0])}px)`,
fontSize: 52,
fontWeight: 600,
color: BRAND.textMuted,
position: "relative",
marginBottom: 20,
}}
>
Vibe Coding
<div
style={{
position: "absolute",
top: "50%",
left: 0,
width: `${strikeWidth}%`,
height: 4,
backgroundColor: "#FF3B30",
borderRadius: 2,
}}
/>
</div>
{/* New species */}
<div
style={{
opacity: newSpeciesSpring,
transform: `translateY(${interpolate(newSpeciesSpring, [0, 1], [40, 0])}px)`,
fontSize: 72,
fontWeight: 800,
color: BRAND.textPrimary,
textAlign: "center",
lineHeight: 1.2,
letterSpacing: -2,
marginBottom: 50,
}}
>
Una{" "}
<span
style={{
background: BRAND.accentGradient,
WebkitBackgroundClip: "text",
WebkitTextFillColor: "transparent",
}}
>
especie nueva
</span>
</div>
{/* Two pillars */}
<div style={{ display: "flex", gap: 40 }}>
{[
{
label: "Harness Engineering",
desc: "Flujos deterministas con gates de seguridad",
icon: "⚙",
},
{
label: "Agent Orchestration",
desc: "Agentes que toman tickets y entregan PRs",
icon: "🎼",
},
].map((pillar, i) => {
const cardSpring = spring({
frame: frame - 45 - i * 10,
fps,
config: { damping: 200 },
});
return (
<div
key={pillar.label}
style={{
opacity: cardSpring,
transform: `translateY(${interpolate(cardSpring, [0, 1], [30, 0])}px)`,
background: BRAND.bgCard,
border: `1px solid ${BRAND.glassBorder}`,
borderRadius: 20,
padding: "40px 48px",
width: 420,
display: "flex",
flexDirection: "column",
alignItems: "center",
textAlign: "center",
}}
>
<div style={{ fontSize: 48, marginBottom: 16 }}>{pillar.icon}</div>
<div
style={{
fontSize: 26,
fontWeight: 700,
color: BRAND.textPrimary,
marginBottom: 8,
}}
>
{pillar.label}
</div>
<div
style={{
fontSize: 18,
color: BRAND.textSecondary,
lineHeight: 1.4,
}}
>
{pillar.desc}
</div>
</div>
);
})}
</div>
</div>
);
};
import {
useCurrentFrame,
useVideoConfig,
spring,
interpolate,
} from "remotion";
import { BRAND, realWorldProofs } from "../data/content";
export const RealWorldScene: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const titleSpring = spring({ frame, fps, config: { damping: 200 } });
return (
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: BRAND.bgDark,
padding: 80,
}}
>
<div
style={{
opacity: titleSpring,
transform: `translateY(${interpolate(titleSpring, [0, 1], [30, 0])}px)`,
fontSize: 44,
fontWeight: 800,
color: BRAND.textPrimary,
textAlign: "center",
letterSpacing: -1,
marginBottom: 50,
}}
>
En producción. No en teoría.
</div>
<div style={{ display: "flex", gap: 32 }}>
{realWorldProofs.map((proof, i) => {
const cardSpring = spring({
frame: frame - 15 - i * 10,
fps,
config: { damping: 200 },
});
return (
<div
key={proof.label}
style={{
opacity: cardSpring,
transform: `translateY(${interpolate(cardSpring, [0, 1], [40, 0])}px)`,
background: BRAND.bgCard,
border: `1px solid ${BRAND.glassBorder}`,
borderRadius: 20,
padding: "44px 40px",
width: 420,
textAlign: "center",
}}
>
<div
style={{
fontSize: 28,
fontWeight: 700,
color: BRAND.textPrimary,
marginBottom: 12,
}}
>
{proof.label}
</div>
<div
style={{
fontSize: 18,
color: BRAND.textSecondary,
lineHeight: 1.5,
}}
>
{proof.detail}
</div>
</div>
);
})}
</div>
</div>
);
};
Related skills
FAQ
What are the eight phases?
Reference (optional), research, narrative, visual assets, audio, video, social, and deploy.
What API keys does it need?
A free GEMINI_API_KEY powers Nano Banana images, Veo 3.1 video, and Gemini analysis; FAL_KEY and ELEVENLABS_API_KEY are optional add-ons.