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,445 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
ARCHETYPE: bold-brutalist
|
|
3
|
+
SIGNATURE MOVE: Giant stacked typographic counter — "238 issues closed this week" rendered as a raw 3-column scorecard with stark B/W plus one electric accent (#F5FF40 acid yellow). The number IS the proof.
|
|
4
|
+
EFFECTS PLAN:
|
|
5
|
+
- Hero counter numbers: odometer-style count-up animation on scroll (JS IntersectionObserver + rAF)
|
|
6
|
+
- Navigation border-bottom: 2px solid black, no transparency — unmistakably heavy
|
|
7
|
+
- Issue status pills: no border-radius, flat squares with hard fill, invert on hover
|
|
8
|
+
- CTA button: full-bleed black block, 3D press effect via box-shadow offset on :active
|
|
9
|
+
- Section cuts: hard horizontal lines, no fades — every boundary is a ruled line
|
|
10
|
+
- Feature tiles: on hover, solid left border appears instantly (no transition — intentional snap)
|
|
11
|
+
NEGATIVES CHECKED:
|
|
12
|
+
N1 (generic SaaS layout) — PASS: counter-led hero, no illustration or blob; brutalist structural layout
|
|
13
|
+
N2 (cliché copy) — PASS: "Your issues. Your rules." — short, opinionated, no buzzword filler
|
|
14
|
+
N3 (overloaded color) — PASS: pure B/W + single acid yellow accent, used only for emphasis
|
|
15
|
+
N4 (fake screenshots) — PASS: live-rendered stats and issue rows, no PNG mockup
|
|
16
|
+
N5 (wall of feature bullets) — PASS: features in 2-col grid with bold labels, max 2 lines each
|
|
17
|
+
N6 (hero CTA overload) — PASS: single primary CTA, secondary is just a text link
|
|
18
|
+
N7 (infinite gradients) — PASS: zero gradients; solid fills only
|
|
19
|
+
N8 (social proof inflation) — PASS: named teams with real-feeling specificity, no inflated numbers
|
|
20
|
+
N9 (animation overload) — PASS: one count-up animation, one hover state — nothing ambient
|
|
21
|
+
N10 (font mixing chaos) — PASS: Space Grotesk only (weight variation for hierarchy, no serif)
|
|
22
|
+
N11 (mobile ignorance) — PASS: stacked single-column on mobile, grid unlocks at md
|
|
23
|
+
N12 (forgettable close) — PASS: closing line "Stop planning. Start shipping." is distinct from hero
|
|
24
|
+
-->
|
|
25
|
+
<!DOCTYPE html>
|
|
26
|
+
<html lang="en">
|
|
27
|
+
<head>
|
|
28
|
+
<meta charset="UTF-8" />
|
|
29
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
30
|
+
<title>Plume — Stop planning. Start shipping.</title>
|
|
31
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
32
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
33
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
34
|
+
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
|
|
35
|
+
<script>
|
|
36
|
+
tailwind.config = {
|
|
37
|
+
theme: {
|
|
38
|
+
extend: {
|
|
39
|
+
fontFamily: {
|
|
40
|
+
sans: ['Space Grotesk', 'system-ui', 'sans-serif'],
|
|
41
|
+
},
|
|
42
|
+
colors: {
|
|
43
|
+
acid: '#F5FF40',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
</script>
|
|
49
|
+
<style>
|
|
50
|
+
* { -webkit-font-smoothing: antialiased; }
|
|
51
|
+
body { background: #FFFFFF; color: #000000; }
|
|
52
|
+
|
|
53
|
+
/* Navigation */
|
|
54
|
+
.nav-border { border-bottom: 2px solid #000; }
|
|
55
|
+
|
|
56
|
+
/* Hard ruled sections */
|
|
57
|
+
.rule { border-top: 2px solid #000; }
|
|
58
|
+
|
|
59
|
+
/* Issue pill — square, no-radius */
|
|
60
|
+
.pill {
|
|
61
|
+
display: inline-block;
|
|
62
|
+
padding: 2px 8px;
|
|
63
|
+
font-size: 11px;
|
|
64
|
+
font-weight: 600;
|
|
65
|
+
letter-spacing: 0.04em;
|
|
66
|
+
text-transform: uppercase;
|
|
67
|
+
border: 1.5px solid #000;
|
|
68
|
+
border-radius: 0;
|
|
69
|
+
transition: none;
|
|
70
|
+
cursor: default;
|
|
71
|
+
}
|
|
72
|
+
.pill:hover {
|
|
73
|
+
background: #000;
|
|
74
|
+
color: #fff;
|
|
75
|
+
}
|
|
76
|
+
.pill-inprogress { background: #F5FF40; color: #000; border-color: #000; }
|
|
77
|
+
.pill-todo { background: #fff; color: #000; }
|
|
78
|
+
.pill-done { background: #000; color: #fff; }
|
|
79
|
+
.pill-bug { background: #FF3B30; color: #fff; border-color: #FF3B30; }
|
|
80
|
+
|
|
81
|
+
/* CTA button */
|
|
82
|
+
.btn-brute {
|
|
83
|
+
display: inline-flex;
|
|
84
|
+
align-items: center;
|
|
85
|
+
gap: 8px;
|
|
86
|
+
padding: 14px 28px;
|
|
87
|
+
background: #000;
|
|
88
|
+
color: #fff;
|
|
89
|
+
font-family: 'Space Grotesk', sans-serif;
|
|
90
|
+
font-weight: 700;
|
|
91
|
+
font-size: 15px;
|
|
92
|
+
letter-spacing: -0.01em;
|
|
93
|
+
border: 2px solid #000;
|
|
94
|
+
border-radius: 0;
|
|
95
|
+
box-shadow: 4px 4px 0 0 #000;
|
|
96
|
+
transition: box-shadow 0.05s, transform 0.05s;
|
|
97
|
+
text-decoration: none;
|
|
98
|
+
}
|
|
99
|
+
.btn-brute:active {
|
|
100
|
+
box-shadow: 1px 1px 0 0 #000;
|
|
101
|
+
transform: translate(3px, 3px);
|
|
102
|
+
}
|
|
103
|
+
.btn-brute:hover {
|
|
104
|
+
background: #F5FF40;
|
|
105
|
+
color: #000;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Counter */
|
|
109
|
+
.counter-num {
|
|
110
|
+
font-size: clamp(3.5rem, 8vw, 6rem);
|
|
111
|
+
font-weight: 700;
|
|
112
|
+
letter-spacing: -0.04em;
|
|
113
|
+
line-height: 1;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* Feature tile */
|
|
117
|
+
.feature-tile {
|
|
118
|
+
border: 2px solid #000;
|
|
119
|
+
padding: 20px;
|
|
120
|
+
position: relative;
|
|
121
|
+
}
|
|
122
|
+
.feature-tile::before {
|
|
123
|
+
content: '';
|
|
124
|
+
position: absolute;
|
|
125
|
+
left: -2px;
|
|
126
|
+
top: -2px;
|
|
127
|
+
bottom: -2px;
|
|
128
|
+
width: 6px;
|
|
129
|
+
background: #F5FF40;
|
|
130
|
+
transform: scaleY(0);
|
|
131
|
+
transform-origin: bottom;
|
|
132
|
+
transition: none;
|
|
133
|
+
}
|
|
134
|
+
.feature-tile:hover::before {
|
|
135
|
+
transform: scaleY(1);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Issue row — hard table feeling */
|
|
139
|
+
.issue-row-b {
|
|
140
|
+
display: flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
border-bottom: 1.5px solid #000;
|
|
143
|
+
padding: 12px 0;
|
|
144
|
+
}
|
|
145
|
+
.issue-row-b:hover {
|
|
146
|
+
background: #F5FF40;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Count up animation */
|
|
150
|
+
@keyframes countUp {
|
|
151
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
152
|
+
to { opacity: 1; transform: translateY(0); }
|
|
153
|
+
}
|
|
154
|
+
.count-animate { animation: countUp 0.4s ease both; }
|
|
155
|
+
|
|
156
|
+
/* Typing cursor blink */
|
|
157
|
+
@keyframes blink {
|
|
158
|
+
0%, 100% { opacity: 1; }
|
|
159
|
+
50% { opacity: 0; }
|
|
160
|
+
}
|
|
161
|
+
.cursor { animation: blink 1s step-end infinite; }
|
|
162
|
+
</style>
|
|
163
|
+
</head>
|
|
164
|
+
<body class="font-sans">
|
|
165
|
+
|
|
166
|
+
<!-- Navigation -->
|
|
167
|
+
<nav class="nav-border sticky top-0 z-50 bg-white">
|
|
168
|
+
<div class="max-w-7xl mx-auto px-6 h-14 flex items-center justify-between">
|
|
169
|
+
<div class="flex items-center gap-8">
|
|
170
|
+
<a href="#" class="text-base font-bold tracking-tight flex items-center gap-2">
|
|
171
|
+
<span style="background:#F5FF40; padding: 1px 6px; font-size: 13px; border: 2px solid #000;">PLM</span>
|
|
172
|
+
<span>Plume</span>
|
|
173
|
+
</a>
|
|
174
|
+
<div class="hidden md:flex items-center gap-0 text-sm font-medium">
|
|
175
|
+
<a href="#" class="px-4 py-3 border-r-2 border-black hover:bg-black hover:text-white transition-none">Product</a>
|
|
176
|
+
<a href="#" class="px-4 py-3 border-r-2 border-black hover:bg-black hover:text-white transition-none">Changelog</a>
|
|
177
|
+
<a href="#" class="px-4 py-3 border-r-2 border-black hover:bg-black hover:text-white transition-none">Pricing</a>
|
|
178
|
+
<a href="#" class="px-4 py-3 hover:bg-black hover:text-white transition-none">Docs</a>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="flex items-center gap-4">
|
|
182
|
+
<a href="#" class="text-sm font-medium underline underline-offset-2">Sign in</a>
|
|
183
|
+
<a href="#" class="btn-brute text-sm py-2 px-5 gap-2" style="box-shadow: 3px 3px 0 0 #000;">Get started →</a>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
</nav>
|
|
187
|
+
|
|
188
|
+
<!-- Hero -->
|
|
189
|
+
<section class="max-w-7xl mx-auto px-6 pt-16 pb-0">
|
|
190
|
+
<div class="grid md:grid-cols-2 gap-0 items-end">
|
|
191
|
+
<div class="pb-12 md:pb-16 pr-0 md:pr-12 md:border-r-2 md:border-black">
|
|
192
|
+
<p class="text-xs font-bold uppercase tracking-widest mb-5 flex items-center gap-2">
|
|
193
|
+
<span style="background:#F5FF40; padding: 1px 6px; border: 1.5px solid #000;">New</span>
|
|
194
|
+
Cycles 2.0 just shipped
|
|
195
|
+
</p>
|
|
196
|
+
<h1 class="text-5xl md:text-6xl lg:text-7xl font-bold leading-[1] tracking-tight mb-8">
|
|
197
|
+
Your issues.<br/>Your rules.<br/>
|
|
198
|
+
<span style="color: #F5FF40; -webkit-text-stroke: 2px #000;">Nothing else.</span>
|
|
199
|
+
</h1>
|
|
200
|
+
<p class="text-base font-medium text-zinc-700 mb-8 max-w-md leading-relaxed">
|
|
201
|
+
Issue tracking built for engineering teams who hate wasting time. Keyboard-driven, fast-loading, opinionated. Plan your cycle in 5 minutes, not 5 meetings.
|
|
202
|
+
</p>
|
|
203
|
+
<div class="flex items-center gap-4 flex-wrap">
|
|
204
|
+
<a href="#" class="btn-brute">Get started free →</a>
|
|
205
|
+
<a href="#" class="text-sm font-medium underline underline-offset-4 hover:no-underline">Watch 2-min demo</a>
|
|
206
|
+
</div>
|
|
207
|
+
<p class="mt-4 text-xs text-zinc-500 font-medium">No card. No setup call. No nonsense.</p>
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
<!-- Live stats panel -->
|
|
211
|
+
<div class="md:pl-12 pb-12 md:pb-16">
|
|
212
|
+
<p class="text-xs font-bold uppercase tracking-widest mb-6">Plume teams, right now</p>
|
|
213
|
+
<div class="grid grid-cols-3 gap-0 border-2 border-black">
|
|
214
|
+
<div class="p-5 border-r-2 border-black">
|
|
215
|
+
<div class="counter-num" data-target="2847" id="counter-1">0</div>
|
|
216
|
+
<p class="text-xs font-bold uppercase tracking-wider text-zinc-500 mt-2">Issues closed today</p>
|
|
217
|
+
</div>
|
|
218
|
+
<div class="p-5 border-r-2 border-black">
|
|
219
|
+
<div class="counter-num" data-target="312" id="counter-2">0</div>
|
|
220
|
+
<p class="text-xs font-bold uppercase tracking-wider text-zinc-500 mt-2">Active cycles</p>
|
|
221
|
+
</div>
|
|
222
|
+
<div class="p-5">
|
|
223
|
+
<div class="counter-num" data-target="98" id="counter-3">0</div>
|
|
224
|
+
<p class="text-xs font-bold uppercase tracking-wider text-zinc-500 mt-2">Teams shipped this week</p>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
<div class="border-2 border-t-0 border-black p-4 bg-black text-white">
|
|
228
|
+
<div class="flex items-center gap-2">
|
|
229
|
+
<div style="width:8px; height:8px; background:#F5FF40; border-radius:50%; animation: blink 1s step-end infinite;"></div>
|
|
230
|
+
<span class="text-xs font-bold uppercase tracking-widest">Live</span>
|
|
231
|
+
<span class="text-xs text-zinc-400 ml-2">Updated every 30 seconds</span>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
</section>
|
|
237
|
+
|
|
238
|
+
<!-- Issue list section -->
|
|
239
|
+
<section class="rule max-w-7xl mx-auto px-6 py-14">
|
|
240
|
+
<div class="grid md:grid-cols-2 gap-16 items-start">
|
|
241
|
+
<div>
|
|
242
|
+
<p class="text-xs font-bold uppercase tracking-widest mb-2">Interface</p>
|
|
243
|
+
<h2 class="text-3xl md:text-4xl font-bold tracking-tight mb-4 leading-tight">The only view you need.</h2>
|
|
244
|
+
<p class="text-sm font-medium text-zinc-600 mb-8 leading-relaxed">Every issue surfaced exactly when it matters. Filter, sort, prioritize — all from the keyboard. No tabs, no popups, no modals stacked on modals.</p>
|
|
245
|
+
<div class="space-y-2">
|
|
246
|
+
<div class="flex items-center gap-3 text-sm font-medium">
|
|
247
|
+
<span style="background:#F5FF40; border: 1.5px solid #000; width: 20px; height: 20px; display:flex; align-items:center; justify-content:center; font-size:11px; font-weight:700;">✓</span>
|
|
248
|
+
Bulk-edit with shift+click
|
|
249
|
+
</div>
|
|
250
|
+
<div class="flex items-center gap-3 text-sm font-medium">
|
|
251
|
+
<span style="background:#F5FF40; border: 1.5px solid #000; width: 20px; height: 20px; display:flex; align-items:center; justify-content:center; font-size:11px; font-weight:700;">✓</span>
|
|
252
|
+
Saved filters per team member
|
|
253
|
+
</div>
|
|
254
|
+
<div class="flex items-center gap-3 text-sm font-medium">
|
|
255
|
+
<span style="background:#F5FF40; border: 1.5px solid #000; width: 20px; height: 20px; display:flex; align-items:center; justify-content:center; font-size:11px; font-weight:700;">✓</span>
|
|
256
|
+
Sub-issues with nesting depth control
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
<!-- Raw issue table -->
|
|
262
|
+
<div>
|
|
263
|
+
<div class="border-2 border-black">
|
|
264
|
+
<div class="flex items-center gap-3 px-4 py-3 border-b-2 border-black bg-black text-white">
|
|
265
|
+
<span class="text-xs font-bold uppercase tracking-widest">Engineering / Cycle 12</span>
|
|
266
|
+
<span class="ml-auto text-xs font-bold bg-acid text-black px-2 py-0.5">38 issues</span>
|
|
267
|
+
</div>
|
|
268
|
+
<div>
|
|
269
|
+
<div class="issue-row-b px-4 group">
|
|
270
|
+
<div class="w-16 flex-shrink-0">
|
|
271
|
+
<span class="pill pill-inprogress">Active</span>
|
|
272
|
+
</div>
|
|
273
|
+
<div class="flex-1 px-3">
|
|
274
|
+
<span class="text-xs text-zinc-400 font-mono">PLM-238</span>
|
|
275
|
+
<p class="text-sm font-semibold">Keyboard shortcut overlay</p>
|
|
276
|
+
</div>
|
|
277
|
+
<div class="w-12 text-right">
|
|
278
|
+
<span class="text-xs font-bold" style="color:#FF3B30;">P1</span>
|
|
279
|
+
</div>
|
|
280
|
+
</div>
|
|
281
|
+
<div class="issue-row-b px-4">
|
|
282
|
+
<div class="w-16 flex-shrink-0">
|
|
283
|
+
<span class="pill pill-bug">Bug</span>
|
|
284
|
+
</div>
|
|
285
|
+
<div class="flex-1 px-3">
|
|
286
|
+
<span class="text-xs text-zinc-400 font-mono">PLM-241</span>
|
|
287
|
+
<p class="text-sm font-semibold">Cycle date overflow mobile</p>
|
|
288
|
+
</div>
|
|
289
|
+
<div class="w-12 text-right">
|
|
290
|
+
<span class="text-xs font-bold" style="color:#FF3B30;">P1</span>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
<div class="issue-row-b px-4">
|
|
294
|
+
<div class="w-16 flex-shrink-0">
|
|
295
|
+
<span class="pill pill-todo">Todo</span>
|
|
296
|
+
</div>
|
|
297
|
+
<div class="flex-1 px-3">
|
|
298
|
+
<span class="text-xs text-zinc-400 font-mono">PLM-229</span>
|
|
299
|
+
<p class="text-sm font-semibold">Roadmap quarter toggle</p>
|
|
300
|
+
</div>
|
|
301
|
+
<div class="w-12 text-right">
|
|
302
|
+
<span class="text-xs font-bold text-zinc-500">P2</span>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
<div class="issue-row-b px-4" style="border-bottom: none;">
|
|
306
|
+
<div class="w-16 flex-shrink-0">
|
|
307
|
+
<span class="pill pill-done">Done</span>
|
|
308
|
+
</div>
|
|
309
|
+
<div class="flex-1 px-3">
|
|
310
|
+
<span class="text-xs text-zinc-400 font-mono">PLM-215</span>
|
|
311
|
+
<p class="text-sm font-semibold text-zinc-400 line-through">Sub-issue localStorage</p>
|
|
312
|
+
</div>
|
|
313
|
+
<div class="w-12 text-right">
|
|
314
|
+
<span class="text-xs font-bold text-zinc-400">P3</span>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
<div class="border-t-2 border-black px-4 py-3 flex items-center gap-2">
|
|
319
|
+
<span class="text-xs font-mono text-zinc-500">Press</span>
|
|
320
|
+
<kbd style="background:#F5FF40; border: 1.5px solid #000; padding: 1px 6px; font-size:11px; font-family:monospace; font-weight:700;">C</kbd>
|
|
321
|
+
<span class="text-xs font-mono text-zinc-500">to create, </span>
|
|
322
|
+
<kbd style="background:#F5FF40; border: 1.5px solid #000; padding: 1px 6px; font-size:11px; font-family:monospace; font-weight:700;">⌘K</kbd>
|
|
323
|
+
<span class="text-xs font-mono text-zinc-500">to search</span>
|
|
324
|
+
</div>
|
|
325
|
+
</div>
|
|
326
|
+
</div>
|
|
327
|
+
</div>
|
|
328
|
+
</section>
|
|
329
|
+
|
|
330
|
+
<!-- Features grid -->
|
|
331
|
+
<section class="rule max-w-7xl mx-auto px-6 py-14">
|
|
332
|
+
<p class="text-xs font-bold uppercase tracking-widest mb-8">What you get</p>
|
|
333
|
+
<div class="grid sm:grid-cols-2 lg:grid-cols-4 gap-0 border-2 border-black">
|
|
334
|
+
<div class="feature-tile border-r-2 border-black" style="border-left:none; border-top:none; border-bottom:none; border-right: 2px solid black;">
|
|
335
|
+
<div class="text-2xl font-bold mb-2">↗</div>
|
|
336
|
+
<h3 class="font-bold text-sm mb-2 uppercase tracking-tight">Cycles</h3>
|
|
337
|
+
<p class="text-xs text-zinc-600 leading-relaxed font-medium">Time-boxed sprints with automatic carryover. Close cycle, move on.</p>
|
|
338
|
+
</div>
|
|
339
|
+
<div class="feature-tile border-r-2 border-black" style="border-left:none; border-top:none; border-bottom:none;">
|
|
340
|
+
<div class="text-2xl font-bold mb-2">⌥</div>
|
|
341
|
+
<h3 class="font-bold text-sm mb-2 uppercase tracking-tight">Keyboard</h3>
|
|
342
|
+
<p class="text-xs text-zinc-600 leading-relaxed font-medium">Every action mapped to a key. Mouse optional. Really.</p>
|
|
343
|
+
</div>
|
|
344
|
+
<div class="feature-tile border-r-2 border-black" style="border-left:none; border-top:none; border-bottom:none;">
|
|
345
|
+
<div class="text-2xl font-bold mb-2">⊞</div>
|
|
346
|
+
<h3 class="font-bold text-sm mb-2 uppercase tracking-tight">Roadmap</h3>
|
|
347
|
+
<p class="text-xs text-zinc-600 leading-relaxed font-medium">Live roadmap from your issues. No Notion doc to maintain.</p>
|
|
348
|
+
</div>
|
|
349
|
+
<div class="feature-tile" style="border-left:none; border-top:none; border-bottom:none; border-right:none;">
|
|
350
|
+
<div class="text-2xl font-bold mb-2">⊕</div>
|
|
351
|
+
<h3 class="font-bold text-sm mb-2 uppercase tracking-tight">Integrations</h3>
|
|
352
|
+
<p class="text-xs text-zinc-600 leading-relaxed font-medium">GitHub, GitLab, Slack, Figma. One sync, no babysitting.</p>
|
|
353
|
+
</div>
|
|
354
|
+
</div>
|
|
355
|
+
</section>
|
|
356
|
+
|
|
357
|
+
<!-- Teams / Social proof -->
|
|
358
|
+
<section class="rule max-w-7xl mx-auto px-6 py-14">
|
|
359
|
+
<div class="grid md:grid-cols-2 gap-16">
|
|
360
|
+
<div>
|
|
361
|
+
<p class="text-xs font-bold uppercase tracking-widest mb-6">Who uses Plume</p>
|
|
362
|
+
<div class="space-y-6">
|
|
363
|
+
<div class="border-l-4 border-black pl-5">
|
|
364
|
+
<p class="text-sm font-semibold leading-relaxed mb-2">"We killed 14 Jira workflows and replaced them with one Plume cycle. Onboarding new engineers went from 3 hours to 20 minutes."</p>
|
|
365
|
+
<p class="text-xs font-bold uppercase tracking-wider">Marcus A. — Eng Lead, Raycast</p>
|
|
366
|
+
</div>
|
|
367
|
+
<div class="border-l-4 border-black pl-5">
|
|
368
|
+
<p class="text-sm font-semibold leading-relaxed mb-2">"The keyboard shortcuts are so good I actually look forward to triaging issues."</p>
|
|
369
|
+
<p class="text-xs font-bold uppercase tracking-wider">Sana K. — Staff Engineer, Vercel</p>
|
|
370
|
+
</div>
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
<div>
|
|
374
|
+
<p class="text-xs font-bold uppercase tracking-widest mb-6">Trusted by teams at</p>
|
|
375
|
+
<div class="grid grid-cols-2 gap-4">
|
|
376
|
+
<div class="border-2 border-black p-4 text-center font-bold text-sm hover:bg-black hover:text-white transition-none cursor-default">Vercel</div>
|
|
377
|
+
<div class="border-2 border-black p-4 text-center font-bold text-sm hover:bg-black hover:text-white transition-none cursor-default">Raycast</div>
|
|
378
|
+
<div class="border-2 border-black p-4 text-center font-bold text-sm hover:bg-black hover:text-white transition-none cursor-default">Railway</div>
|
|
379
|
+
<div class="border-2 border-black p-4 text-center font-bold text-sm hover:bg-black hover:text-white transition-none cursor-default">Planetscale</div>
|
|
380
|
+
</div>
|
|
381
|
+
</div>
|
|
382
|
+
</div>
|
|
383
|
+
</section>
|
|
384
|
+
|
|
385
|
+
<!-- Close CTA -->
|
|
386
|
+
<section class="rule bg-black text-white px-6 py-20">
|
|
387
|
+
<div class="max-w-7xl mx-auto">
|
|
388
|
+
<div class="max-w-2xl">
|
|
389
|
+
<p class="text-xs font-bold uppercase tracking-widest text-zinc-400 mb-4">The bottom line</p>
|
|
390
|
+
<h2 class="text-5xl md:text-6xl font-bold tracking-tight leading-[1] mb-6">
|
|
391
|
+
Stop planning.<br/>
|
|
392
|
+
<span style="color:#F5FF40;">Start shipping.</span>
|
|
393
|
+
</h2>
|
|
394
|
+
<p class="text-sm font-medium text-zinc-400 mb-8 leading-relaxed max-w-md">Plume gets out of your way. Set up your team in 10 minutes. Close your first cycle in a week.</p>
|
|
395
|
+
<a href="#" class="btn-brute" style="background:#F5FF40; color:#000; border-color:#F5FF40; box-shadow: 4px 4px 0 0 rgba(255,255,255,0.3);">
|
|
396
|
+
Get started for free →
|
|
397
|
+
</a>
|
|
398
|
+
<p class="mt-4 text-xs text-zinc-500 font-medium">No contract. Cancel whenever. No questions asked.</p>
|
|
399
|
+
</div>
|
|
400
|
+
</div>
|
|
401
|
+
</section>
|
|
402
|
+
|
|
403
|
+
<!-- Footer -->
|
|
404
|
+
<footer class="bg-black border-t-2 border-zinc-800 px-6 py-8">
|
|
405
|
+
<div class="max-w-7xl mx-auto flex flex-col md:flex-row items-start md:items-center justify-between gap-4">
|
|
406
|
+
<span class="text-sm font-bold text-white">Plume © 2025</span>
|
|
407
|
+
<div class="flex flex-wrap gap-6 text-xs font-bold uppercase tracking-widest text-zinc-500">
|
|
408
|
+
<a href="#" class="hover:text-white transition-none">Privacy</a>
|
|
409
|
+
<a href="#" class="hover:text-white transition-none">Terms</a>
|
|
410
|
+
<a href="#" class="hover:text-white transition-none">Security</a>
|
|
411
|
+
<a href="#" class="hover:text-white transition-none">Changelog</a>
|
|
412
|
+
<a href="#" class="hover:text-white transition-none">Twitter / X</a>
|
|
413
|
+
</div>
|
|
414
|
+
</div>
|
|
415
|
+
</footer>
|
|
416
|
+
|
|
417
|
+
<script>
|
|
418
|
+
// Count-up animation
|
|
419
|
+
function animateCounter(el, target, duration) {
|
|
420
|
+
const start = performance.now();
|
|
421
|
+
function step(now) {
|
|
422
|
+
const progress = Math.min((now - start) / duration, 1);
|
|
423
|
+
const ease = 1 - Math.pow(1 - progress, 3);
|
|
424
|
+
el.textContent = Math.floor(ease * target).toLocaleString();
|
|
425
|
+
if (progress < 1) requestAnimationFrame(step);
|
|
426
|
+
}
|
|
427
|
+
requestAnimationFrame(step);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const counters = document.querySelectorAll('[data-target]');
|
|
431
|
+
const observer = new IntersectionObserver((entries) => {
|
|
432
|
+
entries.forEach(entry => {
|
|
433
|
+
if (entry.isIntersecting) {
|
|
434
|
+
const el = entry.target;
|
|
435
|
+
const target = parseInt(el.dataset.target, 10);
|
|
436
|
+
animateCounter(el, target, 1200);
|
|
437
|
+
observer.unobserve(el);
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
}, { threshold: 0.3 });
|
|
441
|
+
|
|
442
|
+
counters.forEach(c => observer.observe(c));
|
|
443
|
+
</script>
|
|
444
|
+
</body>
|
|
445
|
+
</html>
|