forgedock 1.0.17 → 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.
- 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/qa-sweep.md +37 -2
- package/commands/quality-gate.md +30 -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/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,529 @@
|
|
|
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 the AI Era</title>
|
|
7
|
+
<link href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;500;600&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
8
|
+
<style>
|
|
9
|
+
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
10
|
+
:root {
|
|
11
|
+
--bg: #0d1117;
|
|
12
|
+
--surface: #161b22;
|
|
13
|
+
--surface2: #1c2129;
|
|
14
|
+
--border: #30363d;
|
|
15
|
+
--text: #e6edf3;
|
|
16
|
+
--text-muted: #7d8590;
|
|
17
|
+
--electric: #58a6ff;
|
|
18
|
+
--electric-bg: #58a6ff15;
|
|
19
|
+
--volt-green: #3fb950;
|
|
20
|
+
--volt-orange: #d29922;
|
|
21
|
+
--volt-purple: #bc8cff;
|
|
22
|
+
--volt-red: #f85149;
|
|
23
|
+
}
|
|
24
|
+
body {
|
|
25
|
+
font-family: 'Space Grotesk', sans-serif;
|
|
26
|
+
background: var(--bg);
|
|
27
|
+
color: var(--text);
|
|
28
|
+
line-height: 1.6;
|
|
29
|
+
}
|
|
30
|
+
a { text-decoration: none; color: var(--electric); }
|
|
31
|
+
|
|
32
|
+
/* NAV — minimal, transparent */
|
|
33
|
+
header {
|
|
34
|
+
position: fixed; top: 0; width: 100%; z-index: 100;
|
|
35
|
+
background: rgba(13,17,23,0.8);
|
|
36
|
+
backdrop-filter: blur(16px);
|
|
37
|
+
border-bottom: 1px solid var(--border);
|
|
38
|
+
}
|
|
39
|
+
.header-inner {
|
|
40
|
+
max-width: 1280px; margin: 0 auto;
|
|
41
|
+
padding: 0 40px; height: 56px;
|
|
42
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
43
|
+
}
|
|
44
|
+
.logo {
|
|
45
|
+
font-weight: 700; font-size: 20px; color: var(--text);
|
|
46
|
+
display: flex; align-items: center; gap: 6px;
|
|
47
|
+
}
|
|
48
|
+
.logo-bolt {
|
|
49
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
50
|
+
width: 24px; height: 24px;
|
|
51
|
+
background: linear-gradient(135deg, var(--electric), var(--volt-purple));
|
|
52
|
+
border-radius: 5px; color: #fff; font-size: 14px; font-weight: 700;
|
|
53
|
+
}
|
|
54
|
+
.nav-links { display: flex; gap: 24px; align-items: center; }
|
|
55
|
+
.nav-links a { color: var(--text-muted); font-size: 14px; font-weight: 500; }
|
|
56
|
+
.nav-links a:hover { color: var(--text); }
|
|
57
|
+
.btn-ghost {
|
|
58
|
+
padding: 6px 16px; border: 1px solid var(--border);
|
|
59
|
+
border-radius: 6px; font-size: 13px; font-weight: 600;
|
|
60
|
+
color: var(--text); background: transparent;
|
|
61
|
+
}
|
|
62
|
+
.btn-ghost:hover { border-color: var(--text-muted); }
|
|
63
|
+
.btn-solid {
|
|
64
|
+
padding: 6px 16px; border: 1px solid var(--electric);
|
|
65
|
+
border-radius: 6px; font-size: 13px; font-weight: 600;
|
|
66
|
+
color: #fff; background: var(--electric);
|
|
67
|
+
}
|
|
68
|
+
.btn-solid:hover { opacity: 0.9; }
|
|
69
|
+
|
|
70
|
+
/* HERO — split diagonal with glowing code */
|
|
71
|
+
.hero {
|
|
72
|
+
max-width: 1280px; margin: 0 auto;
|
|
73
|
+
padding: 140px 40px 60px;
|
|
74
|
+
display: grid; grid-template-columns: 1fr; gap: 0;
|
|
75
|
+
text-align: center;
|
|
76
|
+
}
|
|
77
|
+
.hero h1 {
|
|
78
|
+
font-size: 64px; font-weight: 700; letter-spacing: -2.5px;
|
|
79
|
+
line-height: 1.08; margin-bottom: 20px;
|
|
80
|
+
}
|
|
81
|
+
.hero h1 .gradient {
|
|
82
|
+
background: linear-gradient(90deg, var(--electric), var(--volt-purple), var(--volt-green));
|
|
83
|
+
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
|
|
84
|
+
background-clip: text;
|
|
85
|
+
}
|
|
86
|
+
.hero > p {
|
|
87
|
+
font-size: 18px; color: var(--text-muted); max-width: 580px;
|
|
88
|
+
margin: 0 auto 36px; line-height: 1.7;
|
|
89
|
+
}
|
|
90
|
+
.hero-actions {
|
|
91
|
+
display: flex; gap: 12px; justify-content: center; align-items: center;
|
|
92
|
+
margin-bottom: 16px;
|
|
93
|
+
}
|
|
94
|
+
.btn-lg {
|
|
95
|
+
padding: 14px 32px; border-radius: 8px;
|
|
96
|
+
font-size: 15px; font-weight: 700; display: inline-block;
|
|
97
|
+
}
|
|
98
|
+
.btn-lg.primary { background: var(--electric); color: #fff; border: none; }
|
|
99
|
+
.btn-lg.primary:hover { opacity: 0.9; }
|
|
100
|
+
.btn-lg.outline {
|
|
101
|
+
background: transparent; color: var(--text);
|
|
102
|
+
border: 1px solid var(--border);
|
|
103
|
+
}
|
|
104
|
+
.btn-lg.outline:hover { border-color: var(--text-muted); }
|
|
105
|
+
.hero-install {
|
|
106
|
+
font-family: 'Source Code Pro', monospace; font-size: 14px;
|
|
107
|
+
color: var(--text-muted); margin-top: 12px;
|
|
108
|
+
}
|
|
109
|
+
.hero-install span { color: var(--volt-green); }
|
|
110
|
+
|
|
111
|
+
/* TRIPLE CODE PANEL */
|
|
112
|
+
.code-trio {
|
|
113
|
+
max-width: 1280px; margin: 0 auto;
|
|
114
|
+
padding: 60px 40px 100px;
|
|
115
|
+
display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
|
|
116
|
+
}
|
|
117
|
+
.code-card {
|
|
118
|
+
background: var(--surface); border: 1px solid var(--border);
|
|
119
|
+
border-radius: 10px; overflow: hidden;
|
|
120
|
+
transition: border-color 0.3s;
|
|
121
|
+
}
|
|
122
|
+
.code-card:hover { border-color: var(--electric); }
|
|
123
|
+
.code-card-header {
|
|
124
|
+
padding: 12px 16px; border-bottom: 1px solid var(--border);
|
|
125
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
126
|
+
}
|
|
127
|
+
.code-card-header .label {
|
|
128
|
+
font-size: 11px; font-weight: 600; text-transform: uppercase;
|
|
129
|
+
letter-spacing: 0.5px; color: var(--text-muted);
|
|
130
|
+
}
|
|
131
|
+
.code-card-header .tag {
|
|
132
|
+
font-size: 10px; font-weight: 600; padding: 2px 8px;
|
|
133
|
+
border-radius: 100px; background: var(--electric-bg);
|
|
134
|
+
color: var(--electric);
|
|
135
|
+
}
|
|
136
|
+
.code-card pre {
|
|
137
|
+
padding: 20px; font-family: 'Source Code Pro', monospace;
|
|
138
|
+
font-size: 12.5px; line-height: 1.8; color: #adbac7;
|
|
139
|
+
overflow-x: auto; margin: 0;
|
|
140
|
+
}
|
|
141
|
+
.code-card pre .kw { color: var(--volt-purple); }
|
|
142
|
+
.code-card pre .fn { color: var(--electric); }
|
|
143
|
+
.code-card pre .str { color: var(--volt-green); }
|
|
144
|
+
.code-card pre .dec { color: var(--volt-orange); }
|
|
145
|
+
.code-card pre .cm { color: var(--text-muted); }
|
|
146
|
+
.code-card pre .num { color: var(--volt-red); }
|
|
147
|
+
.code-card-footer {
|
|
148
|
+
padding: 12px 16px; border-top: 1px solid var(--border);
|
|
149
|
+
font-size: 13px; color: var(--text-muted);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* CAPABILITIES — horizontal scroll-like row */
|
|
153
|
+
.capabilities {
|
|
154
|
+
max-width: 1280px; margin: 0 auto;
|
|
155
|
+
padding: 80px 40px;
|
|
156
|
+
border-top: 1px solid var(--border);
|
|
157
|
+
}
|
|
158
|
+
.cap-header {
|
|
159
|
+
display: flex; justify-content: space-between; align-items: flex-end;
|
|
160
|
+
margin-bottom: 48px;
|
|
161
|
+
}
|
|
162
|
+
.cap-header h2 {
|
|
163
|
+
font-size: 36px; font-weight: 700; letter-spacing: -1.5px;
|
|
164
|
+
}
|
|
165
|
+
.cap-header p {
|
|
166
|
+
font-size: 14px; color: var(--text-muted); max-width: 400px;
|
|
167
|
+
text-align: right;
|
|
168
|
+
}
|
|
169
|
+
.cap-grid {
|
|
170
|
+
display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px;
|
|
171
|
+
background: var(--border); border-radius: 12px; overflow: hidden;
|
|
172
|
+
}
|
|
173
|
+
.cap-item {
|
|
174
|
+
background: var(--surface); padding: 32px 28px;
|
|
175
|
+
}
|
|
176
|
+
.cap-item .cap-icon {
|
|
177
|
+
font-size: 28px; margin-bottom: 16px; display: block;
|
|
178
|
+
}
|
|
179
|
+
.cap-item h3 {
|
|
180
|
+
font-size: 16px; font-weight: 700; margin-bottom: 8px;
|
|
181
|
+
}
|
|
182
|
+
.cap-item p {
|
|
183
|
+
font-size: 13px; color: var(--text-muted); line-height: 1.6;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* COMPARISON TABLE */
|
|
187
|
+
.comparison {
|
|
188
|
+
max-width: 1280px; margin: 0 auto;
|
|
189
|
+
padding: 80px 40px;
|
|
190
|
+
border-top: 1px solid var(--border);
|
|
191
|
+
}
|
|
192
|
+
.comparison h2 {
|
|
193
|
+
font-size: 36px; font-weight: 700; letter-spacing: -1.5px;
|
|
194
|
+
margin-bottom: 12px;
|
|
195
|
+
}
|
|
196
|
+
.comparison > p {
|
|
197
|
+
font-size: 16px; color: var(--text-muted); margin-bottom: 40px;
|
|
198
|
+
}
|
|
199
|
+
.comp-table {
|
|
200
|
+
width: 100%; border-collapse: collapse;
|
|
201
|
+
font-size: 14px;
|
|
202
|
+
}
|
|
203
|
+
.comp-table th {
|
|
204
|
+
text-align: left; padding: 12px 20px;
|
|
205
|
+
border-bottom: 2px solid var(--border);
|
|
206
|
+
font-weight: 600; font-size: 13px;
|
|
207
|
+
color: var(--text-muted); text-transform: uppercase;
|
|
208
|
+
letter-spacing: 0.5px;
|
|
209
|
+
}
|
|
210
|
+
.comp-table th:last-child {
|
|
211
|
+
color: var(--electric); border-bottom-color: var(--electric);
|
|
212
|
+
}
|
|
213
|
+
.comp-table td {
|
|
214
|
+
padding: 14px 20px;
|
|
215
|
+
border-bottom: 1px solid var(--border);
|
|
216
|
+
color: var(--text-muted);
|
|
217
|
+
}
|
|
218
|
+
.comp-table td:first-child { color: var(--text); font-weight: 500; }
|
|
219
|
+
.comp-table td:last-child { color: var(--volt-green); font-weight: 600; }
|
|
220
|
+
.comp-table tr:last-child td { border-bottom: none; }
|
|
221
|
+
|
|
222
|
+
/* TESTIMONIALS / SOCIAL PROOF */
|
|
223
|
+
.proof {
|
|
224
|
+
max-width: 1280px; margin: 0 auto;
|
|
225
|
+
padding: 80px 40px;
|
|
226
|
+
border-top: 1px solid var(--border);
|
|
227
|
+
display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;
|
|
228
|
+
}
|
|
229
|
+
.proof-card {
|
|
230
|
+
background: var(--surface); border: 1px solid var(--border);
|
|
231
|
+
border-radius: 10px; padding: 28px;
|
|
232
|
+
}
|
|
233
|
+
.proof-card blockquote {
|
|
234
|
+
font-size: 14px; color: var(--text-muted); line-height: 1.7;
|
|
235
|
+
margin-bottom: 16px; font-style: italic;
|
|
236
|
+
}
|
|
237
|
+
.proof-card .author {
|
|
238
|
+
font-size: 13px; font-weight: 600; color: var(--text);
|
|
239
|
+
}
|
|
240
|
+
.proof-card .role {
|
|
241
|
+
font-size: 12px; color: var(--text-muted);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* FINAL CTA */
|
|
245
|
+
.final {
|
|
246
|
+
max-width: 1280px; margin: 0 auto;
|
|
247
|
+
padding: 100px 40px 80px;
|
|
248
|
+
border-top: 1px solid var(--border);
|
|
249
|
+
text-align: center;
|
|
250
|
+
}
|
|
251
|
+
.final h2 {
|
|
252
|
+
font-size: 48px; font-weight: 700; letter-spacing: -2px;
|
|
253
|
+
margin-bottom: 16px;
|
|
254
|
+
}
|
|
255
|
+
.final h2 .gradient {
|
|
256
|
+
background: linear-gradient(90deg, var(--electric), var(--volt-green));
|
|
257
|
+
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
|
|
258
|
+
background-clip: text;
|
|
259
|
+
}
|
|
260
|
+
.final p {
|
|
261
|
+
font-size: 16px; color: var(--text-muted);
|
|
262
|
+
max-width: 480px; margin: 0 auto 32px;
|
|
263
|
+
}
|
|
264
|
+
.final .btn-lg { margin-bottom: 16px; }
|
|
265
|
+
.final .links {
|
|
266
|
+
display: flex; gap: 24px; justify-content: center;
|
|
267
|
+
margin-top: 20px;
|
|
268
|
+
}
|
|
269
|
+
.final .links a {
|
|
270
|
+
font-size: 14px; color: var(--text-muted);
|
|
271
|
+
border-bottom: 1px solid var(--border);
|
|
272
|
+
padding-bottom: 2px;
|
|
273
|
+
}
|
|
274
|
+
.final .links a:hover { color: var(--text); border-color: var(--text); }
|
|
275
|
+
|
|
276
|
+
/* FOOTER */
|
|
277
|
+
footer {
|
|
278
|
+
border-top: 1px solid var(--border);
|
|
279
|
+
max-width: 1280px; margin: 0 auto;
|
|
280
|
+
padding: 32px 40px;
|
|
281
|
+
display: flex; justify-content: space-between; align-items: center;
|
|
282
|
+
}
|
|
283
|
+
footer span { font-size: 12px; color: var(--text-muted); }
|
|
284
|
+
footer .foot-links { display: flex; gap: 20px; }
|
|
285
|
+
footer .foot-links a { font-size: 12px; color: var(--text-muted); }
|
|
286
|
+
footer .foot-links a:hover { color: var(--text); }
|
|
287
|
+
</style>
|
|
288
|
+
</head>
|
|
289
|
+
<body>
|
|
290
|
+
|
|
291
|
+
<header>
|
|
292
|
+
<div class="header-inner">
|
|
293
|
+
<div class="logo">
|
|
294
|
+
<span class="logo-bolt">V</span> Voltage
|
|
295
|
+
</div>
|
|
296
|
+
<div class="nav-links">
|
|
297
|
+
<a href="#capabilities">Platform</a>
|
|
298
|
+
<a href="#comparison">Compare</a>
|
|
299
|
+
<a href="#">Pricing</a>
|
|
300
|
+
<a href="#">Docs</a>
|
|
301
|
+
<a href="#" class="btn-ghost">Log in</a>
|
|
302
|
+
<a href="#" class="btn-solid">Sign up</a>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
</header>
|
|
306
|
+
|
|
307
|
+
<section class="hero">
|
|
308
|
+
<h1>Serverless compute<br>for the <span class="gradient">AI era</span></h1>
|
|
309
|
+
<p>Write Python. Attach GPUs. Deploy in seconds. Voltage runs your functions in the cloud and scales them from zero to thousands of containers automatically. No clusters, no containers, no YAML.</p>
|
|
310
|
+
<div class="hero-actions">
|
|
311
|
+
<a href="#" class="btn-lg primary">Run your first function</a>
|
|
312
|
+
<a href="#" class="btn-lg outline">View documentation</a>
|
|
313
|
+
</div>
|
|
314
|
+
<div class="hero-install">
|
|
315
|
+
<span>$</span> pip install voltage
|
|
316
|
+
</div>
|
|
317
|
+
</section>
|
|
318
|
+
|
|
319
|
+
<section class="code-trio">
|
|
320
|
+
<div class="code-card">
|
|
321
|
+
<div class="code-card-header">
|
|
322
|
+
<span class="label">Batch inference</span>
|
|
323
|
+
<span class="tag">GPU</span>
|
|
324
|
+
</div>
|
|
325
|
+
<pre>
|
|
326
|
+
<span class="kw">import</span> voltage
|
|
327
|
+
|
|
328
|
+
<span class="dec">@voltage.function</span>(gpu=<span class="str">"A100"</span>)
|
|
329
|
+
<span class="kw">def</span> <span class="fn">classify</span>(images: list[bytes]):
|
|
330
|
+
<span class="kw">import</span> torch
|
|
331
|
+
<span class="kw">from</span> torchvision <span class="kw">import</span> models
|
|
332
|
+
|
|
333
|
+
model = models.resnet50(
|
|
334
|
+
weights=<span class="str">"IMAGENET1K_V2"</span>
|
|
335
|
+
).cuda().eval()
|
|
336
|
+
|
|
337
|
+
<span class="cm"># process batch on GPU</span>
|
|
338
|
+
<span class="kw">return</span> [predict(model, img)
|
|
339
|
+
<span class="kw">for</span> img <span class="kw">in</span> images]</pre>
|
|
340
|
+
<div class="code-card-footer">Runs on cloud A100 -- called like a local function</div>
|
|
341
|
+
</div>
|
|
342
|
+
|
|
343
|
+
<div class="code-card">
|
|
344
|
+
<div class="code-card-header">
|
|
345
|
+
<span class="label">Inference endpoint</span>
|
|
346
|
+
<span class="tag">HTTPS</span>
|
|
347
|
+
</div>
|
|
348
|
+
<pre>
|
|
349
|
+
<span class="dec">@voltage.endpoint</span>(
|
|
350
|
+
gpu=<span class="str">"T4"</span>,
|
|
351
|
+
concurrency=<span class="num">50</span>,
|
|
352
|
+
)
|
|
353
|
+
<span class="kw">def</span> <span class="fn">generate</span>(prompt: str):
|
|
354
|
+
<span class="kw">from</span> vllm <span class="kw">import</span> LLM
|
|
355
|
+
|
|
356
|
+
llm = LLM(
|
|
357
|
+
model=<span class="str">"mistralai/Mistral-7B"</span>
|
|
358
|
+
)
|
|
359
|
+
output = llm.generate(prompt)
|
|
360
|
+
<span class="kw">return</span> {
|
|
361
|
+
<span class="str">"text"</span>: output[<span class="num">0</span>].text
|
|
362
|
+
}</pre>
|
|
363
|
+
<div class="code-card-footer">Auto-scaling HTTPS API with auth built in</div>
|
|
364
|
+
</div>
|
|
365
|
+
|
|
366
|
+
<div class="code-card">
|
|
367
|
+
<div class="code-card-header">
|
|
368
|
+
<span class="label">Scheduled job</span>
|
|
369
|
+
<span class="tag">CRON</span>
|
|
370
|
+
</div>
|
|
371
|
+
<pre>
|
|
372
|
+
<span class="dec">@voltage.schedule</span>(
|
|
373
|
+
cron=<span class="str">"0 3 * * *"</span>,
|
|
374
|
+
memory=<span class="num">16384</span>,
|
|
375
|
+
cpu=<span class="num">4</span>,
|
|
376
|
+
)
|
|
377
|
+
<span class="kw">def</span> <span class="fn">nightly_etl</span>():
|
|
378
|
+
<span class="kw">import</span> polars <span class="kw">as</span> pl
|
|
379
|
+
|
|
380
|
+
df = pl.read_parquet(<span class="str">"s3://..."</span>)
|
|
381
|
+
result = (
|
|
382
|
+
df.filter(pl.col(<span class="str">"date"</span>) ==
|
|
383
|
+
yesterday())
|
|
384
|
+
.group_by(<span class="str">"region"</span>)
|
|
385
|
+
.agg(pl.col(<span class="str">"revenue"</span>).sum())
|
|
386
|
+
)
|
|
387
|
+
result.write_delta(<span class="str">"s3://..."</span>)</pre>
|
|
388
|
+
<div class="code-card-footer">Runs at 3 AM daily, scales to zero between runs</div>
|
|
389
|
+
</div>
|
|
390
|
+
</section>
|
|
391
|
+
|
|
392
|
+
<section class="capabilities" id="capabilities">
|
|
393
|
+
<div class="cap-header">
|
|
394
|
+
<h2>Platform capabilities</h2>
|
|
395
|
+
<p>Everything you need to run compute-heavy workloads in production, with nothing you need to manage.</p>
|
|
396
|
+
</div>
|
|
397
|
+
<div class="cap-grid">
|
|
398
|
+
<div class="cap-item">
|
|
399
|
+
<span class="cap-icon">⚡</span>
|
|
400
|
+
<h3>GPU fleet</h3>
|
|
401
|
+
<p>T4, L4, A100, H100. Single or multi-GPU. Select per-function. Available in seconds, not minutes.</p>
|
|
402
|
+
</div>
|
|
403
|
+
<div class="cap-item">
|
|
404
|
+
<span class="cap-icon">↔</span>
|
|
405
|
+
<h3>Autoscale 0 to N</h3>
|
|
406
|
+
<p>Scale from zero to 10,000+ containers based on load. Pay nothing when idle. Configure min/max replicas.</p>
|
|
407
|
+
</div>
|
|
408
|
+
<div class="cap-item">
|
|
409
|
+
<span class="cap-icon">🔒</span>
|
|
410
|
+
<h3>Secrets & auth</h3>
|
|
411
|
+
<p>Inject secrets at runtime. API keys, tokens, and certificates are encrypted at rest and in transit.</p>
|
|
412
|
+
</div>
|
|
413
|
+
<div class="cap-item">
|
|
414
|
+
<span class="cap-icon">💾</span>
|
|
415
|
+
<h3>Persistent volumes</h3>
|
|
416
|
+
<p>Attach network storage to any function. Share model weights, datasets, and checkpoints across runs.</p>
|
|
417
|
+
</div>
|
|
418
|
+
<div class="cap-item">
|
|
419
|
+
<span class="cap-icon">🌐</span>
|
|
420
|
+
<h3>HTTPS endpoints</h3>
|
|
421
|
+
<p>Expose functions as APIs with one decorator. Request queuing, batching, auth, and streaming included.</p>
|
|
422
|
+
</div>
|
|
423
|
+
<div class="cap-item">
|
|
424
|
+
<span class="cap-icon">🕑</span>
|
|
425
|
+
<h3>Cron scheduling</h3>
|
|
426
|
+
<p>Schedule recurring workloads. Nightly retraining, batch scoring, ETL pipelines. Fully managed retries.</p>
|
|
427
|
+
</div>
|
|
428
|
+
<div class="cap-item">
|
|
429
|
+
<span class="cap-icon">📈</span>
|
|
430
|
+
<h3>Observability</h3>
|
|
431
|
+
<p>Real-time logs, GPU utilization, cost per function. OpenTelemetry export. Alerts on errors and latency.</p>
|
|
432
|
+
</div>
|
|
433
|
+
<div class="cap-item">
|
|
434
|
+
<span class="cap-icon">💻</span>
|
|
435
|
+
<h3>Local dev loop</h3>
|
|
436
|
+
<p>Run and test locally, deploy to cloud. Hot-reload functions. SSH into running containers when needed.</p>
|
|
437
|
+
</div>
|
|
438
|
+
</div>
|
|
439
|
+
</section>
|
|
440
|
+
|
|
441
|
+
<section class="comparison" id="comparison">
|
|
442
|
+
<h2>Why teams switch to Voltage</h2>
|
|
443
|
+
<p>Compared to traditional infrastructure, Voltage eliminates entire categories of work.</p>
|
|
444
|
+
<table class="comp-table">
|
|
445
|
+
<thead>
|
|
446
|
+
<tr>
|
|
447
|
+
<th>Concern</th>
|
|
448
|
+
<th>Traditional (K8s / EC2)</th>
|
|
449
|
+
<th>Voltage</th>
|
|
450
|
+
</tr>
|
|
451
|
+
</thead>
|
|
452
|
+
<tbody>
|
|
453
|
+
<tr>
|
|
454
|
+
<td>GPU provisioning</td>
|
|
455
|
+
<td>Manual quota requests, hours to days</td>
|
|
456
|
+
<td>One parameter, seconds</td>
|
|
457
|
+
</tr>
|
|
458
|
+
<tr>
|
|
459
|
+
<td>Container images</td>
|
|
460
|
+
<td>Write Dockerfiles, push to registry</td>
|
|
461
|
+
<td>Auto-detected from imports</td>
|
|
462
|
+
</tr>
|
|
463
|
+
<tr>
|
|
464
|
+
<td>Scaling</td>
|
|
465
|
+
<td>Configure HPA, node autoscaler</td>
|
|
466
|
+
<td>Automatic, zero to 10K</td>
|
|
467
|
+
</tr>
|
|
468
|
+
<tr>
|
|
469
|
+
<td>Idle costs</td>
|
|
470
|
+
<td>Paying for reserved instances 24/7</td>
|
|
471
|
+
<td>$0 when not running</td>
|
|
472
|
+
</tr>
|
|
473
|
+
<tr>
|
|
474
|
+
<td>Cold starts</td>
|
|
475
|
+
<td>Minutes for GPU nodes</td>
|
|
476
|
+
<td>Sub-second for most workloads</td>
|
|
477
|
+
</tr>
|
|
478
|
+
<tr>
|
|
479
|
+
<td>Config surface area</td>
|
|
480
|
+
<td>YAML, Terraform, Helm, CI/CD</td>
|
|
481
|
+
<td>One Python decorator</td>
|
|
482
|
+
</tr>
|
|
483
|
+
</tbody>
|
|
484
|
+
</table>
|
|
485
|
+
</section>
|
|
486
|
+
|
|
487
|
+
<section class="proof">
|
|
488
|
+
<div class="proof-card">
|
|
489
|
+
<blockquote>"We replaced our 12-node GPU cluster with 40 lines of Voltage code. Our inference costs dropped 70% because we stopped paying for idle GPUs overnight."</blockquote>
|
|
490
|
+
<div class="author">Sarah Chen</div>
|
|
491
|
+
<div class="role">ML Platform Lead, Series B startup</div>
|
|
492
|
+
</div>
|
|
493
|
+
<div class="proof-card">
|
|
494
|
+
<blockquote>"The cold start times are genuinely impressive. We serve real-time model predictions and our p99 latency is under 200ms including container spin-up."</blockquote>
|
|
495
|
+
<div class="author">Marcus Webb</div>
|
|
496
|
+
<div class="role">Senior Backend Engineer</div>
|
|
497
|
+
</div>
|
|
498
|
+
<div class="proof-card">
|
|
499
|
+
<blockquote>"I went from 'I need to train a model' to a deployed training pipeline in 20 minutes. No DevOps ticket, no Kubernetes config, no waiting for GPU quota."</blockquote>
|
|
500
|
+
<div class="author">Priya Raghavan</div>
|
|
501
|
+
<div class="role">Data Scientist</div>
|
|
502
|
+
</div>
|
|
503
|
+
</section>
|
|
504
|
+
|
|
505
|
+
<section class="final">
|
|
506
|
+
<h2>Start shipping <span class="gradient">GPU workloads</span> today</h2>
|
|
507
|
+
<p>Free tier includes 10 GPU-hours and unlimited CPU function invocations. No credit card required.</p>
|
|
508
|
+
<a href="#" class="btn-lg primary">Get started free</a>
|
|
509
|
+
<div class="links">
|
|
510
|
+
<a href="#">Documentation</a>
|
|
511
|
+
<a href="#">Examples on GitHub</a>
|
|
512
|
+
<a href="#">Join Discord</a>
|
|
513
|
+
</div>
|
|
514
|
+
</section>
|
|
515
|
+
|
|
516
|
+
<footer>
|
|
517
|
+
<span>© 2026 Voltage, Inc.</span>
|
|
518
|
+
<div class="foot-links">
|
|
519
|
+
<a href="#">Docs</a>
|
|
520
|
+
<a href="#">Blog</a>
|
|
521
|
+
<a href="#">Status</a>
|
|
522
|
+
<a href="#">GitHub</a>
|
|
523
|
+
<a href="#">Privacy</a>
|
|
524
|
+
<a href="#">Terms</a>
|
|
525
|
+
</div>
|
|
526
|
+
</footer>
|
|
527
|
+
|
|
528
|
+
</body>
|
|
529
|
+
</html>
|