Back to templates
Template · Developer Tools · Hairline-Minimal

Forge.

A near-monochrome developer-tool homepage in the Geist tradition: hairline borders, no shadows, a two-column hero with a wireframe-style status graphic, a full app screenshot mockup, a six-step merge timeline, an annotated diff with auto-review comments, a stats strip, an integrations grid, a diagonal-shaded testimonial, and a flat per-seat pricing matrix. One slate accent, otherwise black on warm white.

View code
01 · Preview

The live page.

v4.2 — shipped today

The dev tool your team won’t fight on Friday.

Forge is a code review and CI runner that catches what humans miss — without the seven-tab tab-soup. Open a PR. Get a verdict in 90 seconds.

$ npx forge init
ABCDTrusted by 4,200+ engineering teams
forge / pipelinePR-1842
build · passed42s
forge/auth-rotate · ready to merge#1842
review · 2 comments resolvedjane
deploy · staging12s
forge-monorepo / pulls
ABC3 reviewers online
PR-1842auth: rotate session keys without bouncing usersfeat/auth-rotate
PR-1841billing: handle stripe 3DS step-up on retryfix/billing-3ds
PR-1839platform: cache RLS policy lookups per tenantperf/rls-cache
PR-1837ui: kbd shortcut to jump between failing checksfeat/kbd-jumper
PR-1834infra: pin worker runtime to 2024.11.13chore/runtime-pin
PR-1830docs: rewrite the cli quickstart with real outputdocs/cli-quickstart
Trusted by teams atNorthwindHelioMercerTesseraQuill&Co

Built for the merge queue

Less waiting.
More shipping.

Smart test selection

Run only the tests that touch the diff. Average pipeline drops from 14 minutes to 90 seconds — without sacrificing safety nets.

Branch-aware reviews

Stack PRs without losing the plot. Forge re-bases, re-checks, and re-routes reviewers as the dependency graph changes.

Velocity, measured

Cycle time, review latency, flake rate. Numbers your tech leads will actually open on a Monday — not vanity dashboards.

Anatomy of a merge

From git push to production,
six steps.

01 · Open

Forge sees the push

We pick up the branch the moment it lands. No webhook circus.

branch · feat/auth-rotate1 author
02 · Plan

Affected tests are chosen

We compute the dependency closure of the diff and queue exactly what matters.

482 unit12 integration
03 · Run

Pipelines fan out in parallel

Cached layers, warm runners, no cold-start tax. Median: 87 seconds.

6 jobs · parallelcached
04 · Review

Auto-review + humans

Style, dead code, and risky diffs flagged before a human opens the file.

2 suggestions1 reviewer
05 · Preview

A live URL per PR

Ephemeral envs with seeded data. Designers and PMs click, not git pull.

preview · readyTTL 24h
06 · Merge

Queue, rebase, ship

Linear history, zero conflicts at the tip, deploy on green.

queued · 2deploy · ok

Reviews that read the code

Actually helpful comments,
not noisy bots.

src/auth/session.ts+8 −3
12 export async function rotateSession(userId: string) {
13- const token = await db.tokens.find(userId);
14- await db.tokens.delete(userId);
15- return mintToken(userId);
13++ return db.transaction(async (tx) => {
14++ const old = await tx.tokens.find(userId);
15++ const next = await mintToken(userId, { tx });
16++ await tx.tokens.replace(old.id, next.id);
17++ await audit('session.rotated', { userId });
18++ return next;
19++ });
20 }

Review · 2 suggestions

forge · auto

Wrap the new transaction in an idempotency key so retries don’t mint two sessions for the same user. Suggested change inline.

jane · staff eng

Love it. Can we also emit session.old_revoked so dashboards split rotates from logouts?

forge · risk

This file is hot — 14 incidents in the last 90 days. Routed an extra reviewer (nikhil).

90s
Median pipeline
−62%
Time to first review
11.4M
PRs shipped on Forge
99.99%
Pipeline uptime · 12mo

Plugs into the stack you have

No re-platforming.
No data migration.

GitHub

Branch protection, status checks, queued merges. Works on day one.

GitLab

Self-hosted or SaaS. SAML, audit logs, full mirror support.

Slack & Teams

Routed pings — only the ones you care about. No DM spam.

Forge CLI

Run pipelines locally with the same runners. Zero drift.

Vercel & Fly

Preview env per PR. TTL'd, reset, and labeled automatically.

Linear & Jira

Two-way sync without the ticket-shuffle dance.

Sentry & Datadog

Risky-diff detection from production telemetry, per file.

OIDC SSO

Okta, Entra, Google. SCIM provisioning out of the box.

“We replaced our CI provider, our review bot, and our merge queue with Forge in one Friday. Cycle time fell from 11 hours to 38 minutes.”
ABC
Priya Shah·VP Engineering, Levels

Pricing

Per-seat. No asterisk.

Hobby
$0/seat · mo

For solo devs and OSS maintainers.

  • Unlimited public repos
  • 2,000 pipeline minutes
  • Auto-review on PR
  • Community support
Team · Most chosen
$24/seat · mo

For 5–250 engineers shipping daily.

  • Unlimited private repos
  • Smart test selection + caches
  • Stacked PRs + merge queue
  • Preview envs per PR
  • SSO, audit log, role policies
Enterprise
Custom

For regulated, public, or 250+ teams.

  • Self-hosted runners
  • SCIM, custom IdP, VPC peering
  • Dedicated solutions engineer
  • 99.99% SLA, signed BAA

Your team will merge cleaner
by Monday.

Free for 14 days. No credit card. npx forge init and you’re moving.

02 · Source

The code.

tsx
1import {
2 ArrowRight, Check, GitBranch, GitCommit, GitMerge, GitPullRequest,
3 Github, Slack, Terminal, Zap,
4} from "lucide-react";
5import "./forge.css"; // see styles tab
6
7export default function ForgePage() {
8 return (
9 <div className="forge">
10 {/* NAV */}
11 <nav className="nav">
12 <div className="wrap nav-inner">
13 <a className="brand" href="#"><span className="brand-mark" /> Forge</a>
14 <div className="nav-links">
15 <a href="#">Product</a><a href="#">Pipelines</a>
16 <a href="#">Reviews</a><a href="#">Docs</a><a href="#">Pricing</a>
17 </div>
18 <div className="nav-cta">
19 <button className="btn btn-ghost">Log in</button>
20 <button className="btn btn-outline">Sign up</button>
21 </div>
22 </div>
23 </nav>
24
25 {/* HERO */}
26 <section className="hero">
27 <div className="wrap hero-grid">
28 <div className="hero-left">
29 <h1 className="h1">The dev tool your team won't fight on Friday.</h1>
30 <p className="lede">
31 Forge is a code review and CI runner that catches what humans miss —
32 without the seven-tab tab-soup. Open a PR. Get a verdict in 90 seconds.
33 </p>
34 <div className="hero-cta">
35 <button className="btn btn-solid">Start free <ArrowRight size={16} /></button>
36 <a className="btn btn-ghost mono" href="#">$ npx forge init</a>
37 </div>
38 </div>
39 <div className="hero-right">
40 <div className="hero-graphic">{/* … positioned cards + lines … */}</div>
41 </div>
42 </div>
43 </section>
44
45 {/* APP MOCK, FEATURES, TIMELINE, CODE/REVIEW, STATS,
46 INTEGRATIONS, QUOTE, PRICING, CTA, FOOTER — see styles tab
47 for the full scoped CSS used by every block. */}
48
49 {/* … full body omitted here for brevity; copy the live component file
50 for the complete markup. Each section is plain semantic JSX wired
51 to the .forge scoped classes. */}
52 </div>
53 );
54}
55
03 · Design brief

How to rebuild it.

More than the code: the design tokens, primitives, layout rhythm and step-by-step playbook so you can apply this system to your own product — not just paste the file.

Forge — Design Brief

A near-monochrome dark dev-tool homepage in the editorial-engineering tradition. The design reads like a calm engineering doc that happens to ship a product: hairline borders, a quiet dot-grid, one warm slate accent, and a serif headline that lets technical UI breathe around it.


1. Design principles

  1. One container, one rhythm. Every section uses the same \.wrap\ (max-width 1200px,

24px gutters, 18px on small screens). Nothing escapes the rail — features, timeline, code card, pricing, footer all snap to the same column.

  1. Texture, not decoration. No full-bleed gridlines, no panels of color.

A subtle radial-masked dot grid appears only behind hero, quote and CTA sections — it dies out toward the edges so it never reads as a wallpaper.

  1. Hairlines stay inside cards. Dividers live on the border of a card,

never as floating page-wide lines that fight the typography.

  1. Editorial serif × engineering mono. Fraunces (italic optical-sized)

carries every display headline. Geist Mono carries every label, status, commit, branch, file path. Geist (sans) carries everything else.

  1. One accent. A single cool off-white \#c8d4e3\ is the only "color".

Status chips (\ok / warn / bad / info\) are restrained mineral tones, not neon. They appear in pips and chips — never as fills.


2. Color tokens

\\\css --bg: #0b0d10; /* page */ --bg-2: #0f1216; /* recessed surfaces (rows, code panes) */ --surface: #14181d; /* raised surfaces (cards, plans) */ --surface-2: #1a1f25; /* hover / selected rows */ --fg: #f4f5f7; /* primary text */ --fg-soft: rgba(244,245,247,0.66); --fg-muted: rgba(244,245,247,0.42); --hairline: rgba(244,245,247,0.08); /* every card border */ --hairline-2:rgba(244,245,247,0.16); /* button outlines, emphasis */ --accent: #c8d4e3; /* italic serif emphasis, focused chips */ --accent-2: #7c8a9d; /* secondary glyphs */ --ok:#6bd29a; --warn:#e8b66a; --bad:#e98091; --info:#8fb6e8; \\\

Rule: never introduce a sixth color. If you need to differentiate, change surface depth (\bg → bg-2 → surface → surface-2\) before reaching for hue.


3. Type system

RoleFamilyWeight / size
Display (h1/h2)Fraunces400, italic for emphasis, \clamp\ fluid sizing
BodyGeist400 / 500, 14–16px
Labels, status, file paths, codeGeist Mono400 / 500, 11–13px, +0.16em letter-spacing on uppercase

Every italic word in a headline is wrapped in \<em>\ and tinted \var(--accent)\. That is the only place the accent color appears as text.


4. Reusable primitives

The page is built from four primitives. Reproduce them once and reuse everywhere.

4.1 \.wrap\ (Page rail)

\\\css .wrap { max-width: 1200px; margin: 0 auto; padding: 0 24px; width: 100%; } @media (max-width: 640px) { .wrap { padding: 0 18px; } } \\\

4.2 Dot Grid texture

A radial-masked dot pattern. Drop it as an absolutely-positioned child inside any section that needs depth.

\\\css .dotgrid { position: absolute; inset: 0; pointer-events: none; background-image: radial-gradient(circle, rgba(244,245,247,0.08) 1px, transparent 1px); background-size: 22px 22px; mask-image: radial-gradient(ellipse 80% 70% at 50% 40%, black 40%, transparent 100%); } \\\

4.3 Avatar Group

Overlapping 26px circles with a 2px page-color border. The fifth slot is a muted "+N" pill.

4.4 Segmented Control

A 3px-padded pill with an active "tab" sitting on top of a darker recess. Used for toolbar tabs, filter switches, and pricing cadence.

\\\css .segctl { background: var(--surface); border: 1px solid var(--hairline-2); border-radius: 8px; padding: 3px; } .segctl .seg { height: 28px; padding: 0 14px; border-radius: 6px; color: var(--fg-soft); } .segctl .seg.on { background: var(--bg); color: var(--fg); } \\\


5. Section anatomy (top to bottom)

  1. Sticky nav — blurred dark surface, brand mark = two offset hairline squares.
  2. Hero — 1.1fr / 1fr two-column grid. Left: serif H1 + lede + CTA + avatar

social-proof. Right: a "pipeline status" card with four mono rows. Dot grid behind everything.

  1. App mock — a full-width panel with a window-chrome toolbar (traffic

lights, breadcrumb, segmented control) and a sidebar + PR list.

  1. Logo strip — quiet hairlined band, label + 5 mono logo marks.
  2. Feature grid — 3-column bento. Each cell: a 140px schematic graphic

(bars, branch, chart) above a serif-quiet h3 + body.

  1. Workflow timeline — 6 rows, 3 columns: \step / title / chips\.

On mobile collapses into a single column with hairline dividers.

  1. Code + review card — left pane is a syntax-tinted diff (add/del rows

with subtle color washes), right pane is "auto + human" review comments.

  1. Stat strip — 4 large serif numerals, mono labels.
  2. Integrations — 4×2 grid of small icon cards.
  3. Pull-quote — centered serif blockquote, dot grid behind, avatar group

+ name + role beneath.

  1. Pricing — 3 plans, middle one "feat" with a slightly raised gradient.
  2. CTA + footer — large serif callout over dot grid; minimal footer.

6. Responsive strategy

The page has four breakpoints and degrades gracefully — no horizontal scrollbars, no clipped text, no dead grey rectangles.

BreakpointWhat changes
≤1100pxApp-mock sidebar narrows to 200px.
≤900pxNav links + ghost button hide. Hero collapses to one column. Features → 1 col. Timeline rows stack. Code card stacks. Pricing → 1 col. Stats → 2 cols.
≤720pxApp-mock sidebar disappears (PR list takes full width). Toolbar wraps so the segmented control drops to its own line. Each PR row becomes a 3-area stacked card (\ico / title checks / id avatar\).
≤640pxTightens every internal padding, reduces feature graphic height, drops code font to 11px, and converts every section-head to a vertical stack. Footer stacks.
≤380pxHard cap on H1 (\1.85rem\) and feature graphic (\100px\) so even the smallest phones never overflow.

Guidelines when extending:

  • Always set \min-width: 0\ on flex children that hold long mono strings.
  • Use \text-wrap: balance\ on display H1/H2 so they never break a single

word vertically (this was the original mobile bug).

  • Use fluid \clamp(min, vw, max)\ for headlines, but pick a min that holds at

320px — \clamp(2rem, 6.4vw, 3.6rem)\ for H1, \clamp(1.9rem, 3.2vw, 2.7rem)\ for H2.


7. How to rebuild this from scratch

If you want to apply the Forge system to your own product page, follow these seven steps in order:

  1. Drop in the design tokens. Paste the \--bg / --fg / --hairline / --accent\

token block into the root scope (or a scoped \.yourname\ wrapper). Do not theme individual components — let everything inherit.

  1. Add the three font families (Fraunces, Geist, Geist Mono) once at the

top of your stylesheet via Google Fonts. Set \font-optical-sizing: auto\ on the serif so it scales gracefully.

  1. **Build \.wrap\ first.** Get the 1200/24/18 container right before you

write a single section. Every other layout problem traces back to an inconsistent rail.

  1. Build the four primitives (\btn\, \segctl\, \avatar-group\, \dotgrid\)

in isolation. They are the entire visual vocabulary — once they look correct, the rest of the page is just composition.

  1. Compose top-down, hero first. Lock the H1 typography (italic emphasis,

serif), get the eyebrow + lede + CTA rhythm right, then add the right-side status card. Don't tune sections in isolation.

  1. Stay greyscale until the very end. Add the \--ok / --warn / --bad / --info\

tints last, only as 6px pips and chip dots. If a status feels weak, thicken the border, do not saturate the color.

  1. Test mobile at 375px and 320px before you ship. Open DevTools, enable

the iPhone SE viewport, and walk every section. The rules above (text-wrap balance, min-width: 0, sidebar hide at 720px) are non-negotiable.


8. Common pitfalls

  • ❌ Adding a second accent ("just a little blue for links"). Use \--info\ or

\--accent\ only — never introduce a true brand color.

  • ❌ Putting full-bleed horizontal lines between sections. The vertical rhythm

comes from \.section\ padding, not dividers.

  • ❌ Letting mono labels grow past 13px. Once mono is body-sized it stops

reading as metadata and starts competing with content.

  • ❌ Wrapping serif headings in \<strong>\ for emphasis. Always use

\<em>\ + the accent color — that's the only emphasis primitive.

  • ❌ Using shadows. There are none. Depth comes from surface tokens

(\bg → bg-2 → surface → surface-2\).

04 · Keep browsing

Try another template.