No description
  • TypeScript 47.3%
  • Svelte 23.3%
  • JavaScript 19.5%
  • CSS 7.3%
  • Shell 2.2%
  • Other 0.4%
Find a file
2026-08-14 22:09:36 +00:00
.forgejo/workflows fix(release): the workflow released from develop, not main 2026-08-14 22:08:10 +00:00
.githooks ci(release): stop the release publishing notes with commits silently missing 2026-08-05 14:34:14 -04:00
.github ci(release): port release automation off release-please to the tier-kit git-cliff flow (#115) 2026-08-05 11:44:45 -04:00
docs feat(field-guide): creature habitat/kind schema (FG-1) (#93) 2026-07-11 14:18:36 -04:00
scripts ci(release): stop the release publishing notes with commits silently missing 2026-08-05 14:34:14 -04:00
src chore(deps): update eslint-plugin-svelte to v3 2026-07-19 17:03:49 +00:00
static feat(field-guide): add the habitat range map (FG-7) (#108) 2026-07-12 21:07:16 +00:00
tests/e2e feat(field-guide): add the habitat range map (FG-7) (#108) 2026-07-12 21:07:16 +00:00
.editorconfig feat: scaffold the static offline app, governance, and CI gate (#61) 2026-07-06 13:42:10 -04:00
.gitattributes feat: scaffold the static offline app, governance, and CI gate (#61) 2026-07-06 13:42:10 -04:00
.gitignore fix(lint): stop linting pnpm's store, which only exists in CI 2026-08-03 10:44:14 -04:00
.npmrc feat: scaffold the static offline app, governance, and CI gate (#61) 2026-07-06 13:42:10 -04:00
.prettierignore fix(lint): stop linting pnpm's store, which only exists in CI 2026-08-03 10:44:14 -04:00
.prettierrc feat: scaffold the static offline app, governance, and CI gate (#61) 2026-07-06 13:42:10 -04:00
CHANGELOG.md chore: release v0.3.0 2026-07-18 14:22:55 +00:00
cliff.toml ci(release): port release automation off release-please to the tier-kit git-cliff flow (#115) 2026-08-05 11:44:45 -04:00
CONTRIBUTING.md docs(contributing): the release section described a tool this repo no longer uses 2026-08-05 14:37:42 -04:00
CREDITS.md feat(field-guide): add the habitat range map (FG-7) (#108) 2026-07-12 21:07:16 +00:00
eslint.config.js fix(lint): stop linting pnpm's store, which only exists in CI 2026-08-03 10:44:14 -04:00
handoff.md docs(handoff): record #116, the unproven release path 2026-08-14 22:09:36 +00:00
package.json chore(deps): update vite to v8 2026-07-19 17:06:21 +00:00
playwright.config.ts feat: content module, local-first state, and vendored calendar (#62) 2026-07-06 14:18:28 -04:00
pnpm-lock.yaml chore(deps): update vite to v8 2026-07-19 17:06:21 +00:00
PROJECT.md fix(release): the workflow released from develop, not main 2026-08-14 22:08:10 +00:00
README.md feat: scaffold the static offline app, governance, and CI gate (#61) 2026-07-06 13:42:10 -04:00
renovate.json chore: format renovate.json and remove stale handoff brief (#107) 2026-07-12 20:24:36 +00:00
ROADMAP.md feat: scaffold the static offline app, governance, and CI gate (#61) 2026-07-06 13:42:10 -04:00
svelte.config.js feat(library): inline cross-links via bosco: protocol (#88) 2026-07-10 22:28:30 -04:00
tsconfig.json feat: scaffold the static offline app, governance, and CI gate (#61) 2026-07-06 13:42:10 -04:00
vite.config.ts feat(field-guide): anatomy hotspot diagram — SVG/DOM, no-JS-complete (FG-6) (#99) 2026-07-11 22:21:04 -04:00

Bosco

A little offline internet for traditional Catholic kids (ages 416).

Bosco is a 1990s-styled Portal a child explores — a Library, a Field Guide, a Chapel, an Art Studio, an Arcade, and a Typing Trainer — that runs fully offline. One codebase ships three ways: a static public site, an installable PWA, and a self-hostable offline Docker image.

Status: v0.1.0 Core — the static offline scaffold and the invariants that hold the whole project together. Nothing here is a public release yet. See ROADMAP.md.

What holds it together (the invariants)

  1. Zero external network at runtime. Every asset is bundled. A CI guard greps the built output and fails the build on any external URL. If it can't survive docker run with networking off, it doesn't ship.
  2. Fully prerendered. SvelteKit + adapter-static in strict mode — a route that can't be prerendered fails the build.
  3. Local-first, no kid accounts. The site sets no cookies and holds no server data; everything lives in the browser (localStorage + IndexedDB) with export/import backup. The only server surface is an opt-in, parent-gated sync layer, arriving post-launch (v1.1.0) and off by default.
  4. Doctrine never ships unreviewed. Content marked review_status: pending is excluded from production builds. The owner is the doctrinal reviewer. Catechism, Scripture, and prayers ship verbatim — AI adapts stories, never doctrinal text.
  5. Every third-party asset is credited in CREDITS.md with license + source at add-time. Unknown license ⇒ not committed.

Stack

SvelteKit (adapter-static, all routes prerendered) · mdsvex + a Zod content module · Pagefind (offline search) · PixiJS (canvas + diagrams) · CSS design tokens (three <html> axes: data-theme / data-lit / data-tier) · a build-time sharp media pipeline · a vendored liturgical calendar from introibo Core (CC0 data, generated out-of-band) · a multi-arch nginx Docker image (built at v1.0.0).

Develop

pnpm install
pnpm dev            # dev server
pnpm build          # static build → build/
pnpm preview        # preview the static build
pnpm check          # svelte-check (type + a11y)
pnpm lint           # prettier + eslint
pnpm test:unit      # vitest
pnpm guard:external # fail on any external URL in build/
pnpm serve:static   # serve build/ like the production container

pnpm is managed via packageManager in package.json — run corepack enable pnpm once.

Contributing

See CONTRIBUTING.md for the branch/PR/commit conventions, the content review state machine, and the doctrinal-review gate.

License

The final license split (code + content) is decided before the v1.0.0 public launch — see the launch-readiness epic in ROADMAP.md. Until then, © the project owner, all rights reserved. Third-party assets keep their own licenses, recorded in CREDITS.md.