Personal site and notes for Zach Davis. A garden that keeps growing while you ignore it.
Notes are Markdown files. Their age comes from git. Their size comes from their word count. Nothing is declared; everything is derived at build time.
Nature computes. The gardener commits.
Astro (static output), TypeScript strict, plain CSS with custom properties. No UI framework. pnpm.
pnpm install
pnpm dev # http://localhost:4321
pnpm plant "A title" # start a new note
pnpm build # static site in dist/
pnpm preview
pnpm format # prettierpnpm plant "A title"makessrc/content/notes/a-title.md. Write under the frontmatter.- Commit it and push to
main. The site is live about a minute later.
That is the whole publish flow. The first commit that adds the file is the planted date. The latest commit that touches it is the tended date.
A note you have not pushed is a draft. pnpm dev shows it to you; nobody else can see it.
Away from the laptop, GitHub's web editor works too: open src/content/notes, choose Add file, write, and commit to main.
Optional frontmatter:
| key | meaning |
|---|---|
planted |
Date. Overrides the first-commit date. |
tended |
Date. Overrides the last-commit date. For samples and imports only. |
tier |
whim, thought, or post. A hold-down override; if present, it wins. |
from |
List of slugs this note was planted from. Shown as "Planted from". |
sample |
true shows the note only in pnpm dev, never on the live site. |
src/content/now.md is one handwritten line shown on the home page. No date, no frontmatter.
Tier comes from word count. Age comes from days since the note was last tended.
| tier | words |
|---|---|
whim |
fewer than 80 |
thought |
fewer than 600 |
post |
600 or more |
| age | days since tended |
|---|---|
fresh |
fewer than 30 |
settled |
fewer than 180 |
wilting |
fewer than 365 |
overgrown |
365 or more |
A note that is no longer fresh and is listed in another note's from becomes soil on the garden page.
Whims show their full text wherever they are listed. Thoughts show only a title. Posts show a title and a short excerpt.
The markup never changes. Designs are CSS files that restyle it.
src/styles/designs/<id>.css, every rule scoped underhtml[data-design="<id>"].src/designs/<id>.ts, exporting{ id, name, blurb, fonts }.
Both are picked up automatically. The default is set in src/site.config.ts. To try another one, add ?design=<id> to any URL, or use the switcher in the footer when running pnpm dev (it remembers your pick in localStorage).
Two flourishes stay hidden unless a design styles them: .wordmark-more, which finishes the sentence the domain starts based on how fresh the garden is, and .weather on the garden page, which is whatever the season is doing drifting past.
To screenshot a design on every route, in light and dark, desktop and phone:
pnpm shots --design <id>PNGs land in .shots/<id>/. This uses the Google Chrome already installed on the machine; no browser download.
.github/workflows/deploy.yml builds the site and deploys it to GitHub Pages at zdav.is (the domain is in public/CNAME). It runs on every push to main, and again every morning, because notes age and seasons turn even when nothing is committed.
Dates come from git, so the build needs full history. CI checks out with fetch-depth: 0, and a production build refuses to run in a shallow clone rather than publish wrong dates.
DNS for zdav.is points at GitHub Pages:
| type | host | value |
|---|---|---|
| A | @ |
185.199.108.153, 185.199.109.153, 185.199.110.153, 185.199.111.153 |
| CNAME | www |
zmdavis.github.io. |
The notes marked sample: true exist so every age state is visible while designing. They appear in pnpm dev and pnpm shots, never in a production build. Delete them whenever you like.