forgedock 1.0.16 → 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 +54 -3
- package/bin/cross-publish.mjs +344 -0
- package/bin/forgedock.mjs +2205 -541
- package/bin/github-app-manifest.json.license +2 -0
- package/bin/hooks/session-start.mjs +4 -5
- package/bin/registry.mjs +20 -0
- package/bin/tui.mjs +172 -96
- package/commands/adopt.md +433 -0
- package/commands/analytics.md +2 -0
- package/commands/audit-agents.md +2 -0
- package/commands/audit.md +2 -0
- package/commands/autopilot.md +77 -0
- package/commands/changelog.md +354 -0
- package/commands/cleanup.md +2 -0
- package/commands/compat-audit.md +330 -0
- package/commands/deploy-info.md +6 -5
- package/commands/design-bench.md +176 -0
- package/commands/design-render-critique-loop.md +103 -0
- package/commands/design.md +259 -0
- package/commands/diagnose.md +483 -0
- package/commands/explain.md +349 -0
- package/commands/forge-stats.md +2 -0
- package/commands/forgedock-init.md +2 -0
- package/commands/geo-audit.md +2 -0
- package/commands/incident-response.md +2 -0
- package/commands/issue.md +9 -3
- package/commands/milestone.md +2 -0
- package/commands/optimize.md +411 -0
- package/commands/orchestrate.md +239 -0
- package/commands/pipeline-health.md +60 -1
- package/commands/qa-sweep.md +39 -2
- package/commands/quality-gate.md +67 -0
- package/commands/replay.md +263 -0
- package/commands/resume.md +264 -0
- package/commands/review-pr-agents.md +5 -1
- package/commands/review-pr-staging.md +160 -2
- package/commands/review-pr.md +85 -3
- package/commands/rollback.md +2 -0
- package/commands/scope.md +280 -0
- package/commands/security-audit.md +2 -0
- package/commands/status.md +262 -0
- package/commands/sync-ecosystem.md +2 -0
- package/commands/test-gate.md +929 -0
- package/commands/validate.md +2 -0
- package/commands/work-on/build/architect.md +128 -18
- package/commands/work-on/build/context.md +130 -17
- package/commands/work-on/build/implement.md +7 -3
- package/commands/work-on/build/validate.md +2 -0
- package/commands/work-on/build.md +32 -7
- package/commands/work-on/close.md +85 -0
- package/commands/work-on/decompose.md +2 -0
- package/commands/work-on/investigate.md +30 -3
- package/commands/work-on/review.md +13 -1
- package/commands/work-on-monolithic.md +2 -0
- package/commands/work-on.md +676 -38
- package/docs/BRAND.md +51 -0
- package/docs/CI.md +177 -0
- package/docs/CONFIG.md +94 -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/per-repo-adaptive-scripts-token-savings.md +174 -0
- package/docs/articles/selective-spec-loading-token-savings.md +140 -0
- package/docs/claude-breakpoints.json +47 -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/site/getting-started.md +21 -0
- package/docs/spec-graph-schema.md +397 -0
- package/package.json +3 -3
- package/scripts/bench-scorecard.mjs +239 -0
- package/scripts/build-spec-graph.mjs +509 -0
- package/scripts/classify-lane.sh +138 -0
- package/scripts/design-system-lint.mjs +993 -0
- package/scripts/graph-query.sh +486 -0
- package/scripts/transition-label.sh +169 -0
- package/scripts/validate-pr-target.sh +30 -0
- package/scripts/validate-spec-graph.sh +423 -0
- package/templates/devdocs/README.md +72 -0
- package/templates/devdocs/agent/using-forgedock.md +3 -0
- package/templates/devdocs/agent/using-github.md +3 -0
- package/templates/devdocs/index.yaml +162 -0
- package/templates/devdocs/project/architecture.md +3 -0
- package/templates/devdocs/project/conventions.md +3 -0
- package/templates/devdocs/project/custom-instructions.md +3 -0
- package/templates/devdocs/project/glossary.md +3 -0
- package/templates/devdocs/project/stack.md +3 -0
- package/templates/devdocs/templates/commit-convention.md +3 -0
- package/templates/devdocs/templates/issue.md +3 -0
- package/templates/devdocs/templates/pull-request.md +3 -0
- package/templates/devdocs/templates/review-finding.md +3 -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>Slipstream - Deploy at the speed of push</title>
|
|
7
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;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:#fafaf8;--fg:#111;--muted:#777;--border:#e0e0dc;--accent:#111;--accentSoft:#d4d4cf;--subtle:#f0f0ec;
|
|
13
|
+
}
|
|
14
|
+
html{font-size:16px;scroll-behavior:smooth}
|
|
15
|
+
body{font-family:'Plus Jakarta 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
|
+
|
|
18
|
+
.container{max-width:1120px;margin:0 auto;padding:0 2.5rem}
|
|
19
|
+
.mono{font-family:'JetBrains Mono',monospace}
|
|
20
|
+
|
|
21
|
+
/* NAV */
|
|
22
|
+
nav{padding:2rem 2.5rem;display:flex;justify-content:space-between;align-items:center;max-width:1120px;margin:0 auto}
|
|
23
|
+
nav .logo{font-weight:700;font-size:1.1rem;letter-spacing:-.01em}
|
|
24
|
+
nav ul{list-style:none;display:flex;gap:2.5rem;font-size:.85rem;color:var(--muted);font-weight:500}
|
|
25
|
+
nav ul a:hover{color:var(--fg)}
|
|
26
|
+
nav .cta-nav{border:1.5px solid var(--fg);padding:.55rem 1.5rem;font-weight:600;font-size:.8rem;letter-spacing:.03em;transition:all .15s}
|
|
27
|
+
nav .cta-nav:hover{background:var(--fg);color:var(--bg)}
|
|
28
|
+
|
|
29
|
+
/* HERO — Signature move: asymmetric split, massive type left, deployment state cards right */
|
|
30
|
+
.hero{padding:8rem 0 6rem;border-bottom:1px solid var(--border)}
|
|
31
|
+
.hero-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:4rem;align-items:end}
|
|
32
|
+
.hero h1{font-size:clamp(2.5rem,5.5vw,4.5rem);font-weight:700;letter-spacing:-.045em;line-height:1.05}
|
|
33
|
+
.hero h1 .thin{font-weight:300;color:var(--muted)}
|
|
34
|
+
.hero-body{margin-top:2rem;max-width:420px}
|
|
35
|
+
.hero-body p{font-size:1.05rem;color:var(--muted);line-height:1.65;margin-bottom:2rem}
|
|
36
|
+
.hero-cta{display:inline-block;background:var(--fg);color:var(--bg);padding:1rem 2.5rem;font-weight:600;font-size:.9rem;letter-spacing:.02em;transition:opacity .15s}
|
|
37
|
+
.hero-cta:hover{opacity:.85}
|
|
38
|
+
.hero-note{display:block;margin-top:.75rem;font-size:.78rem;color:var(--muted)}
|
|
39
|
+
|
|
40
|
+
/* Deployment state cards — right column */
|
|
41
|
+
.deploy-states{display:flex;flex-direction:column;gap:.75rem}
|
|
42
|
+
.state-card{border:1px solid var(--border);padding:1.25rem 1.5rem;display:grid;grid-template-columns:auto 1fr auto;gap:1rem;align-items:center;background:var(--bg)}
|
|
43
|
+
.state-dot{width:8px;height:8px;border-radius:50%}
|
|
44
|
+
.state-dot.live{background:#22c55e}
|
|
45
|
+
.state-dot.building{background:#f59e0b}
|
|
46
|
+
.state-dot.queued{background:var(--accentSoft)}
|
|
47
|
+
.state-info .branch{font-family:'JetBrains Mono',monospace;font-size:.8rem;font-weight:500}
|
|
48
|
+
.state-info .status{font-size:.72rem;color:var(--muted);margin-top:.15rem}
|
|
49
|
+
.state-time{font-family:'JetBrains Mono',monospace;font-size:.72rem;color:var(--muted)}
|
|
50
|
+
|
|
51
|
+
/* HOW IT WORKS — horizontal scroll-like 3 panels */
|
|
52
|
+
.how{padding:6rem 0;border-bottom:1px solid var(--border)}
|
|
53
|
+
.how-header{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:3.5rem}
|
|
54
|
+
.how-header h2{font-size:clamp(1.5rem,3vw,2.25rem);font-weight:700;letter-spacing:-.03em}
|
|
55
|
+
.how-header span{font-size:.78rem;color:var(--muted);text-transform:uppercase;letter-spacing:.12em}
|
|
56
|
+
.how-panels{display:grid;grid-template-columns:repeat(3,1fr);gap:0}
|
|
57
|
+
.how-panel{padding:2.5rem;border:1px solid var(--border);border-right:none}
|
|
58
|
+
.how-panel:last-child{border-right:1px solid var(--border)}
|
|
59
|
+
.how-panel .num{font-family:'JetBrains Mono',monospace;font-size:.72rem;color:var(--muted);margin-bottom:1.25rem}
|
|
60
|
+
.how-panel h3{font-size:1.15rem;font-weight:600;margin-bottom:.75rem;letter-spacing:-.01em}
|
|
61
|
+
.how-panel p{font-size:.88rem;color:var(--muted);line-height:1.6;margin-bottom:1.25rem}
|
|
62
|
+
.how-panel code{font-family:'JetBrains Mono',monospace;font-size:.75rem;background:var(--subtle);padding:.35rem .65rem;display:inline-block;border:1px solid var(--border)}
|
|
63
|
+
|
|
64
|
+
/* TERMINAL SECTION */
|
|
65
|
+
.terminal-section{padding:6rem 0;border-bottom:1px solid var(--border)}
|
|
66
|
+
.terminal-layout{display:grid;grid-template-columns:.45fr .55fr;gap:4rem;align-items:start}
|
|
67
|
+
.terminal-copy h2{font-size:clamp(1.5rem,3vw,2.25rem);font-weight:700;letter-spacing:-.03em;margin-bottom:1.25rem}
|
|
68
|
+
.terminal-copy p{color:var(--muted);font-size:.95rem;line-height:1.65;margin-bottom:1.5rem}
|
|
69
|
+
.terminal-copy ul{list-style:none;display:flex;flex-direction:column;gap:.75rem}
|
|
70
|
+
.terminal-copy li{font-size:.88rem;padding-left:1.25rem;position:relative;color:var(--muted)}
|
|
71
|
+
.terminal-copy li::before{content:'';position:absolute;left:0;top:.55em;width:6px;height:1px;background:var(--fg)}
|
|
72
|
+
.terminal-box{background:var(--fg);color:var(--bg);padding:2rem;font-family:'JetBrains Mono',monospace;font-size:.78rem;line-height:1.9;overflow-x:auto;position:relative}
|
|
73
|
+
.terminal-box .t-muted{color:#666}
|
|
74
|
+
.terminal-box .t-green{color:#86efac}
|
|
75
|
+
.terminal-box .t-amber{color:#fcd34d}
|
|
76
|
+
.terminal-box .t-url{color:#93c5fd}
|
|
77
|
+
.terminal-box::before{content:'TERMINAL';position:absolute;top:.75rem;right:1rem;font-size:.6rem;letter-spacing:.15em;color:#444}
|
|
78
|
+
|
|
79
|
+
/* FRAMEWORKS */
|
|
80
|
+
.frameworks{padding:6rem 0;border-bottom:1px solid var(--border)}
|
|
81
|
+
.frameworks h2{font-size:clamp(1.5rem,3vw,2.25rem);font-weight:700;letter-spacing:-.03em;margin-bottom:.75rem}
|
|
82
|
+
.frameworks .sub{color:var(--muted);font-size:.95rem;margin-bottom:3rem;max-width:480px}
|
|
83
|
+
.fw-list{display:grid;grid-template-columns:repeat(4,1fr);gap:0}
|
|
84
|
+
.fw-item{padding:1.75rem;border:1px solid var(--border);border-right:none;border-bottom:none}
|
|
85
|
+
.fw-item:nth-child(4n){border-right:1px solid var(--border)}
|
|
86
|
+
.fw-item:nth-child(n+5){border-bottom:0}
|
|
87
|
+
.fw-item:nth-child(-n+4){border-top:1px solid var(--border)}
|
|
88
|
+
.fw-list .fw-item:last-child{border-right:1px solid var(--border)}
|
|
89
|
+
.fw-item .name{font-weight:600;font-size:.95rem;margin-bottom:.25rem}
|
|
90
|
+
.fw-item .detail{font-size:.78rem;color:var(--muted)}
|
|
91
|
+
|
|
92
|
+
/* PERFORMANCE */
|
|
93
|
+
.perf{padding:6rem 0;border-bottom:1px solid var(--border)}
|
|
94
|
+
.perf-header{margin-bottom:3rem}
|
|
95
|
+
.perf-header h2{font-size:clamp(1.5rem,3vw,2.25rem);font-weight:700;letter-spacing:-.03em;margin-bottom:.5rem}
|
|
96
|
+
.perf-header p{color:var(--muted);font-size:.9rem}
|
|
97
|
+
.perf-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2.5rem}
|
|
98
|
+
.perf-stat .number{font-size:clamp(2rem,4vw,3rem);font-weight:700;letter-spacing:-.04em;line-height:1}
|
|
99
|
+
.perf-stat .unit{font-weight:300;color:var(--muted)}
|
|
100
|
+
.perf-stat .desc{font-size:.78rem;color:var(--muted);margin-top:.5rem;line-height:1.5}
|
|
101
|
+
|
|
102
|
+
/* EDGE FUNCTIONS */
|
|
103
|
+
.edge{padding:6rem 0;border-bottom:1px solid var(--border)}
|
|
104
|
+
.edge-split{display:grid;grid-template-columns:1fr 1fr;gap:4rem;align-items:start}
|
|
105
|
+
.edge h2{font-size:clamp(1.5rem,3vw,2.25rem);font-weight:700;letter-spacing:-.03em;margin-bottom:1rem}
|
|
106
|
+
.edge p{color:var(--muted);font-size:.92rem;line-height:1.65;margin-bottom:1.5rem}
|
|
107
|
+
.edge-code{background:var(--subtle);border:1px solid var(--border);padding:1.75rem;font-family:'JetBrains Mono',monospace;font-size:.75rem;line-height:1.8;overflow-x:auto}
|
|
108
|
+
.edge-code .kw{color:#6366f1}
|
|
109
|
+
.edge-code .fn{color:var(--fg);font-weight:500}
|
|
110
|
+
.edge-code .str{color:#059669}
|
|
111
|
+
.edge-code .cmt{color:#aaa}
|
|
112
|
+
.edge-regions{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:1rem}
|
|
113
|
+
.edge-regions span{font-family:'JetBrains Mono',monospace;font-size:.7rem;padding:.3rem .6rem;border:1px solid var(--border);color:var(--muted)}
|
|
114
|
+
|
|
115
|
+
/* CTA */
|
|
116
|
+
.cta-final{padding:8rem 0 6rem}
|
|
117
|
+
.cta-final h2{font-size:clamp(2rem,5vw,3.5rem);font-weight:700;letter-spacing:-.04em;line-height:1.1;margin-bottom:1.25rem}
|
|
118
|
+
.cta-final h2 .thin{font-weight:300;color:var(--muted)}
|
|
119
|
+
.cta-final p{color:var(--muted);font-size:1rem;margin-bottom:2.5rem;max-width:440px;line-height:1.6}
|
|
120
|
+
.cta-final .btn{display:inline-block;background:var(--fg);color:var(--bg);padding:1rem 2.5rem;font-weight:600;font-size:.9rem;letter-spacing:.02em;transition:opacity .15s}
|
|
121
|
+
.cta-final .btn:hover{opacity:.85}
|
|
122
|
+
.cta-final .terms{font-size:.75rem;color:var(--muted);margin-top:.75rem}
|
|
123
|
+
|
|
124
|
+
/* FOOTER */
|
|
125
|
+
footer{border-top:1px solid var(--border);padding:2rem 0;font-size:.75rem;color:var(--muted);display:flex;justify-content:space-between}
|
|
126
|
+
|
|
127
|
+
@media(max-width:900px){
|
|
128
|
+
.hero-grid,.terminal-layout,.edge-split{grid-template-columns:1fr}
|
|
129
|
+
.how-panels{grid-template-columns:1fr}
|
|
130
|
+
.how-panel{border-right:1px solid var(--border)!important;border-bottom:none}
|
|
131
|
+
.how-panel:last-child{border-bottom:1px solid var(--border)}
|
|
132
|
+
.fw-list{grid-template-columns:repeat(2,1fr)}
|
|
133
|
+
.fw-item:nth-child(2n){border-right:1px solid var(--border)}
|
|
134
|
+
.fw-item:nth-child(4n){border-right:none}
|
|
135
|
+
.perf-grid{grid-template-columns:repeat(2,1fr)}
|
|
136
|
+
nav ul{display:none}
|
|
137
|
+
.deploy-states{margin-top:2rem}
|
|
138
|
+
}
|
|
139
|
+
@media(max-width:600px){
|
|
140
|
+
.container{padding:0 1.25rem}
|
|
141
|
+
.fw-list,.perf-grid{grid-template-columns:1fr}
|
|
142
|
+
.fw-item{border-right:1px solid var(--border)!important}
|
|
143
|
+
}
|
|
144
|
+
</style>
|
|
145
|
+
</head>
|
|
146
|
+
<body>
|
|
147
|
+
|
|
148
|
+
<nav>
|
|
149
|
+
<div class="logo">Slipstream</div>
|
|
150
|
+
<ul>
|
|
151
|
+
<li><a href="#how">How it works</a></li>
|
|
152
|
+
<li><a href="#frameworks">Frameworks</a></li>
|
|
153
|
+
<li><a href="#edge">Edge</a></li>
|
|
154
|
+
<li><a href="#performance">Performance</a></li>
|
|
155
|
+
</ul>
|
|
156
|
+
<a href="#" class="cta-nav">Start free</a>
|
|
157
|
+
</nav>
|
|
158
|
+
|
|
159
|
+
<!-- HERO: Signature move = asymmetric split with live deployment state cards -->
|
|
160
|
+
<section class="hero">
|
|
161
|
+
<div class="container">
|
|
162
|
+
<div class="hero-grid">
|
|
163
|
+
<div>
|
|
164
|
+
<h1>Deploy at the<br>speed of <span class="thin">push</span></h1>
|
|
165
|
+
<div class="hero-body">
|
|
166
|
+
<p>Connect your repo. Push your code. Slipstream handles the build, the CDN, the SSL, the scaling. You handle the product.</p>
|
|
167
|
+
<a href="#" class="hero-cta">Start for free</a>
|
|
168
|
+
<span class="hero-note">No credit card. No configuration. Deploy in 30 seconds.</span>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
<div class="deploy-states">
|
|
172
|
+
<div class="state-card">
|
|
173
|
+
<span class="state-dot live"></span>
|
|
174
|
+
<div class="state-info">
|
|
175
|
+
<div class="branch">main</div>
|
|
176
|
+
<div class="status">Production -- app.example.com</div>
|
|
177
|
+
</div>
|
|
178
|
+
<div class="state-time">3m ago</div>
|
|
179
|
+
</div>
|
|
180
|
+
<div class="state-card">
|
|
181
|
+
<span class="state-dot live"></span>
|
|
182
|
+
<div class="state-info">
|
|
183
|
+
<div class="branch">feat/new-onboarding</div>
|
|
184
|
+
<div class="status">Preview -- feat-new-onboarding.slipstream.app</div>
|
|
185
|
+
</div>
|
|
186
|
+
<div class="state-time">12m ago</div>
|
|
187
|
+
</div>
|
|
188
|
+
<div class="state-card">
|
|
189
|
+
<span class="state-dot building"></span>
|
|
190
|
+
<div class="state-info">
|
|
191
|
+
<div class="branch">fix/checkout-validation</div>
|
|
192
|
+
<div class="status">Building... 67% complete</div>
|
|
193
|
+
</div>
|
|
194
|
+
<div class="state-time">now</div>
|
|
195
|
+
</div>
|
|
196
|
+
<div class="state-card">
|
|
197
|
+
<span class="state-dot live"></span>
|
|
198
|
+
<div class="state-info">
|
|
199
|
+
<div class="branch">staging</div>
|
|
200
|
+
<div class="status">Preview -- staging.slipstream.app</div>
|
|
201
|
+
</div>
|
|
202
|
+
<div class="state-time">1h ago</div>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="state-card">
|
|
205
|
+
<span class="state-dot queued"></span>
|
|
206
|
+
<div class="state-info">
|
|
207
|
+
<div class="branch">refactor/api-layer</div>
|
|
208
|
+
<div class="status">Queued</div>
|
|
209
|
+
</div>
|
|
210
|
+
<div class="state-time">queued</div>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</section>
|
|
216
|
+
|
|
217
|
+
<!-- HOW IT WORKS -->
|
|
218
|
+
<section class="how" id="how">
|
|
219
|
+
<div class="container">
|
|
220
|
+
<div class="how-header">
|
|
221
|
+
<h2>How it works</h2>
|
|
222
|
+
<span>3 steps</span>
|
|
223
|
+
</div>
|
|
224
|
+
<div class="how-panels">
|
|
225
|
+
<div class="how-panel">
|
|
226
|
+
<div class="num">01</div>
|
|
227
|
+
<h3>Connect your repo</h3>
|
|
228
|
+
<p>Import from GitHub, GitLab, or Bitbucket. Slipstream detects your framework and configures the build.</p>
|
|
229
|
+
<code>$ slipstream init</code>
|
|
230
|
+
</div>
|
|
231
|
+
<div class="how-panel">
|
|
232
|
+
<div class="num">02</div>
|
|
233
|
+
<h3>Push to any branch</h3>
|
|
234
|
+
<p>Every branch gets a preview deployment. Every pull request gets a unique URL with its own environment.</p>
|
|
235
|
+
<code>$ git push origin feature/auth</code>
|
|
236
|
+
</div>
|
|
237
|
+
<div class="how-panel">
|
|
238
|
+
<div class="num">03</div>
|
|
239
|
+
<h3>Merge and ship</h3>
|
|
240
|
+
<p>Merge to main. Production updates in seconds. Atomic deploys with instant rollback if needed.</p>
|
|
241
|
+
<code>$ gh pr merge --squash</code>
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
</div>
|
|
245
|
+
</section>
|
|
246
|
+
|
|
247
|
+
<!-- TERMINAL -->
|
|
248
|
+
<section class="terminal-section">
|
|
249
|
+
<div class="container">
|
|
250
|
+
<div class="terminal-layout">
|
|
251
|
+
<div class="terminal-copy">
|
|
252
|
+
<h2>Watch your deploy happen</h2>
|
|
253
|
+
<p>Every deployment streams real-time build logs. See exactly what Slipstream is doing at every step.</p>
|
|
254
|
+
<ul>
|
|
255
|
+
<li>Automatic framework detection</li>
|
|
256
|
+
<li>Dependency caching across builds</li>
|
|
257
|
+
<li>Parallel edge propagation</li>
|
|
258
|
+
<li>SSL provisioning included</li>
|
|
259
|
+
<li>Custom domain mapping</li>
|
|
260
|
+
</ul>
|
|
261
|
+
</div>
|
|
262
|
+
<div class="terminal-box">
|
|
263
|
+
<div class="t-muted"># Deploy triggered by push to main (a4f29c1)</div>
|
|
264
|
+
<br>
|
|
265
|
+
<div>Cloning repository...</div>
|
|
266
|
+
<div class="t-green">Done (0.8s)</div>
|
|
267
|
+
<br>
|
|
268
|
+
<div>Framework: <span class="t-amber">Next.js 14.2.3</span></div>
|
|
269
|
+
<div>Node: 20.11.0 | pnpm 8.15.4</div>
|
|
270
|
+
<br>
|
|
271
|
+
<div>Installing dependencies...</div>
|
|
272
|
+
<div class="t-muted">Restored from cache: node_modules (1,891 packages)</div>
|
|
273
|
+
<div class="t-green">Done (0.4s) -- cache hit</div>
|
|
274
|
+
<br>
|
|
275
|
+
<div>Running build...</div>
|
|
276
|
+
<div class="t-muted">Creating optimized production build</div>
|
|
277
|
+
<div class="t-muted">Compiled 247 pages</div>
|
|
278
|
+
<div class="t-muted">Generated static pages: 182</div>
|
|
279
|
+
<div class="t-muted">Server-side routes: 65</div>
|
|
280
|
+
<div class="t-green">Build complete (5.2s)</div>
|
|
281
|
+
<br>
|
|
282
|
+
<div>Deploying to edge...</div>
|
|
283
|
+
<div class="t-muted">Propagating to 42 regions</div>
|
|
284
|
+
<div class="t-green">All regions healthy (1.1s)</div>
|
|
285
|
+
<br>
|
|
286
|
+
<div class="t-muted">SSL: valid (auto-renewed)</div>
|
|
287
|
+
<div class="t-muted">CDN: purged and warmed</div>
|
|
288
|
+
<br>
|
|
289
|
+
<div class="t-url">https://app.example.com</div>
|
|
290
|
+
<div class="t-green">Deploy successful -- 7.5s total</div>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
</div>
|
|
294
|
+
</section>
|
|
295
|
+
|
|
296
|
+
<!-- FRAMEWORKS -->
|
|
297
|
+
<section class="frameworks" id="frameworks">
|
|
298
|
+
<div class="container">
|
|
299
|
+
<h2>Built for your stack</h2>
|
|
300
|
+
<p class="sub">Zero-config support for every major framework. Automatic build detection, optimized output, edge-aware rendering.</p>
|
|
301
|
+
<div class="fw-list">
|
|
302
|
+
<div class="fw-item"><div class="name">Next.js</div><div class="detail">App Router, Pages, ISR, SSR</div></div>
|
|
303
|
+
<div class="fw-item"><div class="name">Remix</div><div class="detail">Full-stack, nested routes</div></div>
|
|
304
|
+
<div class="fw-item"><div class="name">Astro</div><div class="detail">Islands, SSG, SSR hybrid</div></div>
|
|
305
|
+
<div class="fw-item"><div class="name">SvelteKit</div><div class="detail">SSR, prerendering, adapters</div></div>
|
|
306
|
+
<div class="fw-item"><div class="name">Nuxt</div><div class="detail">Vue 3, Nitro server</div></div>
|
|
307
|
+
<div class="fw-item"><div class="name">React + Vite</div><div class="detail">SPA, client-side</div></div>
|
|
308
|
+
<div class="fw-item"><div class="name">Angular</div><div class="detail">SSR, prerender, hydration</div></div>
|
|
309
|
+
<div class="fw-item"><div class="name">Gatsby</div><div class="detail">SSG, DSG, functions</div></div>
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
</section>
|
|
313
|
+
|
|
314
|
+
<!-- PERFORMANCE -->
|
|
315
|
+
<section class="perf" id="performance">
|
|
316
|
+
<div class="container">
|
|
317
|
+
<div class="perf-header">
|
|
318
|
+
<h2>Performance at scale</h2>
|
|
319
|
+
<p>Global infrastructure built for speed. Every metric measured, every millisecond earned.</p>
|
|
320
|
+
</div>
|
|
321
|
+
<div class="perf-grid">
|
|
322
|
+
<div class="perf-stat">
|
|
323
|
+
<div class="number"><50<span class="unit">ms</span></div>
|
|
324
|
+
<div class="desc">Median time to first byte across all 42 edge regions</div>
|
|
325
|
+
</div>
|
|
326
|
+
<div class="perf-stat">
|
|
327
|
+
<div class="number">8<span class="unit">s</span></div>
|
|
328
|
+
<div class="desc">Average build-to-live time for production deployments</div>
|
|
329
|
+
</div>
|
|
330
|
+
<div class="perf-stat">
|
|
331
|
+
<div class="number">99.99<span class="unit">%</span></div>
|
|
332
|
+
<div class="desc">Uptime SLA for Pro and Enterprise plans</div>
|
|
333
|
+
</div>
|
|
334
|
+
<div class="perf-stat">
|
|
335
|
+
<div class="number">0<span class="unit">ms</span></div>
|
|
336
|
+
<div class="desc">Cold start for edge functions with pre-warmed isolates</div>
|
|
337
|
+
</div>
|
|
338
|
+
</div>
|
|
339
|
+
</div>
|
|
340
|
+
</section>
|
|
341
|
+
|
|
342
|
+
<!-- EDGE -->
|
|
343
|
+
<section class="edge" id="edge">
|
|
344
|
+
<div class="container">
|
|
345
|
+
<div class="edge-split">
|
|
346
|
+
<div>
|
|
347
|
+
<h2>Server logic at the edge</h2>
|
|
348
|
+
<p>Write API routes and middleware that run in the region closest to your user. Standard Web APIs, no proprietary runtime.</p>
|
|
349
|
+
<p>Deployed automatically alongside your frontend. No separate infrastructure to manage.</p>
|
|
350
|
+
<div class="edge-regions">
|
|
351
|
+
<span>us-east-1</span><span>us-west-2</span><span>eu-west-1</span><span>eu-central-1</span><span>ap-northeast-1</span><span>ap-southeast-1</span><span>sa-east-1</span><span>ap-south-1</span>
|
|
352
|
+
</div>
|
|
353
|
+
</div>
|
|
354
|
+
<div class="edge-code">
|
|
355
|
+
<span class="cmt">// api/user.ts</span>
|
|
356
|
+
<span class="kw">import</span> { db } <span class="kw">from</span> <span class="str">'@/lib/db'</span>;
|
|
357
|
+
|
|
358
|
+
<span class="kw">export async function</span> <span class="fn">GET</span>(req: Request) {
|
|
359
|
+
<span class="kw">const</span> session = <span class="kw">await</span> auth(req);
|
|
360
|
+
|
|
361
|
+
<span class="kw">if</span> (!session) {
|
|
362
|
+
<span class="kw">return new</span> Response(<span class="str">'Unauthorized'</span>, {
|
|
363
|
+
status: 401,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
<span class="kw">const</span> user = <span class="kw">await</span> db.user.findUnique({
|
|
368
|
+
where: { id: session.userId },
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
<span class="kw">return</span> Response.json(user);
|
|
372
|
+
}
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
</div>
|
|
376
|
+
</section>
|
|
377
|
+
|
|
378
|
+
<!-- CTA -->
|
|
379
|
+
<section class="cta-final">
|
|
380
|
+
<div class="container">
|
|
381
|
+
<h2>Your code<br>deserves <span class="thin">better infra</span></h2>
|
|
382
|
+
<p>Free for hobby projects. Scale to millions of requests. No infrastructure to manage, ever.</p>
|
|
383
|
+
<a href="#" class="btn">Deploy now</a>
|
|
384
|
+
<div class="terms">Free tier: 100GB bandwidth, unlimited deploys, custom domains, SSL.</div>
|
|
385
|
+
</div>
|
|
386
|
+
</section>
|
|
387
|
+
|
|
388
|
+
<footer>
|
|
389
|
+
<div class="container" style="display:flex;justify-content:space-between;width:100%">
|
|
390
|
+
<span>Slipstream 2026</span>
|
|
391
|
+
<span>Push. Build. Live.</span>
|
|
392
|
+
</div>
|
|
393
|
+
</footer>
|
|
394
|
+
|
|
395
|
+
</body>
|
|
396
|
+
</html>
|