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,396 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Voltage — Run Python on GPUs, Serverlessly</title>
|
|
7
|
+
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=DM+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
|
8
|
+
<style>
|
|
9
|
+
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
10
|
+
body {
|
|
11
|
+
font-family: 'DM Sans', sans-serif;
|
|
12
|
+
background: #fafaf8;
|
|
13
|
+
color: #1a1a1a;
|
|
14
|
+
line-height: 1.6;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* NAV */
|
|
18
|
+
nav {
|
|
19
|
+
position: sticky; top: 0; z-index: 100;
|
|
20
|
+
background: rgba(250,250,248,0.92);
|
|
21
|
+
backdrop-filter: blur(10px);
|
|
22
|
+
border-bottom: 1px solid #e5e5e0;
|
|
23
|
+
padding: 0 64px;
|
|
24
|
+
height: 64px; display: flex; align-items: center; justify-content: space-between;
|
|
25
|
+
}
|
|
26
|
+
.logo { font-weight: 800; font-size: 22px; letter-spacing: -1px; color: #1a1a1a; }
|
|
27
|
+
.logo em { font-style: normal; color: #e04000; }
|
|
28
|
+
nav ul { list-style: none; display: flex; gap: 28px; }
|
|
29
|
+
nav ul a { color: #666; font-size: 14px; font-weight: 500; text-decoration: none; }
|
|
30
|
+
nav ul a:hover { color: #1a1a1a; }
|
|
31
|
+
.nav-actions { display: flex; gap: 12px; align-items: center; }
|
|
32
|
+
.nav-actions a { text-decoration: none; font-size: 14px; font-weight: 600; }
|
|
33
|
+
.link-login { color: #666; }
|
|
34
|
+
.link-signup {
|
|
35
|
+
background: #1a1a1a; color: #fff; padding: 8px 20px;
|
|
36
|
+
border-radius: 6px; transition: background 0.2s;
|
|
37
|
+
}
|
|
38
|
+
.link-signup:hover { background: #333; }
|
|
39
|
+
|
|
40
|
+
/* HERO — full-width, centered, editorial */
|
|
41
|
+
.hero {
|
|
42
|
+
max-width: 1440px; margin: 0 auto;
|
|
43
|
+
padding: 120px 64px 80px;
|
|
44
|
+
text-align: center;
|
|
45
|
+
}
|
|
46
|
+
.hero-kicker {
|
|
47
|
+
display: inline-block;
|
|
48
|
+
font-family: 'IBM Plex Mono', monospace;
|
|
49
|
+
font-size: 13px; font-weight: 500; letter-spacing: 1px;
|
|
50
|
+
text-transform: uppercase; color: #e04000;
|
|
51
|
+
margin-bottom: 24px;
|
|
52
|
+
}
|
|
53
|
+
.hero h1 {
|
|
54
|
+
font-size: 68px; font-weight: 800; line-height: 1.05;
|
|
55
|
+
letter-spacing: -3px; margin-bottom: 24px;
|
|
56
|
+
max-width: 800px; margin-left: auto; margin-right: auto;
|
|
57
|
+
}
|
|
58
|
+
.hero p {
|
|
59
|
+
font-size: 20px; color: #555; line-height: 1.7;
|
|
60
|
+
max-width: 600px; margin: 0 auto 40px;
|
|
61
|
+
}
|
|
62
|
+
.hero-cta {
|
|
63
|
+
display: inline-flex; align-items: center; gap: 10px;
|
|
64
|
+
background: #e04000; color: #fff; padding: 16px 36px;
|
|
65
|
+
border-radius: 8px; font-weight: 700; font-size: 16px;
|
|
66
|
+
text-decoration: none; transition: background 0.2s;
|
|
67
|
+
}
|
|
68
|
+
.hero-cta:hover { background: #c03800; }
|
|
69
|
+
.hero-cta svg { width: 18px; height: 18px; }
|
|
70
|
+
.hero-sub {
|
|
71
|
+
margin-top: 16px; font-size: 13px; color: #999;
|
|
72
|
+
font-family: 'IBM Plex Mono', monospace;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* CODE SHOWCASE — two-column below hero */
|
|
76
|
+
.showcase {
|
|
77
|
+
max-width: 1200px; margin: 0 auto;
|
|
78
|
+
padding: 0 64px 100px;
|
|
79
|
+
display: grid; grid-template-columns: 1fr 1fr; gap: 48px;
|
|
80
|
+
align-items: start;
|
|
81
|
+
}
|
|
82
|
+
.showcase-text { padding-top: 40px; }
|
|
83
|
+
.showcase-text h2 {
|
|
84
|
+
font-size: 32px; font-weight: 800; letter-spacing: -1px;
|
|
85
|
+
margin-bottom: 20px;
|
|
86
|
+
}
|
|
87
|
+
.showcase-text p {
|
|
88
|
+
font-size: 16px; color: #555; line-height: 1.7; margin-bottom: 16px;
|
|
89
|
+
}
|
|
90
|
+
.showcase-text ul {
|
|
91
|
+
list-style: none; margin-top: 20px;
|
|
92
|
+
}
|
|
93
|
+
.showcase-text li {
|
|
94
|
+
font-size: 15px; color: #333; padding: 8px 0;
|
|
95
|
+
border-bottom: 1px solid #eee;
|
|
96
|
+
display: flex; align-items: center; gap: 10px;
|
|
97
|
+
}
|
|
98
|
+
.showcase-text li .check {
|
|
99
|
+
color: #e04000; font-weight: 700; font-size: 16px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.code-panel {
|
|
103
|
+
background: #1a1a1a; border-radius: 12px; overflow: hidden;
|
|
104
|
+
box-shadow: 0 16px 48px rgba(0,0,0,0.12);
|
|
105
|
+
}
|
|
106
|
+
.code-tabs {
|
|
107
|
+
display: flex; background: #111; border-bottom: 1px solid #2a2a2a;
|
|
108
|
+
}
|
|
109
|
+
.code-tab {
|
|
110
|
+
padding: 10px 20px; font-family: 'IBM Plex Mono', monospace;
|
|
111
|
+
font-size: 12px; color: #666; cursor: pointer;
|
|
112
|
+
}
|
|
113
|
+
.code-tab.active { color: #fafaf8; border-bottom: 2px solid #e04000; }
|
|
114
|
+
.code-content {
|
|
115
|
+
padding: 28px; font-family: 'IBM Plex Mono', monospace;
|
|
116
|
+
font-size: 13.5px; line-height: 1.85; color: #ccc; overflow-x: auto;
|
|
117
|
+
}
|
|
118
|
+
.code-content .kw { color: #c792ea; }
|
|
119
|
+
.code-content .fn { color: #82aaff; }
|
|
120
|
+
.code-content .str { color: #c3e88d; }
|
|
121
|
+
.code-content .dec { color: #ffcb6b; }
|
|
122
|
+
.code-content .cm { color: #666; }
|
|
123
|
+
.code-content .num { color: #f78c6c; }
|
|
124
|
+
.code-content .op { color: #89ddff; }
|
|
125
|
+
|
|
126
|
+
/* BENTO FEATURES */
|
|
127
|
+
.bento {
|
|
128
|
+
max-width: 1200px; margin: 0 auto;
|
|
129
|
+
padding: 80px 64px 100px;
|
|
130
|
+
border-top: 1px solid #e5e5e0;
|
|
131
|
+
}
|
|
132
|
+
.bento-title {
|
|
133
|
+
font-size: 14px; font-weight: 600; text-transform: uppercase;
|
|
134
|
+
letter-spacing: 1px; color: #999; margin-bottom: 48px;
|
|
135
|
+
font-family: 'IBM Plex Mono', monospace;
|
|
136
|
+
}
|
|
137
|
+
.bento-grid {
|
|
138
|
+
display: grid;
|
|
139
|
+
grid-template-columns: repeat(3, 1fr);
|
|
140
|
+
grid-template-rows: auto auto;
|
|
141
|
+
gap: 16px;
|
|
142
|
+
}
|
|
143
|
+
.bento-card {
|
|
144
|
+
background: #fff; border: 1px solid #e5e5e0;
|
|
145
|
+
border-radius: 12px; padding: 36px;
|
|
146
|
+
transition: box-shadow 0.3s;
|
|
147
|
+
}
|
|
148
|
+
.bento-card:hover { box-shadow: 0 8px 32px rgba(0,0,0,0.06); }
|
|
149
|
+
.bento-card.wide { grid-column: span 2; }
|
|
150
|
+
.bento-card h3 {
|
|
151
|
+
font-size: 18px; font-weight: 700; margin-bottom: 10px;
|
|
152
|
+
}
|
|
153
|
+
.bento-card p {
|
|
154
|
+
font-size: 14px; color: #666; line-height: 1.7;
|
|
155
|
+
}
|
|
156
|
+
.bento-card .mono-label {
|
|
157
|
+
font-family: 'IBM Plex Mono', monospace;
|
|
158
|
+
font-size: 12px; color: #e04000; font-weight: 600;
|
|
159
|
+
text-transform: uppercase; letter-spacing: 0.5px;
|
|
160
|
+
margin-bottom: 12px;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* PRICING TEASER */
|
|
164
|
+
.pricing {
|
|
165
|
+
max-width: 1200px; margin: 0 auto;
|
|
166
|
+
padding: 80px 64px 100px;
|
|
167
|
+
border-top: 1px solid #e5e5e0;
|
|
168
|
+
display: grid; grid-template-columns: 1fr 1fr; gap: 64px;
|
|
169
|
+
align-items: center;
|
|
170
|
+
}
|
|
171
|
+
.pricing h2 {
|
|
172
|
+
font-size: 36px; font-weight: 800; letter-spacing: -1.5px;
|
|
173
|
+
margin-bottom: 16px;
|
|
174
|
+
}
|
|
175
|
+
.pricing > div:first-child p {
|
|
176
|
+
font-size: 16px; color: #555; line-height: 1.7;
|
|
177
|
+
}
|
|
178
|
+
.price-cards { display: flex; flex-direction: column; gap: 12px; }
|
|
179
|
+
.price-row {
|
|
180
|
+
display: flex; justify-content: space-between; align-items: center;
|
|
181
|
+
background: #fff; border: 1px solid #e5e5e0;
|
|
182
|
+
border-radius: 8px; padding: 20px 24px;
|
|
183
|
+
}
|
|
184
|
+
.price-row .resource {
|
|
185
|
+
font-weight: 600; font-size: 15px;
|
|
186
|
+
}
|
|
187
|
+
.price-row .rate {
|
|
188
|
+
font-family: 'IBM Plex Mono', monospace;
|
|
189
|
+
font-size: 14px; color: #e04000; font-weight: 600;
|
|
190
|
+
}
|
|
191
|
+
.price-row .unit {
|
|
192
|
+
font-size: 12px; color: #999; margin-left: 4px;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* FINAL CTA */
|
|
196
|
+
.final-cta {
|
|
197
|
+
max-width: 1200px; margin: 0 auto;
|
|
198
|
+
padding: 100px 64px;
|
|
199
|
+
text-align: center;
|
|
200
|
+
}
|
|
201
|
+
.terminal-block {
|
|
202
|
+
display: inline-block; background: #1a1a1a;
|
|
203
|
+
border-radius: 12px; padding: 40px 64px;
|
|
204
|
+
margin-bottom: 32px;
|
|
205
|
+
}
|
|
206
|
+
.terminal-block pre {
|
|
207
|
+
font-family: 'IBM Plex Mono', monospace;
|
|
208
|
+
font-size: 18px; color: #ccc; text-align: left;
|
|
209
|
+
}
|
|
210
|
+
.terminal-block .prompt { color: #e04000; }
|
|
211
|
+
.terminal-block .cmd { color: #fff; }
|
|
212
|
+
.final-cta h2 {
|
|
213
|
+
font-size: 40px; font-weight: 800; letter-spacing: -1.5px;
|
|
214
|
+
margin-bottom: 16px;
|
|
215
|
+
}
|
|
216
|
+
.final-cta p {
|
|
217
|
+
font-size: 16px; color: #666; max-width: 440px;
|
|
218
|
+
margin: 0 auto 28px;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* FOOTER */
|
|
222
|
+
footer {
|
|
223
|
+
border-top: 1px solid #e5e5e0;
|
|
224
|
+
padding: 32px 64px;
|
|
225
|
+
max-width: 1440px; margin: 0 auto;
|
|
226
|
+
display: flex; justify-content: space-between;
|
|
227
|
+
}
|
|
228
|
+
footer span { font-size: 13px; color: #999; }
|
|
229
|
+
footer ul { list-style: none; display: flex; gap: 20px; }
|
|
230
|
+
footer ul a { font-size: 13px; color: #999; text-decoration: none; }
|
|
231
|
+
footer ul a:hover { color: #333; }
|
|
232
|
+
</style>
|
|
233
|
+
</head>
|
|
234
|
+
<body>
|
|
235
|
+
|
|
236
|
+
<nav>
|
|
237
|
+
<div class="logo"><em>V</em>oltage</div>
|
|
238
|
+
<ul>
|
|
239
|
+
<li><a href="#features">Platform</a></li>
|
|
240
|
+
<li><a href="#pricing">Pricing</a></li>
|
|
241
|
+
<li><a href="#">Docs</a></li>
|
|
242
|
+
<li><a href="#">Blog</a></li>
|
|
243
|
+
</ul>
|
|
244
|
+
<div class="nav-actions">
|
|
245
|
+
<a href="#" class="link-login">Log in</a>
|
|
246
|
+
<a href="#" class="link-signup">Sign up</a>
|
|
247
|
+
</div>
|
|
248
|
+
</nav>
|
|
249
|
+
|
|
250
|
+
<section class="hero">
|
|
251
|
+
<span class="hero-kicker">Serverless GPU Compute</span>
|
|
252
|
+
<h1>Your Python, our GPUs, zero infrastructure</h1>
|
|
253
|
+
<p>Voltage runs compute-heavy Python in the cloud. Add a decorator, pick your hardware, and deploy. You pay only for the seconds your code is running.</p>
|
|
254
|
+
<a href="#" class="hero-cta">
|
|
255
|
+
Run your first function
|
|
256
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
|
|
257
|
+
</a>
|
|
258
|
+
<div class="hero-sub">pip install voltage · Free tier available</div>
|
|
259
|
+
</section>
|
|
260
|
+
|
|
261
|
+
<section class="showcase">
|
|
262
|
+
<div class="code-panel">
|
|
263
|
+
<div class="code-tabs">
|
|
264
|
+
<div class="code-tab active">train.py</div>
|
|
265
|
+
<div class="code-tab">serve.py</div>
|
|
266
|
+
</div>
|
|
267
|
+
<div class="code-content">
|
|
268
|
+
<span class="kw">import</span> voltage<br>
|
|
269
|
+
<span class="kw">from</span> voltage <span class="kw">import</span> Volume<br>
|
|
270
|
+
<br>
|
|
271
|
+
<span class="cm"># Persistent storage for model checkpoints</span><br>
|
|
272
|
+
checkpoints <span class="op">=</span> Volume.persisted(<span class="str">"training-checkpoints"</span>)<br>
|
|
273
|
+
<br>
|
|
274
|
+
<span class="dec">@voltage.function</span>(<br>
|
|
275
|
+
gpu<span class="op">=</span><span class="str">"H100"</span>,<br>
|
|
276
|
+
memory<span class="op">=</span><span class="num">65536</span>,<br>
|
|
277
|
+
volumes<span class="op">=</span>{<span class="str">"/checkpoints"</span>: checkpoints},<br>
|
|
278
|
+
timeout<span class="op">=</span><span class="num">3600</span>,<br>
|
|
279
|
+
)<br>
|
|
280
|
+
<span class="kw">def</span> <span class="fn">train_lora</span>(base_model: str, dataset_path: str):<br>
|
|
281
|
+
<span class="kw">from</span> transformers <span class="kw">import</span> AutoModelForCausalLM<br>
|
|
282
|
+
<span class="kw">from</span> peft <span class="kw">import</span> LoraConfig, get_peft_model<br>
|
|
283
|
+
<br>
|
|
284
|
+
model <span class="op">=</span> AutoModelForCausalLM.from_pretrained(<br>
|
|
285
|
+
base_model, device_map<span class="op">=</span><span class="str">"auto"</span><br>
|
|
286
|
+
)<br>
|
|
287
|
+
peft_model <span class="op">=</span> get_peft_model(model, LoraConfig(<br>
|
|
288
|
+
r<span class="op">=</span><span class="num">16</span>, lora_alpha<span class="op">=</span><span class="num">32</span>, target_modules<span class="op">=</span>[<span class="str">"q_proj"</span>, <span class="str">"v_proj"</span>]<br>
|
|
289
|
+
))<br>
|
|
290
|
+
<br>
|
|
291
|
+
<span class="cm"># ... training loop ...</span><br>
|
|
292
|
+
peft_model.save_pretrained(<span class="str">"/checkpoints/lora-adapter"</span>)<br>
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
<div class="showcase-text">
|
|
296
|
+
<h2>Write ordinary Python. We handle the rest.</h2>
|
|
297
|
+
<p>No Dockerfiles, no Kubernetes manifests, no Terraform. Voltage detects your imports, builds a container image, provisions the hardware, and runs your function.</p>
|
|
298
|
+
<p>Persistent volumes let you share data between runs. Secrets are injected at runtime. Logs stream in real time.</p>
|
|
299
|
+
<ul>
|
|
300
|
+
<li><span class="check">✓</span> Dependencies detected from imports</li>
|
|
301
|
+
<li><span class="check">✓</span> GPU drivers pre-installed (CUDA 12.x)</li>
|
|
302
|
+
<li><span class="check">✓</span> Persistent networked volumes</li>
|
|
303
|
+
<li><span class="check">✓</span> Secret management built in</li>
|
|
304
|
+
<li><span class="check">✓</span> Structured logging & tracing</li>
|
|
305
|
+
</ul>
|
|
306
|
+
</div>
|
|
307
|
+
</section>
|
|
308
|
+
|
|
309
|
+
<section class="bento" id="features">
|
|
310
|
+
<div class="bento-title">Platform capabilities</div>
|
|
311
|
+
<div class="bento-grid">
|
|
312
|
+
<div class="bento-card wide">
|
|
313
|
+
<div class="mono-label">Autoscaling</div>
|
|
314
|
+
<h3>Zero to 10,000 containers in seconds</h3>
|
|
315
|
+
<p>Voltage scales your function horizontally based on request volume. When traffic drops, containers are reclaimed instantly. You never pay for idle hardware. Min and max concurrency are configurable per function.</p>
|
|
316
|
+
</div>
|
|
317
|
+
<div class="bento-card">
|
|
318
|
+
<div class="mono-label">GPU Fleet</div>
|
|
319
|
+
<h3>A100, H100, L4, T4</h3>
|
|
320
|
+
<p>Select GPU type per function. Multi-GPU configurations available for large model training. Spot pricing for fault-tolerant batch workloads.</p>
|
|
321
|
+
</div>
|
|
322
|
+
<div class="bento-card">
|
|
323
|
+
<div class="mono-label">Endpoints</div>
|
|
324
|
+
<h3>Serve models over HTTPS</h3>
|
|
325
|
+
<p>Turn any function into an inference API with one flag. Built-in request queuing, batching, and auth. WebSocket streaming for generative models.</p>
|
|
326
|
+
</div>
|
|
327
|
+
<div class="bento-card">
|
|
328
|
+
<div class="mono-label">Scheduling</div>
|
|
329
|
+
<h3>Cron and event-driven triggers</h3>
|
|
330
|
+
<p>Schedule recurring jobs or trigger functions from webhooks, queues, or other Voltage functions. Build entire ML pipelines as composable functions.</p>
|
|
331
|
+
</div>
|
|
332
|
+
<div class="bento-card wide">
|
|
333
|
+
<div class="mono-label">Developer Experience</div>
|
|
334
|
+
<h3>A local-feeling development loop</h3>
|
|
335
|
+
<p>Run functions locally with voltage run --local, then deploy with voltage deploy. Hot-reload during development. Tail logs, stream metrics, and SSH into running containers for debugging. The CLI is designed to stay out of your way.</p>
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
</section>
|
|
339
|
+
|
|
340
|
+
<section class="pricing" id="pricing">
|
|
341
|
+
<div>
|
|
342
|
+
<h2>Pay only for compute seconds</h2>
|
|
343
|
+
<p>No base fees, no reserved instances, no minimum spend. Idle functions cost exactly zero. Usage is billed per-second with no rounding.</p>
|
|
344
|
+
</div>
|
|
345
|
+
<div class="price-cards">
|
|
346
|
+
<div class="price-row">
|
|
347
|
+
<span class="resource">CPU (per vCPU)</span>
|
|
348
|
+
<span><span class="rate">$0.000014</span><span class="unit">/sec</span></span>
|
|
349
|
+
</div>
|
|
350
|
+
<div class="price-row">
|
|
351
|
+
<span class="resource">Memory (per GiB)</span>
|
|
352
|
+
<span><span class="rate">$0.000003</span><span class="unit">/sec</span></span>
|
|
353
|
+
</div>
|
|
354
|
+
<div class="price-row">
|
|
355
|
+
<span class="resource">T4 GPU</span>
|
|
356
|
+
<span><span class="rate">$0.000164</span><span class="unit">/sec</span></span>
|
|
357
|
+
</div>
|
|
358
|
+
<div class="price-row">
|
|
359
|
+
<span class="resource">A100 80GB GPU</span>
|
|
360
|
+
<span><span class="rate">$0.001028</span><span class="unit">/sec</span></span>
|
|
361
|
+
</div>
|
|
362
|
+
<div class="price-row">
|
|
363
|
+
<span class="resource">H100 GPU</span>
|
|
364
|
+
<span><span class="rate">$0.001389</span><span class="unit">/sec</span></span>
|
|
365
|
+
</div>
|
|
366
|
+
</div>
|
|
367
|
+
</section>
|
|
368
|
+
|
|
369
|
+
<section class="final-cta">
|
|
370
|
+
<div class="terminal-block">
|
|
371
|
+
<pre><span class="prompt">$</span> <span class="cmd">pip install voltage</span>
|
|
372
|
+
<span class="prompt">$</span> <span class="cmd">voltage login</span>
|
|
373
|
+
<span class="prompt">$</span> <span class="cmd">voltage deploy train.py</span>
|
|
374
|
+
<span style="color:#4ade80;">✓</span> Deployed train_lora → https://you.voltage.run/train-lora</pre>
|
|
375
|
+
</div>
|
|
376
|
+
<h2>Start building in five minutes</h2>
|
|
377
|
+
<p>Free tier includes 10 GPU-hours/month. No credit card required to get started.</p>
|
|
378
|
+
<a href="#" class="hero-cta">
|
|
379
|
+
Get started free
|
|
380
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
|
|
381
|
+
</a>
|
|
382
|
+
</section>
|
|
383
|
+
|
|
384
|
+
<footer>
|
|
385
|
+
<span>© 2026 Voltage, Inc. All rights reserved.</span>
|
|
386
|
+
<ul>
|
|
387
|
+
<li><a href="#">Docs</a></li>
|
|
388
|
+
<li><a href="#">GitHub</a></li>
|
|
389
|
+
<li><a href="#">Status</a></li>
|
|
390
|
+
<li><a href="#">Privacy</a></li>
|
|
391
|
+
<li><a href="#">Terms</a></li>
|
|
392
|
+
</ul>
|
|
393
|
+
</footer>
|
|
394
|
+
|
|
395
|
+
</body>
|
|
396
|
+
</html>
|