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,463 @@
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 — Run Python on GPUs, Instantly</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet" />
9
+ <style>
10
+ * { box-sizing: border-box; }
11
+ body { font-family: 'Space Grotesk', sans-serif; background: #f8f7f4; color: #0f0f0f; }
12
+ .mono { font-family: 'Space Mono', monospace; }
13
+ .border-raw { border: 1.5px solid #0f0f0f; }
14
+ .border-raw-sm { border: 1px solid #0f0f0f; }
15
+ .shadow-brutal { box-shadow: 4px 4px 0px #0f0f0f; }
16
+ .shadow-brutal-lg { box-shadow: 6px 6px 0px #0f0f0f; }
17
+ .shadow-brutal-accent { box-shadow: 4px 4px 0px #ff5500; }
18
+ .btn-primary {
19
+ background: #ff5500;
20
+ border: 1.5px solid #0f0f0f;
21
+ box-shadow: 3px 3px 0px #0f0f0f;
22
+ transition: all 0.1s;
23
+ }
24
+ .btn-primary:hover {
25
+ box-shadow: 1px 1px 0px #0f0f0f;
26
+ transform: translate(2px, 2px);
27
+ }
28
+ .btn-secondary {
29
+ background: #f8f7f4;
30
+ border: 1.5px solid #0f0f0f;
31
+ box-shadow: 3px 3px 0px #0f0f0f;
32
+ transition: all 0.1s;
33
+ }
34
+ .btn-secondary:hover {
35
+ box-shadow: 1px 1px 0px #0f0f0f;
36
+ transform: translate(2px, 2px);
37
+ }
38
+ .card {
39
+ border: 1.5px solid #0f0f0f;
40
+ background: white;
41
+ box-shadow: 4px 4px 0px #0f0f0f;
42
+ }
43
+ .card-accent {
44
+ border: 1.5px solid #0f0f0f;
45
+ background: #ff5500;
46
+ box-shadow: 4px 4px 0px #0f0f0f;
47
+ }
48
+ .card-dark {
49
+ border: 1.5px solid #0f0f0f;
50
+ background: #0f0f0f;
51
+ box-shadow: 4px 4px 0px #ff5500;
52
+ }
53
+ .tag {
54
+ border: 1px solid #0f0f0f;
55
+ background: #f8f7f4;
56
+ font-family: 'Space Mono', monospace;
57
+ font-size: 11px;
58
+ }
59
+ .tag-orange {
60
+ border: 1px solid #ff5500;
61
+ background: #fff3ed;
62
+ color: #ff5500;
63
+ font-family: 'Space Mono', monospace;
64
+ font-size: 11px;
65
+ }
66
+ .divider { border-top: 1.5px solid #0f0f0f; }
67
+ .stripe-bg {
68
+ background-image: repeating-linear-gradient(
69
+ -45deg,
70
+ transparent,
71
+ transparent 8px,
72
+ rgba(255,85,0,0.06) 8px,
73
+ rgba(255,85,0,0.06) 16px
74
+ );
75
+ }
76
+ .code-block {
77
+ background: #0f0f0f;
78
+ border: 1.5px solid #0f0f0f;
79
+ box-shadow: 5px 5px 0px #ff5500;
80
+ }
81
+ .k { color: #ff7a45; }
82
+ .s { color: #7bc47b; }
83
+ .c { color: #666; }
84
+ .f { color: #79b8ff; }
85
+ .n { color: #ffa94d; }
86
+ .d { color: #ff79c6; }
87
+ .t { color: #8be9fd; }
88
+ @keyframes marquee {
89
+ from { transform: translateX(0); }
90
+ to { transform: translateX(-50%); }
91
+ }
92
+ .marquee-inner { animation: marquee 20s linear infinite; }
93
+ </style>
94
+ </head>
95
+ <body>
96
+
97
+ <!-- Nav -->
98
+ <header class="sticky top-0 z-50 bg-[#f8f7f4] divider">
99
+ <div class="max-w-6xl mx-auto px-6 h-14 flex items-center justify-between">
100
+ <div class="flex items-center gap-3">
101
+ <div class="w-8 h-8 bg-[#ff5500] border-raw flex items-center justify-center shadow-brutal" style="box-shadow:2px 2px 0 #0f0f0f">
102
+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1L1 8h5l1 5 6-7H8L7 1z" fill="white"/></svg>
103
+ </div>
104
+ <span class="font-bold text-lg tracking-tight">Voltage</span>
105
+ </div>
106
+ <nav class="hidden md:flex items-center gap-1">
107
+ <a href="#" class="px-4 py-1.5 text-sm font-medium hover:bg-black hover:text-white transition-colors rounded">Docs</a>
108
+ <a href="#" class="px-4 py-1.5 text-sm font-medium hover:bg-black hover:text-white transition-colors rounded">Pricing</a>
109
+ <a href="#" class="px-4 py-1.5 text-sm font-medium hover:bg-black hover:text-white transition-colors rounded">Examples</a>
110
+ <a href="#" class="px-4 py-1.5 text-sm font-medium hover:bg-black hover:text-white transition-colors rounded">Blog</a>
111
+ </nav>
112
+ <div class="flex items-center gap-2">
113
+ <a href="#" class="btn-secondary text-sm font-semibold px-4 py-2 rounded">Sign in</a>
114
+ <a href="#" class="btn-primary text-sm font-bold px-4 py-2 rounded text-white">Get started</a>
115
+ </div>
116
+ </div>
117
+ </header>
118
+
119
+ <!-- Marquee ticker -->
120
+ <div class="bg-[#ff5500] border-b-[1.5px] border-[#0f0f0f] overflow-hidden py-2">
121
+ <div class="flex whitespace-nowrap marquee-inner">
122
+ <span class="mono text-white text-xs px-4">A100 · T4 · A10G · H100 · CPU · GPU · SCALE TO ZERO · PAY PER SECOND · NO YAML · NO DOCKERFILES · PYTHON DECORATORS · PARALLEL JOBS · INFERENCE ENDPOINTS · BATCH PIPELINES · FAST COLD STARTS ·&nbsp;</span>
123
+ <span class="mono text-white text-xs px-4">A100 · T4 · A10G · H100 · CPU · GPU · SCALE TO ZERO · PAY PER SECOND · NO YAML · NO DOCKERFILES · PYTHON DECORATORS · PARALLEL JOBS · INFERENCE ENDPOINTS · BATCH PIPELINES · FAST COLD STARTS ·&nbsp;</span>
124
+ </div>
125
+ </div>
126
+
127
+ <!-- Hero -->
128
+ <section class="max-w-6xl mx-auto px-6 pt-16 pb-20">
129
+ <div class="grid lg:grid-cols-[1fr_1.1fr] gap-12 items-start">
130
+ <div>
131
+ <div class="tag-orange inline-flex px-2.5 py-1 rounded mb-6 font-bold uppercase tracking-wide">
132
+ Serverless GPU Platform
133
+ </div>
134
+ <h1 class="text-5xl lg:text-6xl font-bold leading-[1.05] tracking-tight mb-6">
135
+ Cloud GPUs.<br />
136
+ No<br />
137
+ <span class="relative inline-block">
138
+ <span class="relative z-10">provisioning.</span>
139
+ <span class="absolute bottom-1 left-0 w-full h-3 bg-[#ff5500] -z-0 opacity-40"></span>
140
+ </span>
141
+ </h1>
142
+ <p class="text-lg text-gray-600 leading-relaxed mb-8 max-w-md">
143
+ Add a Python decorator. Call your function. Voltage boots the right GPU, runs your code, and bills only while it's running. Zero idle cost.
144
+ </p>
145
+
146
+ <div class="flex flex-wrap gap-3 mb-10">
147
+ <a href="#" class="btn-primary text-white font-bold px-6 py-3 rounded text-base inline-block">
148
+ Run your first function →
149
+ </a>
150
+ <a href="#" class="btn-secondary font-bold px-6 py-3 rounded text-base inline-block">
151
+ Read the docs
152
+ </a>
153
+ </div>
154
+
155
+ <!-- Stats row -->
156
+ <div class="grid grid-cols-3 gap-4">
157
+ <div class="card p-4 rounded">
158
+ <div class="mono text-2xl font-bold text-[#ff5500]">$0</div>
159
+ <div class="text-xs text-gray-500 mt-1 font-medium uppercase tracking-wide">Idle cost</div>
160
+ </div>
161
+ <div class="card p-4 rounded">
162
+ <div class="mono text-2xl font-bold">1000×</div>
163
+ <div class="text-xs text-gray-500 mt-1 font-medium uppercase tracking-wide">Parallel scale</div>
164
+ </div>
165
+ <div class="card p-4 rounded">
166
+ <div class="mono text-2xl font-bold text-[#ff5500]">&lt;3s</div>
167
+ <div class="text-xs text-gray-500 mt-1 font-medium uppercase tracking-wide">Cold start</div>
168
+ </div>
169
+ </div>
170
+ </div>
171
+
172
+ <!-- Code block -->
173
+ <div class="code-block rounded-lg overflow-hidden">
174
+ <div class="flex items-center justify-between px-4 py-3 border-b border-gray-700">
175
+ <div class="flex items-center gap-2">
176
+ <div class="w-3 h-3 rounded-full bg-[#ff5500]"></div>
177
+ <div class="w-3 h-3 rounded-full bg-yellow-400"></div>
178
+ <div class="w-3 h-3 rounded-full bg-green-400"></div>
179
+ </div>
180
+ <span class="mono text-xs text-gray-500">train.py</span>
181
+ <div class="tag bg-[#1a1a1a] border-gray-700 text-gray-400 px-2 py-0.5 rounded text-[10px]">Python 3.11</div>
182
+ </div>
183
+ <pre class="p-5 text-sm text-gray-100 overflow-x-auto leading-relaxed mono"><code><span class="k">import</span> voltage
184
+ <span class="k">from</span> transformers <span class="k">import</span> Trainer, TrainingArguments
185
+
186
+
187
+ <span class="d">@voltage.function</span>(
188
+ gpu<span class="k">=</span><span class="s">"A100-80GB"</span>,
189
+ memory<span class="k">=</span><span class="s">"120GB"</span>,
190
+ timeout<span class="k">=</span><span class="n">7200</span>,
191
+ volumes<span class="k">=</span>[voltage.Volume(<span class="s">"model-weights"</span>)],
192
+ )
193
+ <span class="k">def</span> <span class="f">fine_tune_llm</span>(
194
+ base_model: <span class="t">str</span>,
195
+ dataset: <span class="t">str</span>,
196
+ epochs: <span class="t">int</span> <span class="k">=</span> <span class="n">3</span>,
197
+ ) <span class="k">-></span> <span class="t">str</span>:
198
+ <span class="c">"""Fine-tune a causal LM on custom data."""</span>
199
+ trainer <span class="k">=</span> Trainer(
200
+ model<span class="k">=</span>load_model(base_model),
201
+ args<span class="k">=</span>TrainingArguments(
202
+ output_dir<span class="k">=</span><span class="s">"/vol/checkpoints"</span>,
203
+ num_train_epochs<span class="k">=</span>epochs,
204
+ fp16<span class="k">=</span><span class="n">True</span>,
205
+ ),
206
+ train_dataset<span class="k">=</span>load_dataset(dataset),
207
+ )
208
+ trainer.train()
209
+ <span class="k">return</span> <span class="s">"/vol/checkpoints/final"</span>
210
+
211
+
212
+ <span class="c"># Kick off from your laptop — no cluster needed</span>
213
+ checkpoint_path <span class="k">=</span> fine_tune_llm.remote(
214
+ base_model<span class="k">=</span><span class="s">"meta-llama/Llama-3-8b"</span>,
215
+ dataset<span class="k">=</span><span class="s">"my-company/qa-pairs"</span>,
216
+ )
217
+ <span class="f">print</span>(<span class="s">f"Done: </span>{checkpoint_path}<span class="s">"</span>)
218
+ <span class="c"># Done: /vol/checkpoints/final · 1h 43m · $2.18</span></code></pre>
219
+ <div class="border-t border-gray-800 px-5 py-3 flex items-center gap-3">
220
+ <div class="flex items-center gap-1.5">
221
+ <div class="w-2 h-2 rounded-full bg-green-400 animate-pulse"></div>
222
+ <span class="mono text-xs text-green-400">running · A100-80GB</span>
223
+ </div>
224
+ <div class="ml-auto mono text-xs text-gray-500">wall time: 1h 43m 12s · cost: $2.18</div>
225
+ </div>
226
+ </div>
227
+ </div>
228
+ </section>
229
+
230
+ <!-- Divider -->
231
+ <div class="stripe-bg divider border-b-[1.5px] border-[#0f0f0f] py-8">
232
+ <div class="max-w-6xl mx-auto px-6">
233
+ <p class="text-center text-sm font-semibold text-gray-600 uppercase tracking-widest mono">Trusted by ML teams at</p>
234
+ <div class="flex flex-wrap items-center justify-center gap-8 mt-6 grayscale opacity-60">
235
+ <span class="font-bold text-xl">Anthropic</span>
236
+ <span class="font-bold text-xl">Scale AI</span>
237
+ <span class="font-bold text-xl">Weights &amp; Biases</span>
238
+ <span class="font-bold text-xl">Cohere</span>
239
+ <span class="font-bold text-xl">Mistral</span>
240
+ </div>
241
+ </div>
242
+ </div>
243
+
244
+ <!-- How it works -->
245
+ <section class="max-w-6xl mx-auto px-6 py-20">
246
+ <div class="flex items-baseline gap-4 mb-12">
247
+ <h2 class="text-3xl font-bold">How it works</h2>
248
+ <div class="tag px-2.5 py-1 rounded uppercase tracking-wide">3 steps</div>
249
+ </div>
250
+ <div class="grid md:grid-cols-3 gap-6">
251
+ <div class="card rounded-lg p-6">
252
+ <div class="w-10 h-10 bg-[#ff5500] border-raw rounded flex items-center justify-center text-white font-bold mono mb-4" style="box-shadow:2px 2px 0 #0f0f0f">1</div>
253
+ <h3 class="font-bold text-lg mb-2">Decorate</h3>
254
+ <p class="text-gray-600 text-sm leading-relaxed mb-4">Add <code class="mono bg-orange-50 border border-orange-200 px-1.5 py-0.5 rounded text-[#ff5500]">@voltage.function</code> to any Python function. Declare GPU type, memory, and timeout. Voltage reads your <code class="mono bg-gray-100 px-1 rounded">requirements.txt</code> and builds the container automatically.</p>
255
+ <div class="tag px-2 py-1 rounded inline-block">No Dockerfile required</div>
256
+ </div>
257
+ <div class="card rounded-lg p-6">
258
+ <div class="w-10 h-10 bg-[#ff5500] border-raw rounded flex items-center justify-center text-white font-bold mono mb-4" style="box-shadow:2px 2px 0 #0f0f0f">2</div>
259
+ <h3 class="font-bold text-lg mb-2">Call remotely</h3>
260
+ <p class="text-gray-600 text-sm leading-relaxed mb-4">Replace <code class="mono bg-gray-100 px-1 rounded">fn()</code> with <code class="mono bg-orange-50 border border-orange-200 px-1.5 py-0.5 rounded text-[#ff5500]">fn.remote()</code>. Voltage cold-starts a container with your requested GPU, ships your code, runs it, and returns the result. Logs stream back in real time.</p>
261
+ <div class="tag px-2 py-1 rounded inline-block">Under 3s cold start</div>
262
+ </div>
263
+ <div class="card rounded-lg p-6">
264
+ <div class="w-10 h-10 bg-[#ff5500] border-raw rounded flex items-center justify-center text-white font-bold mono mb-4" style="box-shadow:2px 2px 0 #0f0f0f">3</div>
265
+ <h3 class="font-bold text-lg mb-2">Scale automatically</h3>
266
+ <p class="text-gray-600 text-sm leading-relaxed mb-4">Map over thousands of inputs and Voltage launches thousands of parallel containers. When they finish, everything scales to zero. You pay per active compute second — nothing while idle.</p>
267
+ <div class="tag px-2 py-1 rounded inline-block">0 → 1000 containers</div>
268
+ </div>
269
+ </div>
270
+ </section>
271
+
272
+ <!-- Parallel workloads -->
273
+ <section class="bg-[#0f0f0f] text-white py-20 border-y-[1.5px] border-[#0f0f0f]">
274
+ <div class="max-w-6xl mx-auto px-6">
275
+ <div class="grid lg:grid-cols-2 gap-16 items-center">
276
+ <div>
277
+ <div class="tag-orange inline-flex px-2.5 py-1 rounded mb-6">Parallel Execution</div>
278
+ <h2 class="text-3xl font-bold mb-6 leading-tight">50,000 embeddings.<br />One line of code.</h2>
279
+ <p class="text-gray-400 leading-relaxed mb-6">Voltage's <code class="mono text-[#ff5500]">voltage.map()</code> fans work out across as many parallel containers as you need. Partial results stream back as they complete. Built-in retry handles transient failures silently.</p>
280
+ <ul class="space-y-3 text-sm">
281
+ <li class="flex items-start gap-3 text-gray-300">
282
+ <span class="w-5 h-5 bg-[#ff5500] rounded flex items-center justify-center flex-shrink-0 text-white text-xs font-bold mt-0.5">✓</span>
283
+ Fan out to 1,000+ containers in seconds
284
+ </li>
285
+ <li class="flex items-start gap-3 text-gray-300">
286
+ <span class="w-5 h-5 bg-[#ff5500] rounded flex items-center justify-center flex-shrink-0 text-white text-xs font-bold mt-0.5">✓</span>
287
+ Async futures — collect results as they arrive
288
+ </li>
289
+ <li class="flex items-start gap-3 text-gray-300">
290
+ <span class="w-5 h-5 bg-[#ff5500] rounded flex items-center justify-center flex-shrink-0 text-white text-xs font-bold mt-0.5">✓</span>
291
+ Mix GPU and CPU containers in one call graph
292
+ </li>
293
+ <li class="flex items-start gap-3 text-gray-300">
294
+ <span class="w-5 h-5 bg-[#ff5500] rounded flex items-center justify-center flex-shrink-0 text-white text-xs font-bold mt-0.5">✓</span>
295
+ Automatic retry on spot reclamation
296
+ </li>
297
+ </ul>
298
+ </div>
299
+ <div class="code-block rounded-lg overflow-hidden" style="box-shadow: 5px 5px 0 #ff5500">
300
+ <div class="flex items-center gap-2 px-4 py-3 border-b border-gray-800">
301
+ <div class="w-2.5 h-2.5 rounded-full bg-[#ff5500]"></div>
302
+ <div class="w-2.5 h-2.5 rounded-full bg-yellow-500"></div>
303
+ <div class="w-2.5 h-2.5 rounded-full bg-green-500"></div>
304
+ <span class="mono text-xs text-gray-500 ml-2">batch_process.py</span>
305
+ </div>
306
+ <pre class="p-5 text-sm text-gray-100 mono leading-relaxed"><code><span class="d">@voltage.function</span>(gpu<span class="k">=</span><span class="s">"T4"</span>)
307
+ <span class="k">def</span> <span class="f">embed</span>(chunk: <span class="t">list</span>[<span class="t">str</span>]) <span class="k">-></span> <span class="t">list</span>[<span class="t">list</span>[<span class="t">float</span>]]:
308
+ <span class="k">return</span> encoder.encode(chunk)
309
+
310
+
311
+ <span class="c"># Load 50k documents from S3</span>
312
+ docs <span class="k">=</span> load_from_s3(<span class="s">"s3://data/corpus.jsonl"</span>)
313
+ chunks <span class="k">=</span> [docs[i:i<span class="k">+</span><span class="n">500</span>] <span class="k">for</span> i <span class="k">in</span> <span class="f">range</span>(<span class="n">0</span>, <span class="f">len</span>(docs), <span class="n">500</span>)]
314
+
315
+ <span class="c"># Fan out — 100 GPU containers launch in parallel</span>
316
+ futures <span class="k">=</span> voltage.map(embed, chunks)
317
+
318
+ <span class="c"># Stream results as they complete</span>
319
+ all_embeddings <span class="k">=</span> []
320
+ <span class="k">for</span> result <span class="k">in</span> voltage.as_completed(futures):
321
+ all_embeddings.extend(result)
322
+ <span class="f">print</span>(<span class="s">f"Progress: </span>{<span class="f">len</span>(all_embeddings)}<span class="s">/</span>{<span class="f">len</span>(docs)}<span class="s">"</span>)
323
+
324
+ <span class="c"># Progress: 500/50000</span>
325
+ <span class="c"># Progress: 1500/50000</span>
326
+ <span class="c"># ... 50000/50000 · done in 3m 41s · $0.94</span></code></pre>
327
+ </div>
328
+ </div>
329
+ </div>
330
+ </section>
331
+
332
+ <!-- Feature grid -->
333
+ <section class="max-w-6xl mx-auto px-6 py-20">
334
+ <div class="flex items-baseline gap-4 mb-12">
335
+ <h2 class="text-3xl font-bold">Everything you need</h2>
336
+ <div class="tag px-2.5 py-1 rounded uppercase tracking-wide">Platform</div>
337
+ </div>
338
+ <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-5">
339
+ <div class="card rounded-lg p-5">
340
+ <div class="mono text-xs text-[#ff5500] uppercase tracking-widest mb-3">Scheduled Jobs</div>
341
+ <h3 class="font-bold mb-2">Cron &amp; event triggers</h3>
342
+ <p class="text-gray-600 text-sm leading-relaxed">Schedule functions on a cron expression or trigger on S3 events, webhooks, or queue messages. No separate orchestrator needed.</p>
343
+ <pre class="mt-3 bg-gray-50 border border-gray-200 rounded p-3 text-xs mono overflow-x-auto"><code><span class="k" style="color:#ff5500">@voltage.schedule</span>(<span class="s" style="color:#228b22">"0 2 * * *"</span>)
344
+ <span class="k" style="color:#666">def</span> nightly_retrain(): ...</code></pre>
345
+ </div>
346
+ <div class="card rounded-lg p-5">
347
+ <div class="mono text-xs text-[#ff5500] uppercase tracking-widest mb-3">Inference Endpoints</div>
348
+ <h3 class="font-bold mb-2">HTTP APIs from a class</h3>
349
+ <p class="text-gray-600 text-sm leading-relaxed">Decorate a class with <code class="mono text-xs bg-orange-50 px-1 rounded">@voltage.endpoint</code>. Model loads once into a warm container; requests hit with sub-100ms latency.</p>
350
+ <pre class="mt-3 bg-gray-50 border border-gray-200 rounded p-3 text-xs mono overflow-x-auto"><code><span class="k" style="color:#ff5500">@voltage.endpoint</span>(gpu<span class="k" style="color:#555">=</span><span class="s" style="color:#228b22">"A10G"</span>)
351
+ <span class="k" style="color:#666">class</span> LLMServer: ...</code></pre>
352
+ </div>
353
+ <div class="card rounded-lg p-5">
354
+ <div class="mono text-xs text-[#ff5500] uppercase tracking-widest mb-3">Volumes &amp; Storage</div>
355
+ <h3 class="font-bold mb-2">Persistent model weights</h3>
356
+ <p class="text-gray-600 text-sm leading-relaxed">Mount cloud volumes for model weights, datasets, or checkpoints. Fast NVMe SSDs local to the container. Shared across runs.</p>
357
+ <pre class="mt-3 bg-gray-50 border border-gray-200 rounded p-3 text-xs mono overflow-x-auto"><code>vol <span class="k" style="color:#555">=</span> voltage.Volume(<span class="s" style="color:#228b22">"llama-weights"</span>)
358
+ <span class="k" style="color:#ff5500">@voltage.function</span>(volumes<span class="k" style="color:#555">=</span>[vol])</code></pre>
359
+ </div>
360
+ <div class="card rounded-lg p-5">
361
+ <div class="mono text-xs text-[#ff5500] uppercase tracking-widest mb-3">Fast Cold Starts</div>
362
+ <h3 class="font-bold mb-2">Under 3 seconds to live</h3>
363
+ <p class="text-gray-600 text-sm leading-relaxed">Container images are cached aggressively. Voltage's snapshot system restores Python state in under 3 seconds — even for large ML dependencies like PyTorch.</p>
364
+ </div>
365
+ <div class="card rounded-lg p-5">
366
+ <div class="mono text-xs text-[#ff5500] uppercase tracking-widest mb-3">GPU Fleet</div>
367
+ <h3 class="font-bold mb-2">Every GPU you need</h3>
368
+ <p class="text-gray-600 text-sm leading-relaxed">T4 for cheap inference, A10G for mid-tier training, A100 40/80GB for large models, H100 for frontier work. Spot or on-demand.</p>
369
+ <div class="flex flex-wrap gap-1.5 mt-3">
370
+ <span class="tag px-1.5 py-0.5 rounded">T4</span>
371
+ <span class="tag px-1.5 py-0.5 rounded">A10G</span>
372
+ <span class="tag px-1.5 py-0.5 rounded">A100-40</span>
373
+ <span class="tag px-1.5 py-0.5 rounded">A100-80</span>
374
+ <span class="tag px-1.5 py-0.5 rounded">H100</span>
375
+ </div>
376
+ </div>
377
+ <div class="card rounded-lg p-5">
378
+ <div class="mono text-xs text-[#ff5500] uppercase tracking-widest mb-3">Secrets &amp; Config</div>
379
+ <h3 class="font-bold mb-2">Secure credential injection</h3>
380
+ <p class="text-gray-600 text-sm leading-relaxed">Store API keys in Voltage's secrets manager. Inject them as environment variables at runtime. Never bake secrets into container images.</p>
381
+ <pre class="mt-3 bg-gray-50 border border-gray-200 rounded p-3 text-xs mono overflow-x-auto"><code><span class="k" style="color:#ff5500">@voltage.function</span>(
382
+ secrets<span class="k" style="color:#555">=</span>[<span class="s" style="color:#228b22">"OPENAI_KEY"</span>])</code></pre>
383
+ </div>
384
+ </div>
385
+ </section>
386
+
387
+ <!-- Pricing -->
388
+ <section class="bg-gray-50 border-y-[1.5px] border-[#0f0f0f] py-20">
389
+ <div class="max-w-6xl mx-auto px-6">
390
+ <div class="text-center mb-12">
391
+ <h2 class="text-3xl font-bold mb-3">Pricing that makes sense</h2>
392
+ <p class="text-gray-600 max-w-lg mx-auto">You pay for compute seconds. When your containers finish, billing stops. Zero idle cost.</p>
393
+ </div>
394
+ <div class="grid md:grid-cols-4 gap-4 mb-8">
395
+ <div class="card rounded-lg p-5 text-center">
396
+ <div class="tag-orange px-2 py-0.5 rounded inline-block mb-3 text-[10px] font-bold uppercase">T4 GPU</div>
397
+ <div class="mono text-2xl font-bold">$0.00042</div>
398
+ <div class="text-gray-500 text-xs mt-1">/GPU·second</div>
399
+ <div class="text-gray-400 text-xs mt-3">16GB VRAM · Great for inference</div>
400
+ </div>
401
+ <div class="card-accent rounded-lg p-5 text-center text-white">
402
+ <div class="bg-black/20 text-white px-2 py-0.5 rounded inline-block mb-3 text-[10px] font-bold uppercase mono">A100 GPU</div>
403
+ <div class="mono text-2xl font-bold">$0.0028</div>
404
+ <div class="text-white/70 text-xs mt-1">/GPU·second</div>
405
+ <div class="text-white/80 text-xs mt-3">80GB VRAM · Best for training</div>
406
+ </div>
407
+ <div class="card rounded-lg p-5 text-center">
408
+ <div class="tag-orange px-2 py-0.5 rounded inline-block mb-3 text-[10px] font-bold uppercase">H100 GPU</div>
409
+ <div class="mono text-2xl font-bold">$0.0055</div>
410
+ <div class="text-gray-500 text-xs mt-1">/GPU·second</div>
411
+ <div class="text-gray-400 text-xs mt-3">80GB HBM3 · Frontier models</div>
412
+ </div>
413
+ <div class="card rounded-lg p-5 text-center">
414
+ <div class="tag px-2 py-0.5 rounded inline-block mb-3 text-[10px] font-bold uppercase">CPU</div>
415
+ <div class="mono text-2xl font-bold">$0.000012</div>
416
+ <div class="text-gray-500 text-xs mt-1">/vCPU·second</div>
417
+ <div class="text-gray-400 text-xs mt-3">Up to 64 vCPUs · NVMe SSD</div>
418
+ </div>
419
+ </div>
420
+ <p class="text-center text-sm text-gray-500 mono">Free tier: 100 CPU·hours/month included · No credit card for 30 days</p>
421
+ </div>
422
+ </section>
423
+
424
+ <!-- CTA -->
425
+ <section class="py-24 max-w-6xl mx-auto px-6">
426
+ <div class="card-dark rounded-2xl p-12 text-center" style="box-shadow: 8px 8px 0 #ff5500">
427
+ <div class="tag-orange inline-flex px-3 py-1 rounded mb-6 font-bold uppercase tracking-wide">Start in 2 minutes</div>
428
+ <h2 class="text-4xl font-bold text-white mb-4">Run your first GPU function today.</h2>
429
+ <p class="text-gray-400 mb-8 max-w-lg mx-auto">Install the SDK, add <code class="mono text-[#ff5500]">@voltage.function</code>, call <code class="mono text-[#ff5500]">.remote()</code>. Your first run is free.</p>
430
+ <div class="flex flex-col sm:flex-row items-center justify-center gap-4">
431
+ <div class="mono bg-[#1a1a1a] border border-gray-700 rounded px-6 py-3 text-sm text-gray-300">
432
+ pip install voltage
433
+ </div>
434
+ <a href="#" class="btn-primary text-white font-bold px-8 py-3 rounded text-base inline-block">
435
+ Run your first function →
436
+ </a>
437
+ </div>
438
+ </div>
439
+ </section>
440
+
441
+ <!-- Footer -->
442
+ <footer class="divider bg-[#0f0f0f] text-gray-400 py-10">
443
+ <div class="max-w-6xl mx-auto px-6 flex flex-col md:flex-row items-center justify-between gap-6">
444
+ <div class="flex items-center gap-3">
445
+ <div class="w-7 h-7 bg-[#ff5500] border border-gray-600 flex items-center justify-center rounded">
446
+ <svg width="12" height="12" viewBox="0 0 14 14" fill="none"><path d="M7 1L1 8h5l1 5 6-7H8L7 1z" fill="white"/></svg>
447
+ </div>
448
+ <span class="font-bold text-white">Voltage</span>
449
+ <span class="text-gray-600 mono text-xs ml-3">© 2025</span>
450
+ </div>
451
+ <div class="flex flex-wrap gap-6 mono text-xs">
452
+ <a href="#" class="hover:text-white transition-colors">Docs</a>
453
+ <a href="#" class="hover:text-white transition-colors">Pricing</a>
454
+ <a href="#" class="hover:text-white transition-colors">Status</a>
455
+ <a href="#" class="hover:text-white transition-colors">GitHub</a>
456
+ <a href="#" class="hover:text-white transition-colors">Discord</a>
457
+ <a href="#" class="hover:text-white transition-colors">Privacy</a>
458
+ </div>
459
+ </div>
460
+ </footer>
461
+
462
+ </body>
463
+ </html>