Astro + Vercel marketing site for teamstep.io.
pnpm install
pnpm devOpen the URL Astro prints (usually http://localhost:4321).
See docs/design-system-workflow.md.
- Published (default / CI / prod):
pnpm ds:use-published— needs a GitHub Packages token (.npmrc.example) - Local co-dev (sibling
brand-assetsclone):pnpm ds:use-local→pnpm dev:all
- Copy an existing file under
src/content/games/(e.g.meltdown.yaml). - Fill in
title,slug, copy,phase,platforms, andmedia. - Put art under
public/games/<slug>/and pointmedia.poster(and optionalloop/trailer) at those paths. - Set
featured: trueon at most one game for the landing hero / featured stage. UsesortOrderfor Quest Log order.
The game also gets a static page at /games/<slug>/ from src/pages/games/[slug].astro — no extra routing step.
Schema lives in src/content.config.ts.
- Landing composition:
src/pages/index.astro(sections + site knobs fromsrc/site.config.ts). - New static route: add
src/pages/<name>.astro(or a folder withindex.astro). - Dynamic routes: add
src/pages/.../[param].astrowithgetStaticPaths, same pattern as games. - Shared chrome (layout, meta):
src/layouts/BaseLayout.astro.
Tabs are driven by a registry — you do not touch the design system package.
- List source (API-backed, e.g. Bluesky / YouTube / Substack):
- Add a fetcher in
src/lib/feed/that returnsBBSItem[]. - Register it in
src/lib/feed/fetchers.ts. - Add a
kind: "list"entry toFEED_SOURCESinsrc/lib/feed/sources.ts(labels, icon, optional list layout).
- Add a fetcher in
- Iframe source (e.g. Discord widget):
- Add a
kind: "iframe"entry withbuildSrc()(andtitle) inFEED_SOURCES.
- Add a
- Put handles / channel IDs / server IDs in
src/site.config.tswhen the fetcher or embed needs them.
The client island is src/components/SignalBoard.tsx; the proxy is GET /api/feed?source=<id>.
Substack already has a fetcher — enable it by adding a tab entry in FEED_SOURCES.
- Astro 7 (static pages +
/api/feedon Vercel) @teamstep/design-system(React components / tokens)- Content: YAML collections under
src/content/