forgedock 1.0.17 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -1
- package/bin/cross-publish.mjs +344 -0
- package/bin/forgedock.mjs +229 -17
- package/commands/autopilot.md +77 -0
- package/commands/design-bench.md +176 -0
- package/commands/design-render-critique-loop.md +103 -0
- package/commands/design.md +259 -0
- package/commands/issue.md +7 -3
- package/commands/orchestrate.md +121 -0
- package/commands/{resume.md → pipeline-resume.md} +4 -4
- package/commands/{status.md → pipeline-status.md} +1 -1
- package/commands/qa-sweep.md +37 -2
- package/commands/quality-gate.md +57 -0
- package/commands/review-pr-staging.md +158 -2
- package/commands/test-gate.md +929 -0
- package/commands/work-on/build/implement.md +5 -3
- package/commands/work-on.md +53 -3
- package/docs/CI.md +177 -0
- package/docs/FORGE-PROTOCOL.md +324 -0
- package/docs/articles/b-vs-c-baseline.md +210 -0
- package/docs/articles/full-abc-benchmark.md +205 -0
- package/docs/articles/selective-spec-loading-token-savings.md +140 -0
- package/docs/design/abc-benchmark.md +195 -0
- package/docs/design/design-architect-rationale.md +123 -0
- package/docs/design/design-memory.md +61 -0
- package/docs/design/design-spec-schema.md +248 -0
- package/docs/design/design-system-lint.md +150 -0
- package/docs/design/divergent-generation.md +106 -0
- package/docs/design/effects-appropriateness.md +133 -0
- package/docs/design/fixtures/briefs/README.md +47 -0
- package/docs/design/fixtures/briefs/cadence.md +39 -0
- package/docs/design/fixtures/briefs/plume.md +39 -0
- package/docs/design/fixtures/briefs/slipstream.md +39 -0
- package/docs/design/fixtures/briefs/tender.md +39 -0
- package/docs/design/fixtures/briefs/voltage.md +39 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/runs.json +175 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/scorecard.json +138 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/b-vs-c-baseline/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-1.html +562 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-2.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-a/run-3.html +618 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-1.html +364 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-2.html +420 -0
- package/docs/design/fixtures/runs/full-abc/cadence/arm-b/run-3.html +506 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-1.html +527 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-2.html +445 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-a/run-3.html +483 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-1.html +611 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-2.html +594 -0
- package/docs/design/fixtures/runs/full-abc/plume/arm-b/run-3.html +817 -0
- package/docs/design/fixtures/runs/full-abc/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-1.html +496 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-2.html +447 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-a/run-3.html +564 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-1.html +373 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-2.html +398 -0
- package/docs/design/fixtures/runs/full-abc/slipstream/arm-b/run-3.html +595 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-1.html +622 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-2.html +475 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-a/run-3.html +660 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-1.html +531 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-2.html +565 -0
- package/docs/design/fixtures/runs/full-abc/tender/arm-b/run-3.html +674 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-1.html +525 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-a/run-3.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-1.html +388 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-2.html +463 -0
- package/docs/design/fixtures/runs/full-abc/voltage/arm-b/run-3.html +568 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-1.html +1068 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-2.html +1423 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-a/run-3.html +1245 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-1.html +305 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-2.html +327 -0
- package/docs/design/fixtures/runs/full-abc-opus/cadence/arm-b/run-3.html +428 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-1.html +1270 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-2.html +1172 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-a/run-3.html +1532 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-1.html +315 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-2.html +342 -0
- package/docs/design/fixtures/runs/full-abc-opus/plume/arm-b/run-3.html +353 -0
- package/docs/design/fixtures/runs/full-abc-opus/runs.json +190 -0
- package/docs/design/fixtures/runs/full-abc-opus/scorecard.json +144 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-1.html +345 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-a/run-3.html +502 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-1.html +408 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-2.html +446 -0
- package/docs/design/fixtures/runs/full-abc-opus/slipstream/arm-b/run-3.html +496 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-1.html +813 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-2.html +711 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-a/run-3.html +721 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-1.html +280 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-2.html +291 -0
- package/docs/design/fixtures/runs/full-abc-opus/tender/arm-b/run-3.html +366 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-1.html +1010 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-2.html +836 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-a/run-3.html +930 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-1.html +407 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-2.html +396 -0
- package/docs/design/fixtures/runs/full-abc-opus/voltage/arm-b/run-3.html +529 -0
- package/docs/design/foundations/brutalist.css +294 -0
- package/docs/design/foundations/editorial.css +300 -0
- package/docs/design/foundations/minimal-luxury.css +295 -0
- package/docs/design/foundations/technical.css +293 -0
- package/docs/design/foundations/warm-photo.css +299 -0
- package/docs/design/reference-corpus.md +1726 -0
- package/docs/design/render-critique-loop.md +57 -0
- package/docs/spec-graph-schema.md +397 -0
- package/package.json +1 -1
- package/scripts/bench-scorecard.mjs +239 -0
- package/scripts/build-spec-graph.mjs +509 -0
- package/scripts/check-native-conflicts.sh +200 -0
- package/scripts/classify-lane.sh +0 -7
- package/scripts/design-system-lint.mjs +993 -0
- package/scripts/graph-query.sh +486 -0
- package/scripts/transition-label.sh +10 -2
- package/scripts/validate-spec-graph.sh +423 -0
- package/templates/workflows/forgedock-review.yml +96 -0
|
@@ -0,0 +1,502 @@
|
|
|
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>Slipstream - The deployment platform</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=Instrument+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
9
|
+
<style>
|
|
10
|
+
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
|
11
|
+
:root{
|
|
12
|
+
--bg:#0c0c0e;--surface:#111114;--surface2:#161619;--border:#222228;--fg:#e4e4e7;--muted:#71717a;--accent:#22d3ee;--accentDim:#0e7490;--green:#4ade80;--amber:#fbbf24;--red:#f87171;
|
|
13
|
+
}
|
|
14
|
+
html{font-size:16px;scroll-behavior:smooth}
|
|
15
|
+
body{font-family:'Instrument Sans',sans-serif;background:var(--bg);color:var(--fg);line-height:1.55;-webkit-font-smoothing:antialiased}
|
|
16
|
+
a{color:inherit;text-decoration:none}
|
|
17
|
+
.container{max-width:1200px;margin:0 auto;padding:0 2rem}
|
|
18
|
+
.mono{font-family:'JetBrains Mono',monospace}
|
|
19
|
+
|
|
20
|
+
/* NAV */
|
|
21
|
+
nav{position:sticky;top:0;z-index:100;background:rgba(12,12,14,.9);backdrop-filter:blur(8px);border-bottom:1px solid var(--border);padding:.75rem 2rem}
|
|
22
|
+
nav .inner{max-width:1200px;margin:0 auto;display:flex;justify-content:space-between;align-items:center}
|
|
23
|
+
nav .logo{font-weight:700;font-size:.95rem;letter-spacing:-.01em;display:flex;align-items:center;gap:.5rem}
|
|
24
|
+
nav .logo .badge{font-family:'JetBrains Mono',monospace;font-size:.6rem;background:var(--surface2);border:1px solid var(--border);padding:.15rem .45rem;color:var(--muted);border-radius:2px}
|
|
25
|
+
nav .links{display:flex;gap:1.75rem;font-size:.8rem;color:var(--muted);font-weight:500;align-items:center}
|
|
26
|
+
nav .links a:hover{color:var(--fg)}
|
|
27
|
+
nav .cta-nav{background:var(--accent);color:var(--bg);padding:.45rem 1.1rem;font-weight:600;font-size:.78rem;border-radius:2px}
|
|
28
|
+
|
|
29
|
+
/* HERO — Signature move: live dashboard-style deployment grid */
|
|
30
|
+
.hero{padding:4rem 0 0;border-bottom:1px solid var(--border)}
|
|
31
|
+
.hero-top{display:grid;grid-template-columns:1fr 1fr;gap:3rem;padding-bottom:3rem;align-items:start}
|
|
32
|
+
.hero-copy h1{font-size:clamp(1.75rem,3.5vw,2.75rem);font-weight:700;letter-spacing:-.03em;line-height:1.15;margin-bottom:1rem}
|
|
33
|
+
.hero-copy h1 .highlight{color:var(--accent)}
|
|
34
|
+
.hero-copy p{color:var(--muted);font-size:.95rem;line-height:1.65;max-width:420px;margin-bottom:1.75rem}
|
|
35
|
+
.hero-actions{display:flex;gap:.75rem;align-items:center;flex-wrap:wrap}
|
|
36
|
+
.hero-actions .primary{background:var(--accent);color:var(--bg);padding:.7rem 1.75rem;font-weight:600;font-size:.85rem;border-radius:2px;transition:opacity .15s}
|
|
37
|
+
.hero-actions .primary:hover{opacity:.85}
|
|
38
|
+
.hero-actions .secondary{border:1px solid var(--border);padding:.7rem 1.75rem;font-weight:500;font-size:.85rem;color:var(--muted);border-radius:2px;font-family:'JetBrains Mono',monospace;font-size:.78rem}
|
|
39
|
+
|
|
40
|
+
/* Dashboard panel in hero */
|
|
41
|
+
.dash{background:var(--surface);border:1px solid var(--border);overflow:hidden;border-radius:3px}
|
|
42
|
+
.dash-header{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;border-bottom:1px solid var(--border);background:var(--surface2)}
|
|
43
|
+
.dash-header .title{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
|
|
44
|
+
.dash-header .live-dot{width:6px;height:6px;border-radius:50%;background:var(--green);box-shadow:0 0 6px var(--green)}
|
|
45
|
+
.dash-table{width:100%;font-size:.75rem}
|
|
46
|
+
.dash-table th{text-align:left;padding:.6rem 1rem;font-size:.65rem;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);font-weight:500;border-bottom:1px solid var(--border);background:var(--surface2)}
|
|
47
|
+
.dash-table td{padding:.65rem 1rem;border-bottom:1px solid var(--border);font-family:'JetBrains Mono',monospace;font-size:.72rem;vertical-align:middle}
|
|
48
|
+
.dash-table tr:last-child td{border-bottom:none}
|
|
49
|
+
.status-badge{display:inline-flex;align-items:center;gap:.35rem;font-size:.65rem;font-weight:500;padding:.15rem .5rem;border-radius:2px}
|
|
50
|
+
.status-badge.ready{background:rgba(74,222,128,.1);color:var(--green)}
|
|
51
|
+
.status-badge.building{background:rgba(251,191,36,.1);color:var(--amber)}
|
|
52
|
+
.status-badge.error{background:rgba(248,113,113,.1);color:var(--red)}
|
|
53
|
+
.status-badge .dot{width:5px;height:5px;border-radius:50%;background:currentColor}
|
|
54
|
+
|
|
55
|
+
/* METRICS BAR */
|
|
56
|
+
.metrics-bar{border-bottom:1px solid var(--border);padding:1.5rem 0}
|
|
57
|
+
.metrics-inner{display:grid;grid-template-columns:repeat(5,1fr);gap:0}
|
|
58
|
+
.metric-cell{text-align:center;padding:1rem;border-right:1px solid var(--border)}
|
|
59
|
+
.metric-cell:last-child{border-right:none}
|
|
60
|
+
.metric-cell .val{font-family:'JetBrains Mono',monospace;font-size:1.35rem;font-weight:700;letter-spacing:-.02em}
|
|
61
|
+
.metric-cell .val .unit{font-size:.7em;color:var(--muted);font-weight:400}
|
|
62
|
+
.metric-cell .label{font-size:.65rem;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);margin-top:.3rem}
|
|
63
|
+
|
|
64
|
+
/* FEATURES GRID */
|
|
65
|
+
.features{padding:4rem 0;border-bottom:1px solid var(--border)}
|
|
66
|
+
.features-header{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:2.5rem}
|
|
67
|
+
.features-header h2{font-size:1.5rem;font-weight:700;letter-spacing:-.02em}
|
|
68
|
+
.features-header .tag{font-family:'JetBrains Mono',monospace;font-size:.65rem;color:var(--muted);border:1px solid var(--border);padding:.25rem .6rem;border-radius:2px}
|
|
69
|
+
.feat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:0}
|
|
70
|
+
.feat-card{border:1px solid var(--border);border-right:none;border-bottom:none;padding:1.75rem}
|
|
71
|
+
.feat-card:nth-child(3n){border-right:1px solid var(--border)}
|
|
72
|
+
.feat-card:nth-child(n+4){border-bottom:0}
|
|
73
|
+
.feat-card:nth-child(-n+3){border-top:1px solid var(--border)}
|
|
74
|
+
.feat-grid .feat-card:nth-child(n+4){border-top:0}
|
|
75
|
+
.feat-card .icon-label{font-family:'JetBrains Mono',monospace;font-size:.65rem;color:var(--accent);margin-bottom:.75rem;text-transform:uppercase;letter-spacing:.08em}
|
|
76
|
+
.feat-card h3{font-size:.95rem;font-weight:600;margin-bottom:.5rem}
|
|
77
|
+
.feat-card p{font-size:.82rem;color:var(--muted);line-height:1.55}
|
|
78
|
+
|
|
79
|
+
/* DEPLOY FLOW */
|
|
80
|
+
.flow{padding:4rem 0;border-bottom:1px solid var(--border)}
|
|
81
|
+
.flow h2{font-size:1.5rem;font-weight:700;letter-spacing:-.02em;margin-bottom:2.5rem}
|
|
82
|
+
.flow-layout{display:grid;grid-template-columns:1fr 1fr;gap:2rem}
|
|
83
|
+
.flow-terminal{background:var(--surface);border:1px solid var(--border);border-radius:3px;overflow:hidden}
|
|
84
|
+
.flow-terminal .tab-bar{display:flex;border-bottom:1px solid var(--border);background:var(--surface2)}
|
|
85
|
+
.flow-terminal .tab{padding:.5rem 1rem;font-size:.7rem;font-family:'JetBrains Mono',monospace;color:var(--muted);border-right:1px solid var(--border)}
|
|
86
|
+
.flow-terminal .tab.active{color:var(--fg);background:var(--surface)}
|
|
87
|
+
.flow-terminal .output{padding:1.25rem;font-family:'JetBrains Mono',monospace;font-size:.72rem;line-height:1.9;overflow-x:auto}
|
|
88
|
+
.flow-terminal .g{color:var(--green)}
|
|
89
|
+
.flow-terminal .a{color:var(--amber)}
|
|
90
|
+
.flow-terminal .c{color:var(--accent)}
|
|
91
|
+
.flow-terminal .m{color:var(--muted)}
|
|
92
|
+
.flow-terminal .r{color:var(--red)}
|
|
93
|
+
|
|
94
|
+
.flow-details{display:flex;flex-direction:column;gap:1.5rem}
|
|
95
|
+
.flow-step{border-left:2px solid var(--border);padding-left:1.25rem;transition:border-color .15s}
|
|
96
|
+
.flow-step:hover{border-color:var(--accent)}
|
|
97
|
+
.flow-step .step-label{font-family:'JetBrains Mono',monospace;font-size:.65rem;color:var(--accent);text-transform:uppercase;letter-spacing:.08em;margin-bottom:.35rem}
|
|
98
|
+
.flow-step h3{font-size:.92rem;font-weight:600;margin-bottom:.3rem}
|
|
99
|
+
.flow-step p{font-size:.8rem;color:var(--muted);line-height:1.5}
|
|
100
|
+
|
|
101
|
+
/* FRAMEWORK COMPAT */
|
|
102
|
+
.compat{padding:4rem 0;border-bottom:1px solid var(--border)}
|
|
103
|
+
.compat h2{font-size:1.5rem;font-weight:700;letter-spacing:-.02em;margin-bottom:.5rem}
|
|
104
|
+
.compat .sub{color:var(--muted);font-size:.88rem;margin-bottom:2.5rem}
|
|
105
|
+
.compat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.75rem}
|
|
106
|
+
.compat-item{background:var(--surface);border:1px solid var(--border);padding:1.25rem;border-radius:2px;display:flex;justify-content:space-between;align-items:center}
|
|
107
|
+
.compat-item .name{font-weight:600;font-size:.88rem}
|
|
108
|
+
.compat-item .check{color:var(--green);font-family:'JetBrains Mono',monospace;font-size:.8rem}
|
|
109
|
+
.compat-item .modes{font-size:.7rem;color:var(--muted);margin-top:.2rem}
|
|
110
|
+
|
|
111
|
+
/* EDGE CODE */
|
|
112
|
+
.edge-section{padding:4rem 0;border-bottom:1px solid var(--border)}
|
|
113
|
+
.edge-section h2{font-size:1.5rem;font-weight:700;letter-spacing:-.02em;margin-bottom:.5rem}
|
|
114
|
+
.edge-section .sub{color:var(--muted);font-size:.88rem;margin-bottom:2.5rem;max-width:560px}
|
|
115
|
+
.edge-layout{display:grid;grid-template-columns:1.1fr .9fr;gap:2rem;align-items:start}
|
|
116
|
+
.code-block{background:var(--surface);border:1px solid var(--border);border-radius:3px;overflow:hidden}
|
|
117
|
+
.code-block .file{padding:.6rem 1rem;border-bottom:1px solid var(--border);font-family:'JetBrains Mono',monospace;font-size:.68rem;color:var(--muted);background:var(--surface2)}
|
|
118
|
+
.code-block pre{padding:1.25rem;font-family:'JetBrains Mono',monospace;font-size:.72rem;line-height:1.8;overflow-x:auto}
|
|
119
|
+
.code-block .kw{color:var(--accent)}
|
|
120
|
+
.code-block .str{color:var(--green)}
|
|
121
|
+
.code-block .num{color:var(--amber)}
|
|
122
|
+
.code-block .cmt{color:#444}
|
|
123
|
+
|
|
124
|
+
.edge-info{display:flex;flex-direction:column;gap:1.25rem}
|
|
125
|
+
.edge-stat{background:var(--surface);border:1px solid var(--border);padding:1.25rem;border-radius:2px}
|
|
126
|
+
.edge-stat .val{font-family:'JetBrains Mono',monospace;font-size:1.5rem;font-weight:700}
|
|
127
|
+
.edge-stat .val .unit{font-size:.6em;color:var(--muted)}
|
|
128
|
+
.edge-stat .desc{font-size:.75rem;color:var(--muted);margin-top:.25rem}
|
|
129
|
+
.edge-regions-list{display:flex;flex-wrap:wrap;gap:.35rem}
|
|
130
|
+
.edge-regions-list span{font-family:'JetBrains Mono',monospace;font-size:.62rem;padding:.2rem .45rem;background:var(--surface);border:1px solid var(--border);color:var(--muted);border-radius:2px}
|
|
131
|
+
|
|
132
|
+
/* CTA */
|
|
133
|
+
.cta-section{padding:5rem 0}
|
|
134
|
+
.cta-section h2{font-size:clamp(1.75rem,3.5vw,2.5rem);font-weight:700;letter-spacing:-.03em;margin-bottom:.75rem}
|
|
135
|
+
.cta-section h2 .highlight{color:var(--accent)}
|
|
136
|
+
.cta-section p{color:var(--muted);font-size:.95rem;margin-bottom:2rem;max-width:440px;line-height:1.6}
|
|
137
|
+
.cta-section .actions{display:flex;gap:.75rem;flex-wrap:wrap}
|
|
138
|
+
.cta-section .btn-primary{background:var(--accent);color:var(--bg);padding:.75rem 2rem;font-weight:600;font-size:.88rem;border-radius:2px}
|
|
139
|
+
.cta-section .btn-secondary{border:1px solid var(--border);padding:.75rem 2rem;font-weight:500;font-size:.88rem;color:var(--muted);border-radius:2px}
|
|
140
|
+
.cta-section .note{font-size:.72rem;color:var(--muted);margin-top:1rem}
|
|
141
|
+
|
|
142
|
+
footer{border-top:1px solid var(--border);padding:1.5rem 0;display:flex;justify-content:space-between;font-size:.72rem;color:var(--muted)}
|
|
143
|
+
|
|
144
|
+
@media(max-width:900px){
|
|
145
|
+
.hero-top,.flow-layout,.edge-layout{grid-template-columns:1fr}
|
|
146
|
+
.feat-grid{grid-template-columns:1fr 1fr}
|
|
147
|
+
.feat-card:nth-child(2n){border-right:1px solid var(--border)}
|
|
148
|
+
.feat-card:nth-child(3n){border-right:none}
|
|
149
|
+
.metrics-inner{grid-template-columns:repeat(3,1fr)}
|
|
150
|
+
.metric-cell:nth-child(3){border-right:none}
|
|
151
|
+
.metric-cell:nth-child(n+4){border-top:1px solid var(--border)}
|
|
152
|
+
.compat-grid{grid-template-columns:repeat(2,1fr)}
|
|
153
|
+
nav .links{display:none}
|
|
154
|
+
.dash{margin-top:2rem}
|
|
155
|
+
}
|
|
156
|
+
@media(max-width:600px){
|
|
157
|
+
.container{padding:0 1rem}
|
|
158
|
+
.feat-grid,.compat-grid{grid-template-columns:1fr}
|
|
159
|
+
.feat-card{border-right:1px solid var(--border)!important}
|
|
160
|
+
.metrics-inner{grid-template-columns:1fr 1fr}
|
|
161
|
+
.metric-cell{border-right:none!important;border-bottom:1px solid var(--border)}
|
|
162
|
+
}
|
|
163
|
+
</style>
|
|
164
|
+
</head>
|
|
165
|
+
<body>
|
|
166
|
+
|
|
167
|
+
<nav>
|
|
168
|
+
<div class="inner">
|
|
169
|
+
<div class="logo">slipstream <span class="badge">v3.2</span></div>
|
|
170
|
+
<div class="links">
|
|
171
|
+
<a href="#features">Features</a>
|
|
172
|
+
<a href="#deploy">Deploy</a>
|
|
173
|
+
<a href="#frameworks">Frameworks</a>
|
|
174
|
+
<a href="#edge">Edge</a>
|
|
175
|
+
<a href="#" class="cta-nav">Deploy now</a>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
</nav>
|
|
179
|
+
|
|
180
|
+
<!-- HERO: Signature move = dashboard deployment table as hero visual -->
|
|
181
|
+
<section class="hero">
|
|
182
|
+
<div class="container">
|
|
183
|
+
<div class="hero-top">
|
|
184
|
+
<div class="hero-copy">
|
|
185
|
+
<h1>The deployment platform for <span class="highlight">modern web teams</span></h1>
|
|
186
|
+
<p>Push to git. Get a live URL. Slipstream builds, deploys, and serves your app from 42 edge regions. Zero server management. Zero configuration.</p>
|
|
187
|
+
<div class="hero-actions">
|
|
188
|
+
<a href="#" class="primary">Deploy now</a>
|
|
189
|
+
<a href="#" class="secondary">npx create-slipstream</a>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
<div class="dash">
|
|
193
|
+
<div class="dash-header">
|
|
194
|
+
<span class="title">Deployments</span>
|
|
195
|
+
<span class="live-dot"></span>
|
|
196
|
+
</div>
|
|
197
|
+
<table class="dash-table">
|
|
198
|
+
<thead>
|
|
199
|
+
<tr>
|
|
200
|
+
<th>Branch</th>
|
|
201
|
+
<th>Status</th>
|
|
202
|
+
<th>Duration</th>
|
|
203
|
+
<th>URL</th>
|
|
204
|
+
</tr>
|
|
205
|
+
</thead>
|
|
206
|
+
<tbody>
|
|
207
|
+
<tr>
|
|
208
|
+
<td>main</td>
|
|
209
|
+
<td><span class="status-badge ready"><span class="dot"></span>Ready</span></td>
|
|
210
|
+
<td>6.8s</td>
|
|
211
|
+
<td style="color:var(--accent)">app.example.com</td>
|
|
212
|
+
</tr>
|
|
213
|
+
<tr>
|
|
214
|
+
<td>feat/dashboard</td>
|
|
215
|
+
<td><span class="status-badge ready"><span class="dot"></span>Ready</span></td>
|
|
216
|
+
<td>7.2s</td>
|
|
217
|
+
<td style="color:var(--accent)">feat-dashboard.slipstream.app</td>
|
|
218
|
+
</tr>
|
|
219
|
+
<tr>
|
|
220
|
+
<td>fix/auth-flow</td>
|
|
221
|
+
<td><span class="status-badge building"><span class="dot"></span>Building</span></td>
|
|
222
|
+
<td>3.1s...</td>
|
|
223
|
+
<td style="color:var(--muted)">pending</td>
|
|
224
|
+
</tr>
|
|
225
|
+
<tr>
|
|
226
|
+
<td>staging</td>
|
|
227
|
+
<td><span class="status-badge ready"><span class="dot"></span>Ready</span></td>
|
|
228
|
+
<td>5.9s</td>
|
|
229
|
+
<td style="color:var(--accent)">staging.example.com</td>
|
|
230
|
+
</tr>
|
|
231
|
+
<tr>
|
|
232
|
+
<td>fix/css-layout</td>
|
|
233
|
+
<td><span class="status-badge error"><span class="dot"></span>Failed</span></td>
|
|
234
|
+
<td>2.4s</td>
|
|
235
|
+
<td style="color:var(--muted)">--</td>
|
|
236
|
+
</tr>
|
|
237
|
+
</tbody>
|
|
238
|
+
</table>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
</section>
|
|
243
|
+
|
|
244
|
+
<!-- METRICS BAR -->
|
|
245
|
+
<section class="metrics-bar">
|
|
246
|
+
<div class="container">
|
|
247
|
+
<div class="metrics-inner">
|
|
248
|
+
<div class="metric-cell">
|
|
249
|
+
<div class="val">42</div>
|
|
250
|
+
<div class="label">Edge Regions</div>
|
|
251
|
+
</div>
|
|
252
|
+
<div class="metric-cell">
|
|
253
|
+
<div class="val"><50<span class="unit">ms</span></div>
|
|
254
|
+
<div class="label">Global TTFB</div>
|
|
255
|
+
</div>
|
|
256
|
+
<div class="metric-cell">
|
|
257
|
+
<div class="val">1.2<span class="unit">M</span></div>
|
|
258
|
+
<div class="label">Daily Deploys</div>
|
|
259
|
+
</div>
|
|
260
|
+
<div class="metric-cell">
|
|
261
|
+
<div class="val">99.99<span class="unit">%</span></div>
|
|
262
|
+
<div class="label">Uptime SLA</div>
|
|
263
|
+
</div>
|
|
264
|
+
<div class="metric-cell">
|
|
265
|
+
<div class="val">0<span class="unit">ms</span></div>
|
|
266
|
+
<div class="label">Cold Starts</div>
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</section>
|
|
271
|
+
|
|
272
|
+
<!-- FEATURES -->
|
|
273
|
+
<section class="features" id="features">
|
|
274
|
+
<div class="container">
|
|
275
|
+
<div class="features-header">
|
|
276
|
+
<h2>Platform capabilities</h2>
|
|
277
|
+
<span class="tag">core features</span>
|
|
278
|
+
</div>
|
|
279
|
+
<div class="feat-grid">
|
|
280
|
+
<div class="feat-card">
|
|
281
|
+
<div class="icon-label">// deploy</div>
|
|
282
|
+
<h3>Git-connected deploys</h3>
|
|
283
|
+
<p>Push to any branch, get a deploy. Production on main, previews on everything else. Atomic and immutable.</p>
|
|
284
|
+
</div>
|
|
285
|
+
<div class="feat-card">
|
|
286
|
+
<div class="icon-label">// preview</div>
|
|
287
|
+
<h3>Preview environments</h3>
|
|
288
|
+
<p>Every pull request gets its own URL, environment variables, and serverless functions. Share with stakeholders before merge.</p>
|
|
289
|
+
</div>
|
|
290
|
+
<div class="feat-card">
|
|
291
|
+
<div class="icon-label">// edge</div>
|
|
292
|
+
<h3>Global edge network</h3>
|
|
293
|
+
<p>Static assets cached and served from 42 regions. Dynamic content computed at the nearest edge location to the user.</p>
|
|
294
|
+
</div>
|
|
295
|
+
<div class="feat-card">
|
|
296
|
+
<div class="icon-label">// functions</div>
|
|
297
|
+
<h3>Serverless functions</h3>
|
|
298
|
+
<p>API routes and server-side logic deployed as edge functions. Standard Web APIs, no proprietary runtime lock-in.</p>
|
|
299
|
+
</div>
|
|
300
|
+
<div class="feat-card">
|
|
301
|
+
<div class="icon-label">// teams</div>
|
|
302
|
+
<h3>Team collaboration</h3>
|
|
303
|
+
<p>Deploy notifications, PR comments with preview links, audit logs, role-based access, and SSO for enterprise teams.</p>
|
|
304
|
+
</div>
|
|
305
|
+
<div class="feat-card">
|
|
306
|
+
<div class="icon-label">// rollback</div>
|
|
307
|
+
<h3>Instant rollback</h3>
|
|
308
|
+
<p>Every deployment is immutable and addressable. Roll back to any previous deploy in under a second. No rebuild needed.</p>
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
</section>
|
|
313
|
+
|
|
314
|
+
<!-- DEPLOY FLOW -->
|
|
315
|
+
<section class="flow" id="deploy">
|
|
316
|
+
<div class="container">
|
|
317
|
+
<h2>Deploy pipeline</h2>
|
|
318
|
+
<div class="flow-layout">
|
|
319
|
+
<div class="flow-terminal">
|
|
320
|
+
<div class="tab-bar">
|
|
321
|
+
<div class="tab active">build-log</div>
|
|
322
|
+
<div class="tab">output</div>
|
|
323
|
+
<div class="tab">functions</div>
|
|
324
|
+
</div>
|
|
325
|
+
<div class="output">
|
|
326
|
+
<div class="m"># commit a4f29c1 pushed to main</div>
|
|
327
|
+
<div class="m"># triggered by github webhook</div>
|
|
328
|
+
<br>
|
|
329
|
+
<div><span class="c">step:clone</span> Cloning repository...</div>
|
|
330
|
+
<div class="g"> done (0.7s)</div>
|
|
331
|
+
<br>
|
|
332
|
+
<div><span class="c">step:detect</span> Scanning project...</div>
|
|
333
|
+
<div> framework: <span class="a">Next.js 14.2.3</span></div>
|
|
334
|
+
<div> runtime: <span class="a">Node 20.11.0</span></div>
|
|
335
|
+
<div> pkg-mgr: <span class="a">pnpm 8.15.4</span></div>
|
|
336
|
+
<br>
|
|
337
|
+
<div><span class="c">step:install</span> Installing dependencies...</div>
|
|
338
|
+
<div class="m"> cache restored: node_modules (2,104 pkgs)</div>
|
|
339
|
+
<div class="g"> done (0.3s) -- full cache hit</div>
|
|
340
|
+
<br>
|
|
341
|
+
<div><span class="c">step:build</span> Building application...</div>
|
|
342
|
+
<div class="m"> compiling 247 routes</div>
|
|
343
|
+
<div class="m"> static: 182 | ssr: 41 | api: 24</div>
|
|
344
|
+
<div class="m"> output: 14.2MB (gzipped: 3.8MB)</div>
|
|
345
|
+
<div class="g"> done (4.9s)</div>
|
|
346
|
+
<br>
|
|
347
|
+
<div><span class="c">step:deploy</span> Deploying to edge...</div>
|
|
348
|
+
<div class="m"> propagating to 42 regions</div>
|
|
349
|
+
<div class="m"> ssl: valid | cdn: purged</div>
|
|
350
|
+
<div class="g"> all regions healthy (1.0s)</div>
|
|
351
|
+
<br>
|
|
352
|
+
<div class="c">https://app.example.com</div>
|
|
353
|
+
<div class="g">deploy complete -- 6.9s total</div>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
<div class="flow-details">
|
|
357
|
+
<div class="flow-step">
|
|
358
|
+
<div class="step-label">01 detect</div>
|
|
359
|
+
<h3>Framework detection</h3>
|
|
360
|
+
<p>Slipstream reads your package.json, config files, and directory structure to identify your framework and optimal build settings.</p>
|
|
361
|
+
</div>
|
|
362
|
+
<div class="flow-step">
|
|
363
|
+
<div class="step-label">02 build</div>
|
|
364
|
+
<h3>Cached builds</h3>
|
|
365
|
+
<p>Dependencies and build artifacts are cached across deploys. Subsequent builds skip unchanged work. Average build: under 5 seconds.</p>
|
|
366
|
+
</div>
|
|
367
|
+
<div class="flow-step">
|
|
368
|
+
<div class="step-label">03 propagate</div>
|
|
369
|
+
<h3>Edge distribution</h3>
|
|
370
|
+
<p>Built artifacts are distributed to 42 global edge regions in parallel. CDN cache is invalidated atomically.</p>
|
|
371
|
+
</div>
|
|
372
|
+
<div class="flow-step">
|
|
373
|
+
<div class="step-label">04 serve</div>
|
|
374
|
+
<h3>Live in seconds</h3>
|
|
375
|
+
<p>Your app is live with SSL, custom domains, and edge functions. Instant rollback available for every deploy.</p>
|
|
376
|
+
</div>
|
|
377
|
+
</div>
|
|
378
|
+
</div>
|
|
379
|
+
</div>
|
|
380
|
+
</section>
|
|
381
|
+
|
|
382
|
+
<!-- FRAMEWORKS -->
|
|
383
|
+
<section class="compat" id="frameworks">
|
|
384
|
+
<div class="container">
|
|
385
|
+
<h2>Framework support</h2>
|
|
386
|
+
<p class="sub">Automatic detection and optimized builds for every major framework.</p>
|
|
387
|
+
<div class="compat-grid">
|
|
388
|
+
<div class="compat-item">
|
|
389
|
+
<div><div class="name">Next.js</div><div class="modes">SSR, SSG, ISR, App Router</div></div>
|
|
390
|
+
<div class="check">OK</div>
|
|
391
|
+
</div>
|
|
392
|
+
<div class="compat-item">
|
|
393
|
+
<div><div class="name">Remix</div><div class="modes">Full-stack, loaders, actions</div></div>
|
|
394
|
+
<div class="check">OK</div>
|
|
395
|
+
</div>
|
|
396
|
+
<div class="compat-item">
|
|
397
|
+
<div><div class="name">Astro</div><div class="modes">SSG, SSR, Islands</div></div>
|
|
398
|
+
<div class="check">OK</div>
|
|
399
|
+
</div>
|
|
400
|
+
<div class="compat-item">
|
|
401
|
+
<div><div class="name">SvelteKit</div><div class="modes">SSR, prerender, adapters</div></div>
|
|
402
|
+
<div class="check">OK</div>
|
|
403
|
+
</div>
|
|
404
|
+
<div class="compat-item">
|
|
405
|
+
<div><div class="name">Nuxt</div><div class="modes">Vue 3, Nitro, hybrid</div></div>
|
|
406
|
+
<div class="check">OK</div>
|
|
407
|
+
</div>
|
|
408
|
+
<div class="compat-item">
|
|
409
|
+
<div><div class="name">React + Vite</div><div class="modes">SPA, client-side</div></div>
|
|
410
|
+
<div class="check">OK</div>
|
|
411
|
+
</div>
|
|
412
|
+
<div class="compat-item">
|
|
413
|
+
<div><div class="name">Angular</div><div class="modes">SSR, prerender, hydration</div></div>
|
|
414
|
+
<div class="check">OK</div>
|
|
415
|
+
</div>
|
|
416
|
+
<div class="compat-item">
|
|
417
|
+
<div><div class="name">Solid</div><div class="modes">SolidStart, SSR</div></div>
|
|
418
|
+
<div class="check">OK</div>
|
|
419
|
+
</div>
|
|
420
|
+
</div>
|
|
421
|
+
</div>
|
|
422
|
+
</section>
|
|
423
|
+
|
|
424
|
+
<!-- EDGE -->
|
|
425
|
+
<section class="edge-section" id="edge">
|
|
426
|
+
<div class="container">
|
|
427
|
+
<h2>Edge functions</h2>
|
|
428
|
+
<p class="sub">Server-side logic executed at the edge. Standard Web APIs. No cold starts. Deployed alongside your frontend automatically.</p>
|
|
429
|
+
<div class="edge-layout">
|
|
430
|
+
<div class="code-block">
|
|
431
|
+
<div class="file">app/api/analytics/route.ts</div>
|
|
432
|
+
<pre><span class="kw">export const</span> runtime = <span class="str">'edge'</span>;
|
|
433
|
+
|
|
434
|
+
<span class="kw">export async function</span> POST(req: Request) {
|
|
435
|
+
<span class="kw">const</span> { event, properties } = <span class="kw">await</span> req.json();
|
|
436
|
+
<span class="kw">const</span> geo = req.geo;
|
|
437
|
+
|
|
438
|
+
<span class="cmt">// Process at the nearest edge region</span>
|
|
439
|
+
<span class="kw">await</span> analytics.track({
|
|
440
|
+
event,
|
|
441
|
+
properties,
|
|
442
|
+
context: {
|
|
443
|
+
region: process.env.SLIPSTREAM_REGION,
|
|
444
|
+
city: geo?.city,
|
|
445
|
+
country: geo?.country,
|
|
446
|
+
timestamp: Date.now(),
|
|
447
|
+
},
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
<span class="kw">return</span> Response.json({
|
|
451
|
+
status: <span class="str">'ok'</span>,
|
|
452
|
+
region: process.env.SLIPSTREAM_REGION,
|
|
453
|
+
latency: <span class="str">`${</span>Date.now() - start<span class="str">}ms`</span>,
|
|
454
|
+
});
|
|
455
|
+
}</pre>
|
|
456
|
+
</div>
|
|
457
|
+
<div class="edge-info">
|
|
458
|
+
<div class="edge-stat">
|
|
459
|
+
<div class="val">0<span class="unit">ms</span></div>
|
|
460
|
+
<div class="desc">Cold start time with pre-warmed V8 isolates</div>
|
|
461
|
+
</div>
|
|
462
|
+
<div class="edge-stat">
|
|
463
|
+
<div class="val">42</div>
|
|
464
|
+
<div class="desc">Edge regions running your functions</div>
|
|
465
|
+
</div>
|
|
466
|
+
<div class="edge-stat">
|
|
467
|
+
<div class="val"><10<span class="unit">ms</span></div>
|
|
468
|
+
<div class="desc">Median function execution time</div>
|
|
469
|
+
</div>
|
|
470
|
+
<div style="margin-top:.5rem">
|
|
471
|
+
<div style="font-size:.7rem;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);margin-bottom:.5rem">Regions</div>
|
|
472
|
+
<div class="edge-regions-list">
|
|
473
|
+
<span>iad1</span><span>sfo1</span><span>lhr1</span><span>fra1</span><span>nrt1</span><span>syd1</span><span>gru1</span><span>sin1</span><span>bom1</span><span>cdg1</span><span>hnd1</span><span>icn1</span><span>dub1</span><span>arn1</span><span>yul1</span><span>pdx1</span>
|
|
474
|
+
</div>
|
|
475
|
+
</div>
|
|
476
|
+
</div>
|
|
477
|
+
</div>
|
|
478
|
+
</div>
|
|
479
|
+
</section>
|
|
480
|
+
|
|
481
|
+
<!-- CTA -->
|
|
482
|
+
<section class="cta-section">
|
|
483
|
+
<div class="container">
|
|
484
|
+
<h2>Start deploying <span class="highlight">now</span></h2>
|
|
485
|
+
<p>Free for personal projects. No credit card. No infrastructure to manage. Push your code and watch it go live.</p>
|
|
486
|
+
<div class="actions">
|
|
487
|
+
<a href="#" class="btn-primary">Deploy now</a>
|
|
488
|
+
<a href="#" class="btn-secondary">View documentation</a>
|
|
489
|
+
</div>
|
|
490
|
+
<div class="note">Free tier: 100GB bandwidth, unlimited preview deploys, edge functions, custom domains, SSL.</div>
|
|
491
|
+
</div>
|
|
492
|
+
</section>
|
|
493
|
+
|
|
494
|
+
<footer>
|
|
495
|
+
<div class="container" style="display:flex;justify-content:space-between;width:100%">
|
|
496
|
+
<span>slipstream 2026</span>
|
|
497
|
+
<span class="mono" style="font-size:.68rem">push. build. live.</span>
|
|
498
|
+
</div>
|
|
499
|
+
</footer>
|
|
500
|
+
|
|
501
|
+
</body>
|
|
502
|
+
</html>
|