Personal blog at https://really.lol
  • HTML 37.9%
  • TypeScript 25.5%
  • Astro 15.7%
  • Python 9.8%
  • CSS 9.7%
  • Other 1.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jack Hackinger-Reid 01ed872c3c
All checks were successful
Deploy to Cloudflare Pages / deploy (push) Successful in 1m1s
style: demarcate stylesheet sections
2026-08-24 21:33:00 +02:00
.forgejo/workflows Pin CI to node 22 for Astro build 2026-08-10 09:32:57 +02:00
.superpowers/brainstorm/97207-1775391441 feat(redesign): remove old pages and components, update routes and RSS feed 2026-04-05 16:12:20 +02:00
cli/src update media cli to support backups and broken link checking 2026-08-10 10:22:27 +02:00
docs/superpowers commit old plans 2026-06-09 12:00:49 +02:00
scripts Add one-off utility scripts 2026-06-09 12:00:37 +02:00
site style: demarcate stylesheet sections 2026-08-24 21:33:00 +02:00
.gitignore feat(tags): wire tags command into CLI entry point 2026-04-30 20:27:36 +02:00
AGENTS.md chore: link agent instructions to Claude config 2026-08-24 21:13:59 +02:00
bun.lock sync books from Hardcover 2026-04-28 14:32:14 +00:00
CLAUDE.md update docs for fixed media scripts 2026-08-10 10:22:44 +02:00
package.json Add Forgejo Actions deploy workflow 2026-08-10 09:24:33 +02:00
photo-tags-state.backup.json feat(tags): add tag search box to review UI 2026-04-30 20:27:36 +02:00
README.md update docs for fixed media scripts 2026-08-10 10:22:44 +02:00
tsconfig.json chore: clean up tsconfig, gitignore, and docs for SSG architecture 2026-04-07 09:49:01 +02:00

really.lol

Personal blog at really.lol. A static Astro site on Cloudflare Pages, with a Bun CLI for content management.

site/       # Astro static site, deployed to CF Pages
cli/        # CLI tool (Bun): content creation, media management, library sync

No CMS and no database. Content lives in markdown files (Astro content collections) and JSON fixtures committed to the repo.

Dashboards

Development

bun install

bun run dev        # Astro dev server on :4321
bun run build      # Build static site
bun run preview    # Preview the built site
bun run deploy     # Build and deploy to CF Pages
bun run test       # Run tests

Pushing to main also triggers a CF Pages build.

CLI

Run via bun run cli or bun cli/src/index.ts.

Content creation

cli create post --title "..." [--body "..." --tags a,b --subtitle "..."]
cli create photo <image-file> [--title "..." --location "..." --tags a,b]
cli create note --title "..."
cli create highlight --title "..." --link "..." [--body "> quote" --tags a,b]

Run any of these without --title for interactive prompts. Files are written to site/src/content/<collection>/ as YYYY-MM-DD-slug.md.

Photo posts take their date from the image's EXIF capture date (DateTimeOriginal, falling back to DateTimeDigitized then the IFD0 DateTime). Images with no usable EXIF fall back to today's date and print a warning. --date always wins. The parser is pure TypeScript in cli/src/lib/exif.ts, so there is no exiftool dependency.

Media management

cli media upload <file> [--prefix img/post/slug]
cli media verify              # Check content media refs exist in R2; missing refs show source file + date
cli media orphans             # List R2 objects no content references
cli media backup <dest-dir>   # Mirror the whole bucket to disk, skipping files that are already up to date

Media is stored in R2 and served from media.really.lol.

Library sync

cli library sync books --shelf read|reading|toread
cli library sync films --list watched|towatch --from path/to/letterboxd-export.zip
cli library sync links

--from accepts a Letterboxd export .zip, an extracted directory, or a single CSV (diary.csv for --list watched, watchlist.csv for --list towatch).

Photo tagging

cli tags init                 # Scan untagged photos, build state file
cli tags describe             # Generate descriptions via a local Ollama vision model
cli tags suggest              # Suggest tags from those descriptions
cli tags review               # Browser review UI on :4444
cli tags apply [--dry-run]    # Write approved tags to the markdown files

Checks

cli check links               # Find broken internal links in the built site

Content types

Collection Directory Notes
blog site/src/content/blog/ Posts, media reviews (media-log tag), link roundups
note site/src/content/note/ Microblog entries
photo site/src/content/photo/ Photo posts with location and tags
highlight site/src/content/highlight/ Blockquote excerpts from articles and books

Library data lives as committed JSON in site/src/data/: books-*.json, films-*.json, links.json, and config.json for tag mappings.

Testing

bun test

Unit tests sit alongside the code in cli/src/**/__tests__/.

Dependencies

Cover CLI

cli library sync books shells out to the cover CLI to fetch data from Hardcover.

git clone https://github.com/jackreid/cover.git
cd cover
go build -o cover      # then put the binary on your PATH

Get an API key from your hardcover.app account settings and set HARDCOVER_API_KEY.

Environment variables

Variable Used for
R2_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY R2 access from the CLI
R2_BUCKET R2 bucket name (default media-really-lol)
LINKDING_ACCESS_TOKEN Linkding API (later.place) for link sync
HARDCOVER_API_KEY Hardcover API, via the cover CLI

Configuration

  • Language: English (GB)
  • Pagination: 40 items per page

Todo

  • Update /uses