Trim CLAUDE.md to non-discoverable context only

Remove project structure, tech stack, services, Makefile targets, DNS,
and other sections that duplicate what's already in the code.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Louis Simoneau
2026-04-10 08:14:15 +10:00
parent 0d7287dce1
commit 6c7afecce1

100
CLAUDE.md
View File

@@ -2,97 +2,25 @@
Personal blog and server infrastructure for monotrope.au.
## Project Structure
## Theme & Concept
```
monotrope/
site/ # Hugo site (content, templates, CSS)
infra/
ansible/playbook.yml # Single playbook for all server provisioning
miniflux/ # Docker Compose for Miniflux RSS reader
Caddyfile # Copied to /etc/caddy/Caddyfile by Ansible
deploy.sh # Build + rsync to production
Makefile # Common tasks
.env # Local secrets (not committed)
```
The name is a play on [monotropism](https://en.wikipedia.org/wiki/Monotropism) —
the theory of autistic cognition as deep, singular focus. The site is built around
that idea: deep attention, flow states, and resisting the fragmentation of modern
(especially AI-mediated) work. It's also an exercise in ownership — writing and
reviews live here instead of on corporate platforms.
## Tech Stack
The tone is personal and reflective. Content includes writing (posts) and book
reviews across all genres.
- **Static site generator:** Hugo (no theme — templates built from scratch)
- **Web server:** Caddy (automatic HTTPS via Let's Encrypt)
- **Hosting:** DigitalOcean droplet (Sydney region, Ubuntu 24.04 LTS)
- **Deployment:** `hugo --minify` then `rsync` to `/var/www/monotrope`
- **Provisioning:** Ansible (`infra/ansible/playbook.yml`)
The terminal/CRT visual aesthetic is deliberate, not just decorative — it
reinforces the themes of simplicity, focus, and rejecting modern web bloat.
No JavaScript unless strictly necessary. No images or decorative elements beyond
CSS. The design should feel minimal, typographic, and monospaced-first.
## Services
## Hosting
| Service | URL | How it runs | Port |
|-------------|-----------------------------|-----------------|------|
| Blog | https://monotrope.au | Static files | — |
| Miniflux | https://reader.monotrope.au | Docker Compose | 8080 |
| GoatCounter | https://stats.monotrope.au | systemd binary | 8081 |
## Ansible Playbook
**All server changes must go through Ansible.** Everything must be idempotent — no ad-hoc SSH changes.
The playbook is at `infra/ansible/playbook.yml`. Tags let individual services be re-provisioned without touching the rest.
| Tag | What it covers |
|---------------|------------------------------------------------------|
| `miniflux` | Miniflux Docker Compose + Caddyfile update |
| `goatcounter` | GoatCounter binary, systemd service + Caddyfile |
| (no tag) | Full provisioning (system, Caddy, Docker, UFW, users)|
### Secrets
Pulled from environment variables, loaded from `.env` via Makefile:
```
MONOTROPE_HOST
MINIFLUX_DB_PASSWORD
MINIFLUX_ADMIN_USER
MINIFLUX_ADMIN_PASSWORD
GOATCOUNTER_ADMIN_EMAIL
GOATCOUNTER_ADMIN_PASSWORD
```
### GoatCounter
Runs as a systemd service (not Docker) using the pre-built binary from GitHub releases.
Version is pinned via `goatcounter_version` var in the playbook.
Initial site/user creation is gated on a `/var/lib/goatcounter/.admin_created` marker file
so re-running the playbook never attempts to recreate the user.
## Makefile Targets
```
make build # hugo --minify
make serve # hugo server --buildDrafts (local dev)
make deploy # build + rsync to production
make ssh # SSH as deploy user
make setup # Full Ansible provisioning (fresh droplet)
make miniflux # Ansible --tags miniflux
make goatcounter # Ansible --tags goatcounter
```
## DNS
- `monotrope.au` → droplet IP (A record)
- `www.monotrope.au` → droplet IP (A record, redirects to apex via Caddy)
- `reader.monotrope.au` → droplet IP (A record)
- `stats.monotrope.au` → droplet IP (A record)
## Site Layout
Content lives in `site/content/`:
- `posts/` — writing
- `reviews/` — book reviews
- `about.md` — about page (uses `layouts/page/single.html`)
Templates are in `site/layouts/`. No JavaScript unless strictly necessary.
The GoatCounter analytics script is injected in `baseof.html` and only loads
in production builds (`hugo.IsProduction`).
DigitalOcean droplet, Sydney region, Ubuntu 24.04 LTS.
## Conventions