vibecarbon 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/LICENSE +110 -663
  2. package/README.md +4 -4
  3. package/carbon/.env.example +11 -0
  4. package/carbon/backup/compose-backup.sh +8 -0
  5. package/carbon/docker-compose.yml +11 -0
  6. package/carbon/ha/primary-init.sql +10 -2
  7. package/carbon/k8s/base/backup/cronjob.yaml +9 -0
  8. package/carbon/k8s/base/repl-gateway/kustomization.yaml +11 -0
  9. package/carbon/k8s/base/repl-gateway/repl-gateway.yaml +92 -0
  10. package/carbon/k8s/values/supabase.values.yaml +6 -1
  11. package/carbon/scripts/dev-init.js +6 -2
  12. package/carbon/src/client/assets/vibecarbon-icon.svg +6 -6
  13. package/carbon/src/client/assets/vibecarbon-wordmark-text-dark.svg +12 -0
  14. package/carbon/src/client/assets/vibecarbon-wordmark-text-light.svg +12 -0
  15. package/carbon/src/client/components/AIIntegrationSection.tsx +1 -3
  16. package/carbon/src/client/components/AppSidebar.tsx +35 -28
  17. package/carbon/src/client/components/CTAFooter.tsx +1 -1
  18. package/carbon/src/client/components/ComparisonSection.tsx +1 -3
  19. package/carbon/src/client/components/ContentPanel.tsx +1 -1
  20. package/carbon/src/client/components/DeploymentScenariosSection.tsx +1 -3
  21. package/carbon/src/client/components/FAQSection.tsx +1 -1
  22. package/carbon/src/client/components/Hero.tsx +13 -1
  23. package/carbon/src/client/components/Logo.tsx +66 -49
  24. package/carbon/src/client/components/Nav.tsx +1 -1
  25. package/carbon/src/client/components/NewsletterSignup.tsx +1 -1
  26. package/carbon/src/client/components/NotificationDrawer.tsx +3 -3
  27. package/carbon/src/client/components/PageHeader.tsx +1 -1
  28. package/carbon/src/client/components/PricingSection.tsx +2 -6
  29. package/carbon/src/client/components/TechStackSection.tsx +1 -3
  30. package/carbon/src/client/components/effects/FilmGrainOverlay.tsx +5 -0
  31. package/carbon/src/client/components/ui/button.tsx +1 -1
  32. package/carbon/src/client/components/ui/card.tsx +1 -1
  33. package/carbon/src/client/components/ui/dialog.tsx +1 -1
  34. package/carbon/src/client/components/ui/dropdown-menu.tsx +2 -2
  35. package/carbon/src/client/components/ui/popover.tsx +1 -1
  36. package/carbon/src/client/components/ui/select.tsx +1 -1
  37. package/carbon/src/client/components/ui/sidebar.tsx +1 -1
  38. package/carbon/src/client/index.css +186 -104
  39. package/carbon/src/client/lib/supabase.ts +41 -0
  40. package/carbon/src/client/lib/theme.ts +14 -14
  41. package/carbon/src/client/locales/de.json +27 -12
  42. package/carbon/src/client/locales/en.json +33 -18
  43. package/carbon/src/client/locales/es.json +27 -12
  44. package/carbon/src/client/locales/fr.json +27 -12
  45. package/carbon/src/client/locales/pt.json +27 -12
  46. package/carbon/src/client/pages/Blog.tsx +1 -1
  47. package/carbon/src/client/pages/Changelog.tsx +1 -1
  48. package/carbon/src/client/pages/Checkout.tsx +1 -1
  49. package/carbon/src/client/pages/Dashboard.tsx +33 -40
  50. package/carbon/src/client/pages/Docs.tsx +1 -1
  51. package/carbon/src/client/pages/Home.tsx +1 -1
  52. package/carbon/src/client/pages/Legal.tsx +1 -1
  53. package/carbon/src/server/billing/providers/paddle.ts +21 -2
  54. package/carbon/src/server/billing/providers/polar.ts +14 -0
  55. package/carbon/src/server/index.ts +12 -9
  56. package/carbon/src/server/lib/client-ip.ts +68 -0
  57. package/carbon/src/server/lib/env.ts +20 -6
  58. package/carbon/src/server/lib/rate-limiter.ts +11 -65
  59. package/carbon/src/server/lib/supabase.ts +10 -4
  60. package/carbon/src/server/middleware/requireOrgRole.ts +76 -0
  61. package/carbon/src/server/middleware/requirePlan.ts +64 -34
  62. package/carbon/src/server/middleware/requireSuperAdmin.ts +26 -0
  63. package/carbon/src/server/routes/v1/admin/contact.ts +5 -20
  64. package/carbon/src/server/routes/v1/admin/jobs.ts +6 -20
  65. package/carbon/src/server/routes/v1/admin/newsletter.ts +26 -23
  66. package/carbon/src/server/routes/v1/auth.ts +5 -2
  67. package/carbon/src/server/routes/v1/billing.ts +24 -64
  68. package/carbon/src/server/routes/v1/index.ts +8 -1
  69. package/carbon/src/server/routes/v1/newsletter.ts +18 -12
  70. package/carbon/src/server/routes/v1/theme.ts +36 -15
  71. package/carbon/supabase/migrations/00003_pg_cron.sql +2 -2
  72. package/carbon/supabase/migrations/00004_contact_newsletter.sql +24 -14
  73. package/carbon/tests/component/supabase-env-guard.test.ts +54 -0
  74. package/carbon/tests/integration/server/middleware/rate-limit-ip-spoof.test.ts +48 -0
  75. package/carbon/tests/integration/server/middleware/require-plan.test.ts +101 -0
  76. package/carbon/tests/integration/server/routes/admin-newsletter.test.ts +93 -0
  77. package/carbon/tests/integration/server/routes/billing-subscription-idor.test.ts +92 -0
  78. package/carbon/tests/integration/server/routes/newsletter-unsubscribe.test.ts +65 -0
  79. package/carbon/tests/integration/server/routes/theme-validation.test.ts +66 -0
  80. package/carbon/tests/unit/server/client-ip.test.ts +76 -0
  81. package/carbon/tests/unit/server/env-bool.test.ts +63 -0
  82. package/carbon/tests/unit/server/paddle-webhook.test.ts +57 -0
  83. package/carbon/tests/unit/server/polar-webhook.test.ts +63 -0
  84. package/carbon/tests/unit/server/supabase-client.test.ts +30 -0
  85. package/carbon/volumes/db/wal-archive.sh +36 -0
  86. package/package.json +2 -2
  87. package/src/backup.js +0 -2
  88. package/src/cli.js +16 -0
  89. package/src/deploy.js +16 -5
  90. package/src/destroy.js +78 -0
  91. package/src/failover.js +118 -237
  92. package/src/lib/command.js +19 -1
  93. package/src/lib/deploy/compose/ha.js +180 -102
  94. package/src/lib/deploy/compose/index.js +63 -20
  95. package/src/lib/deploy/image.js +19 -23
  96. package/src/lib/deploy/k8s/ha/index.js +397 -150
  97. package/src/lib/deploy/k8s/k3s.js +65 -14
  98. package/src/lib/deploy/orchestrator.js +176 -6
  99. package/src/lib/deploy/remote-build.js +8 -1
  100. package/src/lib/deploy/replication.js +540 -0
  101. package/src/lib/deploy/state.js +62 -5
  102. package/src/lib/deploy/utils.js +30 -2
  103. package/src/lib/deploy/wireguard.js +146 -0
  104. package/src/lib/host-keys.js +120 -5
  105. package/src/lib/iac/index.js +57 -23
  106. package/src/lib/licensing/gate.js +59 -0
  107. package/src/lib/licensing/index.js +1 -1
  108. package/src/lib/licensing/tiers.js +6 -5
  109. package/src/lib/prod-confirm.js +65 -0
  110. package/src/lib/providers/hetzner-s3.js +85 -0
  111. package/src/lib/ssh.js +35 -35
  112. package/src/restore.js +102 -14
  113. package/src/scale.js +4 -2
  114. package/src/status.js +122 -0
  115. package/src/upgrade.js +0 -4
  116. package/carbon/ha/activate-standby.sh +0 -52
  117. package/carbon/ha/standby-init.sh +0 -74
  118. package/carbon/src/client/assets/vibecarbon-logo-dark.svg +0 -29
  119. package/carbon/src/client/assets/vibecarbon-logo-light.svg +0 -29
  120. package/carbon/src/server/lib/request.ts +0 -34
  121. package/src/lib/pod-backups.js +0 -53
@@ -217,11 +217,11 @@
217
217
  "charts": {
218
218
  "title": "Charts",
219
219
  "revenue": "Revenue",
220
- "revenueDescription": "Monthly revenue, Jan\u2013Jun",
220
+ "revenueDescription": "Monthly revenue, Jan–Jun",
221
221
  "revenueSparkline": "$29.8k",
222
222
  "newUsers": "New Users",
223
223
  "activeUsers": "Active Users",
224
- "activeUsersDescription": "Weekly signups \u2014 new vs. returning",
224
+ "activeUsersDescription": "Weekly signups new vs. returning",
225
225
  "mrr": "MRR",
226
226
  "mrrGrowth": "MRR Growth",
227
227
  "mrrGrowthDescription": "Cumulative monthly recurring revenue",
@@ -274,7 +274,7 @@
274
274
  "hero": {
275
275
  "badge": "Fully Automated · Self-Hosted",
276
276
  "headline1": "Professional Grade",
277
- "subheading": "Full-stack SaaS starter kit with automated everything built for AI-driven development.",
277
+ "subheading": "Full-stack SaaS starter with the most easy-to-use DevOps CLI ever. Built for AI-driven development.",
278
278
  "getUpdates": "Get Updates"
279
279
  },
280
280
  "logoStrip": {
@@ -285,15 +285,15 @@
285
285
  "subheading": "Provision, deploy, and scale from the CLI",
286
286
  "create": {
287
287
  "label": "Create",
288
- "description": "Full-stack app with auth, database, API, and Kubernetes manifests — ready to go."
288
+ "description": "Full-stack SaaS template with everything you need build, deploy, and maintain advanced applications."
289
289
  },
290
290
  "develop": {
291
291
  "label": "Develop",
292
- "description": "Spin up your entire dev environment: database, auth, API, and hot-reloading frontend."
292
+ "description": "Spin up a dev environment for building your app using AI, complete with security guardrails and a hot-reloading frontend."
293
293
  },
294
294
  "deploy": {
295
295
  "label": "Deploy",
296
- "description": "Provision a VPS or Kubernetes cluster with SSL, HA, backups, and CI/CD in one command."
296
+ "description": "Deploy on Hetzner with Docker Compose or Kubernetes. Complete with backups, scaling, high-availability, and more advanced features with simple commands."
297
297
  }
298
298
  },
299
299
  "techStack": {
@@ -352,7 +352,7 @@
352
352
  "traffic": {
353
353
  "risk": "Can't handle traffic",
354
354
  "protection": "Auto-scaling",
355
- "how": "Kubernetes autoscaling across pods and VPS nodes"
355
+ "how": "Kubernetes pod autoscaling plus one-command worker scaling"
356
356
  },
357
357
  "redundancy": {
358
358
  "risk": "Zero redundancy",
@@ -401,25 +401,40 @@
401
401
  "compose": {
402
402
  "name": "Docker Compose",
403
403
  "tagline": "One VPS, your full stack included.",
404
- "features": ["1 server", "Single region"],
404
+ "features": [
405
+ "1 server",
406
+ "Single region"
407
+ ],
405
408
  "bestFor": "MVPs & internal tools"
406
409
  },
407
410
  "composeHa": {
408
411
  "name": "Compose HA",
409
- "tagline": "Two servers, automatic failover.",
410
- "features": ["2 servers", "Streaming replication", "Auto-failover"],
412
+ "tagline": "Two regions, one-command failover.",
413
+ "features": [
414
+ "2 servers",
415
+ "Streaming replication",
416
+ "One-command failover"
417
+ ],
411
418
  "bestFor": "Production SaaS without Kubernetes"
412
419
  },
413
420
  "k8s": {
414
421
  "name": "Kubernetes",
415
- "tagline": "Auto-scaling k3s cluster.",
416
- "features": ["Single region", "Horizontal autoscaling", "Rolling updates"],
422
+ "tagline": "Production k3s cluster.",
423
+ "features": [
424
+ "Single region",
425
+ "Horizontal autoscaling",
426
+ "Rolling updates"
427
+ ],
417
428
  "bestFor": "High-traffic apps"
418
429
  },
419
430
  "k8sHa": {
420
431
  "name": "Kubernetes HA",
421
432
  "tagline": "Multi-region clusters, maximum uptime.",
422
- "features": ["2 regions", "Region failover", "Autoscaling"],
433
+ "features": [
434
+ "2 regions",
435
+ "Region failover",
436
+ "Pod autoscaling"
437
+ ],
423
438
  "bestFor": "Mission-critical & global"
424
439
  }
425
440
  },
@@ -459,7 +474,7 @@
459
474
  "backups": "Automated S3 backups",
460
475
  "cicd": "CI/CD via GitHub Actions",
461
476
  "unlimited": "Unlimited servers & projects",
462
- "commercial": "Commercial use rights"
477
+ "commercial": "FSL exception (embed, white-label, resell)"
463
478
  }
464
479
  },
465
480
  "fullerene": {
@@ -467,7 +482,7 @@
467
482
  "cta": "Get Fullerene",
468
483
  "features": {
469
484
  "diamond": "Everything in Diamond",
470
- "commercial": "Commercial use rights (AGPL exception)",
485
+ "commercial": "FSL exception: embed, white-label, or resell Vibecarbon-powered services",
471
486
  "clients": "Deploy for clients & organizations",
472
487
  "corporate": "Agency & enterprise teams",
473
488
  "support": "Priority email support",
@@ -496,7 +511,7 @@
496
511
  },
497
512
  "q5": {
498
513
  "question": "How does pricing work?",
499
- "answer": "Graphite is free forever — create projects, develop locally, and use every add-on. Diamond ($149 lifetime) is full automation for indie hackers and startups — all deployment modes, backups, CI/CD, and scaling. Fullerene ($499 lifetime) is the commercial license for agencies and enterprise — deploy for clients and organizations without AGPL restrictions. One-time payment, no subscriptions, your infrastructure."
514
+ "answer": "Graphite is free forever — create projects, develop locally, and use every add-on. Diamond ($149 lifetime) is full automation for indie hackers and startups — all deployment modes, backups, CI/CD, and scaling. Fullerene ($499 lifetime) is for agencies and enterprise — deploy for clients, plus the FSL exception to embed, white-label, or resell Vibecarbon-powered services. One-time payment, no subscriptions, your infrastructure."
500
515
  },
501
516
  "q6": {
502
517
  "question": "How many projects can I create with one license?",
@@ -508,7 +523,7 @@
508
523
  },
509
524
  "q8": {
510
525
  "question": "What happens if Vibecarbon shuts down?",
511
- "answer": "Nothing changes for your app. The generated code is MIT-licensed with zero runtime dependency on Vibecarbon — it's just a codebase you own outright. The CLI is open source under AGPL, so you can run it from source indefinitely. Your infrastructure runs on your own servers."
526
+ "answer": "Nothing changes for your app. The generated code is MIT-licensed with zero runtime dependency on Vibecarbon — it's just a codebase you own outright. The CLI is Fair Source (FSL) you can run it from source indefinitely for any non-competing use, and every release becomes MIT open source two years after publication. Your infrastructure runs on your own servers."
512
527
  },
513
528
  "q9": {
514
529
  "question": "Do I need DevOps experience to deploy?",
@@ -537,4 +552,4 @@
537
552
  "terms": "Terms"
538
553
  }
539
554
  }
540
- }
555
+ }
@@ -293,7 +293,7 @@
293
293
  },
294
294
  "deploy": {
295
295
  "label": "Desplegar",
296
- "description": "Despliega a producción con auto-escalado, alta disponibilidad, monitoreo, CI/CD y más."
296
+ "description": "Despliega a producción con escalado, alta disponibilidad, monitoreo, CI/CD y más."
297
297
  }
298
298
  },
299
299
  "techStack": {
@@ -352,7 +352,7 @@
352
352
  "traffic": {
353
353
  "risk": "No soporta el tráfico",
354
354
  "protection": "Auto-escalado",
355
- "how": "Kubernetes autoscaling en pods y nodos VPS"
355
+ "how": "Autoescalado de pods de Kubernetes más escalado de workers con un comando"
356
356
  },
357
357
  "redundancy": {
358
358
  "risk": "Sin redundancia",
@@ -401,25 +401,40 @@
401
401
  "compose": {
402
402
  "name": "Docker Compose",
403
403
  "tagline": "Un VPS, con todo tu stack incluido.",
404
- "features": ["1 servidor", "Región única"],
404
+ "features": [
405
+ "1 servidor",
406
+ "Región única"
407
+ ],
405
408
  "bestFor": "MVPs y herramientas internas"
406
409
  },
407
410
  "composeHa": {
408
411
  "name": "Compose HA",
409
- "tagline": "Dos servidores, conmutación automática.",
410
- "features": ["2 servidores", "Replicación en streaming", "Conmutación automática"],
412
+ "tagline": "Dos regiones, conmutación con un comando.",
413
+ "features": [
414
+ "2 servidores",
415
+ "Replicación en streaming",
416
+ "Conmutación con un comando"
417
+ ],
411
418
  "bestFor": "SaaS en producción sin Kubernetes"
412
419
  },
413
420
  "k8s": {
414
421
  "name": "Kubernetes",
415
- "tagline": "Clúster k3s con autoescalado.",
416
- "features": ["Región única", "Autoescalado horizontal", "Actualizaciones progresivas"],
422
+ "tagline": "Clúster k3s listo para producción.",
423
+ "features": [
424
+ "Región única",
425
+ "Autoescalado horizontal",
426
+ "Actualizaciones progresivas"
427
+ ],
417
428
  "bestFor": "Apps de alto tráfico"
418
429
  },
419
430
  "k8sHa": {
420
431
  "name": "Kubernetes HA",
421
432
  "tagline": "Clústeres multirregión, máxima disponibilidad.",
422
- "features": ["2 regiones", "Conmutación de región", "Autoescalado"],
433
+ "features": [
434
+ "2 regiones",
435
+ "Conmutación de región",
436
+ "Autoescalado de pods"
437
+ ],
423
438
  "bestFor": "Críticos y globales"
424
439
  }
425
440
  },
@@ -459,7 +474,7 @@
459
474
  "backups": "Copias de seguridad automáticas en S3",
460
475
  "cicd": "CI/CD mediante GitHub Actions",
461
476
  "unlimited": "Servidores y proyectos ilimitados",
462
- "commercial": "Derechos de uso comercial"
477
+ "commercial": "Excepción FSL (integración, marca blanca, reventa)"
463
478
  }
464
479
  },
465
480
  "fullerene": {
@@ -467,7 +482,7 @@
467
482
  "cta": "Ir a Fullerene",
468
483
  "features": {
469
484
  "diamond": "Todo lo de Diamond",
470
- "commercial": "Derechos de uso comercial (excepción AGPL)",
485
+ "commercial": "Excepción FSL: integra, ofrece marca blanca o revende servicios impulsados por Vibecarbon",
471
486
  "clients": "Despliega para clientes y organizaciones",
472
487
  "corporate": "Equipos de agencias y empresas",
473
488
  "support": "Soporte prioritario por correo",
@@ -496,7 +511,7 @@
496
511
  },
497
512
  "q5": {
498
513
  "question": "¿Cómo funciona el precio?",
499
- "answer": "Graphite es gratuito para siempre — crea proyectos, desarrolla localmente y usa todos los complementos. Diamond ($149 de por vida) es automatización completa para indie hackers y startups — todos los modos de despliegue, backups, CI/CD y escalado. Fullerene ($499 de por vida) es la licencia comercial para agencias y empresas — despliega para clientes y organizaciones sin restricciones AGPL. Pago único, sin suscripciones."
514
+ "answer": "Graphite es gratuito para siempre — crea proyectos, desarrolla localmente y usa todos los complementos. Diamond ($149 de por vida) es automatización completa para indie hackers y startups — todos los modos de despliegue, backups, CI/CD y escalado. Fullerene ($499 de por vida) es para agencias y empresas — despliega para clientes, más la excepción FSL para integrar, ofrecer marca blanca o revender servicios impulsados por Vibecarbon. Pago único, sin suscripciones."
500
515
  },
501
516
  "q6": {
502
517
  "question": "¿Cuántos proyectos puedo crear con una licencia?",
@@ -508,7 +523,7 @@
508
523
  },
509
524
  "q8": {
510
525
  "question": "¿Qué pasa si Vibecarbon cierra?",
511
- "answer": "No cambia nada para tu aplicación. El código generado está bajo licencia MIT y sin ninguna dependencia en tiempo de ejecución de Vibecarbon: es simplemente una base de código que te pertenece por completo. La CLI es código abierto bajo AGPL, así que puedes ejecutarla desde el código fuente indefinidamente. Tu infraestructura corre en tus propios servidores."
526
+ "answer": "No cambia nada para tu aplicación. El código generado está bajo licencia MIT y sin ninguna dependencia en tiempo de ejecución de Vibecarbon: es simplemente una base de código que te pertenece por completo. La CLI es Fair Source (FSL): puedes ejecutarla desde el código fuente indefinidamente para cualquier uso no competidor, y cada versión se convierte en código abierto MIT dos años después de su publicación. Tu infraestructura corre en tus propios servidores."
512
527
  },
513
528
  "q9": {
514
529
  "question": "¿Necesito experiencia en DevOps para desplegar?",
@@ -293,7 +293,7 @@
293
293
  },
294
294
  "deploy": {
295
295
  "label": "Déployer",
296
- "description": "Déploie en production avec mise à l'échelle automatique, haute disponibilité, monitoring, CI/CD et plus encore."
296
+ "description": "Déploie en production avec mise à l'échelle, haute disponibilité, monitoring, CI/CD et plus encore."
297
297
  }
298
298
  },
299
299
  "techStack": {
@@ -352,7 +352,7 @@
352
352
  "traffic": {
353
353
  "risk": "Ne supporte pas le trafic",
354
354
  "protection": "Mise à l'échelle automatique",
355
- "how": "Kubernetes autoscaling sur les pods et les nœuds VPS"
355
+ "how": "Autoscaling des pods Kubernetes plus mise à l'échelle des workers en une commande"
356
356
  },
357
357
  "redundancy": {
358
358
  "risk": "Zéro redondance",
@@ -401,25 +401,40 @@
401
401
  "compose": {
402
402
  "name": "Docker Compose",
403
403
  "tagline": "Un VPS, toute votre stack incluse.",
404
- "features": ["1 serveur", "Région unique"],
404
+ "features": [
405
+ "1 serveur",
406
+ "Région unique"
407
+ ],
405
408
  "bestFor": "MVP et outils internes"
406
409
  },
407
410
  "composeHa": {
408
411
  "name": "Compose HA",
409
- "tagline": "Deux serveurs, bascule automatique.",
410
- "features": ["2 serveurs", "Réplication en flux", "Bascule automatique"],
412
+ "tagline": "Deux régions, bascule en une commande.",
413
+ "features": [
414
+ "2 serveurs",
415
+ "Réplication en flux",
416
+ "Bascule en une commande"
417
+ ],
411
418
  "bestFor": "SaaS en production sans Kubernetes"
412
419
  },
413
420
  "k8s": {
414
421
  "name": "Kubernetes",
415
- "tagline": "Cluster k3s à mise à l'échelle automatique.",
416
- "features": ["Région unique", "Mise à l'échelle horizontale", "Mises à jour progressives"],
422
+ "tagline": "Cluster k3s de production.",
423
+ "features": [
424
+ "Région unique",
425
+ "Mise à l'échelle horizontale",
426
+ "Mises à jour progressives"
427
+ ],
417
428
  "bestFor": "Applications à fort trafic"
418
429
  },
419
430
  "k8sHa": {
420
431
  "name": "Kubernetes HA",
421
432
  "tagline": "Clusters multi-région, disponibilité maximale.",
422
- "features": ["2 régions", "Bascule de région", "Mise à l'échelle auto"],
433
+ "features": [
434
+ "2 régions",
435
+ "Bascule de région",
436
+ "Autoscaling des pods"
437
+ ],
423
438
  "bestFor": "Critique et mondial"
424
439
  }
425
440
  },
@@ -459,7 +474,7 @@
459
474
  "backups": "Sauvegardes S3 automatisées",
460
475
  "cicd": "CI/CD via GitHub Actions",
461
476
  "unlimited": "Serveurs et projets illimités",
462
- "commercial": "Droits d'usage commercial"
477
+ "commercial": "Exception FSL (intégration, marque blanche, revente)"
463
478
  }
464
479
  },
465
480
  "fullerene": {
@@ -467,7 +482,7 @@
467
482
  "cta": "Passer à Fullerene",
468
483
  "features": {
469
484
  "diamond": "Tout ce qu'inclut Diamond",
470
- "commercial": "Droits d'usage commercial (exception AGPL)",
485
+ "commercial": "Exception FSL : intégrer, proposer en marque blanche ou revendre des services propulsés par Vibecarbon",
471
486
  "clients": "Déployez pour des clients et des organisations",
472
487
  "corporate": "Équipes d'agence et d'entreprise",
473
488
  "support": "Support e-mail prioritaire",
@@ -496,7 +511,7 @@
496
511
  },
497
512
  "q5": {
498
513
  "question": "Comment fonctionne la tarification ?",
499
- "answer": "Graphite est gratuit pour toujours — crée des projets, développe localement et utilise tous les modules. Diamond (149 $ à vie) offre une automatisation complète pour les indie hackers et startups — tous les modes de déploiement, sauvegardes, CI/CD et mise à l'échelle. Fullerene (499 $ à vie) est la licence commerciale pour les agences et l'entreprise — déploie pour des clients et organisations sans restrictions AGPL. Paiement unique, sans abonnement."
514
+ "answer": "Graphite est gratuit pour toujours — crée des projets, développe localement et utilise tous les modules. Diamond (149 $ à vie) offre une automatisation complète pour les indie hackers et startups — tous les modes de déploiement, sauvegardes, CI/CD et mise à l'échelle. Fullerene (499 $ à vie) s'adresse aux agences et à l'entreprise — déploie pour des clients, avec en plus l'exception FSL pour intégrer, proposer en marque blanche ou revendre des services propulsés par Vibecarbon. Paiement unique, sans abonnement."
500
515
  },
501
516
  "q6": {
502
517
  "question": "Combien de projets puis-je créer avec une seule licence ?",
@@ -508,7 +523,7 @@
508
523
  },
509
524
  "q8": {
510
525
  "question": "Que se passe-t-il si Vibecarbon ferme ses portes ?",
511
- "answer": "Rien ne change pour votre application. Le code généré est sous licence MIT et n'a aucune dépendance d'exécution envers Vibecarbon — c'est simplement une base de code qui vous appartient entièrement. La CLI est open source sous AGPL, vous pouvez donc l'exécuter à partir des sources indéfiniment. Votre infrastructure tourne sur vos propres serveurs."
526
+ "answer": "Rien ne change pour votre application. Le code généré est sous licence MIT et n'a aucune dépendance d'exécution envers Vibecarbon — c'est simplement une base de code qui vous appartient entièrement. La CLI est Fair Source (FSL) vous pouvez l'exécuter à partir des sources indéfiniment pour tout usage non concurrent, et chaque version devient open source MIT deux ans après sa publication. Votre infrastructure tourne sur vos propres serveurs."
512
527
  },
513
528
  "q9": {
514
529
  "question": "Faut-il avoir une expérience DevOps pour déployer ?",
@@ -293,7 +293,7 @@
293
293
  },
294
294
  "deploy": {
295
295
  "label": "Publicar",
296
- "description": "Publica em produção com auto-scaling, alta disponibilidade, monitorização, CI/CD e muito mais."
296
+ "description": "Publica em produção com escalonamento, alta disponibilidade, monitorização, CI/CD e muito mais."
297
297
  }
298
298
  },
299
299
  "techStack": {
@@ -352,7 +352,7 @@
352
352
  "traffic": {
353
353
  "risk": "Incapaz de escalar",
354
354
  "protection": "Auto-scaling",
355
- "how": "Auto-scaling Kubernetes em pods e nós VPS"
355
+ "how": "Auto-scaling de pods Kubernetes mais escalonamento de workers com um comando"
356
356
  },
357
357
  "redundancy": {
358
358
  "risk": "Sem redundância",
@@ -401,25 +401,40 @@
401
401
  "compose": {
402
402
  "name": "Docker Compose",
403
403
  "tagline": "Um VPS, com toda a sua stack incluída.",
404
- "features": ["1 servidor", "Região única"],
404
+ "features": [
405
+ "1 servidor",
406
+ "Região única"
407
+ ],
405
408
  "bestFor": "MVPs e ferramentas internas"
406
409
  },
407
410
  "composeHa": {
408
411
  "name": "Compose HA",
409
- "tagline": "Dois servidores, failover automático.",
410
- "features": ["2 servidores", "Replicação em streaming", "Failover automático"],
412
+ "tagline": "Duas regiões, failover com um comando.",
413
+ "features": [
414
+ "2 servidores",
415
+ "Replicação em streaming",
416
+ "Failover com um comando"
417
+ ],
411
418
  "bestFor": "SaaS em produção sem Kubernetes"
412
419
  },
413
420
  "k8s": {
414
421
  "name": "Kubernetes",
415
- "tagline": "Cluster k3s com escalonamento automático.",
416
- "features": ["Região única", "Escalonamento horizontal", "Atualizações graduais"],
422
+ "tagline": "Cluster k3s pronto para produção.",
423
+ "features": [
424
+ "Região única",
425
+ "Escalonamento horizontal",
426
+ "Atualizações graduais"
427
+ ],
417
428
  "bestFor": "Apps de alto tráfego"
418
429
  },
419
430
  "k8sHa": {
420
431
  "name": "Kubernetes HA",
421
432
  "tagline": "Clusters multirregião, disponibilidade máxima.",
422
- "features": ["2 regiões", "Failover de região", "Escalonamento automático"],
433
+ "features": [
434
+ "2 regiões",
435
+ "Failover de região",
436
+ "Auto-scaling de pods"
437
+ ],
423
438
  "bestFor": "Crítico e global"
424
439
  }
425
440
  },
@@ -459,7 +474,7 @@
459
474
  "backups": "Backups S3 automáticos",
460
475
  "cicd": "CI/CD via GitHub Actions",
461
476
  "unlimited": "Servidores e projetos ilimitados",
462
- "commercial": "Direitos de uso comercial"
477
+ "commercial": "Exceção FSL (integração, white-label, revenda)"
463
478
  }
464
479
  },
465
480
  "fullerene": {
@@ -467,7 +482,7 @@
467
482
  "cta": "Ir para Fullerene",
468
483
  "features": {
469
484
  "diamond": "Tudo do Diamond",
470
- "commercial": "Direitos de uso comercial (exceção AGPL)",
485
+ "commercial": "Exceção FSL: integrar, oferecer white-label ou revender serviços baseados no Vibecarbon",
471
486
  "clients": "Implante para clientes e organizações",
472
487
  "corporate": "Equipas de agência e empresas",
473
488
  "support": "Suporte prioritário por e-mail",
@@ -496,7 +511,7 @@
496
511
  },
497
512
  "q5": {
498
513
  "question": "Como funciona o modelo de preços?",
499
- "answer": "O Graphite é gratuito para sempre — cria projetos, desenvolve localmente e usa todos os add-ons. O Diamond (149 $ vitalício) é automatização completa para indie hackers e startups — todos os modos de deployment, backups, CI/CD e escalamento. O Fullerene (499 $ vitalício) é a licença comercial para agências e empresas — faz deployment para clientes e organizações sem restrições AGPL. Pagamento único, sem subscrições."
514
+ "answer": "O Graphite é gratuito para sempre — cria projetos, desenvolve localmente e usa todos os add-ons. O Diamond (149 $ vitalício) é automatização completa para indie hackers e startups — todos os modos de deployment, backups, CI/CD e escalamento. O Fullerene (499 $ vitalício) é para agências e empresas — faz deployment para clientes, mais a exceção FSL para integrar, oferecer white-label ou revender serviços baseados no Vibecarbon. Pagamento único, sem subscrições."
500
515
  },
501
516
  "q6": {
502
517
  "question": "Quantos projetos posso criar com uma licença?",
@@ -508,7 +523,7 @@
508
523
  },
509
524
  "q8": {
510
525
  "question": "O que acontece se o Vibecarbon encerrar?",
511
- "answer": "Nada muda para a sua aplicação. O código gerado tem licença MIT sem qualquer dependência em tempo de execução do Vibecarbon — é apenas uma base de código que lhe pertence por completo. A CLI é open source sob AGPL, por isso pode executá-la a partir do código-fonte indefinidamente. A sua infraestrutura corre nos seus próprios servidores."
526
+ "answer": "Nada muda para a sua aplicação. O código gerado tem licença MIT sem qualquer dependência em tempo de execução do Vibecarbon — é apenas uma base de código que lhe pertence por completo. A CLI é Fair Source (FSL) pode executá-la a partir do código-fonte indefinidamente para qualquer uso não concorrente, e cada versão torna-se open source MIT dois anos após a publicação. A sua infraestrutura corre nos seus próprios servidores."
512
527
  },
513
528
  "q9": {
514
529
  "question": "Preciso de experiência em DevOps para implantar?",
@@ -109,7 +109,7 @@ export function BlogPost() {
109
109
  </div>
110
110
  </header>
111
111
 
112
- <article className="prose prose-invert max-w-none">
112
+ <article className="prose dark:prose-invert max-w-none">
113
113
  <post.Component />
114
114
  </article>
115
115
 
@@ -107,7 +107,7 @@ export function ChangelogEntry() {
107
107
  </div>
108
108
  </header>
109
109
 
110
- <article className="prose prose-invert max-w-none">
110
+ <article className="prose dark:prose-invert max-w-none">
111
111
  <entry.Component />
112
112
  </article>
113
113
 
@@ -52,7 +52,7 @@ const tierData: Record<string, TierInfo> = {
52
52
  gradientClass: 'from-secondary-accent to-fuchsia-400',
53
53
  features: [
54
54
  'Everything in Diamond',
55
- 'Commercial use rights (AGPL exception)',
55
+ 'FSL exception: embed, white-label, or resell Vibecarbon-powered services',
56
56
  'Deploy for clients & organizations',
57
57
  'Agency & enterprise teams',
58
58
  'Priority email support',