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.
- package/README.md +34 -1
- package/bin/cross-publish.mjs +344 -0
- package/bin/forgedock.mjs +229 -17
- package/commands/autopilot.md +77 -0
- package/commands/design-bench.md +176 -0
- package/commands/design-render-critique-loop.md +103 -0
- package/commands/design.md +259 -0
- package/commands/issue.md +7 -3
- package/commands/orchestrate.md +121 -0
- package/commands/{resume.md → pipeline-resume.md} +4 -4
- package/commands/{status.md → pipeline-status.md} +1 -1
- package/commands/qa-sweep.md +37 -2
- package/commands/quality-gate.md +57 -0
- package/commands/review-pr-staging.md +158 -2
- package/commands/test-gate.md +929 -0
- package/commands/work-on/build/implement.md +5 -3
- package/commands/work-on.md +53 -3
- package/docs/CI.md +177 -0
- package/docs/FORGE-PROTOCOL.md +324 -0
- package/docs/articles/b-vs-c-baseline.md +210 -0
- package/docs/articles/full-abc-benchmark.md +205 -0
- package/docs/articles/selective-spec-loading-token-savings.md +140 -0
- package/docs/design/abc-benchmark.md +195 -0
- package/docs/design/design-architect-rationale.md +123 -0
- package/docs/design/design-memory.md +61 -0
- package/docs/design/design-spec-schema.md +248 -0
- package/docs/design/design-system-lint.md +150 -0
- package/docs/design/divergent-generation.md +106 -0
- package/docs/design/effects-appropriateness.md +133 -0
- package/docs/design/fixtures/briefs/README.md +47 -0
- package/docs/design/fixtures/briefs/cadence.md +39 -0
- package/docs/design/fixtures/briefs/plume.md +39 -0
- package/docs/design/fixtures/briefs/slipstream.md +39 -0
- package/docs/design/fixtures/briefs/tender.md +39 -0
- package/docs/design/fixtures/briefs/voltage.md +39 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
- package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
- package/docs/design/foundations/brutalist.css +294 -0
- package/docs/design/foundations/editorial.css +300 -0
- package/docs/design/foundations/minimal-luxury.css +295 -0
- package/docs/design/foundations/technical.css +293 -0
- package/docs/design/foundations/warm-photo.css +299 -0
- package/docs/design/reference-corpus.md +1726 -0
- package/docs/design/render-critique-loop.md +57 -0
- package/docs/spec-graph-schema.md +397 -0
- package/package.json +1 -1
- package/scripts/bench-scorecard.mjs +239 -0
- package/scripts/build-spec-graph.mjs +509 -0
- package/scripts/check-native-conflicts.sh +200 -0
- package/scripts/classify-lane.sh +0 -7
- package/scripts/design-system-lint.mjs +993 -0
- package/scripts/graph-query.sh +486 -0
- package/scripts/transition-label.sh +10 -2
- package/scripts/validate-spec-graph.sh +423 -0
- package/templates/workflows/forgedock-review.yml +96 -0
|
@@ -0,0 +1,1010 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Voltage — Serverless Compute for AI</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
9
|
+
<style>
|
|
10
|
+
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
11
|
+
|
|
12
|
+
:root {
|
|
13
|
+
--bg: #0a0e14;
|
|
14
|
+
--surface: #111820;
|
|
15
|
+
--surface-2: #161d27;
|
|
16
|
+
--border: #1e2a38;
|
|
17
|
+
--text: #c5cdd8;
|
|
18
|
+
--text-bright: #e8edf3;
|
|
19
|
+
--text-muted: #5a6a7e;
|
|
20
|
+
--accent: #22d68a;
|
|
21
|
+
--accent-dim: #1a9e66;
|
|
22
|
+
--accent-glow: rgba(34, 214, 138, 0.08);
|
|
23
|
+
--red: #e5534b;
|
|
24
|
+
--yellow: #daaa3f;
|
|
25
|
+
--blue: #539bf5;
|
|
26
|
+
--mono: 'JetBrains Mono', monospace;
|
|
27
|
+
--sans: 'Space Grotesk', sans-serif;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
body {
|
|
31
|
+
background: var(--bg);
|
|
32
|
+
color: var(--text);
|
|
33
|
+
font-family: var(--sans);
|
|
34
|
+
line-height: 1.6;
|
|
35
|
+
-webkit-font-smoothing: antialiased;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* ── TOPBAR ── */
|
|
39
|
+
.topbar {
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: space-between;
|
|
43
|
+
padding: 16px 32px;
|
|
44
|
+
border-bottom: 1px solid var(--border);
|
|
45
|
+
position: sticky;
|
|
46
|
+
top: 0;
|
|
47
|
+
background: rgba(10, 14, 20, 0.92);
|
|
48
|
+
backdrop-filter: blur(12px);
|
|
49
|
+
z-index: 100;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.topbar-logo {
|
|
53
|
+
font-family: var(--mono);
|
|
54
|
+
font-weight: 700;
|
|
55
|
+
font-size: 18px;
|
|
56
|
+
color: var(--accent);
|
|
57
|
+
letter-spacing: -0.5px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.topbar-logo span { color: var(--text-muted); font-weight: 400; }
|
|
61
|
+
|
|
62
|
+
.topbar-nav { display: flex; gap: 28px; align-items: center; }
|
|
63
|
+
.topbar-nav a {
|
|
64
|
+
color: var(--text-muted);
|
|
65
|
+
text-decoration: none;
|
|
66
|
+
font-size: 13px;
|
|
67
|
+
font-weight: 500;
|
|
68
|
+
transition: color 0.15s;
|
|
69
|
+
}
|
|
70
|
+
.topbar-nav a:hover { color: var(--text-bright); }
|
|
71
|
+
|
|
72
|
+
.btn-primary {
|
|
73
|
+
display: inline-flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
gap: 6px;
|
|
76
|
+
background: var(--accent);
|
|
77
|
+
color: var(--bg);
|
|
78
|
+
font-family: var(--mono);
|
|
79
|
+
font-size: 13px;
|
|
80
|
+
font-weight: 600;
|
|
81
|
+
padding: 8px 18px;
|
|
82
|
+
border: none;
|
|
83
|
+
cursor: pointer;
|
|
84
|
+
text-decoration: none;
|
|
85
|
+
transition: background 0.15s;
|
|
86
|
+
}
|
|
87
|
+
.btn-primary:hover { background: var(--accent-dim); }
|
|
88
|
+
|
|
89
|
+
.btn-ghost {
|
|
90
|
+
display: inline-flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
gap: 6px;
|
|
93
|
+
background: transparent;
|
|
94
|
+
color: var(--text);
|
|
95
|
+
font-family: var(--mono);
|
|
96
|
+
font-size: 13px;
|
|
97
|
+
font-weight: 500;
|
|
98
|
+
padding: 8px 18px;
|
|
99
|
+
border: 1px solid var(--border);
|
|
100
|
+
cursor: pointer;
|
|
101
|
+
text-decoration: none;
|
|
102
|
+
transition: border-color 0.15s;
|
|
103
|
+
}
|
|
104
|
+
.btn-ghost:hover { border-color: var(--text-muted); }
|
|
105
|
+
|
|
106
|
+
/* ── HERO: DASHBOARD LAYOUT ── */
|
|
107
|
+
.hero {
|
|
108
|
+
display: grid;
|
|
109
|
+
grid-template-columns: 1fr 1fr;
|
|
110
|
+
gap: 0;
|
|
111
|
+
min-height: 85vh;
|
|
112
|
+
border-bottom: 1px solid var(--border);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.hero-left {
|
|
116
|
+
padding: 80px 48px 80px 48px;
|
|
117
|
+
display: flex;
|
|
118
|
+
flex-direction: column;
|
|
119
|
+
justify-content: center;
|
|
120
|
+
max-width: 640px;
|
|
121
|
+
margin-left: auto;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.hero-badge {
|
|
125
|
+
font-family: var(--mono);
|
|
126
|
+
font-size: 11px;
|
|
127
|
+
color: var(--accent);
|
|
128
|
+
text-transform: uppercase;
|
|
129
|
+
letter-spacing: 2px;
|
|
130
|
+
margin-bottom: 24px;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.hero-title {
|
|
134
|
+
font-size: 48px;
|
|
135
|
+
font-weight: 700;
|
|
136
|
+
line-height: 1.1;
|
|
137
|
+
color: var(--text-bright);
|
|
138
|
+
letter-spacing: -1.5px;
|
|
139
|
+
margin-bottom: 20px;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.hero-sub {
|
|
143
|
+
font-size: 17px;
|
|
144
|
+
color: var(--text-muted);
|
|
145
|
+
line-height: 1.7;
|
|
146
|
+
margin-bottom: 36px;
|
|
147
|
+
max-width: 460px;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.hero-actions { display: flex; gap: 12px; margin-bottom: 48px; }
|
|
151
|
+
|
|
152
|
+
.hero-stats {
|
|
153
|
+
display: grid;
|
|
154
|
+
grid-template-columns: repeat(3, 1fr);
|
|
155
|
+
gap: 1px;
|
|
156
|
+
background: var(--border);
|
|
157
|
+
border: 1px solid var(--border);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.hero-stat {
|
|
161
|
+
background: var(--surface);
|
|
162
|
+
padding: 16px 20px;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.hero-stat-value {
|
|
166
|
+
font-family: var(--mono);
|
|
167
|
+
font-size: 22px;
|
|
168
|
+
font-weight: 700;
|
|
169
|
+
color: var(--text-bright);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.hero-stat-label {
|
|
173
|
+
font-size: 11px;
|
|
174
|
+
color: var(--text-muted);
|
|
175
|
+
text-transform: uppercase;
|
|
176
|
+
letter-spacing: 1px;
|
|
177
|
+
margin-top: 4px;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* ── HERO RIGHT: LIVE TERMINAL ── */
|
|
181
|
+
.hero-right {
|
|
182
|
+
background: var(--surface);
|
|
183
|
+
border-left: 1px solid var(--border);
|
|
184
|
+
padding: 0;
|
|
185
|
+
display: flex;
|
|
186
|
+
flex-direction: column;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.terminal-bar {
|
|
190
|
+
display: flex;
|
|
191
|
+
align-items: center;
|
|
192
|
+
gap: 8px;
|
|
193
|
+
padding: 12px 20px;
|
|
194
|
+
border-bottom: 1px solid var(--border);
|
|
195
|
+
font-family: var(--mono);
|
|
196
|
+
font-size: 11px;
|
|
197
|
+
color: var(--text-muted);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.terminal-dot {
|
|
201
|
+
width: 8px;
|
|
202
|
+
height: 8px;
|
|
203
|
+
border-radius: 50%;
|
|
204
|
+
}
|
|
205
|
+
.terminal-dot.r { background: var(--red); }
|
|
206
|
+
.terminal-dot.y { background: var(--yellow); }
|
|
207
|
+
.terminal-dot.g { background: var(--accent); }
|
|
208
|
+
|
|
209
|
+
.terminal-tabs {
|
|
210
|
+
display: flex;
|
|
211
|
+
border-bottom: 1px solid var(--border);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.terminal-tab {
|
|
215
|
+
padding: 8px 20px;
|
|
216
|
+
font-family: var(--mono);
|
|
217
|
+
font-size: 11px;
|
|
218
|
+
color: var(--text-muted);
|
|
219
|
+
border-right: 1px solid var(--border);
|
|
220
|
+
cursor: pointer;
|
|
221
|
+
}
|
|
222
|
+
.terminal-tab.active {
|
|
223
|
+
color: var(--text-bright);
|
|
224
|
+
background: var(--bg);
|
|
225
|
+
border-bottom: 2px solid var(--accent);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.terminal-body {
|
|
229
|
+
flex: 1;
|
|
230
|
+
padding: 24px;
|
|
231
|
+
overflow: auto;
|
|
232
|
+
font-family: var(--mono);
|
|
233
|
+
font-size: 13px;
|
|
234
|
+
line-height: 1.8;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.code-comment { color: var(--text-muted); }
|
|
238
|
+
.code-keyword { color: var(--blue); }
|
|
239
|
+
.code-decorator { color: var(--yellow); }
|
|
240
|
+
.code-string { color: var(--accent); }
|
|
241
|
+
.code-fn { color: var(--text-bright); }
|
|
242
|
+
.code-param { color: var(--red); }
|
|
243
|
+
.code-number { color: var(--yellow); }
|
|
244
|
+
|
|
245
|
+
/* ── SCALING VIZ SECTION ── */
|
|
246
|
+
.scaling-section {
|
|
247
|
+
border-bottom: 1px solid var(--border);
|
|
248
|
+
padding: 80px 48px;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.section-header {
|
|
252
|
+
display: flex;
|
|
253
|
+
justify-content: space-between;
|
|
254
|
+
align-items: flex-end;
|
|
255
|
+
margin-bottom: 48px;
|
|
256
|
+
max-width: 1200px;
|
|
257
|
+
margin-left: auto;
|
|
258
|
+
margin-right: auto;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.section-title {
|
|
262
|
+
font-size: 32px;
|
|
263
|
+
font-weight: 700;
|
|
264
|
+
color: var(--text-bright);
|
|
265
|
+
letter-spacing: -1px;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.section-sub {
|
|
269
|
+
color: var(--text-muted);
|
|
270
|
+
font-size: 14px;
|
|
271
|
+
max-width: 360px;
|
|
272
|
+
text-align: right;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.scaling-grid {
|
|
276
|
+
display: grid;
|
|
277
|
+
grid-template-columns: 2fr 1fr;
|
|
278
|
+
gap: 1px;
|
|
279
|
+
background: var(--border);
|
|
280
|
+
border: 1px solid var(--border);
|
|
281
|
+
max-width: 1200px;
|
|
282
|
+
margin: 0 auto;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.scaling-chart {
|
|
286
|
+
background: var(--surface);
|
|
287
|
+
padding: 40px;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.chart-label {
|
|
291
|
+
font-family: var(--mono);
|
|
292
|
+
font-size: 11px;
|
|
293
|
+
color: var(--text-muted);
|
|
294
|
+
text-transform: uppercase;
|
|
295
|
+
letter-spacing: 1.5px;
|
|
296
|
+
margin-bottom: 24px;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.chart-bars {
|
|
300
|
+
display: flex;
|
|
301
|
+
flex-direction: column;
|
|
302
|
+
gap: 12px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.chart-row {
|
|
306
|
+
display: grid;
|
|
307
|
+
grid-template-columns: 100px 1fr 80px;
|
|
308
|
+
align-items: center;
|
|
309
|
+
gap: 16px;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.chart-row-label {
|
|
313
|
+
font-family: var(--mono);
|
|
314
|
+
font-size: 12px;
|
|
315
|
+
color: var(--text-muted);
|
|
316
|
+
text-align: right;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.chart-bar-track {
|
|
320
|
+
height: 28px;
|
|
321
|
+
background: var(--bg);
|
|
322
|
+
position: relative;
|
|
323
|
+
overflow: hidden;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.chart-bar-fill {
|
|
327
|
+
height: 100%;
|
|
328
|
+
background: var(--accent);
|
|
329
|
+
opacity: 0.7;
|
|
330
|
+
transition: width 0.6s ease;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.chart-bar-fill.warm { background: var(--yellow); opacity: 0.6; }
|
|
334
|
+
|
|
335
|
+
.chart-row-value {
|
|
336
|
+
font-family: var(--mono);
|
|
337
|
+
font-size: 12px;
|
|
338
|
+
color: var(--text-bright);
|
|
339
|
+
font-weight: 600;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.scaling-metrics {
|
|
343
|
+
background: var(--surface);
|
|
344
|
+
display: grid;
|
|
345
|
+
grid-template-rows: repeat(4, 1fr);
|
|
346
|
+
gap: 1px;
|
|
347
|
+
background: var(--border);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.scaling-metric {
|
|
351
|
+
background: var(--surface);
|
|
352
|
+
padding: 24px 28px;
|
|
353
|
+
display: flex;
|
|
354
|
+
flex-direction: column;
|
|
355
|
+
justify-content: center;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.scaling-metric-value {
|
|
359
|
+
font-family: var(--mono);
|
|
360
|
+
font-size: 28px;
|
|
361
|
+
font-weight: 700;
|
|
362
|
+
color: var(--text-bright);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.scaling-metric-label {
|
|
366
|
+
font-size: 12px;
|
|
367
|
+
color: var(--text-muted);
|
|
368
|
+
margin-top: 4px;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/* ── FEATURES GRID ── */
|
|
372
|
+
.features-section {
|
|
373
|
+
padding: 80px 48px;
|
|
374
|
+
border-bottom: 1px solid var(--border);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.features-grid {
|
|
378
|
+
display: grid;
|
|
379
|
+
grid-template-columns: repeat(3, 1fr);
|
|
380
|
+
gap: 1px;
|
|
381
|
+
background: var(--border);
|
|
382
|
+
border: 1px solid var(--border);
|
|
383
|
+
max-width: 1200px;
|
|
384
|
+
margin: 48px auto 0;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.feature-card {
|
|
388
|
+
background: var(--surface);
|
|
389
|
+
padding: 32px 28px;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.feature-icon {
|
|
393
|
+
font-family: var(--mono);
|
|
394
|
+
font-size: 11px;
|
|
395
|
+
color: var(--accent);
|
|
396
|
+
text-transform: uppercase;
|
|
397
|
+
letter-spacing: 1.5px;
|
|
398
|
+
margin-bottom: 16px;
|
|
399
|
+
padding-bottom: 12px;
|
|
400
|
+
border-bottom: 1px solid var(--border);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.feature-title {
|
|
404
|
+
font-size: 17px;
|
|
405
|
+
font-weight: 600;
|
|
406
|
+
color: var(--text-bright);
|
|
407
|
+
margin-bottom: 8px;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.feature-desc {
|
|
411
|
+
font-size: 13px;
|
|
412
|
+
color: var(--text-muted);
|
|
413
|
+
line-height: 1.6;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/* ── GPU BENCHMARK TABLE ── */
|
|
417
|
+
.bench-section {
|
|
418
|
+
padding: 80px 48px;
|
|
419
|
+
border-bottom: 1px solid var(--border);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
.bench-table {
|
|
423
|
+
max-width: 1200px;
|
|
424
|
+
margin: 48px auto 0;
|
|
425
|
+
border: 1px solid var(--border);
|
|
426
|
+
width: 100%;
|
|
427
|
+
border-collapse: collapse;
|
|
428
|
+
font-family: var(--mono);
|
|
429
|
+
font-size: 13px;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.bench-table thead {
|
|
433
|
+
background: var(--surface);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.bench-table th {
|
|
437
|
+
text-align: left;
|
|
438
|
+
padding: 14px 20px;
|
|
439
|
+
color: var(--text-muted);
|
|
440
|
+
font-weight: 500;
|
|
441
|
+
font-size: 11px;
|
|
442
|
+
text-transform: uppercase;
|
|
443
|
+
letter-spacing: 1px;
|
|
444
|
+
border-bottom: 1px solid var(--border);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.bench-table td {
|
|
448
|
+
padding: 14px 20px;
|
|
449
|
+
border-bottom: 1px solid var(--border);
|
|
450
|
+
color: var(--text);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.bench-table tr:hover td {
|
|
454
|
+
background: var(--accent-glow);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.bench-table .gpu-name { color: var(--text-bright); font-weight: 600; }
|
|
458
|
+
.bench-table .gpu-price { color: var(--accent); }
|
|
459
|
+
|
|
460
|
+
/* ── CODE EXAMPLES ── */
|
|
461
|
+
.examples-section {
|
|
462
|
+
padding: 80px 48px;
|
|
463
|
+
border-bottom: 1px solid var(--border);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.examples-grid {
|
|
467
|
+
display: grid;
|
|
468
|
+
grid-template-columns: 1fr 1fr;
|
|
469
|
+
gap: 1px;
|
|
470
|
+
background: var(--border);
|
|
471
|
+
border: 1px solid var(--border);
|
|
472
|
+
max-width: 1200px;
|
|
473
|
+
margin: 48px auto 0;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
.example-panel {
|
|
477
|
+
background: var(--surface);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.example-header {
|
|
481
|
+
padding: 12px 20px;
|
|
482
|
+
border-bottom: 1px solid var(--border);
|
|
483
|
+
font-family: var(--mono);
|
|
484
|
+
font-size: 11px;
|
|
485
|
+
color: var(--text-muted);
|
|
486
|
+
display: flex;
|
|
487
|
+
justify-content: space-between;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
.example-code {
|
|
491
|
+
padding: 24px;
|
|
492
|
+
font-family: var(--mono);
|
|
493
|
+
font-size: 12.5px;
|
|
494
|
+
line-height: 1.8;
|
|
495
|
+
overflow-x: auto;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/* ── PRICING ── */
|
|
499
|
+
.pricing-section {
|
|
500
|
+
padding: 80px 48px;
|
|
501
|
+
border-bottom: 1px solid var(--border);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.pricing-grid {
|
|
505
|
+
display: grid;
|
|
506
|
+
grid-template-columns: repeat(4, 1fr);
|
|
507
|
+
gap: 1px;
|
|
508
|
+
background: var(--border);
|
|
509
|
+
border: 1px solid var(--border);
|
|
510
|
+
max-width: 1200px;
|
|
511
|
+
margin: 48px auto 0;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
.pricing-card {
|
|
515
|
+
background: var(--surface);
|
|
516
|
+
padding: 32px 24px;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
.pricing-card.highlighted {
|
|
520
|
+
background: var(--surface-2);
|
|
521
|
+
border-top: 2px solid var(--accent);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.pricing-tier {
|
|
525
|
+
font-family: var(--mono);
|
|
526
|
+
font-size: 11px;
|
|
527
|
+
color: var(--accent);
|
|
528
|
+
text-transform: uppercase;
|
|
529
|
+
letter-spacing: 1.5px;
|
|
530
|
+
margin-bottom: 12px;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
.pricing-price {
|
|
534
|
+
font-size: 32px;
|
|
535
|
+
font-weight: 700;
|
|
536
|
+
color: var(--text-bright);
|
|
537
|
+
font-family: var(--mono);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
.pricing-unit {
|
|
541
|
+
font-size: 13px;
|
|
542
|
+
color: var(--text-muted);
|
|
543
|
+
margin-bottom: 20px;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
.pricing-features {
|
|
547
|
+
list-style: none;
|
|
548
|
+
font-size: 13px;
|
|
549
|
+
color: var(--text-muted);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
.pricing-features li {
|
|
553
|
+
padding: 6px 0;
|
|
554
|
+
border-bottom: 1px solid var(--border);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
.pricing-features li::before {
|
|
558
|
+
content: ">";
|
|
559
|
+
font-family: var(--mono);
|
|
560
|
+
color: var(--accent);
|
|
561
|
+
margin-right: 8px;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/* ── CTA ── */
|
|
565
|
+
.cta-section {
|
|
566
|
+
padding: 100px 48px;
|
|
567
|
+
text-align: left;
|
|
568
|
+
max-width: 1200px;
|
|
569
|
+
margin: 0 auto;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
.cta-section .hero-title { margin-bottom: 16px; }
|
|
573
|
+
|
|
574
|
+
.cta-actions { display: flex; gap: 12px; margin-top: 32px; }
|
|
575
|
+
|
|
576
|
+
/* ── FOOTER ── */
|
|
577
|
+
.footer {
|
|
578
|
+
padding: 32px 48px;
|
|
579
|
+
border-top: 1px solid var(--border);
|
|
580
|
+
display: flex;
|
|
581
|
+
justify-content: space-between;
|
|
582
|
+
font-size: 12px;
|
|
583
|
+
color: var(--text-muted);
|
|
584
|
+
font-family: var(--mono);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/* ── MOBILE ── */
|
|
588
|
+
@media (max-width: 900px) {
|
|
589
|
+
.hero { grid-template-columns: 1fr; min-height: auto; }
|
|
590
|
+
.hero-left { padding: 48px 24px; margin-left: 0; }
|
|
591
|
+
.hero-right { border-left: none; border-top: 1px solid var(--border); min-height: 400px; }
|
|
592
|
+
.hero-title { font-size: 32px; }
|
|
593
|
+
.hero-stats { grid-template-columns: 1fr; }
|
|
594
|
+
.scaling-grid { grid-template-columns: 1fr; }
|
|
595
|
+
.features-grid { grid-template-columns: 1fr; }
|
|
596
|
+
.examples-grid { grid-template-columns: 1fr; }
|
|
597
|
+
.pricing-grid { grid-template-columns: 1fr 1fr; }
|
|
598
|
+
.section-header { flex-direction: column; align-items: flex-start; gap: 12px; }
|
|
599
|
+
.section-sub { text-align: left; }
|
|
600
|
+
.topbar-nav { display: none; }
|
|
601
|
+
.chart-row { grid-template-columns: 60px 1fr 60px; }
|
|
602
|
+
.bench-table { font-size: 11px; }
|
|
603
|
+
.bench-table th, .bench-table td { padding: 10px 12px; }
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
@media (max-width: 600px) {
|
|
607
|
+
.pricing-grid { grid-template-columns: 1fr; }
|
|
608
|
+
.hero-actions { flex-direction: column; }
|
|
609
|
+
}
|
|
610
|
+
</style>
|
|
611
|
+
</head>
|
|
612
|
+
<body>
|
|
613
|
+
|
|
614
|
+
<!-- TOPBAR -->
|
|
615
|
+
<nav class="topbar">
|
|
616
|
+
<div class="topbar-logo">voltage<span>/compute</span></div>
|
|
617
|
+
<div class="topbar-nav">
|
|
618
|
+
<a href="#">Docs</a>
|
|
619
|
+
<a href="#">Pricing</a>
|
|
620
|
+
<a href="#">Changelog</a>
|
|
621
|
+
<a href="#">GitHub</a>
|
|
622
|
+
<a href="#" class="btn-primary">Get started</a>
|
|
623
|
+
</div>
|
|
624
|
+
</nav>
|
|
625
|
+
|
|
626
|
+
<!-- HERO -->
|
|
627
|
+
<section class="hero">
|
|
628
|
+
<div class="hero-left">
|
|
629
|
+
<div class="hero-badge">Serverless GPU Compute</div>
|
|
630
|
+
<h1 class="hero-title">Your Python.<br>Our GPUs.<br>Zero infra.</h1>
|
|
631
|
+
<p class="hero-sub">Add a decorator to any Python function. Voltage runs it on cloud GPUs — scaling from zero to thousands of containers — billed by the second.</p>
|
|
632
|
+
<div class="hero-actions">
|
|
633
|
+
<a href="#" class="btn-primary">Run your first function</a>
|
|
634
|
+
<a href="#" class="btn-ghost">Read the docs</a>
|
|
635
|
+
</div>
|
|
636
|
+
<div class="hero-stats">
|
|
637
|
+
<div class="hero-stat">
|
|
638
|
+
<div class="hero-stat-value"><300ms</div>
|
|
639
|
+
<div class="hero-stat-label">Cold start</div>
|
|
640
|
+
</div>
|
|
641
|
+
<div class="hero-stat">
|
|
642
|
+
<div class="hero-stat-value">10,000+</div>
|
|
643
|
+
<div class="hero-stat-label">Max containers</div>
|
|
644
|
+
</div>
|
|
645
|
+
<div class="hero-stat">
|
|
646
|
+
<div class="hero-stat-value">$0.00</div>
|
|
647
|
+
<div class="hero-stat-label">Idle cost</div>
|
|
648
|
+
</div>
|
|
649
|
+
</div>
|
|
650
|
+
</div>
|
|
651
|
+
|
|
652
|
+
<div class="hero-right">
|
|
653
|
+
<div class="terminal-bar">
|
|
654
|
+
<span class="terminal-dot r"></span>
|
|
655
|
+
<span class="terminal-dot y"></span>
|
|
656
|
+
<span class="terminal-dot g"></span>
|
|
657
|
+
<span style="margin-left: 12px;">app.py</span>
|
|
658
|
+
</div>
|
|
659
|
+
<div class="terminal-tabs">
|
|
660
|
+
<div class="terminal-tab active">app.py</div>
|
|
661
|
+
<div class="terminal-tab">deploy.sh</div>
|
|
662
|
+
<div class="terminal-tab">output</div>
|
|
663
|
+
</div>
|
|
664
|
+
<div class="terminal-body">
|
|
665
|
+
<div><span class="code-keyword">import</span> voltage</div>
|
|
666
|
+
<br>
|
|
667
|
+
<div><span class="code-comment"># Define your compute environment once</span></div>
|
|
668
|
+
<div><span class="code-fn">app</span> = voltage.<span class="code-fn">App</span>(<span class="code-string">"image-gen"</span>)</div>
|
|
669
|
+
<br>
|
|
670
|
+
<div><span class="code-fn">image</span> = voltage.<span class="code-fn">Image</span>.debian_slim()</div>
|
|
671
|
+
<div> .<span class="code-fn">pip_install</span>(<span class="code-string">"torch"</span>, <span class="code-string">"diffusers"</span>, <span class="code-string">"transformers"</span>)</div>
|
|
672
|
+
<br>
|
|
673
|
+
<div><span class="code-decorator">@app.function</span>(</div>
|
|
674
|
+
<div> gpu=<span class="code-string">"A100-80GB"</span>,</div>
|
|
675
|
+
<div> image=image,</div>
|
|
676
|
+
<div> timeout=<span class="code-number">600</span>,</div>
|
|
677
|
+
<div>)</div>
|
|
678
|
+
<div><span class="code-keyword">def</span> <span class="code-fn">generate</span>(prompt: <span class="code-param">str</span>) -> bytes:</div>
|
|
679
|
+
<div> <span class="code-keyword">from</span> diffusers <span class="code-keyword">import</span> StableDiffusionPipeline</div>
|
|
680
|
+
<div> pipe = StableDiffusionPipeline.<span class="code-fn">from_pretrained</span>(</div>
|
|
681
|
+
<div> <span class="code-string">"stabilityai/sdxl-turbo"</span>,</div>
|
|
682
|
+
<div> )</div>
|
|
683
|
+
<div> result = pipe(prompt).<span class="code-fn">images</span>[<span class="code-number">0</span>]</div>
|
|
684
|
+
<div> <span class="code-keyword">return</span> result.<span class="code-fn">tobytes</span>()</div>
|
|
685
|
+
<br>
|
|
686
|
+
<div><span class="code-comment"># Deploy as an API endpoint</span></div>
|
|
687
|
+
<div><span class="code-decorator">@app.endpoint</span>(method=<span class="code-string">"POST"</span>)</div>
|
|
688
|
+
<div><span class="code-keyword">def</span> <span class="code-fn">api</span>(prompt: <span class="code-param">str</span>):</div>
|
|
689
|
+
<div> <span class="code-keyword">return</span> generate.<span class="code-fn">remote</span>(prompt)</div>
|
|
690
|
+
</div>
|
|
691
|
+
</div>
|
|
692
|
+
</section>
|
|
693
|
+
|
|
694
|
+
<!-- SCALING VISUALIZATION -->
|
|
695
|
+
<section class="scaling-section">
|
|
696
|
+
<div class="section-header">
|
|
697
|
+
<div>
|
|
698
|
+
<h2 class="section-title">Scales with your traffic</h2>
|
|
699
|
+
</div>
|
|
700
|
+
<div class="section-sub">Real-time autoscaling. Containers spin up in milliseconds, scale back to zero when idle. You never pay for waiting.</div>
|
|
701
|
+
</div>
|
|
702
|
+
|
|
703
|
+
<div class="scaling-grid">
|
|
704
|
+
<div class="scaling-chart">
|
|
705
|
+
<div class="chart-label">Containers active — 24h window</div>
|
|
706
|
+
<div class="chart-bars">
|
|
707
|
+
<div class="chart-row">
|
|
708
|
+
<div class="chart-row-label">00:00</div>
|
|
709
|
+
<div class="chart-bar-track"><div class="chart-bar-fill" style="width: 3%;"></div></div>
|
|
710
|
+
<div class="chart-row-value">12</div>
|
|
711
|
+
</div>
|
|
712
|
+
<div class="chart-row">
|
|
713
|
+
<div class="chart-row-label">04:00</div>
|
|
714
|
+
<div class="chart-bar-track"><div class="chart-bar-fill" style="width: 0.5%;"></div></div>
|
|
715
|
+
<div class="chart-row-value">0</div>
|
|
716
|
+
</div>
|
|
717
|
+
<div class="chart-row">
|
|
718
|
+
<div class="chart-row-label">08:00</div>
|
|
719
|
+
<div class="chart-bar-track"><div class="chart-bar-fill" style="width: 18%;"></div></div>
|
|
720
|
+
<div class="chart-row-value">184</div>
|
|
721
|
+
</div>
|
|
722
|
+
<div class="chart-row">
|
|
723
|
+
<div class="chart-row-label">10:00</div>
|
|
724
|
+
<div class="chart-bar-track"><div class="chart-bar-fill" style="width: 45%;"></div></div>
|
|
725
|
+
<div class="chart-row-value">1,024</div>
|
|
726
|
+
</div>
|
|
727
|
+
<div class="chart-row">
|
|
728
|
+
<div class="chart-row-label">12:00</div>
|
|
729
|
+
<div class="chart-bar-track"><div class="chart-bar-fill" style="width: 82%;"></div></div>
|
|
730
|
+
<div class="chart-row-value">4,210</div>
|
|
731
|
+
</div>
|
|
732
|
+
<div class="chart-row">
|
|
733
|
+
<div class="chart-row-label">14:00</div>
|
|
734
|
+
<div class="chart-bar-track"><div class="chart-bar-fill warm" style="width: 100%;"></div></div>
|
|
735
|
+
<div class="chart-row-value">8,192</div>
|
|
736
|
+
</div>
|
|
737
|
+
<div class="chart-row">
|
|
738
|
+
<div class="chart-row-label">16:00</div>
|
|
739
|
+
<div class="chart-bar-track"><div class="chart-bar-fill" style="width: 60%;"></div></div>
|
|
740
|
+
<div class="chart-row-value">2,816</div>
|
|
741
|
+
</div>
|
|
742
|
+
<div class="chart-row">
|
|
743
|
+
<div class="chart-row-label">18:00</div>
|
|
744
|
+
<div class="chart-bar-track"><div class="chart-bar-fill" style="width: 22%;"></div></div>
|
|
745
|
+
<div class="chart-row-value">340</div>
|
|
746
|
+
</div>
|
|
747
|
+
<div class="chart-row">
|
|
748
|
+
<div class="chart-row-label">22:00</div>
|
|
749
|
+
<div class="chart-bar-track"><div class="chart-bar-fill" style="width: 5%;"></div></div>
|
|
750
|
+
<div class="chart-row-value">28</div>
|
|
751
|
+
</div>
|
|
752
|
+
</div>
|
|
753
|
+
</div>
|
|
754
|
+
|
|
755
|
+
<div class="scaling-metrics" style="background: var(--border);">
|
|
756
|
+
<div class="scaling-metric">
|
|
757
|
+
<div class="scaling-metric-value">8,192</div>
|
|
758
|
+
<div class="scaling-metric-label">Peak containers today</div>
|
|
759
|
+
</div>
|
|
760
|
+
<div class="scaling-metric">
|
|
761
|
+
<div class="scaling-metric-value">247ms</div>
|
|
762
|
+
<div class="scaling-metric-label">Avg cold start</div>
|
|
763
|
+
</div>
|
|
764
|
+
<div class="scaling-metric">
|
|
765
|
+
<div class="scaling-metric-value">$14.20</div>
|
|
766
|
+
<div class="scaling-metric-label">Total cost (24h)</div>
|
|
767
|
+
</div>
|
|
768
|
+
<div class="scaling-metric">
|
|
769
|
+
<div class="scaling-metric-value">6h 12m</div>
|
|
770
|
+
<div class="scaling-metric-label">At-zero time</div>
|
|
771
|
+
</div>
|
|
772
|
+
</div>
|
|
773
|
+
</div>
|
|
774
|
+
</section>
|
|
775
|
+
|
|
776
|
+
<!-- FEATURES -->
|
|
777
|
+
<section class="features-section">
|
|
778
|
+
<div class="section-header" style="max-width: 1200px; margin: 0 auto 0;">
|
|
779
|
+
<h2 class="section-title">Built for compute-heavy Python</h2>
|
|
780
|
+
</div>
|
|
781
|
+
|
|
782
|
+
<div class="features-grid">
|
|
783
|
+
<div class="feature-card">
|
|
784
|
+
<div class="feature-icon">01 / GPU</div>
|
|
785
|
+
<h3 class="feature-title">On-demand GPUs</h3>
|
|
786
|
+
<p class="feature-desc">A100, H100, L4 — attach any GPU with a single parameter. No provisioning, no reservations. Billed per second of actual use.</p>
|
|
787
|
+
</div>
|
|
788
|
+
<div class="feature-card">
|
|
789
|
+
<div class="feature-icon">02 / Scale</div>
|
|
790
|
+
<h3 class="feature-title">Zero to 10,000</h3>
|
|
791
|
+
<p class="feature-desc">Containers scale automatically based on demand. Burst to thousands for batch jobs, scale back to zero between requests. No capacity planning.</p>
|
|
792
|
+
</div>
|
|
793
|
+
<div class="feature-card">
|
|
794
|
+
<div class="feature-icon">03 / Deploy</div>
|
|
795
|
+
<h3 class="feature-title">Decorator-based deploys</h3>
|
|
796
|
+
<p class="feature-desc">No Dockerfiles, no Kubernetes YAML, no Terraform. Add @app.function() to your Python and deploy. Your local code runs in the cloud.</p>
|
|
797
|
+
</div>
|
|
798
|
+
<div class="feature-card">
|
|
799
|
+
<div class="feature-icon">04 / Endpoints</div>
|
|
800
|
+
<h3 class="feature-title">Inference endpoints</h3>
|
|
801
|
+
<p class="feature-desc">Serve any model as an auto-scaling HTTP endpoint. Built-in request batching, GPU warmup pools, and automatic health checks.</p>
|
|
802
|
+
</div>
|
|
803
|
+
<div class="feature-card">
|
|
804
|
+
<div class="feature-icon">05 / Schedule</div>
|
|
805
|
+
<h3 class="feature-title">Cron & pipelines</h3>
|
|
806
|
+
<p class="feature-desc">Schedule training runs, ETL jobs, or batch inference. Chain functions into DAG pipelines with automatic retry and monitoring.</p>
|
|
807
|
+
</div>
|
|
808
|
+
<div class="feature-card">
|
|
809
|
+
<div class="feature-icon">06 / Dev</div>
|
|
810
|
+
<h3 class="feature-title">Local-feeling loop</h3>
|
|
811
|
+
<p class="feature-desc">Interactive debugging with voltage shell. Hot-reload code changes. Stream logs in real time. The cloud feels like your laptop.</p>
|
|
812
|
+
</div>
|
|
813
|
+
</div>
|
|
814
|
+
</section>
|
|
815
|
+
|
|
816
|
+
<!-- GPU BENCHMARK TABLE -->
|
|
817
|
+
<section class="bench-section">
|
|
818
|
+
<div class="section-header" style="max-width: 1200px; margin: 0 auto 0;">
|
|
819
|
+
<div>
|
|
820
|
+
<h2 class="section-title">GPU catalog</h2>
|
|
821
|
+
</div>
|
|
822
|
+
<div class="section-sub">On-demand. No reservations. Cancel anytime.</div>
|
|
823
|
+
</div>
|
|
824
|
+
|
|
825
|
+
<table class="bench-table">
|
|
826
|
+
<thead>
|
|
827
|
+
<tr>
|
|
828
|
+
<th>GPU</th>
|
|
829
|
+
<th>VRAM</th>
|
|
830
|
+
<th>TFLOPS (FP16)</th>
|
|
831
|
+
<th>Use case</th>
|
|
832
|
+
<th>Price</th>
|
|
833
|
+
<th>Availability</th>
|
|
834
|
+
</tr>
|
|
835
|
+
</thead>
|
|
836
|
+
<tbody>
|
|
837
|
+
<tr>
|
|
838
|
+
<td class="gpu-name">NVIDIA T4</td>
|
|
839
|
+
<td>16 GB</td>
|
|
840
|
+
<td>65</td>
|
|
841
|
+
<td>Inference, light fine-tuning</td>
|
|
842
|
+
<td class="gpu-price">$0.59/hr</td>
|
|
843
|
+
<td>Instant</td>
|
|
844
|
+
</tr>
|
|
845
|
+
<tr>
|
|
846
|
+
<td class="gpu-name">NVIDIA L4</td>
|
|
847
|
+
<td>24 GB</td>
|
|
848
|
+
<td>121</td>
|
|
849
|
+
<td>Inference, video encoding</td>
|
|
850
|
+
<td class="gpu-price">$0.73/hr</td>
|
|
851
|
+
<td>Instant</td>
|
|
852
|
+
</tr>
|
|
853
|
+
<tr>
|
|
854
|
+
<td class="gpu-name">NVIDIA A10G</td>
|
|
855
|
+
<td>24 GB</td>
|
|
856
|
+
<td>125</td>
|
|
857
|
+
<td>Mid-range training & inference</td>
|
|
858
|
+
<td class="gpu-price">$1.10/hr</td>
|
|
859
|
+
<td>Instant</td>
|
|
860
|
+
</tr>
|
|
861
|
+
<tr>
|
|
862
|
+
<td class="gpu-name">NVIDIA A100 40GB</td>
|
|
863
|
+
<td>40 GB</td>
|
|
864
|
+
<td>312</td>
|
|
865
|
+
<td>Training, large model inference</td>
|
|
866
|
+
<td class="gpu-price">$2.78/hr</td>
|
|
867
|
+
<td>Instant</td>
|
|
868
|
+
</tr>
|
|
869
|
+
<tr>
|
|
870
|
+
<td class="gpu-name">NVIDIA A100 80GB</td>
|
|
871
|
+
<td>80 GB</td>
|
|
872
|
+
<td>312</td>
|
|
873
|
+
<td>Large model training</td>
|
|
874
|
+
<td class="gpu-price">$3.64/hr</td>
|
|
875
|
+
<td>Instant</td>
|
|
876
|
+
</tr>
|
|
877
|
+
<tr>
|
|
878
|
+
<td class="gpu-name">NVIDIA H100 80GB</td>
|
|
879
|
+
<td>80 GB</td>
|
|
880
|
+
<td>989</td>
|
|
881
|
+
<td>Frontier training, massive inference</td>
|
|
882
|
+
<td class="gpu-price">$4.25/hr</td>
|
|
883
|
+
<td><2 min</td>
|
|
884
|
+
</tr>
|
|
885
|
+
</tbody>
|
|
886
|
+
</table>
|
|
887
|
+
</section>
|
|
888
|
+
|
|
889
|
+
<!-- CODE EXAMPLES -->
|
|
890
|
+
<section class="examples-section">
|
|
891
|
+
<div class="section-header" style="max-width: 1200px; margin: 0 auto 0;">
|
|
892
|
+
<h2 class="section-title">Common patterns</h2>
|
|
893
|
+
</div>
|
|
894
|
+
|
|
895
|
+
<div class="examples-grid">
|
|
896
|
+
<div class="example-panel">
|
|
897
|
+
<div class="example-header">
|
|
898
|
+
<span>batch_inference.py</span>
|
|
899
|
+
<span>GPU batch processing</span>
|
|
900
|
+
</div>
|
|
901
|
+
<div class="example-code">
|
|
902
|
+
<div><span class="code-decorator">@app.function</span>(gpu=<span class="code-string">"A100-80GB"</span>, concurrency=<span class="code-number">50</span>)</div>
|
|
903
|
+
<div><span class="code-keyword">def</span> <span class="code-fn">embed_batch</span>(texts: list[<span class="code-param">str</span>]):</div>
|
|
904
|
+
<div> <span class="code-keyword">import</span> torch</div>
|
|
905
|
+
<div> <span class="code-keyword">from</span> sentence_transformers <span class="code-keyword">import</span> SentenceTransformer</div>
|
|
906
|
+
<div> model = SentenceTransformer(<span class="code-string">"all-MiniLM-L6-v2"</span>)</div>
|
|
907
|
+
<div> <span class="code-keyword">return</span> model.encode(texts).tolist()</div>
|
|
908
|
+
<br>
|
|
909
|
+
<div><span class="code-comment"># Process 1M documents in parallel</span></div>
|
|
910
|
+
<div>results = list(embed_batch.<span class="code-fn">map</span>(chunks))</div>
|
|
911
|
+
</div>
|
|
912
|
+
</div>
|
|
913
|
+
<div class="example-panel">
|
|
914
|
+
<div class="example-header">
|
|
915
|
+
<span>cron_job.py</span>
|
|
916
|
+
<span>Scheduled training</span>
|
|
917
|
+
</div>
|
|
918
|
+
<div class="example-code">
|
|
919
|
+
<div><span class="code-decorator">@app.function</span>(</div>
|
|
920
|
+
<div> gpu=<span class="code-string">"H100"</span>,</div>
|
|
921
|
+
<div> schedule=voltage.<span class="code-fn">Cron</span>(<span class="code-string">"0 2 * * *"</span>),</div>
|
|
922
|
+
<div> timeout=<span class="code-number">3600</span>,</div>
|
|
923
|
+
<div>)</div>
|
|
924
|
+
<div><span class="code-keyword">def</span> <span class="code-fn">nightly_finetune</span>():</div>
|
|
925
|
+
<div> dataset = load_new_data()</div>
|
|
926
|
+
<div> model = load_base_model()</div>
|
|
927
|
+
<div> train(model, dataset, epochs=<span class="code-number">3</span>)</div>
|
|
928
|
+
<div> push_to_registry(model)</div>
|
|
929
|
+
<br>
|
|
930
|
+
<div><span class="code-comment"># Runs at 2 AM daily, H100 allocated</span></div>
|
|
931
|
+
<div><span class="code-comment"># only for the duration of training</span></div>
|
|
932
|
+
</div>
|
|
933
|
+
</div>
|
|
934
|
+
</div>
|
|
935
|
+
</section>
|
|
936
|
+
|
|
937
|
+
<!-- PRICING -->
|
|
938
|
+
<section class="pricing-section">
|
|
939
|
+
<div class="section-header" style="max-width: 1200px; margin: 0 auto 0;">
|
|
940
|
+
<h2 class="section-title">Simple pricing</h2>
|
|
941
|
+
<div class="section-sub">Pay for compute seconds. Nothing else. Scale to zero = $0.</div>
|
|
942
|
+
</div>
|
|
943
|
+
|
|
944
|
+
<div class="pricing-grid">
|
|
945
|
+
<div class="pricing-card">
|
|
946
|
+
<div class="pricing-tier">CPU</div>
|
|
947
|
+
<div class="pricing-price">$0.024</div>
|
|
948
|
+
<div class="pricing-unit">/ vCPU / hour</div>
|
|
949
|
+
<ul class="pricing-features">
|
|
950
|
+
<li>Up to 64 vCPUs per container</li>
|
|
951
|
+
<li>Up to 256 GB RAM</li>
|
|
952
|
+
<li>NVMe scratch storage</li>
|
|
953
|
+
<li>Per-second billing</li>
|
|
954
|
+
</ul>
|
|
955
|
+
</div>
|
|
956
|
+
<div class="pricing-card highlighted">
|
|
957
|
+
<div class="pricing-tier">GPU</div>
|
|
958
|
+
<div class="pricing-price">$0.59</div>
|
|
959
|
+
<div class="pricing-unit">/ GPU-hour (T4, starting)</div>
|
|
960
|
+
<ul class="pricing-features">
|
|
961
|
+
<li>T4 through H100</li>
|
|
962
|
+
<li>Multi-GPU supported</li>
|
|
963
|
+
<li>Preemptible discounts</li>
|
|
964
|
+
<li>Per-second billing</li>
|
|
965
|
+
</ul>
|
|
966
|
+
</div>
|
|
967
|
+
<div class="pricing-card">
|
|
968
|
+
<div class="pricing-tier">Storage</div>
|
|
969
|
+
<div class="pricing-price">$0.10</div>
|
|
970
|
+
<div class="pricing-unit">/ GB / month</div>
|
|
971
|
+
<ul class="pricing-features">
|
|
972
|
+
<li>Persistent volumes</li>
|
|
973
|
+
<li>Shared across functions</li>
|
|
974
|
+
<li>Snapshot & restore</li>
|
|
975
|
+
<li>NFS-compatible</li>
|
|
976
|
+
</ul>
|
|
977
|
+
</div>
|
|
978
|
+
<div class="pricing-card">
|
|
979
|
+
<div class="pricing-tier">Network</div>
|
|
980
|
+
<div class="pricing-price">$0.00</div>
|
|
981
|
+
<div class="pricing-unit">ingress always free</div>
|
|
982
|
+
<ul class="pricing-features">
|
|
983
|
+
<li>Unlimited ingress</li>
|
|
984
|
+
<li>$0.05/GB egress</li>
|
|
985
|
+
<li>Private networking</li>
|
|
986
|
+
<li>Global edge routing</li>
|
|
987
|
+
</ul>
|
|
988
|
+
</div>
|
|
989
|
+
</div>
|
|
990
|
+
</section>
|
|
991
|
+
|
|
992
|
+
<!-- CTA -->
|
|
993
|
+
<section class="cta-section">
|
|
994
|
+
<div class="hero-badge">Ready to ship?</div>
|
|
995
|
+
<h2 class="hero-title">Run your first<br>function in 5 minutes.</h2>
|
|
996
|
+
<p class="hero-sub">pip install voltage. Write a function. Deploy. That's it.</p>
|
|
997
|
+
<div class="cta-actions">
|
|
998
|
+
<a href="#" class="btn-primary">Get started free</a>
|
|
999
|
+
<a href="#" class="btn-ghost">Talk to engineering</a>
|
|
1000
|
+
</div>
|
|
1001
|
+
</section>
|
|
1002
|
+
|
|
1003
|
+
<!-- FOOTER -->
|
|
1004
|
+
<footer class="footer">
|
|
1005
|
+
<span>voltage 2026</span>
|
|
1006
|
+
<span>docs / changelog / status / github</span>
|
|
1007
|
+
</footer>
|
|
1008
|
+
|
|
1009
|
+
</body>
|
|
1010
|
+
</html>
|