NatesNotes
A static notes site whose content lives in a separate repo — a plain folder of markdown, with ordered "courses" assembled from it at build time.
- Section
- productivity
- Year
- 2026
- Role
- Solo project
- Stack
- Astro, TypeScript, GitHub Actions, GitHub Pages
Summary
A static notes site whose content lives in a separate repo — a plain folder of markdown I commit by hand. Frontmatter is optional, a bare file publishes, and ordered “courses” are assembled from the notes at build time.
Story
Every CMS I looked at inverted what I wanted: the notes live in the tool and you
get them back as an export. Here the notes repo is symlinked in as content/
locally and checked out with a token in CI, and only notes/ and courses/ are
read — private/, drafts and scratch are tracked in git and never published.
Sequence comes from YAML manifests that list note slugs in order, and the
direction of that reference is the whole design: notes never mention courses,
courses point at notes, so reordering means editing one manifest. A slug
matching no note fails the build on purpose. Decoupling the content also
decoupled the deploy — a push to the notes repo fires a repository_dispatch
that the site workflow builds on. Then DNS ate the most time: the apex records
all have to be DNS only, because proxying hides the origin from GitHub,
which then can’t issue a certificate, and the failure looks like a working site
with a certificate error nobody warned you about.
Lessons
- Ceremony kills the habit. The moment publishing a note requires frontmatter, I stop writing notes and start maintaining a website.
- A dead link inside a numbered outline is worse than a missing page — the reader can’t tell whether they lost their place. Fail the build.
- Two expiring access tokens are load-bearing infrastructure with a silent failure mode: the site just stops updating and I’d notice weeks later.