forgedock 1.0.17 → 1.0.19

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 (134) hide show
  1. package/README.md +34 -1
  2. package/bin/cross-publish.mjs +344 -0
  3. package/bin/forgedock.mjs +229 -17
  4. package/commands/autopilot.md +77 -0
  5. package/commands/design-bench.md +176 -0
  6. package/commands/design-render-critique-loop.md +103 -0
  7. package/commands/design.md +259 -0
  8. package/commands/issue.md +7 -3
  9. package/commands/orchestrate.md +121 -0
  10. package/commands/{resume.md → pipeline-resume.md} +4 -4
  11. package/commands/{status.md → pipeline-status.md} +1 -1
  12. package/commands/qa-sweep.md +37 -2
  13. package/commands/quality-gate.md +57 -0
  14. package/commands/review-pr-staging.md +158 -2
  15. package/commands/test-gate.md +929 -0
  16. package/commands/work-on/build/implement.md +5 -3
  17. package/commands/work-on.md +53 -3
  18. package/docs/CI.md +177 -0
  19. package/docs/FORGE-PROTOCOL.md +324 -0
  20. package/docs/articles/b-vs-c-baseline.md +210 -0
  21. package/docs/articles/full-abc-benchmark.md +205 -0
  22. package/docs/articles/selective-spec-loading-token-savings.md +140 -0
  23. package/docs/design/abc-benchmark.md +195 -0
  24. package/docs/design/design-architect-rationale.md +123 -0
  25. package/docs/design/design-memory.md +61 -0
  26. package/docs/design/design-spec-schema.md +248 -0
  27. package/docs/design/design-system-lint.md +150 -0
  28. package/docs/design/divergent-generation.md +106 -0
  29. package/docs/design/effects-appropriateness.md +133 -0
  30. package/docs/design/fixtures/briefs/README.md +47 -0
  31. package/docs/design/fixtures/briefs/cadence.md +39 -0
  32. package/docs/design/fixtures/briefs/plume.md +39 -0
  33. package/docs/design/fixtures/briefs/slipstream.md +39 -0
  34. package/docs/design/fixtures/briefs/tender.md +39 -0
  35. package/docs/design/fixtures/briefs/voltage.md +39 -0
  36. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
  37. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
  38. package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
  39. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
  40. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
  41. package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
  42. package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
  43. package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
  44. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
  45. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
  46. package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
  47. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
  48. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
  49. package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
  50. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
  51. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
  52. package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
  53. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
  54. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
  55. package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
  56. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
  57. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
  58. package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
  59. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
  60. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
  61. package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
  62. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
  63. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
  64. package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
  65. package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
  66. package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
  67. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
  68. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
  69. package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
  70. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
  71. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
  72. package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
  73. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
  74. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
  75. package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
  76. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
  77. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
  78. package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
  79. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
  80. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
  81. package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
  82. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
  83. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
  84. package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
  85. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
  86. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
  87. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
  88. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
  89. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
  90. package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
  91. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
  92. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
  93. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
  94. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
  95. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
  96. package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
  97. package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
  98. package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
  99. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
  100. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
  101. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
  102. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
  103. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
  104. package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
  105. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
  106. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
  107. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
  108. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
  109. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
  110. package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
  111. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
  112. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
  113. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
  114. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
  115. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
  116. package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
  117. package/docs/design/foundations/brutalist.css +294 -0
  118. package/docs/design/foundations/editorial.css +300 -0
  119. package/docs/design/foundations/minimal-luxury.css +295 -0
  120. package/docs/design/foundations/technical.css +293 -0
  121. package/docs/design/foundations/warm-photo.css +299 -0
  122. package/docs/design/reference-corpus.md +1726 -0
  123. package/docs/design/render-critique-loop.md +57 -0
  124. package/docs/spec-graph-schema.md +397 -0
  125. package/package.json +1 -1
  126. package/scripts/bench-scorecard.mjs +239 -0
  127. package/scripts/build-spec-graph.mjs +509 -0
  128. package/scripts/check-native-conflicts.sh +200 -0
  129. package/scripts/classify-lane.sh +0 -7
  130. package/scripts/design-system-lint.mjs +993 -0
  131. package/scripts/graph-query.sh +486 -0
  132. package/scripts/transition-label.sh +10 -2
  133. package/scripts/validate-spec-graph.sh +423 -0
  134. package/templates/workflows/forgedock-review.yml +96 -0
@@ -0,0 +1,388 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="scroll-smooth">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Voltage — Serverless Compute for AI Workloads</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script>
9
+ tailwind.config = {
10
+ theme: {
11
+ extend: {
12
+ colors: {
13
+ volt: {
14
+ 50: '#f5f3ff',
15
+ 100: '#ede9fe',
16
+ 400: '#a78bfa',
17
+ 500: '#8b5cf6',
18
+ 600: '#7c3aed',
19
+ 700: '#6d28d9',
20
+ 900: '#1e1b4b',
21
+ }
22
+ },
23
+ fontFamily: {
24
+ mono: ['JetBrains Mono', 'Fira Code', 'Consolas', 'monospace'],
25
+ }
26
+ }
27
+ }
28
+ }
29
+ </script>
30
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
31
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet" />
32
+ <style>
33
+ body { font-family: 'Inter', sans-serif; }
34
+ .code-font { font-family: 'JetBrains Mono', monospace; }
35
+ .grid-bg {
36
+ background-image: linear-gradient(rgba(139,92,246,0.07) 1px, transparent 1px),
37
+ linear-gradient(90deg, rgba(139,92,246,0.07) 1px, transparent 1px);
38
+ background-size: 40px 40px;
39
+ }
40
+ .glow {
41
+ box-shadow: 0 0 40px rgba(139,92,246,0.3), 0 0 80px rgba(139,92,246,0.1);
42
+ }
43
+ .text-glow {
44
+ text-shadow: 0 0 40px rgba(139,92,246,0.6);
45
+ }
46
+ .token-keyword { color: #c084fc; }
47
+ .token-decorator { color: #f472b6; }
48
+ .token-string { color: #86efac; }
49
+ .token-comment { color: #6b7280; }
50
+ .token-function { color: #93c5fd; }
51
+ .token-number { color: #fbbf24; }
52
+ .token-class { color: #67e8f9; }
53
+ @keyframes pulse-border {
54
+ 0%, 100% { border-color: rgba(139,92,246,0.3); }
55
+ 50% { border-color: rgba(139,92,246,0.8); }
56
+ }
57
+ .pulse-border { animation: pulse-border 3s ease-in-out infinite; }
58
+ @keyframes float {
59
+ 0%, 100% { transform: translateY(0px); }
60
+ 50% { transform: translateY(-8px); }
61
+ }
62
+ .float { animation: float 4s ease-in-out infinite; }
63
+ @keyframes slide-in {
64
+ from { opacity: 0; transform: translateY(20px); }
65
+ to { opacity: 1; transform: translateY(0); }
66
+ }
67
+ .slide-in { animation: slide-in 0.6s ease-out forwards; }
68
+ .counter-badge {
69
+ background: linear-gradient(135deg, rgba(139,92,246,0.2), rgba(139,92,246,0.05));
70
+ border: 1px solid rgba(139,92,246,0.3);
71
+ }
72
+ </style>
73
+ </head>
74
+ <body class="bg-gray-950 text-gray-100 antialiased">
75
+
76
+ <!-- Nav -->
77
+ <nav class="fixed top-0 w-full z-50 border-b border-gray-800/60 backdrop-blur-md bg-gray-950/80">
78
+ <div class="max-w-7xl mx-auto px-6 h-16 flex items-center justify-between">
79
+ <div class="flex items-center gap-2">
80
+ <div class="w-7 h-7 rounded bg-violet-600 flex items-center justify-center">
81
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1L1 8h5l1 5 6-7H8L7 1z" fill="white"/></svg>
82
+ </div>
83
+ <span class="font-bold text-white tracking-tight text-lg">Voltage</span>
84
+ </div>
85
+ <div class="hidden md:flex items-center gap-8 text-sm text-gray-400">
86
+ <a href="#" class="hover:text-white transition-colors">Docs</a>
87
+ <a href="#" class="hover:text-white transition-colors">Pricing</a>
88
+ <a href="#" class="hover:text-white transition-colors">Examples</a>
89
+ <a href="#" class="hover:text-white transition-colors">Blog</a>
90
+ </div>
91
+ <div class="flex items-center gap-3">
92
+ <a href="#" class="text-sm text-gray-400 hover:text-white transition-colors">Sign in</a>
93
+ <a href="#" class="text-sm bg-violet-600 hover:bg-violet-500 text-white px-4 py-2 rounded-lg transition-colors font-medium">Get started</a>
94
+ </div>
95
+ </div>
96
+ </nav>
97
+
98
+ <!-- Hero -->
99
+ <section class="relative min-h-screen grid-bg flex items-center pt-16">
100
+ <div class="absolute inset-0 bg-gradient-to-b from-transparent via-transparent to-gray-950 pointer-events-none"></div>
101
+ <div class="absolute top-1/4 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] rounded-full bg-violet-600/10 blur-[120px] pointer-events-none"></div>
102
+
103
+ <div class="relative max-w-7xl mx-auto px-6 py-24 grid lg:grid-cols-2 gap-16 items-center">
104
+ <div>
105
+ <div class="inline-flex items-center gap-2 counter-badge rounded-full px-3 py-1 text-xs font-mono text-violet-300 mb-6">
106
+ <span class="w-1.5 h-1.5 rounded-full bg-violet-400 animate-pulse"></span>
107
+ Now in public beta — GPUs from $0.00042/sec
108
+ </div>
109
+ <h1 class="text-5xl lg:text-6xl font-black text-white leading-tight mb-6">
110
+ Serious compute.<br />
111
+ <span class="text-glow text-violet-400">Zero ops.</span>
112
+ </h1>
113
+ <p class="text-xl text-gray-400 leading-relaxed mb-8 max-w-lg">
114
+ Voltage runs your Python functions in the cloud — with GPUs, large memory, and infinite scale — exactly as written. No Dockerfiles. No YAML. No clusters to babysit.
115
+ </p>
116
+ <div class="flex flex-wrap gap-4">
117
+ <a href="#" class="inline-flex items-center gap-2 bg-violet-600 hover:bg-violet-500 text-white px-6 py-3 rounded-xl font-semibold transition-all hover:scale-105 glow">
118
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M3 8h10M9 4l4 4-4 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
119
+ Run your first function
120
+ </a>
121
+ <a href="#" class="inline-flex items-center gap-2 border border-gray-700 hover:border-gray-500 text-gray-300 hover:text-white px-6 py-3 rounded-xl font-semibold transition-all">
122
+ Read the docs
123
+ </a>
124
+ </div>
125
+
126
+ <div class="mt-12 flex items-center gap-8 text-sm">
127
+ <div>
128
+ <div class="text-2xl font-bold text-white">0→1000</div>
129
+ <div class="text-gray-500">containers in seconds</div>
130
+ </div>
131
+ <div class="w-px h-10 bg-gray-800"></div>
132
+ <div>
133
+ <div class="text-2xl font-bold text-white">$0</div>
134
+ <div class="text-gray-500">cost at idle</div>
135
+ </div>
136
+ <div class="w-px h-10 bg-gray-800"></div>
137
+ <div>
138
+ <div class="text-2xl font-bold text-white">A100</div>
139
+ <div class="text-gray-500">GPUs on demand</div>
140
+ </div>
141
+ </div>
142
+ </div>
143
+
144
+ <!-- Code block -->
145
+ <div class="float">
146
+ <div class="rounded-2xl border border-gray-700/60 bg-gray-900/80 backdrop-blur overflow-hidden pulse-border">
147
+ <div class="flex items-center gap-2 px-4 py-3 border-b border-gray-800 bg-gray-900">
148
+ <div class="w-3 h-3 rounded-full bg-red-500/70"></div>
149
+ <div class="w-3 h-3 rounded-full bg-yellow-500/70"></div>
150
+ <div class="w-3 h-3 rounded-full bg-green-500/70"></div>
151
+ <span class="ml-3 text-xs text-gray-500 code-font">train.py</span>
152
+ </div>
153
+ <pre class="p-6 text-sm code-font leading-relaxed overflow-x-auto"><code><span class="token-keyword">import</span> voltage
154
+ <span class="token-keyword">from</span> transformers <span class="token-keyword">import</span> AutoModelForCausalLM
155
+
156
+ <span class="token-decorator">@voltage.function</span>(
157
+ gpu<span class="token-keyword">=</span><span class="token-string">"A100"</span>,
158
+ memory<span class="token-keyword">=</span><span class="token-string">"80GB"</span>,
159
+ timeout<span class="token-keyword">=</span><span class="token-number">3600</span>,
160
+ )
161
+ <span class="token-keyword">def</span> <span class="token-function">fine_tune</span>(dataset_path: <span class="token-class">str</span>) <span class="token-keyword">-></span> <span class="token-class">dict</span>:
162
+ model <span class="token-keyword">=</span> AutoModelForCausalLM.from_pretrained(
163
+ <span class="token-string">"meta-llama/Llama-3-8b"</span>
164
+ )
165
+ <span class="token-comment"># ... your training loop here</span>
166
+ <span class="token-keyword">return</span> {<span class="token-string">"loss"</span>: final_loss, <span class="token-string">"steps"</span>: steps}
167
+
168
+
169
+ <span class="token-comment"># Run remotely — feels like a local function call</span>
170
+ result <span class="token-keyword">=</span> fine_tune.remote(<span class="token-string">"s3://my-bucket/data"</span>)
171
+ <span class="token-function">print</span>(result) <span class="token-comment"># {'loss': 0.043, 'steps': 2000}</span></code></pre>
172
+ <div class="px-6 py-3 border-t border-gray-800 bg-gray-950/50 flex items-center justify-between">
173
+ <span class="text-xs text-gray-500 code-font">$ voltage run train.py</span>
174
+ <span class="text-xs text-green-400 code-font flex items-center gap-1">
175
+ <span class="w-1.5 h-1.5 rounded-full bg-green-400 animate-pulse"></span>
176
+ running on A100 · 34s
177
+ </span>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ </div>
182
+ </section>
183
+
184
+ <!-- How it works -->
185
+ <section class="py-24 bg-gray-950">
186
+ <div class="max-w-7xl mx-auto px-6">
187
+ <div class="text-center mb-16">
188
+ <h2 class="text-3xl font-bold text-white mb-4">One decorator. Infinite scale.</h2>
189
+ <p class="text-gray-400 max-w-xl mx-auto">Write ordinary Python. Voltage handles everything between your local call and the cloud result.</p>
190
+ </div>
191
+
192
+ <div class="grid md:grid-cols-3 gap-6">
193
+ <div class="p-6 rounded-2xl bg-gray-900 border border-gray-800 hover:border-violet-700/50 transition-colors">
194
+ <div class="w-10 h-10 rounded-xl bg-violet-600/20 border border-violet-600/30 flex items-center justify-center text-violet-400 font-bold text-sm mb-4">01</div>
195
+ <h3 class="text-white font-semibold mb-2">Decorate your function</h3>
196
+ <p class="text-gray-400 text-sm leading-relaxed">Add <code class="code-font text-violet-300 bg-violet-950/50 px-1 rounded">@voltage.function</code> and declare what you need — GPU model, memory, timeout. That's it. Voltage builds the environment from your existing <code class="code-font text-violet-300 bg-violet-950/50 px-1 rounded">requirements.txt</code>.</p>
197
+ </div>
198
+ <div class="p-6 rounded-2xl bg-gray-900 border border-gray-800 hover:border-violet-700/50 transition-colors">
199
+ <div class="w-10 h-10 rounded-xl bg-violet-600/20 border border-violet-600/30 flex items-center justify-center text-violet-400 font-bold text-sm mb-4">02</div>
200
+ <h3 class="text-white font-semibold mb-2">Call it with <code class="code-font text-violet-300">.remote()</code></h3>
201
+ <p class="text-gray-400 text-sm leading-relaxed">Swap <code class="code-font text-violet-300 bg-violet-950/50 px-1 rounded">fn(args)</code> for <code class="code-font text-violet-300 bg-violet-950/50 px-1 rounded">fn.remote(args)</code>. Voltage cold-starts a container, runs your code, streams logs back. No CLI pipelines to configure.</p>
202
+ </div>
203
+ <div class="p-6 rounded-2xl bg-gray-900 border border-gray-800 hover:border-violet-700/50 transition-colors">
204
+ <div class="w-10 h-10 rounded-xl bg-violet-600/20 border border-violet-600/30 flex items-center justify-center text-violet-400 font-bold text-sm mb-4">03</div>
205
+ <h3 class="text-white font-semibold mb-2">Scale — automatically</h3>
206
+ <p class="text-gray-400 text-sm leading-relaxed">Call it 1000 times in a loop and Voltage fans out to 1000 parallel containers. When they finish, they scale back to zero. You pay only for active compute seconds.</p>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </section>
211
+
212
+ <!-- Features deep -->
213
+ <section class="py-24 border-t border-gray-900">
214
+ <div class="max-w-7xl mx-auto px-6">
215
+ <div class="grid lg:grid-cols-2 gap-24 items-center mb-24">
216
+ <div>
217
+ <div class="text-xs font-mono text-violet-400 uppercase tracking-widest mb-4">Parallel execution</div>
218
+ <h2 class="text-3xl font-bold text-white mb-6">Fan out to thousands. Collect results as futures.</h2>
219
+ <p class="text-gray-400 leading-relaxed mb-6">Use <code class="code-font text-violet-300">voltage.map()</code> or scatter calls across a list. Every invocation is independent, scheduled on the best available hardware, and results are gathered back asynchronously.</p>
220
+ <ul class="space-y-3 text-sm text-gray-400">
221
+ <li class="flex items-start gap-2"><span class="text-violet-400 mt-0.5">▸</span> Fan out 10,000 inference calls in a single line</li>
222
+ <li class="flex items-start gap-2"><span class="text-violet-400 mt-0.5">▸</span> Gather partial results as they complete</li>
223
+ <li class="flex items-start gap-2"><span class="text-violet-400 mt-0.5">▸</span> Automatic retry on transient failures</li>
224
+ <li class="flex items-start gap-2"><span class="text-violet-400 mt-0.5">▸</span> Mix GPU and CPU functions in the same call graph</li>
225
+ </ul>
226
+ </div>
227
+ <div class="rounded-2xl border border-gray-700/60 bg-gray-900/80 overflow-hidden">
228
+ <div class="flex items-center gap-2 px-4 py-3 border-b border-gray-800">
229
+ <div class="w-3 h-3 rounded-full bg-red-500/70"></div>
230
+ <div class="w-3 h-3 rounded-full bg-yellow-500/70"></div>
231
+ <div class="w-3 h-3 rounded-full bg-green-500/70"></div>
232
+ <span class="ml-3 text-xs text-gray-500 code-font">batch_embed.py</span>
233
+ </div>
234
+ <pre class="p-6 text-sm code-font leading-relaxed"><code><span class="token-decorator">@voltage.function</span>(gpu<span class="token-keyword">=</span><span class="token-string">"T4"</span>, memory<span class="token-keyword">=</span><span class="token-string">"16GB"</span>)
235
+ <span class="token-keyword">def</span> <span class="token-function">embed</span>(text: <span class="token-class">str</span>) <span class="token-keyword">-></span> <span class="token-class">list</span>[<span class="token-class">float</span>]:
236
+ <span class="token-keyword">return</span> model.encode(text).tolist()
237
+
238
+
239
+ <span class="token-comment"># Fan out 50k items — Voltage scales up automatically</span>
240
+ corpus <span class="token-keyword">=</span> load_dataset(<span class="token-string">"my-corpus"</span>) <span class="token-comment"># 50,000 texts</span>
241
+
242
+ futures <span class="token-keyword">=</span> [embed.remote(t) <span class="token-keyword">for</span> t <span class="token-keyword">in</span> corpus]
243
+ embeddings <span class="token-keyword">=</span> voltage.gather(futures)
244
+
245
+ <span class="token-function">print</span>(<span class="token-function">len</span>(embeddings)) <span class="token-comment"># 50000</span>
246
+ <span class="token-comment"># Ran across 200 containers · done in 4m 12s</span></code></pre>
247
+ </div>
248
+ </div>
249
+
250
+ <div class="grid lg:grid-cols-2 gap-24 items-center">
251
+ <div class="order-2 lg:order-1 rounded-2xl border border-gray-700/60 bg-gray-900/80 overflow-hidden">
252
+ <div class="flex items-center gap-2 px-4 py-3 border-b border-gray-800">
253
+ <div class="w-3 h-3 rounded-full bg-red-500/70"></div>
254
+ <div class="w-3 h-3 rounded-full bg-yellow-500/70"></div>
255
+ <div class="w-3 h-3 rounded-full bg-green-500/70"></div>
256
+ <span class="ml-3 text-xs text-gray-500 code-font">inference_api.py</span>
257
+ </div>
258
+ <pre class="p-6 text-sm code-font leading-relaxed"><code><span class="token-decorator">@voltage.endpoint</span>(
259
+ gpu<span class="token-keyword">=</span><span class="token-string">"A10G"</span>,
260
+ min_containers<span class="token-keyword">=</span><span class="token-number">1</span>, <span class="token-comment"># keep warm</span>
261
+ max_containers<span class="token-keyword">=</span><span class="token-number">50</span>, <span class="token-comment"># burst capacity</span>
262
+ )
263
+ <span class="token-keyword">class</span> <span class="token-class">InferenceAPI</span>:
264
+ <span class="token-keyword">def</span> <span class="token-function">__init__</span>(self):
265
+ self.model <span class="token-keyword">=</span> load_model(<span class="token-string">"./weights"</span>)
266
+
267
+ <span class="token-decorator">@voltage.web_endpoint</span>(method<span class="token-keyword">=</span><span class="token-string">"POST"</span>)
268
+ <span class="token-keyword">def</span> <span class="token-function">predict</span>(self, prompt: <span class="token-class">str</span>) <span class="token-keyword">-></span> <span class="token-class">dict</span>:
269
+ <span class="token-keyword">return</span> {<span class="token-string">"output"</span>: self.model.generate(prompt)}
270
+
271
+ <span class="token-comment"># Deploy: voltage deploy inference_api.py</span>
272
+ <span class="token-comment"># → https://api.voltage.run/your-app/predict</span></code></pre>
273
+ </div>
274
+ <div class="order-1 lg:order-2">
275
+ <div class="text-xs font-mono text-violet-400 uppercase tracking-widest mb-4">Inference endpoints</div>
276
+ <h2 class="text-3xl font-bold text-white mb-6">Serve models at scale. Keep one warm, burst to fifty.</h2>
277
+ <p class="text-gray-400 leading-relaxed mb-6">Turn any class into a persistent HTTP endpoint. Model weights load once into a warm container, then requests hit it with sub-100ms latency. Traffic spikes burst to more containers automatically.</p>
278
+ <ul class="space-y-3 text-sm text-gray-400">
279
+ <li class="flex items-start gap-2"><span class="text-violet-400 mt-0.5">▸</span> HTTP endpoint provisioned in one CLI command</li>
280
+ <li class="flex items-start gap-2"><span class="text-violet-400 mt-0.5">▸</span> Keep-warm containers eliminate cold-start latency</li>
281
+ <li class="flex items-start gap-2"><span class="text-violet-400 mt-0.5">▸</span> Autoscale on request queue depth</li>
282
+ <li class="flex items-start gap-2"><span class="text-violet-400 mt-0.5">▸</span> Bring your own model weights from S3 or HuggingFace</li>
283
+ </ul>
284
+ </div>
285
+ </div>
286
+ </div>
287
+ </section>
288
+
289
+ <!-- Use cases -->
290
+ <section class="py-24 bg-gray-900/30 border-t border-gray-900">
291
+ <div class="max-w-7xl mx-auto px-6">
292
+ <div class="text-center mb-16">
293
+ <h2 class="text-3xl font-bold text-white mb-4">Built for the workloads that break other platforms</h2>
294
+ <p class="text-gray-400 max-w-xl mx-auto">Voltage was designed from the start for ML engineers who need more than a Lambda function.</p>
295
+ </div>
296
+ <div class="grid md:grid-cols-2 lg:grid-cols-4 gap-4">
297
+ <div class="p-6 rounded-xl bg-gray-900 border border-gray-800">
298
+ <div class="text-2xl mb-3">⚡</div>
299
+ <h3 class="text-white font-semibold mb-2 text-sm">Model fine-tuning</h3>
300
+ <p class="text-gray-500 text-xs leading-relaxed">Run LoRA, QLoRA, or full fine-tunes on A100s. Trigger from CI or a notebook. No cluster teardown.</p>
301
+ </div>
302
+ <div class="p-6 rounded-xl bg-gray-900 border border-gray-800">
303
+ <div class="text-2xl mb-3">🔬</div>
304
+ <h3 class="text-white font-semibold mb-2 text-sm">Hyperparameter sweeps</h3>
305
+ <p class="text-gray-500 text-xs leading-relaxed">Fan out hundreds of training runs in parallel. Each gets its own isolated GPU. Results in minutes, not days.</p>
306
+ </div>
307
+ <div class="p-6 rounded-xl bg-gray-900 border border-gray-800">
308
+ <div class="text-2xl mb-3">📊</div>
309
+ <h3 class="text-white font-semibold mb-2 text-sm">Data pipelines</h3>
310
+ <p class="text-gray-500 text-xs leading-relaxed">Embed, chunk, clean, and index terabytes of data. Schedule nightly jobs or trigger on S3 events.</p>
311
+ </div>
312
+ <div class="p-6 rounded-xl bg-gray-900 border border-gray-800">
313
+ <div class="text-2xl mb-3">🚀</div>
314
+ <h3 class="text-white font-semibold mb-2 text-sm">Inference serving</h3>
315
+ <p class="text-gray-500 text-xs leading-relaxed">Deploy any model as a REST endpoint. Scale on traffic, pay per token generated, not per hour reserved.</p>
316
+ </div>
317
+ </div>
318
+ </div>
319
+ </section>
320
+
321
+ <!-- Pricing -->
322
+ <section class="py-24 border-t border-gray-900">
323
+ <div class="max-w-4xl mx-auto px-6 text-center">
324
+ <h2 class="text-3xl font-bold text-white mb-4">Pay only while your code runs</h2>
325
+ <p class="text-gray-400 mb-16 max-w-2xl mx-auto">No reserved instances. No idle costs. No minimum spend. Billing starts when your container starts and stops when it finishes.</p>
326
+ <div class="grid md:grid-cols-3 gap-6 text-left mb-12">
327
+ <div class="p-6 rounded-2xl bg-gray-900 border border-gray-800">
328
+ <div class="text-xs text-gray-500 font-mono uppercase tracking-widest mb-3">CPU compute</div>
329
+ <div class="text-3xl font-bold text-white mb-1">$0.000012<span class="text-base font-normal text-gray-500">/vCPU·sec</span></div>
330
+ <p class="text-gray-500 text-sm mt-3">Up to 64 vCPUs per container. Local NVMe SSD included.</p>
331
+ </div>
332
+ <div class="p-6 rounded-2xl bg-violet-900/20 border border-violet-600/40 relative">
333
+ <div class="absolute -top-3 left-1/2 -translate-x-1/2 bg-violet-600 text-white text-xs px-3 py-1 rounded-full font-medium">Most popular</div>
334
+ <div class="text-xs text-violet-300 font-mono uppercase tracking-widest mb-3">GPU compute</div>
335
+ <div class="text-3xl font-bold text-white mb-1">From $0.00042<span class="text-base font-normal text-gray-400">/GPU·sec</span></div>
336
+ <p class="text-gray-400 text-sm mt-3">T4, A10G, A100 (40GB + 80GB), H100. Billed to the second.</p>
337
+ </div>
338
+ <div class="p-6 rounded-2xl bg-gray-900 border border-gray-800">
339
+ <div class="text-xs text-gray-500 font-mono uppercase tracking-widest mb-3">Memory</div>
340
+ <div class="text-3xl font-bold text-white mb-1">$0.0000015<span class="text-base font-normal text-gray-500">/GB·sec</span></div>
341
+ <p class="text-gray-500 text-sm mt-3">Up to 512GB RAM per container. EFA networking available.</p>
342
+ </div>
343
+ </div>
344
+ <p class="text-sm text-gray-500">Free tier: 100 CPU·hours/month. No credit card for the first 30 days.</p>
345
+ </div>
346
+ </section>
347
+
348
+ <!-- CTA -->
349
+ <section class="py-24 border-t border-gray-900">
350
+ <div class="max-w-3xl mx-auto px-6 text-center">
351
+ <div class="relative">
352
+ <div class="absolute inset-0 bg-violet-600/10 blur-[80px] rounded-full pointer-events-none"></div>
353
+ <h2 class="relative text-4xl font-black text-white mb-6">Your first GPU run takes<br /><span class="text-violet-400">two minutes.</span></h2>
354
+ <p class="relative text-gray-400 text-lg mb-10 max-w-xl mx-auto">Install the Python SDK, add a decorator, call <code class="code-font text-violet-300">.remote()</code>. Voltage handles the rest.</p>
355
+ <div class="relative flex flex-col sm:flex-row items-center justify-center gap-4">
356
+ <div class="code-font bg-gray-900 border border-gray-700 rounded-xl px-6 py-3 text-sm text-gray-300 select-all">
357
+ pip install voltage
358
+ </div>
359
+ <a href="#" class="bg-violet-600 hover:bg-violet-500 text-white px-8 py-3 rounded-xl font-semibold transition-all hover:scale-105 glow">
360
+ Run your first function →
361
+ </a>
362
+ </div>
363
+ </div>
364
+ </div>
365
+ </section>
366
+
367
+ <!-- Footer -->
368
+ <footer class="border-t border-gray-900 py-12">
369
+ <div class="max-w-7xl mx-auto px-6 flex flex-col md:flex-row items-center justify-between gap-6">
370
+ <div class="flex items-center gap-2">
371
+ <div class="w-6 h-6 rounded bg-violet-600 flex items-center justify-center">
372
+ <svg width="12" height="12" viewBox="0 0 14 14" fill="none"><path d="M7 1L1 8h5l1 5 6-7H8L7 1z" fill="white"/></svg>
373
+ </div>
374
+ <span class="font-bold text-white">Voltage</span>
375
+ <span class="text-gray-600 ml-4 text-sm">© 2025</span>
376
+ </div>
377
+ <div class="flex items-center gap-8 text-sm text-gray-500">
378
+ <a href="#" class="hover:text-gray-300 transition-colors">Privacy</a>
379
+ <a href="#" class="hover:text-gray-300 transition-colors">Terms</a>
380
+ <a href="#" class="hover:text-gray-300 transition-colors">Status</a>
381
+ <a href="#" class="hover:text-gray-300 transition-colors">GitHub</a>
382
+ <a href="#" class="hover:text-gray-300 transition-colors">Discord</a>
383
+ </div>
384
+ </div>
385
+ </footer>
386
+
387
+ </body>
388
+ </html>