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,463 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
ARCHETYPE: minimal-luxury
|
|
3
|
+
RATIONALE: "Power made simple" is best expressed through restraint. A stripped-back,
|
|
4
|
+
airy layout with refined typography creates a felt sense of effortlessness — which is
|
|
5
|
+
exactly what Voltage promises (serious compute, feels like local code). The luxury
|
|
6
|
+
signal says "this is a serious, well-made tool" without being loud about it. It
|
|
7
|
+
differentiates from the crowded dark-and-dense MLOps aesthetic.
|
|
8
|
+
SIGNATURE MOVE: The hero is a single, centered code snippet treated as a precious
|
|
9
|
+
object — generous whitespace above and below, a whisper-thin border, the rest of
|
|
10
|
+
the page breathing around it. The "one decorator" concept is the entire hero:
|
|
11
|
+
no words needed beyond a single sharp headline. A thin horizontal rule in
|
|
12
|
+
soft sage-green (the only accent) separates every section cleanly.
|
|
13
|
+
EFFECTS PLAN:
|
|
14
|
+
- Color palette: #FAFAF8 cream-white background, #111110 near-black text,
|
|
15
|
+
#1a1a18 surface, #4d7c6f sage-green accent (restrained, natural), #9ca3af stone-gray muted
|
|
16
|
+
- Typefaces: Fraunces (optical-size serif) for display headlines — refined, considered.
|
|
17
|
+
JetBrains Mono for code — the contrast between editorial serif and precise mono IS
|
|
18
|
+
the aesthetic. Inter for body/UI elements.
|
|
19
|
+
- Spacing: generous. Each section breathes. Max-width 680px for prose columns.
|
|
20
|
+
- Code block: thin border (#e5e5e0), subtle bg (#f5f5f2), code in mono at 13px
|
|
21
|
+
- No drop shadows, no gradients. Thin borders (1px) only.
|
|
22
|
+
- Hover: sage-green underlines, no color changes on backgrounds
|
|
23
|
+
- Numbers and stats rendered in large Fraunces — treated typographically, not as data widgets
|
|
24
|
+
- Section dividers: a single 1px #e5e5e0 line, full-width within container
|
|
25
|
+
- CTA button: outlined — black border, transparent bg — fills to black on hover
|
|
26
|
+
NEGATIVES CHECKED:
|
|
27
|
+
N1 - No lorem ipsum
|
|
28
|
+
N2 - Headline is "One decorator. Any GPU. On demand." — specific and arguable
|
|
29
|
+
N3 - No photo placeholders — whitespace and code are the visual elements
|
|
30
|
+
N4 - No clashing archetype signals — no bright neons, no dark backgrounds, no heavy weight type
|
|
31
|
+
N5 - NOT centered-everything — hero is centered as a deliberate editorial choice,
|
|
32
|
+
features and prose are left-aligned two-column. Centered hero is the signature move,
|
|
33
|
+
not the default layout.
|
|
34
|
+
N6 - Palette constrained: #FAFAF8, #111110, #4d7c6f, #9ca3af, #e5e5e0. 5 values, no more.
|
|
35
|
+
N7 - Two typefaces only: Fraunces + JetBrains Mono (Inter for micro-labels only)
|
|
36
|
+
N8 - CTA is "Run your first function" — specific
|
|
37
|
+
N9 - Prose capped at ~80 chars wide. Short paragraphs. Never more than 3 sentences.
|
|
38
|
+
N10 - Hero communicates VALUE: "your Python function + GPU = running in the cloud" in 6 words
|
|
39
|
+
N11 - Whitespace is purposeful editorial pacing — sections have rhythm
|
|
40
|
+
N12 - Mobile: center-column stacks cleanly, type scales down proportionally
|
|
41
|
+
-->
|
|
42
|
+
<!DOCTYPE html>
|
|
43
|
+
<html lang="en" class="scroll-smooth">
|
|
44
|
+
<head>
|
|
45
|
+
<meta charset="UTF-8" />
|
|
46
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
47
|
+
<title>Voltage — Serverless Compute, Distilled</title>
|
|
48
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
49
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
50
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
51
|
+
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,600;1,9..144,300;1,9..144,400&family=Inter:wght@300;400;500&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
|
|
52
|
+
<script>
|
|
53
|
+
tailwind.config = {
|
|
54
|
+
theme: {
|
|
55
|
+
extend: {
|
|
56
|
+
fontFamily: {
|
|
57
|
+
display: ['Fraunces', 'Georgia', 'serif'],
|
|
58
|
+
mono: ['JetBrains Mono', 'Fira Code', 'monospace'],
|
|
59
|
+
sans: ['Inter', 'system-ui', 'sans-serif'],
|
|
60
|
+
},
|
|
61
|
+
colors: {
|
|
62
|
+
lux: {
|
|
63
|
+
bg: '#FAFAF8',
|
|
64
|
+
surface: '#F5F5F2',
|
|
65
|
+
border: '#E5E5E0',
|
|
66
|
+
text: '#111110',
|
|
67
|
+
muted: '#6B7280',
|
|
68
|
+
subtle: '#9CA3AF',
|
|
69
|
+
sage: '#4D7C6F',
|
|
70
|
+
'sage-light': '#EAF1EF',
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
fontSize: {
|
|
74
|
+
'2xs': ['0.65rem', { lineHeight: '1rem' }],
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
</script>
|
|
80
|
+
<style>
|
|
81
|
+
body {
|
|
82
|
+
background: #FAFAF8;
|
|
83
|
+
color: #111110;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Syntax tokens */
|
|
87
|
+
.t-dec { color: #4D7C6F; font-weight: 500; } /* decorator */
|
|
88
|
+
.t-kw { color: #111110; } /* keyword */
|
|
89
|
+
.t-fn { color: #111110; font-weight: 500; } /* function name */
|
|
90
|
+
.t-str { color: #6B7280; } /* string */
|
|
91
|
+
.t-num { color: #4D7C6F; } /* number */
|
|
92
|
+
.t-cm { color: #C4C4BE; } /* comment */
|
|
93
|
+
.t-p { color: #9CA3AF; } /* punctuation */
|
|
94
|
+
.t-ok { color: #4D7C6F; } /* success output */
|
|
95
|
+
|
|
96
|
+
/* Cursor */
|
|
97
|
+
@keyframes blink { 50% { opacity: 0; } }
|
|
98
|
+
.cursor { animation: blink 1s step-end infinite; }
|
|
99
|
+
|
|
100
|
+
/* Sage underline hover */
|
|
101
|
+
.sage-link {
|
|
102
|
+
position: relative;
|
|
103
|
+
}
|
|
104
|
+
.sage-link::after {
|
|
105
|
+
content: '';
|
|
106
|
+
position: absolute;
|
|
107
|
+
bottom: -1px;
|
|
108
|
+
left: 0;
|
|
109
|
+
width: 0;
|
|
110
|
+
height: 1px;
|
|
111
|
+
background: #4D7C6F;
|
|
112
|
+
transition: width 0.25s ease;
|
|
113
|
+
}
|
|
114
|
+
.sage-link:hover::after { width: 100%; }
|
|
115
|
+
|
|
116
|
+
/* Editorial rule */
|
|
117
|
+
.editorial-rule {
|
|
118
|
+
border: none;
|
|
119
|
+
border-top: 1px solid #E5E5E0;
|
|
120
|
+
margin: 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Large stat number */
|
|
124
|
+
.stat-figure {
|
|
125
|
+
font-family: 'Fraunces', Georgia, serif;
|
|
126
|
+
font-weight: 300;
|
|
127
|
+
font-optical-sizing: auto;
|
|
128
|
+
}
|
|
129
|
+
</style>
|
|
130
|
+
</head>
|
|
131
|
+
<body class="antialiased font-sans">
|
|
132
|
+
|
|
133
|
+
<!-- NAV -->
|
|
134
|
+
<nav class="border-b border-lux-border">
|
|
135
|
+
<div class="max-w-5xl mx-auto px-6 sm:px-8 h-14 flex items-center justify-between">
|
|
136
|
+
<a href="#" class="font-display font-semibold text-lux-text tracking-tight flex items-center gap-1.5 text-base">
|
|
137
|
+
<span class="text-lux-sage">⚡</span>
|
|
138
|
+
<span>Voltage</span>
|
|
139
|
+
</a>
|
|
140
|
+
<div class="flex items-center gap-8">
|
|
141
|
+
<div class="hidden md:flex gap-7 text-sm text-lux-muted font-sans">
|
|
142
|
+
<a href="#" class="sage-link hover:text-lux-text transition-colors">Docs</a>
|
|
143
|
+
<a href="#" class="sage-link hover:text-lux-text transition-colors">Pricing</a>
|
|
144
|
+
<a href="#" class="sage-link hover:text-lux-text transition-colors">Examples</a>
|
|
145
|
+
</div>
|
|
146
|
+
<div class="flex items-center gap-4">
|
|
147
|
+
<a href="#" class="text-sm text-lux-muted hover:text-lux-text transition-colors hidden sm:block">Sign in</a>
|
|
148
|
+
<a href="#" class="text-sm border border-lux-text text-lux-text px-4 py-1.5 hover:bg-lux-text hover:text-lux-bg transition-colors">
|
|
149
|
+
Start free
|
|
150
|
+
</a>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</nav>
|
|
155
|
+
|
|
156
|
+
<!-- HERO — centered, editorial -->
|
|
157
|
+
<section class="max-w-3xl mx-auto px-6 sm:px-8 pt-24 pb-20 text-center">
|
|
158
|
+
|
|
159
|
+
<!-- Pre-headline label -->
|
|
160
|
+
<div class="inline-flex items-center gap-2 mb-8">
|
|
161
|
+
<span class="w-1.5 h-1.5 rounded-full bg-lux-sage inline-block"></span>
|
|
162
|
+
<span class="font-mono text-2xs text-lux-muted uppercase tracking-widest">Serverless GPU Compute</span>
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<!-- Main headline -->
|
|
166
|
+
<h1 class="font-display text-5xl sm:text-6xl text-lux-text leading-[1.1] mb-6 font-light">
|
|
167
|
+
One decorator.<br/>
|
|
168
|
+
<em class="not-italic text-lux-sage">Any GPU.</em><br/>
|
|
169
|
+
On demand.
|
|
170
|
+
</h1>
|
|
171
|
+
|
|
172
|
+
<p class="text-lux-muted text-base sm:text-lg leading-relaxed max-w-lg mx-auto mb-12 font-light">
|
|
173
|
+
Voltage runs Python functions on cloud GPUs — scaling from zero to thousands of
|
|
174
|
+
containers and back, billed by the second.
|
|
175
|
+
No Docker. No YAML. No ops team.
|
|
176
|
+
</p>
|
|
177
|
+
|
|
178
|
+
<!-- Precious code object -->
|
|
179
|
+
<div class="border border-lux-border bg-lux-surface rounded-sm text-left mx-auto max-w-md mb-10">
|
|
180
|
+
<!-- Code header -->
|
|
181
|
+
<div class="border-b border-lux-border px-4 py-2.5 flex items-center justify-between">
|
|
182
|
+
<span class="font-mono text-2xs text-lux-subtle">train.py</span>
|
|
183
|
+
<span class="font-mono text-2xs text-lux-sage">pip install voltage</span>
|
|
184
|
+
</div>
|
|
185
|
+
<!-- Code body -->
|
|
186
|
+
<div class="p-5 font-mono text-sm leading-relaxed">
|
|
187
|
+
<div class="t-cm"># Attach any GPU to a Python function</div>
|
|
188
|
+
<div class="mt-3">
|
|
189
|
+
<span class="t-kw">import</span> <span class="t-fn">voltage</span>
|
|
190
|
+
</div>
|
|
191
|
+
<div class="mt-3">
|
|
192
|
+
<span class="t-dec">@voltage.function</span><span class="t-p">(gpu=</span><span class="t-str">"A100"</span><span class="t-p">)</span>
|
|
193
|
+
</div>
|
|
194
|
+
<div>
|
|
195
|
+
<span class="t-kw">def</span> <span class="t-fn">run</span><span class="t-p">(</span><span class="t-fn">data</span><span class="t-p">:</span> <span class="t-fn">str</span><span class="t-p">):</span>
|
|
196
|
+
</div>
|
|
197
|
+
<div class="pl-5 text-lux-muted">
|
|
198
|
+
<span class="t-kw">return</span> <span class="t-fn">model</span><span class="t-p">.</span><span class="t-fn">fit</span><span class="t-p">(</span>data<span class="t-p">)</span>
|
|
199
|
+
</div>
|
|
200
|
+
<div class="mt-4 border-t border-lux-border pt-4">
|
|
201
|
+
<div class="text-lux-muted"><span class="t-fn">run</span><span class="t-p">.</span><span class="t-dec">remote</span><span class="t-p">(</span><span class="t-str">"/data/imagenet"</span><span class="t-p">)</span></div>
|
|
202
|
+
</div>
|
|
203
|
+
<div class="mt-3 pt-3 text-xs space-y-1">
|
|
204
|
+
<div class="t-ok">→ container ready in 141ms</div>
|
|
205
|
+
<div class="t-ok">→ A100 attached · 92% utilization<span class="cursor text-lux-sage">|</span></div>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
<div class="flex flex-wrap justify-center gap-3">
|
|
211
|
+
<a href="#" class="font-sans text-sm bg-lux-text text-lux-bg px-7 py-2.5 hover:bg-lux-sage transition-colors">
|
|
212
|
+
Run your first function
|
|
213
|
+
</a>
|
|
214
|
+
<a href="#" class="font-sans text-sm border border-lux-border text-lux-muted px-7 py-2.5 hover:border-lux-text hover:text-lux-text transition-colors">
|
|
215
|
+
Read the docs →
|
|
216
|
+
</a>
|
|
217
|
+
</div>
|
|
218
|
+
</section>
|
|
219
|
+
|
|
220
|
+
<hr class="editorial-rule" />
|
|
221
|
+
|
|
222
|
+
<!-- STAT ROW — typographic treatment -->
|
|
223
|
+
<section class="max-w-5xl mx-auto px-6 sm:px-8 py-16">
|
|
224
|
+
<div class="grid grid-cols-1 sm:grid-cols-3 gap-12 sm:gap-0 sm:divide-x sm:divide-lux-border">
|
|
225
|
+
<div class="sm:pr-12 text-center sm:text-left">
|
|
226
|
+
<div class="stat-figure text-6xl text-lux-text leading-none mb-2"><200</div>
|
|
227
|
+
<div class="font-mono text-2xs text-lux-subtle uppercase tracking-widest">millisecond cold start</div>
|
|
228
|
+
<p class="text-lux-muted text-sm mt-3 leading-relaxed">
|
|
229
|
+
Memory-snapshotted containers. PyTorch environments ready before
|
|
230
|
+
the next request arrives.
|
|
231
|
+
</p>
|
|
232
|
+
</div>
|
|
233
|
+
<div class="sm:px-12 text-center sm:text-left">
|
|
234
|
+
<div class="stat-figure text-6xl text-lux-sage leading-none mb-2">10,000</div>
|
|
235
|
+
<div class="font-mono text-2xs text-lux-subtle uppercase tracking-widest">containers, in parallel</div>
|
|
236
|
+
<p class="text-lux-muted text-sm mt-3 leading-relaxed">
|
|
237
|
+
One <code class="font-mono text-xs">.map()</code> call fans work across as many containers
|
|
238
|
+
as your job needs. Scale down to zero when done.
|
|
239
|
+
</p>
|
|
240
|
+
</div>
|
|
241
|
+
<div class="sm:pl-12 text-center sm:text-left">
|
|
242
|
+
<div class="stat-figure text-6xl text-lux-text leading-none mb-2">$0</div>
|
|
243
|
+
<div class="font-mono text-2xs text-lux-subtle uppercase tracking-widest">cost at idle</div>
|
|
244
|
+
<p class="text-lux-muted text-sm mt-3 leading-relaxed">
|
|
245
|
+
Per-second billing. You pay only while your function executes.
|
|
246
|
+
No reserved instances, no minimum spend.
|
|
247
|
+
</p>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
</section>
|
|
251
|
+
|
|
252
|
+
<hr class="editorial-rule" />
|
|
253
|
+
|
|
254
|
+
<!-- CAPABILITIES — two-column editorial -->
|
|
255
|
+
<section class="max-w-5xl mx-auto px-6 sm:px-8 py-16">
|
|
256
|
+
<div class="flex items-baseline gap-4 mb-12">
|
|
257
|
+
<span class="font-mono text-2xs text-lux-subtle uppercase tracking-widest">Capabilities</span>
|
|
258
|
+
<div class="flex-1 border-t border-lux-border"></div>
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
<div class="grid sm:grid-cols-2 gap-x-16 gap-y-12">
|
|
262
|
+
|
|
263
|
+
<div>
|
|
264
|
+
<div class="font-mono text-2xs text-lux-sage uppercase tracking-widest mb-3">GPU compute</div>
|
|
265
|
+
<h3 class="font-display text-xl text-lux-text mb-3 font-light">The right GPU, attached instantly.</h3>
|
|
266
|
+
<p class="text-lux-muted text-sm leading-relaxed mb-4">
|
|
267
|
+
A100, H100, L40S — specify in a decorator argument. Voltage provisions the
|
|
268
|
+
instance, attaches the GPU, and runs your function. It scales down when finished.
|
|
269
|
+
No reservations required.
|
|
270
|
+
</p>
|
|
271
|
+
<div class="font-mono text-xs bg-lux-surface border border-lux-border p-3">
|
|
272
|
+
<span class="t-dec">@voltage.function</span><span class="t-p">(gpu=</span><span class="t-str">"H100"</span><span class="t-p">,</span> <span class="t-p">memory=</span><span class="t-str">"80GB"</span><span class="t-p">)</span>
|
|
273
|
+
</div>
|
|
274
|
+
</div>
|
|
275
|
+
|
|
276
|
+
<div>
|
|
277
|
+
<div class="font-mono text-2xs text-lux-sage uppercase tracking-widest mb-3">Parallel scale</div>
|
|
278
|
+
<h3 class="font-display text-xl text-lux-text mb-3 font-light">Map over thousands. Collect results.</h3>
|
|
279
|
+
<p class="text-lux-muted text-sm leading-relaxed mb-4">
|
|
280
|
+
Pass a list of inputs to <code class="font-mono text-xs">.map()</code>. Voltage distributes work
|
|
281
|
+
across parallel containers, returns results in order. No queue
|
|
282
|
+
configuration, no retry logic to write yourself.
|
|
283
|
+
</p>
|
|
284
|
+
<div class="font-mono text-xs bg-lux-surface border border-lux-border p-3">
|
|
285
|
+
<span class="t-fn">results</span> <span class="t-p">=</span> <span class="t-fn">process</span><span class="t-p">.</span><span class="t-dec">map</span><span class="t-p">(shards,</span> <span class="t-p">concurrency=</span><span class="t-num">2000</span><span class="t-p">)</span>
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
|
|
289
|
+
<div>
|
|
290
|
+
<div class="font-mono text-2xs text-lux-sage uppercase tracking-widest mb-3">Inference endpoints</div>
|
|
291
|
+
<h3 class="font-display text-xl text-lux-text mb-3 font-light">A URL for any model, instantly.</h3>
|
|
292
|
+
<p class="text-lux-muted text-sm leading-relaxed mb-4">
|
|
293
|
+
One decorator turns a function into a persistent HTTP endpoint. Auto-scales to
|
|
294
|
+
traffic, returns to zero when idle. No load balancers. No Kubernetes.
|
|
295
|
+
No ops overhead.
|
|
296
|
+
</p>
|
|
297
|
+
<div class="font-mono text-xs bg-lux-surface border border-lux-border p-3">
|
|
298
|
+
<span class="t-dec">@voltage.endpoint</span><span class="t-p">(min_replicas=</span><span class="t-num">0</span><span class="t-p">)</span>
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
|
|
302
|
+
<div>
|
|
303
|
+
<div class="font-mono text-2xs text-lux-sage uppercase tracking-widest mb-3">Scheduling</div>
|
|
304
|
+
<h3 class="font-display text-xl text-lux-text mb-3 font-light">Cron jobs in Python, not YAML.</h3>
|
|
305
|
+
<p class="text-lux-muted text-sm leading-relaxed mb-4">
|
|
306
|
+
Schedule nightly retraining, data pipelines, model evaluations. Express
|
|
307
|
+
schedules as Python — trigger from cron, CI, webhooks, or other functions.
|
|
308
|
+
Monitor from the Voltage dashboard.
|
|
309
|
+
</p>
|
|
310
|
+
<div class="font-mono text-xs bg-lux-surface border border-lux-border p-3">
|
|
311
|
+
<span class="t-dec">@voltage.cron</span><span class="t-p">(schedule=</span><span class="t-str">"0 2 * * *"</span><span class="t-p">)</span>
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
|
|
315
|
+
</div>
|
|
316
|
+
</section>
|
|
317
|
+
|
|
318
|
+
<hr class="editorial-rule" />
|
|
319
|
+
|
|
320
|
+
<!-- THE POINT — single column prose, editorial -->
|
|
321
|
+
<section class="max-w-5xl mx-auto px-6 sm:px-8 py-16">
|
|
322
|
+
<div class="grid sm:grid-cols-2 gap-16 items-start">
|
|
323
|
+
<div>
|
|
324
|
+
<div class="font-mono text-2xs text-lux-subtle uppercase tracking-widest mb-4">The premise</div>
|
|
325
|
+
<h2 class="font-display text-3xl sm:text-4xl text-lux-text leading-snug mb-6 font-light">
|
|
326
|
+
Infrastructure shouldn't be the hard part<em class="text-lux-sage not-italic">.</em>
|
|
327
|
+
</h2>
|
|
328
|
+
<p class="text-lux-muted text-base leading-relaxed mb-4">
|
|
329
|
+
ML engineers spend weeks writing Dockerfiles, YAML manifests, and Kubernetes
|
|
330
|
+
configs — before a single training run. Voltage makes this work disappear.
|
|
331
|
+
</p>
|
|
332
|
+
<p class="text-lux-muted text-base leading-relaxed">
|
|
333
|
+
Write ordinary Python. The decorator is the infrastructure. Voltage handles
|
|
334
|
+
provisioning, networking, scaling, and teardown — automatically, reliably,
|
|
335
|
+
cheaply.
|
|
336
|
+
</p>
|
|
337
|
+
</div>
|
|
338
|
+
|
|
339
|
+
<div class="space-y-6">
|
|
340
|
+
<div class="border-l-2 border-lux-sage pl-5">
|
|
341
|
+
<div class="font-display text-lg text-lux-text mb-1 font-light">No Docker</div>
|
|
342
|
+
<p class="text-lux-muted text-sm leading-relaxed">
|
|
343
|
+
Voltage builds container images from your Python environment automatically.
|
|
344
|
+
Specify dependencies in a decorator argument, not a Dockerfile.
|
|
345
|
+
</p>
|
|
346
|
+
</div>
|
|
347
|
+
<div class="border-l-2 border-lux-border pl-5">
|
|
348
|
+
<div class="font-display text-lg text-lux-text mb-1 font-light">No YAML</div>
|
|
349
|
+
<p class="text-lux-muted text-sm leading-relaxed">
|
|
350
|
+
Resource requirements, scaling limits, and schedules are Python function
|
|
351
|
+
arguments. They live next to your code.
|
|
352
|
+
</p>
|
|
353
|
+
</div>
|
|
354
|
+
<div class="border-l-2 border-lux-border pl-5">
|
|
355
|
+
<div class="font-display text-lg text-lux-text mb-1 font-light">No cluster ops</div>
|
|
356
|
+
<p class="text-lux-muted text-sm leading-relaxed">
|
|
357
|
+
No GPU nodes to manage, no autoscaling policies to tune, no on-call rotation
|
|
358
|
+
for your compute infrastructure.
|
|
359
|
+
</p>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
363
|
+
</section>
|
|
364
|
+
|
|
365
|
+
<hr class="editorial-rule" />
|
|
366
|
+
|
|
367
|
+
<!-- PRICING -->
|
|
368
|
+
<section class="max-w-5xl mx-auto px-6 sm:px-8 py-16">
|
|
369
|
+
<div class="flex items-baseline gap-4 mb-12">
|
|
370
|
+
<span class="font-mono text-2xs text-lux-subtle uppercase tracking-widest">Pricing</span>
|
|
371
|
+
<div class="flex-1 border-t border-lux-border"></div>
|
|
372
|
+
</div>
|
|
373
|
+
|
|
374
|
+
<div class="grid sm:grid-cols-2 gap-16 items-start">
|
|
375
|
+
<div>
|
|
376
|
+
<h2 class="font-display text-3xl text-lux-text mb-4 font-light leading-snug">
|
|
377
|
+
Pay while it runs.<br/>
|
|
378
|
+
Not while it waits.
|
|
379
|
+
</h2>
|
|
380
|
+
<p class="text-lux-muted text-base leading-relaxed">
|
|
381
|
+
Per-second billing. No reserved capacity. GPUs from $2.49/hr —
|
|
382
|
+
billed only for the seconds your function is executing.
|
|
383
|
+
Scale to zero means your bill scales to zero.
|
|
384
|
+
</p>
|
|
385
|
+
</div>
|
|
386
|
+
|
|
387
|
+
<div>
|
|
388
|
+
<div class="space-y-0 border border-lux-border divide-y divide-lux-border font-mono text-sm">
|
|
389
|
+
<div class="flex justify-between px-5 py-3.5">
|
|
390
|
+
<span class="text-lux-muted">A100 (80 GB)</span>
|
|
391
|
+
<span class="text-lux-text">$2.49 / hr</span>
|
|
392
|
+
</div>
|
|
393
|
+
<div class="flex justify-between px-5 py-3.5">
|
|
394
|
+
<span class="text-lux-muted">H100 (80 GB)</span>
|
|
395
|
+
<span class="text-lux-text">$3.89 / hr</span>
|
|
396
|
+
</div>
|
|
397
|
+
<div class="flex justify-between px-5 py-3.5">
|
|
398
|
+
<span class="text-lux-muted">L40S (48 GB)</span>
|
|
399
|
+
<span class="text-lux-text">$1.79 / hr</span>
|
|
400
|
+
</div>
|
|
401
|
+
<div class="flex justify-between px-5 py-3.5">
|
|
402
|
+
<span class="text-lux-muted">CPU (per vCPU)</span>
|
|
403
|
+
<span class="text-lux-text">$0.018 / hr</span>
|
|
404
|
+
</div>
|
|
405
|
+
<div class="flex justify-between px-5 py-3.5 bg-lux-sage-light">
|
|
406
|
+
<span class="text-lux-sage">Idle cost</span>
|
|
407
|
+
<span class="text-lux-sage font-medium">$0.00</span>
|
|
408
|
+
</div>
|
|
409
|
+
</div>
|
|
410
|
+
<p class="font-mono text-2xs text-lux-subtle mt-3">Billed per second. No minimum spend.</p>
|
|
411
|
+
</div>
|
|
412
|
+
</div>
|
|
413
|
+
</section>
|
|
414
|
+
|
|
415
|
+
<hr class="editorial-rule" />
|
|
416
|
+
|
|
417
|
+
<!-- CTA -->
|
|
418
|
+
<section class="max-w-5xl mx-auto px-6 sm:px-8 py-24 text-center">
|
|
419
|
+
<div class="font-mono text-2xs text-lux-subtle uppercase tracking-widest mb-6">Get started</div>
|
|
420
|
+
<h2 class="font-display text-4xl sm:text-5xl text-lux-text mb-5 font-light leading-snug">
|
|
421
|
+
Run your first function<em class="text-lux-sage not-italic">.</em>
|
|
422
|
+
</h2>
|
|
423
|
+
<p class="text-lux-muted text-base leading-relaxed max-w-sm mx-auto mb-10">
|
|
424
|
+
Install the SDK. Decorate a function. Call <code class="font-mono text-xs text-lux-text">.remote()</code>.
|
|
425
|
+
Your code is running on a GPU in under 200ms.
|
|
426
|
+
</p>
|
|
427
|
+
|
|
428
|
+
<div class="inline-block font-mono text-sm bg-lux-surface border border-lux-border px-8 py-4 mb-8 text-lux-text">
|
|
429
|
+
$ pip install voltage
|
|
430
|
+
</div>
|
|
431
|
+
|
|
432
|
+
<div class="flex flex-wrap justify-center gap-4">
|
|
433
|
+
<a href="#" class="font-sans text-sm bg-lux-text text-lux-bg px-8 py-3 hover:bg-lux-sage transition-colors">
|
|
434
|
+
Run your first function →
|
|
435
|
+
</a>
|
|
436
|
+
<a href="#" class="font-sans text-sm border border-lux-border text-lux-muted px-8 py-3 hover:border-lux-text hover:text-lux-text transition-colors">
|
|
437
|
+
Browse examples
|
|
438
|
+
</a>
|
|
439
|
+
</div>
|
|
440
|
+
</section>
|
|
441
|
+
|
|
442
|
+
<!-- FOOTER -->
|
|
443
|
+
<footer class="border-t border-lux-border">
|
|
444
|
+
<div class="max-w-5xl mx-auto px-6 sm:px-8 py-10">
|
|
445
|
+
<div class="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-6">
|
|
446
|
+
<a href="#" class="font-display font-semibold text-lux-text flex items-center gap-1.5">
|
|
447
|
+
<span class="text-lux-sage">⚡</span> Voltage
|
|
448
|
+
</a>
|
|
449
|
+
<div class="flex flex-wrap gap-6 font-sans text-sm text-lux-subtle">
|
|
450
|
+
<a href="#" class="sage-link hover:text-lux-muted transition-colors">Docs</a>
|
|
451
|
+
<a href="#" class="sage-link hover:text-lux-muted transition-colors">Pricing</a>
|
|
452
|
+
<a href="#" class="sage-link hover:text-lux-muted transition-colors">Status</a>
|
|
453
|
+
<a href="#" class="sage-link hover:text-lux-muted transition-colors">GitHub</a>
|
|
454
|
+
<a href="#" class="sage-link hover:text-lux-muted transition-colors">Discord</a>
|
|
455
|
+
<a href="#" class="sage-link hover:text-lux-muted transition-colors">Privacy</a>
|
|
456
|
+
</div>
|
|
457
|
+
<div class="font-mono text-2xs text-lux-subtle">© 2024 Voltage Inc.</div>
|
|
458
|
+
</div>
|
|
459
|
+
</div>
|
|
460
|
+
</footer>
|
|
461
|
+
|
|
462
|
+
</body>
|
|
463
|
+
</html>
|