open-design/apps/landing-page/AGENTS.md
Zakaria a46764fb1b
Some checks failed
ci / Validate workspace (push) Has been cancelled
landing-page-ci / Validate landing page (push) Has been cancelled
landing-page-deploy / Deploy landing page (push) Has been cancelled
github-metrics / Generate repository metrics SVG (push) Has been cancelled
first-commit
2026-05-04 14:58:14 -04:00

75 lines
3.2 KiB
Markdown

# apps/landing-page/AGENTS.md
Follow the root `AGENTS.md` and `apps/AGENTS.md` first. This file only
records module-level boundaries for `apps/landing-page/`.
## Purpose
`apps/landing-page` is a stand-alone static Astro site that renders
the canonical Open Design marketing page in the **Atelier Zero** style.
It is the deployable counterpart to:
- Skill: `skills/open-design-landing/` — agent workflow + the source-of-truth
`example.html` known-good rendering.
- Design system: `design-systems/atelier-zero/DESIGN.md` — token spec.
- Image assets: `skills/open-design-landing/assets/*.png` are uploaded to
Cloudflare R2 (`open-design-static`) and served through
`static.open-design.ai` with Image Resizing (`format=auto`). Do not
commit local mirrored PNGs into `apps/landing-page/public/assets/`.
## What it is
- Astro static output. The route lives at `app/pages/index.astro` and
uses React only at build time (`renderToStaticMarkup`) for the existing
`app/page.tsx` component. The generated page is CDN-ready HTML/CSS plus
a small inline enhancement script; no React runtime ships to browsers.
- `astro.config.ts` always uses `output: 'static'` and emits to `out/`
so it can be served by any CDN (Vercel, Cloudflare Pages, the daemon's
static fallback) without a Node runtime.
- All styles live in `app/globals.css`. Class names match the Atelier
Zero CSS in the canonical example so visual parity is one-to-one.
- All page imagery is referenced through `app/image-assets.ts`, which builds
Cloudflare Image Resizing URLs for the R2 originals.
## What it is NOT
- Not part of `apps/web`. The web app is the product surface; the
landing page is a marketing surface. They share design tokens but
not state, routes, or runtime.
- Not connected to `apps/daemon`. There is no `/api`, no `/artifacts`,
no `/frames` — no proxy to set up.
- Not multi-page. There is exactly one route (`/`) that renders the
full landing page. If you need a second page, add it as a sibling
Astro page route.
## Boundary constraints
- Must remain a static Astro output.
- Must not import from `@open-design/web`, `@open-design/daemon`,
`@open-design/desktop`, `@open-design/sidecar*`, or
`@open-design/contracts`. Those are product runtime concerns.
- Must not introduce a `src/` shell — keep all source under
`app/`. If a component grows beyond ~80 lines, extract it to
`app/_components/<name>.tsx`.
- Must not depend on any non-Google web font.
- When the canonical `skills/open-design-landing/example.html` changes,
the corresponding section JSX in `app/page.tsx` and rules in
`app/globals.css` must be updated to match. The two files are kept
in lockstep.
## Common commands
```bash
pnpm --filter @open-design/landing-page dev # http://127.0.0.1:17574
pnpm --filter @open-design/landing-page build # static export → out/
pnpm --filter @open-design/landing-page typecheck
```
## When to update this app
- New section added to the canonical landing page → port it here.
- Asset regeneration in the skill → re-mirror PNGs into
`public/assets/`.
- Brand re-keying for a non-Open-Design tenant → fork the app, update
copy, swap PNGs. Do not parameterize this app for multi-tenancy.