- Typescript
- HonoX
- Vite
- Tailwind CSS
- Biome linter & formatter
- Node.js 24.x
- pnpm 10.x (
corepack enablewill pick up the version pinned inpackage.json)
# set up env vars (fill in the values afterwards)
cp .env.example .env
# develop
pnpm install
pnpm dev
# build & preview
pnpm run previewpnpm check # lint + format check (Biome)
pnpm check:fix # auto-fix lint + format
pnpm lint:fix # lint only, with fixes
pnpm format:fix # format only, with fixesA lefthook pre-commit hook runs these automatically on commit.
app/
routes/ # file-based routes (HonoX)
components/ # UI components
server.ts # SSG entry
client.ts # client entry
public/ # static assets served as-is (images, favicon, .well-known)
dist/ # build output (deployed to Pages)
vite.config.ts # two-pass build: `--mode client` bundle + SSG
Deployment is automated via GitHub Actions (.github/workflows/publish.yml) to GitHub Pages.
- CI: every push to any branch runs type check, lint, and build.
- Deploy: only pushes to
mainupload the artifact and publish to Pages. - Manual: trigger via the Actions tab (
Run workflow) orgh workflow run publish.yml --ref main.
- In repo Settings → Pages → Build and deployment, set Source to GitHub Actions.
- Add the build-time secrets under Settings → Secrets and variables → Actions (see
.env.example):VITE_AIRTABLE_NEWSLETTER_PAT/_BASE/_TABLEAIRTABLE_EVENTCURATE_PAT/_BASE/_TABLE
Note:
VITE_-prefixed vars are inlined into the client bundle and are publicly visible by design.
MIT.