forgedock 1.0.16 → 1.0.18

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 (190) hide show
  1. package/README.md +54 -3
  2. package/bin/cross-publish.mjs +344 -0
  3. package/bin/forgedock.mjs +2205 -541
  4. package/bin/github-app-manifest.json.license +2 -0
  5. package/bin/hooks/session-start.mjs +4 -5
  6. package/bin/registry.mjs +20 -0
  7. package/bin/tui.mjs +172 -96
  8. package/commands/adopt.md +433 -0
  9. package/commands/analytics.md +2 -0
  10. package/commands/audit-agents.md +2 -0
  11. package/commands/audit.md +2 -0
  12. package/commands/autopilot.md +77 -0
  13. package/commands/changelog.md +354 -0
  14. package/commands/cleanup.md +2 -0
  15. package/commands/compat-audit.md +330 -0
  16. package/commands/deploy-info.md +6 -5
  17. package/commands/design-bench.md +176 -0
  18. package/commands/design-render-critique-loop.md +103 -0
  19. package/commands/design.md +259 -0
  20. package/commands/diagnose.md +483 -0
  21. package/commands/explain.md +349 -0
  22. package/commands/forge-stats.md +2 -0
  23. package/commands/forgedock-init.md +2 -0
  24. package/commands/geo-audit.md +2 -0
  25. package/commands/incident-response.md +2 -0
  26. package/commands/issue.md +9 -3
  27. package/commands/milestone.md +2 -0
  28. package/commands/optimize.md +411 -0
  29. package/commands/orchestrate.md +239 -0
  30. package/commands/pipeline-health.md +60 -1
  31. package/commands/qa-sweep.md +39 -2
  32. package/commands/quality-gate.md +67 -0
  33. package/commands/replay.md +263 -0
  34. package/commands/resume.md +264 -0
  35. package/commands/review-pr-agents.md +5 -1
  36. package/commands/review-pr-staging.md +160 -2
  37. package/commands/review-pr.md +85 -3
  38. package/commands/rollback.md +2 -0
  39. package/commands/scope.md +280 -0
  40. package/commands/security-audit.md +2 -0
  41. package/commands/status.md +262 -0
  42. package/commands/sync-ecosystem.md +2 -0
  43. package/commands/test-gate.md +929 -0
  44. package/commands/validate.md +2 -0
  45. package/commands/work-on/build/architect.md +128 -18
  46. package/commands/work-on/build/context.md +130 -17
  47. package/commands/work-on/build/implement.md +7 -3
  48. package/commands/work-on/build/validate.md +2 -0
  49. package/commands/work-on/build.md +32 -7
  50. package/commands/work-on/close.md +85 -0
  51. package/commands/work-on/decompose.md +2 -0
  52. package/commands/work-on/investigate.md +30 -3
  53. package/commands/work-on/review.md +13 -1
  54. package/commands/work-on-monolithic.md +2 -0
  55. package/commands/work-on.md +676 -38
  56. package/docs/BRAND.md +51 -0
  57. package/docs/CI.md +177 -0
  58. package/docs/CONFIG.md +94 -0
  59. package/docs/FORGE-PROTOCOL.md +324 -0
  60. package/docs/articles/b-vs-c-baseline.md +210 -0
  61. package/docs/articles/full-abc-benchmark.md +205 -0
  62. package/docs/articles/per-repo-adaptive-scripts-token-savings.md +174 -0
  63. package/docs/articles/selective-spec-loading-token-savings.md +140 -0
  64. package/docs/claude-breakpoints.json +47 -0
  65. package/docs/design/abc-benchmark.md +195 -0
  66. package/docs/design/design-architect-rationale.md +123 -0
  67. package/docs/design/design-memory.md +61 -0
  68. package/docs/design/design-spec-schema.md +248 -0
  69. package/docs/design/design-system-lint.md +150 -0
  70. package/docs/design/divergent-generation.md +106 -0
  71. package/docs/design/effects-appropriateness.md +133 -0
  72. package/docs/design/fixtures/briefs/README.md +47 -0
  73. package/docs/design/fixtures/briefs/cadence.md +39 -0
  74. package/docs/design/fixtures/briefs/plume.md +39 -0
  75. package/docs/design/fixtures/briefs/slipstream.md +39 -0
  76. package/docs/design/fixtures/briefs/tender.md +39 -0
  77. package/docs/design/fixtures/briefs/voltage.md +39 -0
  78. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
  79. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
  80. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
  81. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
  82. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
  83. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
  84. package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
  85. package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
  86. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
  87. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
  88. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
  89. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
  90. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
  91. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
  92. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
  93. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
  94. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
  95. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
  96. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
  97. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
  98. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
  99. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
  100. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
  101. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
  102. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
  103. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
  104. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
  105. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
  106. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
  107. package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
  108. package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
  109. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
  110. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
  111. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
  112. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
  113. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
  114. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
  115. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
  116. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
  117. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
  118. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
  119. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
  120. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
  121. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
  122. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
  123. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
  124. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
  125. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
  126. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
  127. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
  128. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
  129. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
  130. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
  131. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
  132. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
  133. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
  134. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
  135. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
  136. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
  137. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
  138. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
  139. package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
  140. package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
  141. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
  142. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
  143. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
  144. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
  145. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
  146. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
  147. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
  148. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
  149. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
  150. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
  151. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
  152. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
  153. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
  154. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
  155. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
  156. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
  157. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
  158. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
  159. package/docs/design/foundations/brutalist.css +294 -0
  160. package/docs/design/foundations/editorial.css +300 -0
  161. package/docs/design/foundations/minimal-luxury.css +295 -0
  162. package/docs/design/foundations/technical.css +293 -0
  163. package/docs/design/foundations/warm-photo.css +299 -0
  164. package/docs/design/reference-corpus.md +1726 -0
  165. package/docs/design/render-critique-loop.md +57 -0
  166. package/docs/site/getting-started.md +21 -0
  167. package/docs/spec-graph-schema.md +397 -0
  168. package/package.json +3 -3
  169. package/scripts/bench-scorecard.mjs +239 -0
  170. package/scripts/build-spec-graph.mjs +509 -0
  171. package/scripts/classify-lane.sh +138 -0
  172. package/scripts/design-system-lint.mjs +993 -0
  173. package/scripts/graph-query.sh +486 -0
  174. package/scripts/transition-label.sh +169 -0
  175. package/scripts/validate-pr-target.sh +30 -0
  176. package/scripts/validate-spec-graph.sh +423 -0
  177. package/templates/devdocs/README.md +72 -0
  178. package/templates/devdocs/agent/using-forgedock.md +3 -0
  179. package/templates/devdocs/agent/using-github.md +3 -0
  180. package/templates/devdocs/index.yaml +162 -0
  181. package/templates/devdocs/project/architecture.md +3 -0
  182. package/templates/devdocs/project/conventions.md +3 -0
  183. package/templates/devdocs/project/custom-instructions.md +3 -0
  184. package/templates/devdocs/project/glossary.md +3 -0
  185. package/templates/devdocs/project/stack.md +3 -0
  186. package/templates/devdocs/templates/commit-convention.md +3 -0
  187. package/templates/devdocs/templates/issue.md +3 -0
  188. package/templates/devdocs/templates/pull-request.md +3 -0
  189. package/templates/devdocs/templates/review-finding.md +3 -0
  190. package/templates/workflows/forgedock-review.yml +96 -0
@@ -0,0 +1,568 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Voltage — Serverless AI Infrastructure</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;0,9..40,800;1,9..40,400&family=DM+Mono:wght@300;400;500&display=swap" rel="stylesheet" />
9
+ <style>
10
+ body { font-family: 'DM Sans', sans-serif; background: #050a14; color: #e8ecf4; }
11
+ .mono { font-family: 'DM Mono', monospace; }
12
+ .gradient-text {
13
+ background: linear-gradient(135deg, #38bdf8 0%, #818cf8 50%, #e879f9 100%);
14
+ -webkit-background-clip: text;
15
+ -webkit-text-fill-color: transparent;
16
+ background-clip: text;
17
+ }
18
+ .gradient-text-warm {
19
+ background: linear-gradient(135deg, #fb923c 0%, #f472b6 100%);
20
+ -webkit-background-clip: text;
21
+ -webkit-text-fill-color: transparent;
22
+ background-clip: text;
23
+ }
24
+ .surface { background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.08); }
25
+ .surface-hover:hover { background: rgba(255,255,255,0.05); border-color: rgba(255,255,255,0.14); }
26
+ .glow-blue { box-shadow: 0 0 30px rgba(56,189,248,0.2); }
27
+ .glow-purple { box-shadow: 0 0 30px rgba(129,140,248,0.2); }
28
+ .btn-cta {
29
+ background: linear-gradient(135deg, #38bdf8, #818cf8);
30
+ transition: all 0.2s;
31
+ }
32
+ .btn-cta:hover {
33
+ background: linear-gradient(135deg, #7dd3fc, #a5b4fc);
34
+ transform: translateY(-1px);
35
+ box-shadow: 0 8px 25px rgba(56,189,248,0.35);
36
+ }
37
+ .code-surface {
38
+ background: #090d1a;
39
+ border: 1px solid rgba(56,189,248,0.15);
40
+ }
41
+ /* Syntax */
42
+ .t-k { color: #c084fc; } /* keyword */
43
+ .t-d { color: #f472b6; } /* decorator */
44
+ .t-s { color: #4ade80; } /* string */
45
+ .t-c { color: #374151; } /* comment */
46
+ .t-f { color: #60a5fa; } /* function */
47
+ .t-n { color: #fb923c; } /* number */
48
+ .t-t { color: #22d3ee; } /* type */
49
+ .t-p { color: #a78bfa; } /* punctuation */
50
+ .gpu-badge {
51
+ background: linear-gradient(135deg, rgba(56,189,248,0.1), rgba(129,140,248,0.1));
52
+ border: 1px solid rgba(56,189,248,0.25);
53
+ }
54
+ .stat-card {
55
+ background: linear-gradient(135deg, rgba(56,189,248,0.05), rgba(129,140,248,0.05));
56
+ border: 1px solid rgba(129,140,248,0.2);
57
+ }
58
+ @keyframes scan {
59
+ 0% { transform: translateY(-100%); }
60
+ 100% { transform: translateY(400%); }
61
+ }
62
+ .scan-line {
63
+ animation: scan 3s linear infinite;
64
+ background: linear-gradient(to bottom, transparent, rgba(56,189,248,0.15), transparent);
65
+ }
66
+ @keyframes blink {
67
+ 0%, 100% { opacity: 1; }
68
+ 50% { opacity: 0; }
69
+ }
70
+ .cursor { animation: blink 1s step-end infinite; }
71
+ .timeline-dot { background: linear-gradient(135deg, #38bdf8, #818cf8); }
72
+ .feature-number {
73
+ background: linear-gradient(135deg, rgba(56,189,248,0.15), rgba(129,140,248,0.15));
74
+ border: 1px solid rgba(56,189,248,0.2);
75
+ }
76
+ .gradient-border {
77
+ position: relative;
78
+ }
79
+ .gradient-border::before {
80
+ content: '';
81
+ position: absolute;
82
+ inset: 0;
83
+ border-radius: inherit;
84
+ padding: 1px;
85
+ background: linear-gradient(135deg, #38bdf8, #818cf8, #e879f9);
86
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
87
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
88
+ -webkit-mask-composite: xor;
89
+ mask-composite: exclude;
90
+ }
91
+ .noise {
92
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
93
+ }
94
+ .tag-pill {
95
+ background: rgba(56,189,248,0.1);
96
+ border: 1px solid rgba(56,189,248,0.2);
97
+ color: #7dd3fc;
98
+ }
99
+ </style>
100
+ </head>
101
+ <body class="noise antialiased">
102
+
103
+ <!-- Nav -->
104
+ <nav class="fixed top-0 w-full z-50 border-b border-white/5 bg-[#050a14]/90 backdrop-blur-xl">
105
+ <div class="max-w-7xl mx-auto px-6 h-16 flex items-center justify-between">
106
+ <div class="flex items-center gap-8">
107
+ <div class="flex items-center gap-2.5">
108
+ <div class="w-8 h-8 rounded-lg btn-cta flex items-center justify-center">
109
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1L1 8h5l1 5 6-7H8L7 1z" fill="white"/></svg>
110
+ </div>
111
+ <span class="font-bold text-white text-lg tracking-tight">Voltage</span>
112
+ </div>
113
+ <div class="hidden lg:flex items-center gap-1">
114
+ <a href="#" class="px-3 py-1.5 text-sm text-gray-400 hover:text-white transition-colors rounded-lg hover:bg-white/5">Platform</a>
115
+ <a href="#" class="px-3 py-1.5 text-sm text-gray-400 hover:text-white transition-colors rounded-lg hover:bg-white/5">Docs</a>
116
+ <a href="#" class="px-3 py-1.5 text-sm text-gray-400 hover:text-white transition-colors rounded-lg hover:bg-white/5">Pricing</a>
117
+ <a href="#" class="px-3 py-1.5 text-sm text-gray-400 hover:text-white transition-colors rounded-lg hover:bg-white/5">Blog</a>
118
+ <a href="#" class="px-3 py-1.5 text-sm text-gray-400 hover:text-white transition-colors rounded-lg hover:bg-white/5">Changelog</a>
119
+ </div>
120
+ </div>
121
+ <div class="flex items-center gap-3">
122
+ <a href="#" class="text-sm text-gray-400 hover:text-white transition-colors px-3 py-1.5">Sign in</a>
123
+ <a href="#" class="btn-cta text-sm font-semibold text-white px-5 py-2 rounded-lg">Get started free</a>
124
+ </div>
125
+ </div>
126
+ </nav>
127
+
128
+ <!-- Hero -->
129
+ <section class="relative pt-32 pb-24 overflow-hidden">
130
+ <!-- Background glows -->
131
+ <div class="absolute top-0 left-1/2 -translate-x-1/2 w-[800px] h-[500px] rounded-full bg-blue-500/5 blur-[120px] pointer-events-none"></div>
132
+ <div class="absolute top-32 left-1/4 w-[400px] h-[300px] rounded-full bg-purple-500/8 blur-[100px] pointer-events-none"></div>
133
+ <div class="absolute top-32 right-1/4 w-[400px] h-[300px] rounded-full bg-pink-500/6 blur-[100px] pointer-events-none"></div>
134
+
135
+ <div class="max-w-7xl mx-auto px-6 relative">
136
+ <!-- Badge -->
137
+ <div class="flex justify-center mb-8">
138
+ <div class="tag-pill mono text-xs px-4 py-1.5 rounded-full flex items-center gap-2">
139
+ <span class="w-1.5 h-1.5 rounded-full bg-sky-400 animate-pulse"></span>
140
+ Public beta · H100 GPUs now available
141
+ </div>
142
+ </div>
143
+
144
+ <h1 class="text-center text-6xl lg:text-7xl font-bold tracking-tight leading-[1.05] mb-8">
145
+ <span class="text-white">AI infrastructure</span><br />
146
+ <span class="gradient-text">that disappears.</span>
147
+ </h1>
148
+
149
+ <p class="text-center text-xl text-gray-400 max-w-2xl mx-auto leading-relaxed mb-12">
150
+ Voltage runs your Python functions on GPUs in the cloud — triggered by a decorator, billed by the second, scaled to zero when idle. No clusters. No ops. No surprises on your bill.
151
+ </p>
152
+
153
+ <div class="flex flex-col sm:flex-row items-center justify-center gap-4 mb-20">
154
+ <a href="#" class="btn-cta text-white font-semibold px-8 py-3.5 rounded-xl text-base w-full sm:w-auto text-center">
155
+ Run your first function
156
+ </a>
157
+ <a href="#" class="surface surface-hover text-gray-300 font-semibold px-8 py-3.5 rounded-xl text-base transition-all w-full sm:w-auto text-center">
158
+ View the docs
159
+ </a>
160
+ </div>
161
+
162
+ <!-- Stats -->
163
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4 max-w-3xl mx-auto mb-20">
164
+ <div class="stat-card rounded-xl p-4 text-center">
165
+ <div class="text-2xl font-bold gradient-text">$0</div>
166
+ <div class="text-xs text-gray-500 mt-1">idle cost</div>
167
+ </div>
168
+ <div class="stat-card rounded-xl p-4 text-center">
169
+ <div class="text-2xl font-bold gradient-text">&lt;3s</div>
170
+ <div class="text-xs text-gray-500 mt-1">cold start</div>
171
+ </div>
172
+ <div class="stat-card rounded-xl p-4 text-center">
173
+ <div class="text-2xl font-bold gradient-text">1000+</div>
174
+ <div class="text-xs text-gray-500 mt-1">parallel containers</div>
175
+ </div>
176
+ <div class="stat-card rounded-xl p-4 text-center">
177
+ <div class="text-2xl font-bold gradient-text">A100</div>
178
+ <div class="text-xs text-gray-500 mt-1">→ H100 on demand</div>
179
+ </div>
180
+ </div>
181
+
182
+ <!-- Hero code -->
183
+ <div class="max-w-3xl mx-auto gradient-border rounded-2xl overflow-hidden">
184
+ <div class="code-surface rounded-2xl overflow-hidden">
185
+ <div class="flex items-center gap-2 px-5 py-3.5 border-b border-white/5">
186
+ <div class="flex gap-1.5">
187
+ <div class="w-3 h-3 rounded-full bg-red-500/60"></div>
188
+ <div class="w-3 h-3 rounded-full bg-yellow-500/60"></div>
189
+ <div class="w-3 h-3 rounded-full bg-green-500/60"></div>
190
+ </div>
191
+ <div class="flex-1 text-center">
192
+ <span class="mono text-xs text-gray-500">inference_server.py</span>
193
+ </div>
194
+ <div class="gpu-badge mono text-[10px] text-sky-300 px-2 py-0.5 rounded">A10G · 24GB VRAM</div>
195
+ </div>
196
+ <div class="relative overflow-hidden">
197
+ <div class="scan-line absolute inset-x-0 h-16 pointer-events-none"></div>
198
+ <pre class="p-6 text-sm mono leading-[1.8] overflow-x-auto"><code><span class="t-k">import</span> voltage
199
+ <span class="t-k">from</span> vllm <span class="t-k">import</span> LLM, SamplingParams
200
+ <span class="t-k">from</span> typing <span class="t-k">import</span> Iterator
201
+
202
+
203
+ <span class="t-d">@voltage.endpoint</span>(
204
+ gpu<span class="t-k">=</span><span class="t-s">"A10G"</span>,
205
+ min_containers<span class="t-k">=</span><span class="t-n">1</span>, <span class="t-c"># keep one warm for low-latency</span>
206
+ max_containers<span class="t-k">=</span><span class="t-n">20</span>, <span class="t-c"># burst under traffic</span>
207
+ scaledown_window<span class="t-k">=</span><span class="t-n">300</span>, <span class="t-c"># 5 min grace period</span>
208
+ )
209
+ <span class="t-k">class</span> <span class="t-t">LlamaServer</span>:
210
+ <span class="t-k">def</span> <span class="t-f">__init__</span>(self):
211
+ <span class="t-c"># Runs once — model loaded into warm container</span>
212
+ self.llm <span class="t-k">=</span> LLM(
213
+ model<span class="t-k">=</span><span class="t-s">"meta-llama/Llama-3.1-8B-Instruct"</span>,
214
+ tensor_parallel_size<span class="t-k">=</span><span class="t-n">1</span>,
215
+ dtype<span class="t-k">=</span><span class="t-s">"bfloat16"</span>,
216
+ )
217
+ self.params <span class="t-k">=</span> SamplingParams(temperature<span class="t-k">=</span><span class="t-n">0.7</span>, max_tokens<span class="t-k">=</span><span class="t-n">512</span>)
218
+
219
+ <span class="t-d">@voltage.web_endpoint</span>(method<span class="t-k">=</span><span class="t-s">"POST"</span>, streaming<span class="t-k">=</span><span class="t-n">True</span>)
220
+ <span class="t-k">def</span> <span class="t-f">generate</span>(self, prompt: <span class="t-t">str</span>) <span class="t-k">-></span> Iterator[<span class="t-t">str</span>]:
221
+ <span class="t-k">for</span> output <span class="t-k">in</span> self.llm.generate_streaming([prompt], self.params):
222
+ <span class="t-k">yield</span> output.outputs[<span class="t-n">0</span>].text
223
+
224
+
225
+ <span class="t-c"># Deploy — returns a live HTTPS endpoint</span>
226
+ <span class="t-c"># $ voltage deploy inference_server.py::LlamaServer</span>
227
+ <span class="t-c"># → https://api.voltage.run/org/llama-server/generate</span></code></pre>
228
+ </div>
229
+ <div class="border-t border-white/5 px-5 py-3 flex items-center justify-between">
230
+ <div class="flex items-center gap-3">
231
+ <div class="flex items-center gap-1.5">
232
+ <span class="w-2 h-2 rounded-full bg-green-400 animate-pulse"></span>
233
+ <span class="mono text-xs text-green-400">deployed · 1 warm replica</span>
234
+ </div>
235
+ </div>
236
+ <div class="mono text-xs text-gray-600">p50 latency: 82ms · cost: $0.00038/req</div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ </section>
242
+
243
+ <!-- Architecture strip -->
244
+ <section class="border-y border-white/5 py-16 bg-gradient-to-r from-sky-500/3 via-purple-500/3 to-pink-500/3">
245
+ <div class="max-w-7xl mx-auto px-6">
246
+ <div class="flex flex-col md:flex-row items-center justify-between gap-8">
247
+ <div class="text-center md:text-left">
248
+ <h2 class="text-2xl font-bold text-white mb-2">The full stack, managed.</h2>
249
+ <p class="text-gray-400 text-sm max-w-sm">From your Python function to a running GPU container — Voltage handles every layer below your code.</p>
250
+ </div>
251
+ <div class="flex items-center gap-3 flex-wrap justify-center">
252
+ <div class="surface rounded-lg px-4 py-2.5 text-sm text-gray-300">Your Python code</div>
253
+ <svg class="w-4 h-4 text-sky-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
254
+ <div class="surface rounded-lg px-4 py-2.5 text-sm text-gray-300">Container image</div>
255
+ <svg class="w-4 h-4 text-sky-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
256
+ <div class="surface rounded-lg px-4 py-2.5 text-sm text-gray-300">GPU scheduler</div>
257
+ <svg class="w-4 h-4 text-sky-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
258
+ <div class="gpu-badge rounded-lg px-4 py-2.5 text-sm text-sky-300">Running GPU</div>
259
+ <svg class="w-4 h-4 text-sky-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
260
+ <div class="surface rounded-lg px-4 py-2.5 text-sm text-gray-300">Result + logs</div>
261
+ </div>
262
+ </div>
263
+ </div>
264
+ </section>
265
+
266
+ <!-- Features -->
267
+ <section class="py-28 max-w-7xl mx-auto px-6">
268
+ <div class="text-center mb-20">
269
+ <h2 class="text-4xl font-bold text-white mb-4">Everything ML teams need.<br /><span class="gradient-text">Nothing they don't.</span></h2>
270
+ <p class="text-gray-400 max-w-xl mx-auto">Voltage ships the primitives you actually use. No sprawling configuration surfaces. No YAML pipelines.</p>
271
+ </div>
272
+
273
+ <div class="space-y-6">
274
+
275
+ <!-- Feature 1 -->
276
+ <div class="grid lg:grid-cols-2 gap-6 items-center">
277
+ <div class="surface rounded-2xl p-8 surface-hover transition-all">
278
+ <div class="feature-number w-10 h-10 rounded-xl flex items-center justify-center mono text-sky-300 font-bold text-sm mb-6">01</div>
279
+ <h3 class="text-xl font-bold text-white mb-3">On-demand GPUs with one decorator</h3>
280
+ <p class="text-gray-400 leading-relaxed mb-6">Declare hardware requirements inline with your code. Voltage provisions exactly what you ask for — no cluster sizing, no instance family research, no reserved capacity planning.</p>
281
+ <div class="flex flex-wrap gap-2">
282
+ <span class="gpu-badge mono text-xs text-sky-300 px-3 py-1.5 rounded-lg">NVIDIA T4</span>
283
+ <span class="gpu-badge mono text-xs text-sky-300 px-3 py-1.5 rounded-lg">A10G</span>
284
+ <span class="gpu-badge mono text-xs text-sky-300 px-3 py-1.5 rounded-lg">A100-40GB</span>
285
+ <span class="gpu-badge mono text-xs text-sky-300 px-3 py-1.5 rounded-lg">A100-80GB</span>
286
+ <span class="gpu-badge mono text-xs text-sky-300 px-3 py-1.5 rounded-lg">H100</span>
287
+ </div>
288
+ </div>
289
+ <div class="code-surface rounded-2xl overflow-hidden glow-blue">
290
+ <div class="flex items-center gap-2 px-5 py-3.5 border-b border-white/5">
291
+ <div class="flex gap-1.5"><div class="w-2.5 h-2.5 rounded-full bg-red-500/60"></div><div class="w-2.5 h-2.5 rounded-full bg-yellow-500/60"></div><div class="w-2.5 h-2.5 rounded-full bg-green-500/60"></div></div>
292
+ <span class="mono text-xs text-gray-500 ml-2">train_diffusion.py</span>
293
+ </div>
294
+ <pre class="p-5 text-sm mono leading-relaxed overflow-x-auto"><code><span class="t-k">import</span> voltage
295
+ <span class="t-k">from</span> diffusers <span class="t-k">import</span> DDPMPipeline
296
+
297
+
298
+ <span class="t-d">@voltage.function</span>(
299
+ gpu<span class="t-k">=</span><span class="t-s">"A100-80GB"</span>,
300
+ memory<span class="t-k">=</span><span class="t-s">"96GB"</span>,
301
+ cpu<span class="t-k">=</span><span class="t-n">8</span>,
302
+ timeout<span class="t-k">=</span><span class="t-n">14400</span>, <span class="t-c"># 4 hours</span>
303
+ )
304
+ <span class="t-k">def</span> <span class="t-f">train_diffusion_model</span>(
305
+ config_path: <span class="t-t">str</span>,
306
+ output_path: <span class="t-t">str</span>,
307
+ ) <span class="t-k">-></span> <span class="t-t">dict</span>:
308
+ pipeline <span class="t-k">=</span> DDPMPipeline.from_pretrained(config_path)
309
+ pipeline.train(output_dir<span class="t-k">=</span>output_path)
310
+ <span class="t-k">return</span> pipeline.metrics()
311
+
312
+
313
+ <span class="t-c"># $ python train_diffusion.py</span>
314
+ metrics <span class="t-k">=</span> train_diffusion_model.remote(
315
+ config_path<span class="t-k">=</span><span class="t-s">"./configs/sd-xl.yaml"</span>,
316
+ output_path<span class="t-k">=</span><span class="t-s">"s3://models/sd-xl-v2"</span>,
317
+ )</code></pre>
318
+ </div>
319
+ </div>
320
+
321
+ <!-- Feature 2 -->
322
+ <div class="grid lg:grid-cols-2 gap-6 items-center">
323
+ <div class="code-surface rounded-2xl overflow-hidden glow-purple order-2 lg:order-1">
324
+ <div class="flex items-center gap-2 px-5 py-3.5 border-b border-white/5">
325
+ <div class="flex gap-1.5"><div class="w-2.5 h-2.5 rounded-full bg-red-500/60"></div><div class="w-2.5 h-2.5 rounded-full bg-yellow-500/60"></div><div class="w-2.5 h-2.5 rounded-full bg-green-500/60"></div></div>
326
+ <span class="mono text-xs text-gray-500 ml-2">hyperparam_sweep.py</span>
327
+ </div>
328
+ <pre class="p-5 text-sm mono leading-relaxed overflow-x-auto"><code><span class="t-k">import</span> itertools, voltage
329
+
330
+
331
+ <span class="t-d">@voltage.function</span>(gpu<span class="t-k">=</span><span class="t-s">"T4"</span>, memory<span class="t-k">=</span><span class="t-s">"16GB"</span>)
332
+ <span class="t-k">def</span> <span class="t-f">train_run</span>(lr: <span class="t-t">float</span>, dropout: <span class="t-t">float</span>, layers: <span class="t-t">int</span>) <span class="t-k">-></span> <span class="t-t">float</span>:
333
+ model <span class="t-k">=</span> build_model(layers, dropout)
334
+ <span class="t-k">return</span> fit(model, lr<span class="t-k">=</span>lr).best_val_loss
335
+
336
+
337
+ <span class="t-c"># 180 hyperparameter combinations</span>
338
+ grid <span class="t-k">=</span> [
339
+ {<span class="t-s">"lr"</span>: lr, <span class="t-s">"dropout"</span>: d, <span class="t-s">"layers"</span>: l}
340
+ <span class="t-k">for</span> lr, d, l <span class="t-k">in</span> itertools.product(
341
+ [<span class="t-n">1e-4</span>, <span class="t-n">3e-4</span>, <span class="t-n">1e-3</span>],
342
+ [<span class="t-n">0.0</span>, <span class="t-n">0.1</span>, <span class="t-n">0.2</span>, <span class="t-n">0.3</span>],
343
+ [<span class="t-n">4</span>, <span class="t-n">6</span>, <span class="t-n">8</span>, <span class="t-n">12</span>, <span class="t-n">16</span>],
344
+ )
345
+ ]
346
+
347
+ <span class="t-c"># All 180 run in parallel on separate GPU containers</span>
348
+ results <span class="t-k">=</span> voltage.map(train_run, grid)
349
+ best <span class="t-k">=</span> <span class="t-f">min</span>(results, key<span class="t-k">=</span><span class="t-k">lambda</span> r: r)
350
+ <span class="t-f">print</span>(<span class="t-s">f"Best val loss: </span>{best:.4f}<span class="t-s">"</span>)
351
+ <span class="t-c"># 180 runs · 47 minutes · $12.40</span></code></pre>
352
+ </div>
353
+ <div class="surface rounded-2xl p-8 surface-hover transition-all order-1 lg:order-2">
354
+ <div class="feature-number w-10 h-10 rounded-xl flex items-center justify-center mono text-purple-300 font-bold text-sm mb-6">02</div>
355
+ <h3 class="text-xl font-bold text-white mb-3">Parallel sweep — not a queue</h3>
356
+ <p class="text-gray-400 leading-relaxed mb-6">Pass a list to <code class="mono text-sky-300">voltage.map()</code> and every item gets its own container, launched simultaneously. What would be an 8-hour sequential sweep becomes a 47-minute parallel one.</p>
357
+ <div class="space-y-3">
358
+ <div class="flex items-center gap-3 text-sm text-gray-400">
359
+ <div class="w-6 h-6 rounded-full bg-purple-500/20 border border-purple-500/30 flex items-center justify-center flex-shrink-0">
360
+ <svg class="w-3 h-3 text-purple-400" fill="currentColor" viewBox="0 0 20 20"><path d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"/></svg>
361
+ </div>
362
+ True parallelism — not thread-based concurrency
363
+ </div>
364
+ <div class="flex items-center gap-3 text-sm text-gray-400">
365
+ <div class="w-6 h-6 rounded-full bg-purple-500/20 border border-purple-500/30 flex items-center justify-center flex-shrink-0">
366
+ <svg class="w-3 h-3 text-purple-400" fill="currentColor" viewBox="0 0 20 20"><path d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"/></svg>
367
+ </div>
368
+ Collect results as futures or wait for all
369
+ </div>
370
+ <div class="flex items-center gap-3 text-sm text-gray-400">
371
+ <div class="w-6 h-6 rounded-full bg-purple-500/20 border border-purple-500/30 flex items-center justify-center flex-shrink-0">
372
+ <svg class="w-3 h-3 text-purple-400" fill="currentColor" viewBox="0 0 20 20"><path d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"/></svg>
373
+ </div>
374
+ Built-in retry on spot instance interruption
375
+ </div>
376
+ </div>
377
+ </div>
378
+ </div>
379
+
380
+ </div>
381
+ </section>
382
+
383
+ <!-- Use cases -->
384
+ <section class="border-t border-white/5 py-24 bg-gradient-to-b from-transparent to-sky-500/3">
385
+ <div class="max-w-7xl mx-auto px-6">
386
+ <h2 class="text-3xl font-bold text-white text-center mb-4">What teams build on Voltage</h2>
387
+ <p class="text-gray-400 text-center max-w-xl mx-auto mb-16">Designed for the workloads that overwhelm serverless functions and overprovision Kubernetes clusters.</p>
388
+ <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-5">
389
+ <div class="surface surface-hover rounded-xl p-6 transition-all cursor-default">
390
+ <div class="w-10 h-10 rounded-xl bg-sky-500/10 border border-sky-500/20 flex items-center justify-center mb-4">
391
+ <svg class="w-5 h-5 text-sky-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg>
392
+ </div>
393
+ <h3 class="font-semibold text-white mb-2">LLM Fine-tuning</h3>
394
+ <p class="text-gray-500 text-sm leading-relaxed">Fine-tune Llama, Mistral, or custom architectures with LoRA or full-parameter training. A100 or H100. Checkpoints written to persistent volumes.</p>
395
+ </div>
396
+ <div class="surface surface-hover rounded-xl p-6 transition-all cursor-default">
397
+ <div class="w-10 h-10 rounded-xl bg-purple-500/10 border border-purple-500/20 flex items-center justify-center mb-4">
398
+ <svg class="w-5 h-5 text-purple-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg>
399
+ </div>
400
+ <h3 class="font-semibold text-white mb-2">Inference Serving</h3>
401
+ <p class="text-gray-500 text-sm leading-relaxed">Deploy vLLM, TGI, or custom serving code as an HTTPS endpoint. Keep a warm replica; burst on traffic. Pay per token served, not per GPU-hour reserved.</p>
402
+ </div>
403
+ <div class="surface surface-hover rounded-xl p-6 transition-all cursor-default">
404
+ <div class="w-10 h-10 rounded-xl bg-pink-500/10 border border-pink-500/20 flex items-center justify-center mb-4">
405
+ <svg class="w-5 h-5 text-pink-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4"/></svg>
406
+ </div>
407
+ <h3 class="font-semibold text-white mb-2">Embedding Pipelines</h3>
408
+ <p class="text-gray-500 text-sm leading-relaxed">Embed millions of documents for RAG indexes. Fan out across hundreds of GPU containers in parallel. Write results to S3, Pinecone, or pgvector.</p>
409
+ </div>
410
+ <div class="surface surface-hover rounded-xl p-6 transition-all cursor-default">
411
+ <div class="w-10 h-10 rounded-xl bg-orange-500/10 border border-orange-500/20 flex items-center justify-center mb-4">
412
+ <svg class="w-5 h-5 text-orange-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
413
+ </div>
414
+ <h3 class="font-semibold text-white mb-2">Scheduled Batch Jobs</h3>
415
+ <p class="text-gray-500 text-sm leading-relaxed">Run nightly retraining, daily data processing, or weekly evals on a cron schedule. No separate orchestration layer. Logs and results stored automatically.</p>
416
+ </div>
417
+ <div class="surface surface-hover rounded-xl p-6 transition-all cursor-default">
418
+ <div class="w-10 h-10 rounded-xl bg-green-500/10 border border-green-500/20 flex items-center justify-center mb-4">
419
+ <svg class="w-5 h-5 text-green-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/></svg>
420
+ </div>
421
+ <h3 class="font-semibold text-white mb-2">Hyperparameter Sweeps</h3>
422
+ <p class="text-gray-500 text-sm leading-relaxed">Run hundreds of training variants in true parallel. Each configuration gets its own isolated container. Cut sweep time from days to hours.</p>
423
+ </div>
424
+ <div class="surface surface-hover rounded-xl p-6 transition-all cursor-default">
425
+ <div class="w-10 h-10 rounded-xl bg-cyan-500/10 border border-cyan-500/20 flex items-center justify-center mb-4">
426
+ <svg class="w-5 h-5 text-cyan-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/></svg>
427
+ </div>
428
+ <h3 class="font-semibold text-white mb-2">Model Evaluation</h3>
429
+ <p class="text-gray-500 text-sm leading-relaxed">Run eval benchmarks across multiple model checkpoints in parallel. Stream results back as they complete. Integrated with W&amp;B, MLflow, and custom logging.</p>
430
+ </div>
431
+ </div>
432
+ </div>
433
+ </section>
434
+
435
+ <!-- Pricing -->
436
+ <section class="py-24 border-t border-white/5">
437
+ <div class="max-w-4xl mx-auto px-6">
438
+ <div class="text-center mb-16">
439
+ <h2 class="text-3xl font-bold text-white mb-3">Transparent pricing. Zero idle waste.</h2>
440
+ <p class="text-gray-400 max-w-lg mx-auto">We bill to the second. When your container stops, billing stops. No reservation required.</p>
441
+ </div>
442
+ <div class="grid md:grid-cols-2 gap-4 mb-6">
443
+ <div class="surface rounded-2xl p-6">
444
+ <div class="text-xs mono text-gray-500 uppercase tracking-widest mb-4">GPU compute</div>
445
+ <div class="space-y-3">
446
+ <div class="flex items-center justify-between py-2 border-b border-white/5">
447
+ <div class="flex items-center gap-3">
448
+ <div class="gpu-badge px-2 py-0.5 rounded text-xs mono text-sky-300">T4</div>
449
+ <span class="text-sm text-gray-300">16 GB VRAM</span>
450
+ </div>
451
+ <span class="mono text-sm text-white">$0.00042<span class="text-gray-500 text-xs">/sec</span></span>
452
+ </div>
453
+ <div class="flex items-center justify-between py-2 border-b border-white/5">
454
+ <div class="flex items-center gap-3">
455
+ <div class="gpu-badge px-2 py-0.5 rounded text-xs mono text-sky-300">A10G</div>
456
+ <span class="text-sm text-gray-300">24 GB VRAM</span>
457
+ </div>
458
+ <span class="mono text-sm text-white">$0.00093<span class="text-gray-500 text-xs">/sec</span></span>
459
+ </div>
460
+ <div class="flex items-center justify-between py-2 border-b border-white/5">
461
+ <div class="flex items-center gap-3">
462
+ <div class="gpu-badge px-2 py-0.5 rounded text-xs mono text-sky-300">A100-40</div>
463
+ <span class="text-sm text-gray-300">40 GB VRAM</span>
464
+ </div>
465
+ <span class="mono text-sm text-white">$0.0018<span class="text-gray-500 text-xs">/sec</span></span>
466
+ </div>
467
+ <div class="flex items-center justify-between py-2 border-b border-white/5">
468
+ <div class="flex items-center gap-3">
469
+ <div class="gpu-badge px-2 py-0.5 rounded text-xs mono text-sky-300">A100-80</div>
470
+ <span class="text-sm text-gray-300">80 GB VRAM</span>
471
+ </div>
472
+ <span class="mono text-sm text-white">$0.0028<span class="text-gray-500 text-xs">/sec</span></span>
473
+ </div>
474
+ <div class="flex items-center justify-between py-2">
475
+ <div class="flex items-center gap-3">
476
+ <div class="gpu-badge px-2 py-0.5 rounded text-xs mono text-sky-300">H100</div>
477
+ <span class="text-sm text-gray-300">80 GB HBM3</span>
478
+ </div>
479
+ <span class="mono text-sm text-white">$0.0055<span class="text-gray-500 text-xs">/sec</span></span>
480
+ </div>
481
+ </div>
482
+ </div>
483
+ <div class="surface rounded-2xl p-6">
484
+ <div class="text-xs mono text-gray-500 uppercase tracking-widest mb-4">CPU &amp; Memory</div>
485
+ <div class="space-y-3">
486
+ <div class="flex items-center justify-between py-2 border-b border-white/5">
487
+ <span class="text-sm text-gray-300">vCPU</span>
488
+ <span class="mono text-sm text-white">$0.000012<span class="text-gray-500 text-xs">/vCPU·sec</span></span>
489
+ </div>
490
+ <div class="flex items-center justify-between py-2 border-b border-white/5">
491
+ <span class="text-sm text-gray-300">Memory</span>
492
+ <span class="mono text-sm text-white">$0.0000015<span class="text-gray-500 text-xs">/GB·sec</span></span>
493
+ </div>
494
+ <div class="flex items-center justify-between py-2 border-b border-white/5">
495
+ <span class="text-sm text-gray-300">Egress</span>
496
+ <span class="mono text-sm text-white">$0.09<span class="text-gray-500 text-xs">/GB</span></span>
497
+ </div>
498
+ <div class="flex items-center justify-between py-2">
499
+ <span class="text-sm text-gray-300">Volume storage</span>
500
+ <span class="mono text-sm text-white">$0.20<span class="text-gray-500 text-xs">/GB·month</span></span>
501
+ </div>
502
+ </div>
503
+ <div class="mt-6 bg-gradient-to-r from-sky-500/10 to-purple-500/10 border border-sky-500/20 rounded-xl p-4">
504
+ <div class="text-sm font-semibold text-white mb-1">Free tier</div>
505
+ <div class="text-xs text-gray-400 leading-relaxed">100 CPU·hours/month included. No credit card required for the first 30 days. Usage alerts available.</div>
506
+ </div>
507
+ </div>
508
+ </div>
509
+ </div>
510
+ </section>
511
+
512
+ <!-- Final CTA -->
513
+ <section class="py-24 relative overflow-hidden">
514
+ <div class="absolute inset-0 bg-gradient-to-t from-sky-500/8 via-purple-500/5 to-transparent pointer-events-none"></div>
515
+ <div class="max-w-3xl mx-auto px-6 text-center relative">
516
+ <h2 class="text-5xl font-bold text-white mb-6 leading-tight">
517
+ Write Python.<br />
518
+ <span class="gradient-text">Run on GPUs.</span>
519
+ </h2>
520
+ <p class="text-xl text-gray-400 mb-10 max-w-xl mx-auto leading-relaxed">
521
+ Install the SDK and run your first GPU function in under two minutes. No infrastructure decisions required.
522
+ </p>
523
+ <div class="flex flex-col sm:flex-row items-center justify-center gap-4 mb-6">
524
+ <div class="code-surface border border-white/10 rounded-xl px-6 py-3 mono text-sm text-gray-300 select-all">
525
+ pip install voltage
526
+ </div>
527
+ <a href="#" class="btn-cta text-white font-bold px-8 py-3 rounded-xl text-base">
528
+ Run your first function →
529
+ </a>
530
+ </div>
531
+ <p class="text-gray-600 text-sm mono">No credit card · Free tier included · Docs in 5 minutes</p>
532
+ </div>
533
+ </section>
534
+
535
+ <!-- Footer -->
536
+ <footer class="border-t border-white/5 py-12">
537
+ <div class="max-w-7xl mx-auto px-6">
538
+ <div class="flex flex-col md:flex-row items-center justify-between gap-8 mb-10">
539
+ <div class="flex items-center gap-2.5">
540
+ <div class="w-8 h-8 rounded-lg btn-cta flex items-center justify-center">
541
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1L1 8h5l1 5 6-7H8L7 1z" fill="white"/></svg>
542
+ </div>
543
+ <span class="font-bold text-white text-lg tracking-tight">Voltage</span>
544
+ </div>
545
+ <div class="flex flex-wrap justify-center gap-6 text-sm text-gray-500">
546
+ <a href="#" class="hover:text-gray-300 transition-colors">Platform</a>
547
+ <a href="#" class="hover:text-gray-300 transition-colors">Docs</a>
548
+ <a href="#" class="hover:text-gray-300 transition-colors">Pricing</a>
549
+ <a href="#" class="hover:text-gray-300 transition-colors">Blog</a>
550
+ <a href="#" class="hover:text-gray-300 transition-colors">Changelog</a>
551
+ <a href="#" class="hover:text-gray-300 transition-colors">Status</a>
552
+ <a href="#" class="hover:text-gray-300 transition-colors">GitHub</a>
553
+ <a href="#" class="hover:text-gray-300 transition-colors">Discord</a>
554
+ </div>
555
+ </div>
556
+ <div class="border-t border-white/5 pt-6 flex flex-col md:flex-row items-center justify-between gap-4 text-xs text-gray-600">
557
+ <span>© 2025 Voltage Inc. All rights reserved.</span>
558
+ <div class="flex gap-6">
559
+ <a href="#" class="hover:text-gray-400 transition-colors">Privacy Policy</a>
560
+ <a href="#" class="hover:text-gray-400 transition-colors">Terms of Service</a>
561
+ <a href="#" class="hover:text-gray-400 transition-colors">Security</a>
562
+ </div>
563
+ </div>
564
+ </div>
565
+ </footer>
566
+
567
+ </body>
568
+ </html>