Claude dcfd97e823 Deploy from GitHub with a systemd timer instead of Gitea Actions
Cosmos keeps a deploy-only clone of the GitHub repo. gk-deploy.timer runs
pull-and-deploy.sh every 5 minutes: it fetches master and, when it has
moved, runs deploy.sh (build, check, restart, roll back if unhealthy). A
commit that failed is not retried until master moves (FORCE=1 retries), and
DEPLOY_HEALTHCHECK_URL turns red on a failed fetch or deploy. Removes the
Gitea workflow and updates the runbook, README and inventory note.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012aSbo2D1qP8cMFQCykf7kx
2026-10-12 00:57:18 +00:00
2026-10-12 00:43:03 +00:00
2026-10-12 00:43:03 +00:00

GregKilmer.com

The site, rebuilt around Greg's Obsidian vault. Notes in the vault's Site folder are the content; a content service checks every change and keeps the last good version; the site serves pages from that service. The full plan, with the decisions behind it, is the Functional Design Plan.

What is here

Path What it is
packages/schema The one definition of every note type: fields, folders, file names, and the checks for one note and for the whole folder. The migration, the content service, the MCP server, the site and any later editing tool all use it.
vault-kit What goes into the vault: the Obsidian templates (generated from the schema), the Site guide and the stack's inventory note.
services/content The content service: watches the Site folder, runs the rules, keeps the last good version and its history, and serves the one write API. The MCP server for agents is part of it. See docs/content-service.md.
services/admin The admin page: the review queue with diffs, history and rollback, quick capture, store orders, draft previews and sync health. A client of the content service, on the tailnet only. See docs/admin.md.
packages/ui The component library: the approved element rules and ornament kit as Astro components, with the brand fonts, seals and icons, and a gallery page that shows them all. See docs/components.md.
services/site The public site: every page rendered from the content service's published notes, the resume PDF, and the inquiry and order forms. See docs/site.md.
deploy, Dockerfile The Cosmos stack: images, compose file, deploy and rollback scripts, and the systemd timer that deploys each new commit to master. See docs/deploy.md.
tools/migrate The one-time migration from the old site's data into Site folder notes.
docs How the pieces fit. Start with docs/content-model.md.
legacy The old site, kept for reference only. Nothing outside it imports from it except the migration.

Coming next: the cutover from the old site (phase 8).

Commands

Node 22 or newer.

npm install
npm run check      # typecheck (with astro check) and tests
npm run ui         # the component gallery at http://localhost:4321
npm run migrate    # writes out/24.01_PersonalWebsite and out/MIGRATION-REPORT.md
npm run templates  # regenerates vault-kit templates after a schema change
npm run schema:json  # writes a JSON Schema per note type to packages/schema/json/

# the content service, against a copy of the Site folder
SITE_DIR=out/24.01_PersonalWebsite/Site DATA_DIR=data \
CONTENT_TOKENS="reader:<24+ chars>,admin:<24+ chars>" npm run content

# the admin page, in a second terminal
ADMIN_TOKEN=<the admin token> npm run admin   # http://localhost:4320

The old site

The live site still runs from the old code until cutover. It builds the same way as before, from inside legacy/:

cd legacy && docker compose up -d --build
S
Description
No description provided
Readme 64 MiB
Languages
TypeScript 53.3%
Astro 40%
CSS 3.1%
JavaScript 2.9%
Dockerfile 0.4%
Other 0.3%