The official website for Gas Town - an orchestration layer for AI coding agents.
Live site: https://gastownhall.ai
npm install # Installs all dependencies (monorepo with npm workspaces)
npm run dev # Main site at localhost:4321
npm run dev:docs # Docs site at localhost:4322To preview production builds locally before deploying:
npm run build && npm run preview # Main site
npm run build:docs && npm run preview:docs # Docs site| Command | Description |
|---|---|
npm run dev |
Start main site dev server (port 4321) |
npm run dev:docs |
Start docs dev server (port 4322) |
npm run build |
Build main site |
npm run build:docs |
Build docs subdomain (from committed content, no gt needed) |
npm run build:all |
Build both main site and docs |
npm run preview |
Preview main site production build (run build first) |
npm run preview:docs |
Preview docs production build (run build:docs first) |
npm run copy-assets |
Copy static assets to tmp/public/ |
npm run sync-docs |
Sync docs from gastown repo (requires gt CLI) |
npm run llms |
Regenerate llms.txt for main site |
npm test |
Run unit tests |
npm run test:e2e |
Run E2E tests with Playwright |
npm run test:all |
Run all tests (unit + E2E) |
npm run lint |
Run ESLint |
npm run format |
Format code with Prettier |
npm run audit:check |
Check for high/critical vulnerabilities |
npm run check |
Run all quality checks (lint, format, test, audit) |
npm run deploy |
Build + deploy main site to Cloudflare |
npm run deploy:docs |
Build + deploy docs subdomain to Cloudflare |
Build pipelines:
- Main site: copy-assets → llms → astro build →
deploy/ - Docs subdomain: llms → astro build →
deploy-docs/(content is COMMITTED, no gt needed)
Both sites auto-deploy to Cloudflare Pages on push to main.
| Site | URL | Cloudflare Project | Output Dir |
|---|---|---|---|
| Main | https://gastownhall.ai | gastownhall-website |
deploy/ |
| Docs | https://docs.gastownhall.ai | gastown-docs |
deploy-docs/ |
Manual deploys:
npm run deploy- Deploy main sitenpm run deploy:docs- Deploy docs subdomain
Redirects: gastownhall.com → gastownhall.ai
This is an npm workspaces monorepo with two Astro projects:
├── package.json # Root package with workspaces: ["docs"]
├── src/ # Main site source
│ ├── site.config.ts # Site configuration (URLs, social links)
│ ├── pages/ # Astro pages (file-based routing)
│ ├── layouts/ # Page layouts (BaseLayout, BlogLayout)
│ └── components/ # Reusable components
├── docs/ # Docs subdomain (Astro Starlight workspace)
│ ├── package.json # Workspace package (docs-specific deps)
│ ├── astro.config.mjs # Starlight config with sidebar
│ ├── src/content/docs/ # Markdown content (committed)
│ └── scripts/ # Docs build scripts
├── scripts/
│ ├── copy-assets.mjs # Copy src/static/ → tmp/public/
│ ├── sync-gastown-docs.mjs # Sync docs from gastown repo
│ ├── generate-llms.mjs # Generate /llms.txt
│ └── lib/ # Shared utilities and tests
├── src/static/ # Static assets (source of truth)
├── docs-fodder/
│ ├── gastown-docs/ # Documentation markdown source
│ ├── steve-blog-posts/ # Medium blog post markdown
│ └── youtube/ # YouTube video metadata markdown
├── deploy/ # Main site build output
└── deploy-docs/ # Docs subdomain build output
Docs use Astro Starlight for a modern documentation experience with built-in search, dark mode, and automatic navigation.
npm run build:docs - Builds from COMMITTED content. No gt CLI needed. Used by Cloudflare.
npm run sync-docs - Regenerates content from gastown repo. Requires gt CLI. LOCAL ONLY.
LOCAL (when gastown docs change):
npm run sync-docs # Regenerate content (requires gt CLI)
git commit + push # Commit the updated content
CLOUDFLARE (automatic on push):
npm run build:docs # Build from committed content (no gt needed)
The docs/src/content/docs/ directory is committed. Cloudflare builds from these committed files.
# 1. Pull latest gastown
cd ~/Code/Cache/steveyegge/gastown && git pull && cd -
# 2. Sync docs from gastown repo (requires gt CLI)
npm run sync-docs
# 3. Preview locally
npm run build:docs && npm run preview:docs
# 4. Commit the updated docs
git add docs/src/content/docs/ && git commit -m "Sync docs from gastown"
# 5. Push to main - CF auto-builds both sites
git pushTo edit documentation without syncing from gastown:
- Edit markdown files directly in
docs/src/content/docs/ - Run
npm run dev:docsto preview - Commit your changes
The homepage "Town Crier" section displays blog posts and videos from the blogPosts array in site.config.json. Content source files live in docs-fodder/steve-blog-posts/ (Medium posts) and docs-fodder/youtube/ (YouTube videos).
To add new content, use the Claude Code skill: add-content (in .claude/skills/add-content/SKILL.md), or follow these steps manually:
- Extract metadata (title, date, URL, description, lead image) from the
docs-fodder/markdown files - Add entries to the
blogPostsarray insite.config.json(newest first) - Download images to
src/static/images/blog/andtmp/public/images/blog/(both required — see skill for details) - Verify with
npm run devatlocalhost:4321
Images display as 112x112px squares with object-fit: cover. Use mqdefault.jpg for YouTube thumbnails (not hqdefault.jpg, which has letterboxing).
Single source of truth: site.config.json contains all site metadata.
src/site.config.ts- Re-exports JSON for Astro componentsscripts/lib/config.mjs- Imports JSON for build scriptsdocs/astro.config.mjs- Starlight sidebar configuration
- npm workspaces - Monorepo management
- Astro - Static site generator
- Astro Starlight - Documentation framework
- Plausible - Privacy-friendly analytics
- ESLint + Prettier - Linting and formatting
- Playwright - E2E testing
- Husky - Git hooks
- Node.js test runner - Unit testing
A pre-commit hook runs npm run check automatically on commits to main branch, which includes:
- ESLint
- Prettier format check
- Unit tests
- Security audit (fails on high/critical vulnerabilities)
To bypass temporarily: git commit --no-verify
This website is licensed under the MIT License.
Content Attribution: All documentation content from the Gas Town repository and blog posts by Steve Yegge are copyright Steve Yegge and are reproduced on this website with permission. The MIT license applies only to the website code, design, and infrastructure - not to the Gas Town documentation content.
For the Gas Town software license, see the Gas Town repository.