Monorepo for the public Spore websites.
apps/www-spore-lang.dev, the primary public site and future product-facing pages, with route-based homepage locales and browser-language auto-detect on/.apps/docs-docs.spore-lang.dev, documentation, onboarding, and reference, with a manual language switcher.apps/blog-blog.spore-lang.dev, the official blog, using an AstroPaper-derived shell for Spore essays and draft series.
- Astro
- Starlight
- AstroPaper
- pnpm
prekfor unified local and CI quality checks
pnpm dev- start all local app dev servers in parallel.pnpm dev:www- startapps/www.pnpm dev:docs- startapps/docs.pnpm dev:blog- startapps/blog.pnpm types- regenerate ignored Worker binding/runtime types for all apps.pnpm check- regenerate Worker types and run Astro static checks across all apps.pnpm check:blog- run static checks forapps/blog.pnpm build- build all sites in the workspace.pnpm build:blog- buildapps/blog.pnpm run ci- run the local CI command set.pnpm pre-commit- run all configured hooks withprek.pnpm pre-commit:install- install local Git hooks.
The deployment baseline is now Cloudflare Workers + Static Assets, with one Worker per app:
| App | Worker config | Custom domain | Build output |
|---|---|---|---|
apps/www |
apps/www/wrangler.jsonc |
spore-lang.dev |
apps/www/dist |
apps/docs |
apps/docs/wrangler.jsonc |
docs.spore-lang.dev |
apps/docs/dist |
apps/blog |
apps/blog/wrangler.jsonc |
blog.spore-lang.dev |
apps/blog/dist |
Each Worker serves its Astro build output from a Static Assets binding named ASSETS, and each Worker is attached as the origin for its hostname via a custom domain route.
pnpm types- regenerate Worker binding/runtime types for all three apps.pnpm deploy:www- buildapps/wwwand deployspore-lang.dev.pnpm deploy:docs- buildapps/docsand deploydocs.spore-lang.dev.pnpm deploy:blog- buildapps/blogand deployblog.spore-lang.dev.pnpm deploy- deploy all three Workers in sequence.pnpm versions:www- upload a preview version forspore-lang.dev.pnpm versions:docs- upload a preview version fordocs.spore-lang.dev.pnpm versions:blog- upload a preview version forblog.spore-lang.dev.
pnpm checkandpnpm buildare the validation baseline.worker-configuration.d.tsfiles are generated locally and ignored by Git.- GitHub Actions now handles validation only; production deployment is expected to run through Cloudflare Workers Builds / Git integration.
- Manual local deployment still works through Wrangler (
pnpm deploy:*/pnpm versions:*) and uses your localwrangler loginsession or shell environment.
For a Vercel-style GitHub App deployment flow, connect this repository to Cloudflare from Workers & Pages and create one Git-connected Worker per app.
| Worker | Wrangler config | Root directory | Build command | Deploy command | Non-production branch deploy command |
|---|---|---|---|---|---|
spore-lang-www |
apps/www/wrangler.jsonc |
/ |
pnpm build:www |
pnpm exec wrangler deploy --config apps/www/wrangler.jsonc |
pnpm exec wrangler versions upload --config apps/www/wrangler.jsonc |
spore-lang-docs |
apps/docs/wrangler.jsonc |
/ |
pnpm build:docs |
pnpm exec wrangler deploy --config apps/docs/wrangler.jsonc |
pnpm exec wrangler versions upload --config apps/docs/wrangler.jsonc |
spore-lang-blog |
apps/blog/wrangler.jsonc |
/ |
pnpm build:blog |
pnpm exec wrangler deploy --config apps/blog/wrangler.jsonc |
pnpm exec wrangler versions upload --config apps/blog/wrangler.jsonc |
Recommended Cloudflare-side settings:
- Connect the same GitHub repository to all three Workers.
- Set the production branch to
main. - Enable non-production branch builds if you want preview URLs and PR feedback from Cloudflare.
- Add build watch paths per Worker so monorepo commits only rebuild the affected site:
www:apps/www/**,package.json,pnpm-lock.yamldocs:apps/docs/**,package.json,pnpm-lock.yamlblog:apps/blog/**,package.json,pnpm-lock.yaml
- Let Workers Builds manage its own build token unless you have a reason to pin a custom token in the Cloudflare dashboard.
Runtime webfonts are delivered from pinned jsDelivr package URLs so the sites can reuse pre-split CDN assets instead of shipping monolithic font files from this repository:
- UI:
Geist Variable+Source Han Sans SC VF - Code:
Maple Mono Normal NF CN+Iosevka
For Chinese text, the current setup prefers pre-split CDN packages (especially cn-fontsource-source-han-sans-sc-vf and maplemono-normal-nf-cn) to reduce first-load font cost.
apps/blog OG image generation no longer depends on host system fonts. It subsets vendored Source Han Sans SC OTF assets during build so CI and local builds render the same glyph set deterministically.
This repository follows the same baseline as sibling Spore repositories:
- GitHub Actions for static checks and site checks.
prekas the unified hook runner.- Vale, lychee, typos, TOML, YAML, and Markdown checks for docs quality.
This bootstrap now establishes a three-app workspace for the root site, docs site, and blog site while keeping one shared quality baseline. The homepage and docs site already have independent English/Simplified Chinese behavior, and the blog app now hosts the imported vision, roadmap, and implementation Spore draft series under apps/blog/src/data/blog/spore/. Those blog drafts remain marked draft: true, so they stay private in production while remaining available for iterative writing in local development.