t3-code-android-nightly/.repos/alchemy-effect/website/design-system/README.md
Julius Marminge 108e01746c
Upgrade Effect and Alchemy betas (#4643)
Prepare Relay production infrastructure for the PlanetScale PS_20 HA topology, upgrade Effect and Alchemy to compatible betas, reconcile migration state, and preserve patched MCP session termination behavior.\n\nCo-authored-by: codex <codex@users.noreply.github.com>
2026-07-27 16:21:02 +02:00

316 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Alchemy Design System
> **Infrastructure-as-Effects** — a TypeScript framework that unifies cloud
> infrastructure and application logic into a single type-safe program
> powered by [Effect](https://effect.website).
Alchemy is a developer-tool brand: terminal-first, code-dense, dark-mode only,
with one signature color — mint green `#00e599`. Marketing moments lean on
**hand-drawn sketch diagrams** (arrows, circles, scribbled labels) to explain
abstract type-system concepts. Everything else is flat, quiet, and close to
black.
This design system captures the visuals, tone, and components needed to ship
new marketing pages, docs, social posts, and slide decks that feel like
Alchemy — without re-inventing tokens each time.
---
## Sources
- **Repo:** `github.com/alchemy-run/alchemy` — website (Astro +
Starlight), README, docs content, raw sketch PNGs under `images/`.
- **Live docs:** https://alchemy.run
- **Docs styling:** `website/src/styles/custom.css` — the ground truth for
color tokens, spacing, dark-only theme.
- **Hero diagrams:** `images/alchemy-effect-*.png` — hand-drawn
Function → Binding → Resource triple, layers, terminal screenshots.
- **Sibling repos** (same brand):
`alchemy-run/distilled` (Effect-native cloud SDKs).
---
## Index
| File / folder | What's in it |
| --------------------- | ------------------------------------------------------------------------------- |
| `README.md` | This doc — brand context, content & visual foundations, iconography |
| `SKILL.md` | Agent Skill manifest (usable standalone in Claude Code) |
| `colors_and_type.css` | All design tokens: colors, type, spacing, radii, shadows, motion |
| `fonts/` | Local webfont fallbacks (Inter, JetBrains Mono, Caveat via Google Fonts import) |
| `assets/` | Logos, hand-drawn diagrams, product screenshots |
| `preview/` | HTML specimen cards — one per token group / component cluster |
| `ui_kits/website/` | Marketing + docs UI kit (hero, feature grid, terminal, provider cards) |
| `ui_kits/docs/` | Docs reader UI kit (sidebar nav, article, code blocks, callouts) |
### Products covered
1. **alchemy.run marketing site** — landing, what-is, getting-started. Astro + Starlight.
2. **alchemy.run docs** — sidebar nav, MDX articles, expressive-code blocks, terminal widget.
No app UI exists — Alchemy is a CLI + library. The CLI's terminal output
(`$ alchemy deploy`, colored plan/apply reports) is itself a visual surface
and is recreated as a component.
---
## Content Fundamentals
Alchemy's voice is **technical, calm, and quietly opinionated**. It talks to
senior TypeScript engineers. It never hypes, never uses exclamation marks for
emphasis, and never uses emoji outside the occasional Discord context.
**Tone rules**
- **Lowercase brand name** always: _alchemy_ — not "Alchemy" in body copy
(headings can capitalize for sentence case; the wordmark itself is always
lowercase).
- **Short declarative sentences.** Max ~18 words. Break into paragraphs
instead of running on.
- **"You" for the reader, "we" for the team.** "Come hang in our Discord."
"You'll install Alchemy and Effect."
- **Technical terms are the nouns.** Capitalize product concepts when used
as proper nouns: _Stack_, _Resource_, _Provider_, _Binding_, _Layer_,
_Output Attribute_. Leave verbs lowercase: _deploy_, _bind_, _yield_.
- **Code is a first-class citizen.** Almost every paragraph either
introduces a code block or refers to `monospace identifiers`. Don't
paraphrase what the code shows — show it.
- **No hype adjectives.** Never say "amazing", "powerful", "revolutionary",
"magical". Say what it does.
- **Specific numbers > vague claims.** "in under two minutes", "Node.js 22+",
"under 30 minutes" — concrete, verifiable.
- **Em-dashes (—) for rhetorical pivots**; used frequently. Same character,
no spaces around it sometimes, with spaces sometimes — match the docs.
- **Tagline form:** "**X.** Y." — two sentences, first is the category, second
is the value. _"Infrastructure-as-Effects. Your infrastructure and
application logic in a single, type-safe program."_
**Casing**
- Product name in prose: **alchemy** (lowercase)
- Headings: **Sentence case** — "Getting started", "What is alchemy?",
"Plan, deploy, destroy"
- `alchemy deploy`, `alchemy dev`, `alchemy destroy` — CLI verbs lowercase
- TypeScript identifiers verbatim (`Cloudflare.R2.Bucket`, `Effect.gen`)
**Don't**
- ❌ Emoji in marketing / docs body copy
- ❌ Rhetorical questions as headings ("Why Alchemy?")
- ❌ Marketing filler ("we're excited to announce…")
- ❌ Capitalizing "Alchemy" mid-sentence
- ❌ Introducing a concept without a code example nearby
**Representative copy**
> _"Infrastructure as **Effects**. Your infrastructure and application logic in
> a single, type-safe program."_
>
> _"If it compiles, it deploys."_
>
> _"Resources are just Effects. Resources are declared as Effects and
> composed with `yield_`. Import them from any file, bind them to Workers,
> pass their outputs to other resources — it's all just TypeScript."\*
>
> _"Preview what will change with `plan`, apply it with `deploy`, and tear
> it down with `destroy`. Stages isolate environments so `dev` and `prod`
> never collide."_
>
> _"alchemy is in alpha and not ready for production use (expect breaking
> changes). Come hang in our Discord to participate in the early stages of
> development."_
---
## Visual Foundations
### Mode
**Dark mode only.** The `color-scheme: dark` declaration is hard-coded and
the theme toggle is hidden. Every surface is on a near-black canvas. Do
not produce light-mode variants unless explicitly asked — they don't exist.
### Color
- **One accent:** `#00e599` — a bright, slightly-yellow mint green. Used for
emphasis, success states, CTAs, link hovers, the wordmark dot, and the
single gradient stop in "Infrastructure as **Effects**" hero text.
- **Canvas:** `#0a0a0a` (page) → `#111111` (nav/sidebar) → `#18181b` (elevated
cards) → `#1f1f23` (hover). Steps are ~1–2 lightness units apart — very
subtle.
- **Neutrals:** Tailwind Zinc scale (50 → 950). Body text at zinc-200/300,
muted at zinc-400, captions at zinc-500.
- **Hairlines:** `rgba(255,255,255,0.06)` for default borders, `0.10` for
hover/emphasis. No solid-gray borders.
- **Semantic colors in terminal output:**
- Success / create: `#00e599` (same mint)
- Update: `#f5a524` (amber)
- Replace / destroy: `#f04b4b` (red)
- Info / tag: `#7cc5ff` (cyan)
- Dim: `#71717a`
**No purple. No blue gradients. No "SaaS violet".** The only gradient in the
entire brand is `linear-gradient(90deg, #fff, #00e599)` applied as
`background-clip: text` on the word "Effects" in the hero.
### Type
- **Inter** (400/500/600/700/800) — UI, headings, body
- **JetBrains Mono** (400/500/600) — all code, terminal output, eyebrows
- **Caveat** (600) — hand-drawn diagram labels (see Iconography)
- Letter-spacing: `-0.04em` on display, `-0.02em` on headings, `0` on body.
- Headings are **sentence case**, weight 700, tightly tracked. No all-caps
except monospace eyebrows (`EYEBROW TEXT`, 12px, `letter-spacing: 0.1em`).
### Spacing
- 4px grid: 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96.
- Section rhythm on marketing pages: `margin-bottom: 5rem` (80px) between
hero / features / providers / CTA.
- Max content width on landing: `72rem` (1152px).
### Backgrounds
- **Flat solid black-ish surfaces** — no patterns, no noise, no gradients.
- **Hand-drawn sketch illustrations** are the signature decorative element —
they appear as standalone hero artwork, not backgrounds. See Iconography.
- Occasional full-bleed terminal screenshots demonstrating CLI output.
### Borders & cards
- Border radius: **8px** standard (provider cards, buttons, code blocks),
**4–6px** for small chips/tags, **12px** for large hero panels.
- Cards: `background: #18181b; border: 1px solid rgba(255,255,255,0.06);
border-radius: 8px; padding: 1.5rem;`
- **Never** a colored left-border accent. Never an "alert callout" stripe.
- Hover on a card: border becomes `var(--alc-accent)`. That's it — no
transform, no shadow change, no scale.
### Shadows
- Near-zero by default. Dark surfaces don't need elevation shadows.
- When used: `0 4px 14px rgba(0,0,0,0.5)` for floating elements.
- **Accent glow** is allowed sparingly on focused/active CTA buttons:
`0 0 0 1px rgba(0,229,153,.4), 0 0 24px -4px rgba(0,229,153,.4)`.
### Transparency & blur
- Transparency is used for **hairlines** (`rgba(255,255,255,.06–.16)`) and
**accent washes** (`color-mix(in srgb, #00e599 12%, transparent)`).
- No frosted-glass / backdrop-blur surfaces. Alchemy's surfaces are crisp
and opaque.
### Motion
- **Restrained.** Marketing page has essentially no animation. Hover
transitions are `120–180ms ease` on color/border only.
- Easing: `cubic-bezier(0.2, 0, 0, 1)` — standard Material out-curve.
- No bounces, no parallax, no auto-playing hero videos.
- Prefer instant state changes for developers — they move fast and dislike
jank.
### Hover states
- **Links:** color → `var(--alc-accent)`.
- **Cards with a link:** border-color → `var(--alc-accent)`. No translate.
- **Primary buttons:** background slightly brighter, no transform.
- **Secondary buttons / icon buttons:** background → `rgba(255,255,255,.04)`.
### Press / active states
- Buttons darken a touch (`filter: brightness(0.95)`) — no scale-down, no
inset shadow. The goal is "it registered" without bouncing.
### Focus states
- **2px mint outline, 2px offset.** Never remove focus rings.
`outline: 2px solid #00e599; outline-offset: 2px;`
### Layout rules
- Fixed top nav (64px tall, `#111` bg, hairline bottom border).
- Docs: 260px left sidebar (`#111`), article body max-width 768–820px,
optional right-side "On this page" column.
- Marketing: centered, 72rem max-width, generous 5rem between sections.
### Imagery vibe
- **Hand-drawn, warm, slightly-silly sketches** on otherwise austere dark
surfaces. Black ink on white paper, dropped into the dark theme as-is
(white backgrounds show through — it's a deliberate contrast).
- Product screenshots (VS Code, terminal) appear in their native
github-dark-dimmed theme. Preserve as PNGs.
- No stock photography. No AI-generated imagery. No people.
### Code blocks
- **Theme:** `github-dark-dimmed` (Expressive Code). Keyword `#f47067`, string
`#96d0ff`, function `#dcbdfb`, type `#6cb6ff`, comment `#768390`.
- **Filename header:** small mono label at top-left, dim.
- **Diff additions:** green `+` prefix with row tint; deletions: red `-`
prefix with row tint. TwoSlash-powered.
---
## Iconography
**Alchemy does not use an icon font or lucide/heroicons in its marketing
or docs.** The visual vocabulary splits into three categories:
### 1. Hand-drawn sketch illustrations (signature)
Black-ink marker sketches on white, scanned and dropped into the dark
theme. Used for explaining concepts on the README and marketing site. They
replace what would normally be iconographic diagrams.
Available in `assets/`:
- `diagram-triple.png` — **Function → Binding → Resource** (the core triple)
- `diagram-triad.png` — triad diagram
- `diagram-layers.png` — Effect Layer hierarchy sketch
- `screenshot-plan-type.png` — VS Code type-hover screenshot
- `screenshot-output.png` — VS Code stack output screenshot
- `screenshot-policy-error.png` — VS Code IAM policy type error
**Typography in sketches:** labels look like Caveat / marker handwriting.
When recreating digitally, use **Caveat 600** as the nearest Google Fonts
match. Flag to the user that true sketches should be produced by hand or
with an illustrator.
### 2. Code as decoration
The biggest "icons" on the marketing site are **code blocks themselves**.
Every feature card has a syntax-highlighted TypeScript snippet paired with
a short paragraph. Treat code blocks as the primary visual unit — size
them, pad them, give them room.
### 3. CLI glyphs (terminal component)
Inside the custom `<Terminal />` component, plain unicode / ASCII glyphs
signal status:
- `✓` success (mint)
- `+` create (mint)
- `~` update (amber)
- `-` / `×` destroy (red)
- `◉` / `○` radio selection
- `•` bullet / separator (dim)
- `[u]…[/u]` underline markup, `[b]…[/b]` bold, `[d]…[/d]` dim, `[g]…[/g]`
green/success, `[c]…[/c]` cyan
### 4. Small UI icons (Starlight built-ins)
The docs layout uses Starlight's stock icons — `right-arrow`, `open-book`,
`github`, `bun`, `npm`, `pnpm`, `seti:yarn` — for link buttons and tabs.
When recreating, **use Lucide** (CDN) as the closest stroke-weight match,
or the original Starlight icons if available. Flag this substitution.
### 5. Logo mark
`assets/logo-mark.svg` — a mint dot on a rounded black square. This is a
**placeholder** synthesized from the wordmark style on the live site; the
repo does not contain an official logo file. **Ask the user for a real
logo asset.**
Emoji usage: **none** in marketing/docs. Fine in community spaces
(Discord) but out of scope for the design system.