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,836 @@
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 — Cloud Compute</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
9
+ <style>
10
+ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
11
+
12
+ :root {
13
+ --black: #000000;
14
+ --white: #ffffff;
15
+ --off-white: #f0f0ec;
16
+ --gray: #888888;
17
+ --gray-dark: #333333;
18
+ --gray-light: #cccccc;
19
+ --volt: #c8ff00;
20
+ --volt-dark: #9ecc00;
21
+ --display: 'Syne', sans-serif;
22
+ --mono: 'IBM Plex Mono', monospace;
23
+ }
24
+
25
+ body {
26
+ background: var(--off-white);
27
+ color: var(--black);
28
+ font-family: var(--display);
29
+ -webkit-font-smoothing: antialiased;
30
+ }
31
+
32
+ /* ── NAV ── */
33
+ .nav {
34
+ display: flex;
35
+ justify-content: space-between;
36
+ align-items: center;
37
+ padding: 20px 40px;
38
+ border-bottom: 3px solid var(--black);
39
+ }
40
+
41
+ .nav-logo {
42
+ font-weight: 800;
43
+ font-size: 20px;
44
+ letter-spacing: 6px;
45
+ text-transform: uppercase;
46
+ }
47
+
48
+ .nav-links { display: flex; gap: 32px; align-items: center; }
49
+ .nav-links a {
50
+ font-family: var(--mono);
51
+ font-size: 12px;
52
+ color: var(--black);
53
+ text-decoration: none;
54
+ text-transform: uppercase;
55
+ letter-spacing: 1.5px;
56
+ }
57
+ .nav-links a:hover { text-decoration: underline; text-underline-offset: 4px; }
58
+
59
+ .nav-cta {
60
+ background: var(--black) !important;
61
+ color: var(--volt) !important;
62
+ padding: 10px 24px !important;
63
+ font-weight: 600 !important;
64
+ letter-spacing: 2px !important;
65
+ }
66
+
67
+ /* ── HERO: NEWSPAPER SCALE ── */
68
+ .hero {
69
+ display: grid;
70
+ grid-template-columns: 1fr 1fr;
71
+ border-bottom: 3px solid var(--black);
72
+ }
73
+
74
+ .hero-left {
75
+ padding: 80px 48px 60px;
76
+ border-right: 3px solid var(--black);
77
+ display: flex;
78
+ flex-direction: column;
79
+ justify-content: space-between;
80
+ }
81
+
82
+ .hero-headline {
83
+ font-size: clamp(56px, 8vw, 120px);
84
+ font-weight: 800;
85
+ line-height: 0.9;
86
+ letter-spacing: -4px;
87
+ text-transform: uppercase;
88
+ }
89
+
90
+ .hero-headline .volt-text {
91
+ color: var(--black);
92
+ background: var(--volt);
93
+ padding: 0 12px;
94
+ display: inline;
95
+ }
96
+
97
+ .hero-subhead {
98
+ font-family: var(--mono);
99
+ font-size: 14px;
100
+ line-height: 1.8;
101
+ color: var(--gray-dark);
102
+ max-width: 480px;
103
+ margin-top: 32px;
104
+ }
105
+
106
+ .hero-bottom {
107
+ display: flex;
108
+ gap: 24px;
109
+ margin-top: 48px;
110
+ padding-top: 24px;
111
+ border-top: 1px solid var(--gray-light);
112
+ }
113
+
114
+ .hero-metric {
115
+ flex: 1;
116
+ }
117
+
118
+ .hero-metric-value {
119
+ font-size: 36px;
120
+ font-weight: 800;
121
+ letter-spacing: -1px;
122
+ }
123
+
124
+ .hero-metric-label {
125
+ font-family: var(--mono);
126
+ font-size: 10px;
127
+ text-transform: uppercase;
128
+ letter-spacing: 2px;
129
+ color: var(--gray);
130
+ margin-top: 4px;
131
+ }
132
+
133
+ /* ── HERO RIGHT: TERMINAL ON LIGHT ── */
134
+ .hero-right {
135
+ background: var(--black);
136
+ color: var(--white);
137
+ padding: 0;
138
+ display: flex;
139
+ flex-direction: column;
140
+ }
141
+
142
+ .term-chrome {
143
+ padding: 16px 24px;
144
+ border-bottom: 1px solid #222;
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: space-between;
148
+ font-family: var(--mono);
149
+ font-size: 11px;
150
+ color: var(--gray);
151
+ }
152
+
153
+ .term-dots { display: flex; gap: 6px; }
154
+ .term-dots span { width: 10px; height: 10px; border-radius: 50%; border: 1px solid #444; }
155
+ .term-dots span:first-child { background: #ff5f57; border-color: #ff5f57; }
156
+
157
+ .term-body {
158
+ flex: 1;
159
+ padding: 32px 28px;
160
+ font-family: var(--mono);
161
+ font-size: 13px;
162
+ line-height: 2;
163
+ overflow: auto;
164
+ }
165
+
166
+ .t-comment { color: #555; }
167
+ .t-kw { color: var(--volt); }
168
+ .t-str { color: #7ec8e3; }
169
+ .t-fn { color: #fff; }
170
+ .t-dec { color: #ff9f43; }
171
+ .t-num { color: #ff6b6b; }
172
+ .t-param { color: var(--gray-light); }
173
+
174
+ /* ── CTA BAR ── */
175
+ .cta-bar {
176
+ display: flex;
177
+ border-bottom: 3px solid var(--black);
178
+ }
179
+
180
+ .cta-bar-left {
181
+ flex: 1;
182
+ background: var(--volt);
183
+ padding: 28px 48px;
184
+ font-weight: 800;
185
+ font-size: 20px;
186
+ text-transform: uppercase;
187
+ letter-spacing: 4px;
188
+ display: flex;
189
+ align-items: center;
190
+ }
191
+
192
+ .cta-bar-right {
193
+ background: var(--black);
194
+ color: var(--volt);
195
+ padding: 28px 48px;
196
+ font-family: var(--mono);
197
+ font-size: 14px;
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 8px;
201
+ cursor: pointer;
202
+ text-decoration: none;
203
+ }
204
+
205
+ .cta-bar-right:hover { background: #111; }
206
+
207
+ /* ── CONTENT BLOCKS ── */
208
+ .split-section {
209
+ display: grid;
210
+ grid-template-columns: 1fr 1fr;
211
+ border-bottom: 3px solid var(--black);
212
+ }
213
+
214
+ .split-left {
215
+ padding: 64px 48px;
216
+ border-right: 3px solid var(--black);
217
+ }
218
+
219
+ .split-right {
220
+ padding: 64px 48px;
221
+ }
222
+
223
+ .block-label {
224
+ font-family: var(--mono);
225
+ font-size: 10px;
226
+ text-transform: uppercase;
227
+ letter-spacing: 3px;
228
+ color: var(--gray);
229
+ margin-bottom: 20px;
230
+ }
231
+
232
+ .block-title {
233
+ font-size: 32px;
234
+ font-weight: 800;
235
+ line-height: 1.1;
236
+ letter-spacing: -1px;
237
+ text-transform: uppercase;
238
+ margin-bottom: 16px;
239
+ }
240
+
241
+ .block-text {
242
+ font-family: var(--mono);
243
+ font-size: 13px;
244
+ line-height: 1.8;
245
+ color: var(--gray-dark);
246
+ }
247
+
248
+ /* ── GPU TABLE ── */
249
+ .gpu-section {
250
+ border-bottom: 3px solid var(--black);
251
+ padding: 64px 48px;
252
+ }
253
+
254
+ .gpu-table {
255
+ width: 100%;
256
+ border-collapse: collapse;
257
+ font-family: var(--mono);
258
+ font-size: 13px;
259
+ margin-top: 32px;
260
+ }
261
+
262
+ .gpu-table th {
263
+ text-align: left;
264
+ padding: 12px 16px;
265
+ font-size: 10px;
266
+ text-transform: uppercase;
267
+ letter-spacing: 2px;
268
+ color: var(--gray);
269
+ border-bottom: 3px solid var(--black);
270
+ font-weight: 500;
271
+ }
272
+
273
+ .gpu-table td {
274
+ padding: 14px 16px;
275
+ border-bottom: 1px solid var(--gray-light);
276
+ }
277
+
278
+ .gpu-table tr:hover td {
279
+ background: var(--volt);
280
+ color: var(--black);
281
+ }
282
+
283
+ .gpu-name { font-weight: 600; }
284
+ .gpu-price { font-weight: 600; }
285
+
286
+ /* ── FEATURES: STACKED BLOCKS ── */
287
+ .features-stack {
288
+ border-bottom: 3px solid var(--black);
289
+ }
290
+
291
+ .feature-row {
292
+ display: grid;
293
+ grid-template-columns: 200px 1fr 1fr;
294
+ border-bottom: 1px solid var(--gray-light);
295
+ }
296
+
297
+ .feature-row:last-child { border-bottom: none; }
298
+
299
+ .feature-num {
300
+ padding: 28px 32px;
301
+ font-weight: 800;
302
+ font-size: 48px;
303
+ color: var(--gray-light);
304
+ border-right: 3px solid var(--black);
305
+ display: flex;
306
+ align-items: center;
307
+ }
308
+
309
+ .feature-title-col {
310
+ padding: 28px 32px;
311
+ border-right: 1px solid var(--gray-light);
312
+ display: flex;
313
+ align-items: center;
314
+ }
315
+
316
+ .feature-row-title {
317
+ font-size: 20px;
318
+ font-weight: 700;
319
+ text-transform: uppercase;
320
+ letter-spacing: -0.5px;
321
+ }
322
+
323
+ .feature-desc-col {
324
+ padding: 28px 32px;
325
+ display: flex;
326
+ align-items: center;
327
+ }
328
+
329
+ .feature-row-desc {
330
+ font-family: var(--mono);
331
+ font-size: 13px;
332
+ color: var(--gray-dark);
333
+ line-height: 1.6;
334
+ }
335
+
336
+ /* ── CODE EXAMPLES ── */
337
+ .code-section {
338
+ display: grid;
339
+ grid-template-columns: 1fr 1fr;
340
+ border-bottom: 3px solid var(--black);
341
+ }
342
+
343
+ .code-panel {
344
+ border-right: 3px solid var(--black);
345
+ background: var(--black);
346
+ color: var(--white);
347
+ }
348
+
349
+ .code-panel:last-child { border-right: none; }
350
+
351
+ .code-panel-header {
352
+ padding: 16px 24px;
353
+ border-bottom: 1px solid #222;
354
+ font-family: var(--mono);
355
+ font-size: 11px;
356
+ color: var(--gray);
357
+ display: flex;
358
+ justify-content: space-between;
359
+ }
360
+
361
+ .code-panel-body {
362
+ padding: 24px;
363
+ font-family: var(--mono);
364
+ font-size: 12.5px;
365
+ line-height: 1.9;
366
+ }
367
+
368
+ /* ── PRICING STRIP ── */
369
+ .pricing-strip {
370
+ display: grid;
371
+ grid-template-columns: repeat(4, 1fr);
372
+ border-bottom: 3px solid var(--black);
373
+ }
374
+
375
+ .pricing-cell {
376
+ padding: 40px 32px;
377
+ border-right: 3px solid var(--black);
378
+ }
379
+
380
+ .pricing-cell:last-child { border-right: none; }
381
+
382
+ .pricing-cell.featured {
383
+ background: var(--black);
384
+ color: var(--white);
385
+ }
386
+
387
+ .pricing-cell.featured .pricing-cell-label { color: var(--volt); }
388
+ .pricing-cell.featured .pricing-cell-price { color: var(--white); }
389
+
390
+ .pricing-cell-label {
391
+ font-family: var(--mono);
392
+ font-size: 10px;
393
+ text-transform: uppercase;
394
+ letter-spacing: 2px;
395
+ color: var(--gray);
396
+ margin-bottom: 12px;
397
+ }
398
+
399
+ .pricing-cell-price {
400
+ font-size: 40px;
401
+ font-weight: 800;
402
+ letter-spacing: -2px;
403
+ }
404
+
405
+ .pricing-cell-unit {
406
+ font-family: var(--mono);
407
+ font-size: 11px;
408
+ color: var(--gray);
409
+ margin-bottom: 20px;
410
+ }
411
+
412
+ .pricing-cell-list {
413
+ list-style: none;
414
+ font-family: var(--mono);
415
+ font-size: 12px;
416
+ line-height: 2;
417
+ }
418
+
419
+ .pricing-cell-list li::before {
420
+ content: "--";
421
+ margin-right: 6px;
422
+ color: var(--gray);
423
+ }
424
+
425
+ .pricing-cell.featured .pricing-cell-list li::before { color: var(--volt); }
426
+
427
+ /* ── BOTTOM CTA ── */
428
+ .bottom-cta {
429
+ display: grid;
430
+ grid-template-columns: 2fr 1fr;
431
+ border-bottom: 3px solid var(--black);
432
+ }
433
+
434
+ .bottom-cta-left {
435
+ padding: 80px 48px;
436
+ border-right: 3px solid var(--black);
437
+ }
438
+
439
+ .bottom-cta-title {
440
+ font-size: 56px;
441
+ font-weight: 800;
442
+ text-transform: uppercase;
443
+ letter-spacing: -2px;
444
+ line-height: 1;
445
+ margin-bottom: 24px;
446
+ }
447
+
448
+ .bottom-cta-sub {
449
+ font-family: var(--mono);
450
+ font-size: 14px;
451
+ color: var(--gray-dark);
452
+ margin-bottom: 32px;
453
+ }
454
+
455
+ .bottom-cta-right {
456
+ background: var(--volt);
457
+ display: flex;
458
+ align-items: center;
459
+ justify-content: center;
460
+ flex-direction: column;
461
+ padding: 48px;
462
+ text-align: center;
463
+ cursor: pointer;
464
+ }
465
+
466
+ .bottom-cta-right:hover { background: var(--volt-dark); }
467
+
468
+ .bottom-cta-action {
469
+ font-size: 20px;
470
+ font-weight: 800;
471
+ text-transform: uppercase;
472
+ letter-spacing: 4px;
473
+ }
474
+
475
+ .bottom-cta-hint {
476
+ font-family: var(--mono);
477
+ font-size: 12px;
478
+ margin-top: 8px;
479
+ color: var(--gray-dark);
480
+ }
481
+
482
+ /* ── FOOTER ── */
483
+ .footer {
484
+ display: flex;
485
+ justify-content: space-between;
486
+ padding: 24px 48px;
487
+ font-family: var(--mono);
488
+ font-size: 11px;
489
+ color: var(--gray);
490
+ text-transform: uppercase;
491
+ letter-spacing: 1px;
492
+ }
493
+
494
+ /* ── MOBILE ── */
495
+ @media (max-width: 900px) {
496
+ .hero { grid-template-columns: 1fr; }
497
+ .hero-left { border-right: none; border-bottom: 3px solid var(--black); padding: 48px 24px; }
498
+ .hero-right { min-height: 400px; }
499
+ .hero-headline { font-size: 48px; letter-spacing: -2px; }
500
+ .split-section { grid-template-columns: 1fr; }
501
+ .split-left { border-right: none; border-bottom: 1px solid var(--gray-light); }
502
+ .feature-row { grid-template-columns: 60px 1fr; }
503
+ .feature-num { font-size: 24px; padding: 16px; }
504
+ .feature-desc-col { display: none; }
505
+ .code-section { grid-template-columns: 1fr; }
506
+ .code-panel { border-right: none; border-bottom: 3px solid var(--black); }
507
+ .pricing-strip { grid-template-columns: 1fr 1fr; }
508
+ .pricing-cell { border-bottom: 3px solid var(--black); }
509
+ .bottom-cta { grid-template-columns: 1fr; }
510
+ .bottom-cta-left { border-right: none; }
511
+ .cta-bar { flex-direction: column; }
512
+ .nav-links { gap: 16px; }
513
+ }
514
+
515
+ @media (max-width: 600px) {
516
+ .pricing-strip { grid-template-columns: 1fr; }
517
+ .nav-links a:not(.nav-cta) { display: none; }
518
+ .hero-bottom { flex-direction: column; gap: 16px; }
519
+ }
520
+ </style>
521
+ </head>
522
+ <body>
523
+
524
+ <!-- NAV -->
525
+ <nav class="nav">
526
+ <div class="nav-logo">VOLTAGE</div>
527
+ <div class="nav-links">
528
+ <a href="#">Docs</a>
529
+ <a href="#">Pricing</a>
530
+ <a href="#">Changelog</a>
531
+ <a href="#" class="nav-cta">Get started</a>
532
+ </div>
533
+ </nav>
534
+
535
+ <!-- HERO -->
536
+ <section class="hero">
537
+ <div class="hero-left">
538
+ <div>
539
+ <h1 class="hero-headline">
540
+ YOUR<br>CODE.<br><span class="volt-text">OUR</span><br>GPUS.
541
+ </h1>
542
+ <p class="hero-subhead">
543
+ Serverless compute for AI workloads. Write ordinary Python, attach GPUs with a decorator, scale from zero to thousands of containers. No Dockerfiles. No YAML. No clusters.
544
+ </p>
545
+ </div>
546
+ <div class="hero-bottom">
547
+ <div class="hero-metric">
548
+ <div class="hero-metric-value">&lt;300ms</div>
549
+ <div class="hero-metric-label">Cold start</div>
550
+ </div>
551
+ <div class="hero-metric">
552
+ <div class="hero-metric-value">10K+</div>
553
+ <div class="hero-metric-label">Max containers</div>
554
+ </div>
555
+ <div class="hero-metric">
556
+ <div class="hero-metric-value">$0</div>
557
+ <div class="hero-metric-label">When idle</div>
558
+ </div>
559
+ </div>
560
+ </div>
561
+
562
+ <div class="hero-right">
563
+ <div class="term-chrome">
564
+ <div class="term-dots"><span></span><span></span><span></span></div>
565
+ <div>inference.py</div>
566
+ </div>
567
+ <div class="term-body">
568
+ <div><span class="t-kw">import</span> voltage</div>
569
+ <div>&nbsp;</div>
570
+ <div><span class="t-fn">app</span> = voltage.<span class="t-fn">App</span>(<span class="t-str">"llm-service"</span>)</div>
571
+ <div>&nbsp;</div>
572
+ <div><span class="t-comment"># Container image with dependencies baked in</span></div>
573
+ <div><span class="t-fn">image</span> = (</div>
574
+ <div>&nbsp;&nbsp;voltage.<span class="t-fn">Image</span>.debian_slim(python=<span class="t-str">"3.11"</span>)</div>
575
+ <div>&nbsp;&nbsp;.<span class="t-fn">pip_install</span>(<span class="t-str">"vllm"</span>, <span class="t-str">"torch"</span>)</div>
576
+ <div>)</div>
577
+ <div>&nbsp;</div>
578
+ <div><span class="t-dec">@app.cls</span>(gpu=<span class="t-str">"H100"</span>, image=image)</div>
579
+ <div><span class="t-kw">class</span> <span class="t-fn">LLM</span>:</div>
580
+ <div>&nbsp;&nbsp;<span class="t-dec">@voltage.enter</span>()</div>
581
+ <div>&nbsp;&nbsp;<span class="t-kw">def</span> <span class="t-fn">load</span>(self):</div>
582
+ <div>&nbsp;&nbsp;&nbsp;&nbsp;<span class="t-kw">from</span> vllm <span class="t-kw">import</span> LLM</div>
583
+ <div>&nbsp;&nbsp;&nbsp;&nbsp;self.engine = LLM(<span class="t-str">"meta-llama/Llama-3-70B"</span>)</div>
584
+ <div>&nbsp;</div>
585
+ <div>&nbsp;&nbsp;<span class="t-dec">@voltage.method</span>()</div>
586
+ <div>&nbsp;&nbsp;<span class="t-kw">def</span> <span class="t-fn">generate</span>(self, prompt: <span class="t-param">str</span>) -> <span class="t-param">str</span>:</div>
587
+ <div>&nbsp;&nbsp;&nbsp;&nbsp;output = self.engine.generate(prompt)</div>
588
+ <div>&nbsp;&nbsp;&nbsp;&nbsp;<span class="t-kw">return</span> output[<span class="t-num">0</span>].outputs[<span class="t-num">0</span>].text</div>
589
+ <div>&nbsp;</div>
590
+ <div><span class="t-dec">@app.endpoint</span>(method=<span class="t-str">"POST"</span>)</div>
591
+ <div><span class="t-kw">def</span> <span class="t-fn">serve</span>(prompt: <span class="t-param">str</span>):</div>
592
+ <div>&nbsp;&nbsp;<span class="t-kw">return</span> LLM().<span class="t-fn">generate</span>.remote(prompt)</div>
593
+ </div>
594
+ </div>
595
+ </section>
596
+
597
+ <!-- CTA BAR -->
598
+ <div class="cta-bar">
599
+ <div class="cta-bar-left">pip install voltage && voltage deploy</div>
600
+ <a href="#" class="cta-bar-right">RUN YOUR FIRST FUNCTION &#8594;</a>
601
+ </div>
602
+
603
+ <!-- SPLIT: HOW IT WORKS -->
604
+ <section class="split-section">
605
+ <div class="split-left">
606
+ <div class="block-label">How it works</div>
607
+ <h2 class="block-title">Write Python.<br>Add a decorator.<br>Deploy.</h2>
608
+ <p class="block-text">
609
+ Voltage serializes your function, builds a container image with your dependencies, and deploys it to our global fleet. When a request comes in, we boot a container in under 300ms, run your code on the GPU you specified, and shut it down when done. You only pay for the seconds your code is actually running.
610
+ </p>
611
+ </div>
612
+ <div class="split-right">
613
+ <div class="block-label">What you don't need</div>
614
+ <h2 class="block-title">No Dockerfiles.<br>No K8s manifests.<br>No Terraform.</h2>
615
+ <p class="block-text">
616
+ No cluster provisioning. No autoscaler configuration. No load balancer setup. No container registry management. No GPU driver installation. No CUDA version juggling. No spot instance bidding. No capacity reservations. Your Python function is the entire deployment artifact.
617
+ </p>
618
+ </div>
619
+ </section>
620
+
621
+ <!-- GPU TABLE -->
622
+ <section class="gpu-section">
623
+ <div class="block-label">GPU Catalog</div>
624
+ <h2 class="block-title">Every GPU. On demand. Per second.</h2>
625
+
626
+ <table class="gpu-table">
627
+ <thead>
628
+ <tr>
629
+ <th>GPU</th>
630
+ <th>VRAM</th>
631
+ <th>FP16 TFLOPS</th>
632
+ <th>Best for</th>
633
+ <th>$/hr</th>
634
+ </tr>
635
+ </thead>
636
+ <tbody>
637
+ <tr>
638
+ <td class="gpu-name">T4</td>
639
+ <td>16 GB</td>
640
+ <td>65</td>
641
+ <td>Inference, embeddings</td>
642
+ <td class="gpu-price">$0.59</td>
643
+ </tr>
644
+ <tr>
645
+ <td class="gpu-name">L4</td>
646
+ <td>24 GB</td>
647
+ <td>121</td>
648
+ <td>Inference, video</td>
649
+ <td class="gpu-price">$0.73</td>
650
+ </tr>
651
+ <tr>
652
+ <td class="gpu-name">A10G</td>
653
+ <td>24 GB</td>
654
+ <td>125</td>
655
+ <td>Training, inference</td>
656
+ <td class="gpu-price">$1.10</td>
657
+ </tr>
658
+ <tr>
659
+ <td class="gpu-name">A100-40GB</td>
660
+ <td>40 GB</td>
661
+ <td>312</td>
662
+ <td>Training, large models</td>
663
+ <td class="gpu-price">$2.78</td>
664
+ </tr>
665
+ <tr>
666
+ <td class="gpu-name">A100-80GB</td>
667
+ <td>80 GB</td>
668
+ <td>312</td>
669
+ <td>Large model training</td>
670
+ <td class="gpu-price">$3.64</td>
671
+ </tr>
672
+ <tr>
673
+ <td class="gpu-name">H100</td>
674
+ <td>80 GB</td>
675
+ <td>989</td>
676
+ <td>Frontier models</td>
677
+ <td class="gpu-price">$4.25</td>
678
+ </tr>
679
+ </tbody>
680
+ </table>
681
+ </section>
682
+
683
+ <!-- FEATURES -->
684
+ <section class="features-stack">
685
+ <div class="feature-row">
686
+ <div class="feature-num">01</div>
687
+ <div class="feature-title-col"><div class="feature-row-title">Scale to zero</div></div>
688
+ <div class="feature-desc-col"><div class="feature-row-desc">No traffic, no cost. Containers spin down automatically. When requests return, cold starts under 300ms bring you back instantly.</div></div>
689
+ </div>
690
+ <div class="feature-row">
691
+ <div class="feature-num">02</div>
692
+ <div class="feature-title-col"><div class="feature-row-title">Burst to thousands</div></div>
693
+ <div class="feature-desc-col"><div class="feature-row-desc">Process millions of items with .map() across 10,000+ parallel containers. Batch inference, ETL, data processing at massive scale.</div></div>
694
+ </div>
695
+ <div class="feature-row">
696
+ <div class="feature-num">03</div>
697
+ <div class="feature-title-col"><div class="feature-row-title">Inference endpoints</div></div>
698
+ <div class="feature-desc-col"><div class="feature-row-desc">Turn any model into an auto-scaling HTTP API. Built-in request batching, GPU warmup pools, and global edge routing.</div></div>
699
+ </div>
700
+ <div class="feature-row">
701
+ <div class="feature-num">04</div>
702
+ <div class="feature-title-col"><div class="feature-row-title">Scheduled compute</div></div>
703
+ <div class="feature-desc-col"><div class="feature-row-desc">Cron-scheduled training runs, nightly pipelines, periodic batch jobs. GPU provisioned only for the duration of execution.</div></div>
704
+ </div>
705
+ <div class="feature-row">
706
+ <div class="feature-num">05</div>
707
+ <div class="feature-title-col"><div class="feature-row-title">Persistent storage</div></div>
708
+ <div class="feature-desc-col"><div class="feature-row-desc">Mount shared volumes across functions. Cache model weights, store training checkpoints, share data between pipeline stages.</div></div>
709
+ </div>
710
+ <div class="feature-row">
711
+ <div class="feature-num">06</div>
712
+ <div class="feature-title-col"><div class="feature-row-title">Local dev loop</div></div>
713
+ <div class="feature-desc-col"><div class="feature-row-desc">Interactive shells on remote containers. Hot-reload code. Stream logs. Debug in production with the same tools you use locally.</div></div>
714
+ </div>
715
+ </section>
716
+
717
+ <!-- CODE EXAMPLES -->
718
+ <section class="code-section">
719
+ <div class="code-panel">
720
+ <div class="code-panel-header">
721
+ <span>batch_embed.py</span>
722
+ <span>Parallel processing</span>
723
+ </div>
724
+ <div class="code-panel-body">
725
+ <div><span class="t-dec">@app.function</span>(gpu=<span class="t-str">"T4"</span>)</div>
726
+ <div><span class="t-kw">def</span> <span class="t-fn">embed</span>(texts: list[<span class="t-param">str</span>]):</div>
727
+ <div>&nbsp;&nbsp;<span class="t-kw">from</span> sentence_transformers <span class="t-kw">import</span> (</div>
728
+ <div>&nbsp;&nbsp;&nbsp;&nbsp;SentenceTransformer</div>
729
+ <div>&nbsp;&nbsp;)</div>
730
+ <div>&nbsp;&nbsp;model = SentenceTransformer(</div>
731
+ <div>&nbsp;&nbsp;&nbsp;&nbsp;<span class="t-str">"all-MiniLM-L6-v2"</span></div>
732
+ <div>&nbsp;&nbsp;)</div>
733
+ <div>&nbsp;&nbsp;<span class="t-kw">return</span> model.encode(texts)</div>
734
+ <div>&nbsp;</div>
735
+ <div><span class="t-comment"># Fan out across 500 containers</span></div>
736
+ <div><span class="t-comment"># Process 5M docs in 4 minutes</span></div>
737
+ <div>results = list(</div>
738
+ <div>&nbsp;&nbsp;embed.<span class="t-fn">map</span>(batches, </div>
739
+ <div>&nbsp;&nbsp;&nbsp;&nbsp;order=<span class="t-kw">True</span>)</div>
740
+ <div>)</div>
741
+ </div>
742
+ </div>
743
+ <div class="code-panel">
744
+ <div class="code-panel-header">
745
+ <span>train_nightly.py</span>
746
+ <span>Scheduled GPU job</span>
747
+ </div>
748
+ <div class="code-panel-body">
749
+ <div><span class="t-fn">vol</span> = voltage.<span class="t-fn">Volume</span>.from_name(</div>
750
+ <div>&nbsp;&nbsp;<span class="t-str">"training-data"</span>,</div>
751
+ <div>&nbsp;&nbsp;create_if_missing=<span class="t-kw">True</span></div>
752
+ <div>)</div>
753
+ <div>&nbsp;</div>
754
+ <div><span class="t-dec">@app.function</span>(</div>
755
+ <div>&nbsp;&nbsp;gpu=<span class="t-str">"A100-80GB"</span>,</div>
756
+ <div>&nbsp;&nbsp;volumes={<span class="t-str">"/data"</span>: vol},</div>
757
+ <div>&nbsp;&nbsp;schedule=voltage.Cron(</div>
758
+ <div>&nbsp;&nbsp;&nbsp;&nbsp;<span class="t-str">"0 3 * * *"</span></div>
759
+ <div>&nbsp;&nbsp;),</div>
760
+ <div>&nbsp;&nbsp;timeout=<span class="t-num">7200</span>,</div>
761
+ <div>)</div>
762
+ <div><span class="t-kw">def</span> <span class="t-fn">finetune</span>():</div>
763
+ <div>&nbsp;&nbsp;train(load(<span class="t-str">"/data/new"</span>))</div>
764
+ <div>&nbsp;&nbsp;push_model()</div>
765
+ </div>
766
+ </div>
767
+ </section>
768
+
769
+ <!-- PRICING -->
770
+ <section class="pricing-strip">
771
+ <div class="pricing-cell">
772
+ <div class="pricing-cell-label">CPU compute</div>
773
+ <div class="pricing-cell-price">$0.024</div>
774
+ <div class="pricing-cell-unit">per vCPU/hr</div>
775
+ <ul class="pricing-cell-list">
776
+ <li>Up to 64 vCPUs</li>
777
+ <li>256 GB RAM max</li>
778
+ <li>Per-second billing</li>
779
+ <li>Scale to zero</li>
780
+ </ul>
781
+ </div>
782
+ <div class="pricing-cell featured">
783
+ <div class="pricing-cell-label">GPU compute</div>
784
+ <div class="pricing-cell-price">$0.59</div>
785
+ <div class="pricing-cell-unit">per GPU/hr (from T4)</div>
786
+ <ul class="pricing-cell-list">
787
+ <li>T4 through H100</li>
788
+ <li>Multi-GPU support</li>
789
+ <li>Per-second billing</li>
790
+ <li>Preemptible: 60% off</li>
791
+ </ul>
792
+ </div>
793
+ <div class="pricing-cell">
794
+ <div class="pricing-cell-label">Storage</div>
795
+ <div class="pricing-cell-price">$0.10</div>
796
+ <div class="pricing-cell-unit">per GB/month</div>
797
+ <ul class="pricing-cell-list">
798
+ <li>Persistent volumes</li>
799
+ <li>Cross-function sharing</li>
800
+ <li>Snapshots included</li>
801
+ <li>NFS compatible</li>
802
+ </ul>
803
+ </div>
804
+ <div class="pricing-cell">
805
+ <div class="pricing-cell-label">Network</div>
806
+ <div class="pricing-cell-price">$0.00</div>
807
+ <div class="pricing-cell-unit">ingress always free</div>
808
+ <ul class="pricing-cell-list">
809
+ <li>Unlimited ingress</li>
810
+ <li>$0.05/GB egress</li>
811
+ <li>Private VPC peering</li>
812
+ <li>Global edge</li>
813
+ </ul>
814
+ </div>
815
+ </section>
816
+
817
+ <!-- BOTTOM CTA -->
818
+ <section class="bottom-cta">
819
+ <div class="bottom-cta-left">
820
+ <h2 class="bottom-cta-title">STOP MANAGING<br>INFRASTRUCTURE.</h2>
821
+ <p class="bottom-cta-sub">pip install voltage. Write a function. Ship it. The cloud is a decorator away.</p>
822
+ </div>
823
+ <a href="#" class="bottom-cta-right">
824
+ <div class="bottom-cta-action">Get started</div>
825
+ <div class="bottom-cta-hint">Free tier available</div>
826
+ </a>
827
+ </section>
828
+
829
+ <!-- FOOTER -->
830
+ <footer class="footer">
831
+ <span>VOLTAGE 2026</span>
832
+ <span>DOCS / PRICING / STATUS / GITHUB</span>
833
+ </footer>
834
+
835
+ </body>
836
+ </html>