A running tally of every album, film, and series logged here — how often each feeling comes up, which genres keep pulling me back, and how this site got built along the way.
TRACK 01 — SUMMARY TRACK 02 — MOOD MAP TRACK 03 — BUILD
Every album, film, and series gets logged here — what it was, why today, and up to three feelings that came with it.
This site's own history, pulled straight from git — every change, grouped by the day it happened.
Why this log exists, and what the entries add up to when you read them all at once.
This log is also a build log. Every change to the site is a commit, and those commits get read straight out of git each time it deploys — so the numbers below can't drift from what actually shipped.
Each commit is bucketed by what it touched. Many land in more than one.
Supabase reads and writes, auth, and the lookup APIs.
Layout, components, tabs, and everything you actually see.
Astro, TypeScript, the build pipeline, and project structure.
The entries table, its columns, and moving old data in.
Getting it online: Cloudflare Pages, GitHub, deploy scripts.
Keeping the spec honest about what the thing actually does.
Colour, type, spacing — how the whole thing feels.
Versions read from package.json at build time.
The three most recent working days. Full history lives on the Dev Log tab.
89f84b0 Add an About tab, auto-fetch covers, and suggest genres up front 18693b8 Add entry editing, pagination, and real cover artwork a549e06 Repaint in pastel, rename Overview to Home, and surface the build story 774a911 Give each tab its own hero copy 41f12e8 Scroll to top when switching tabs 9bad919 Add a Dev Log tab and regroup the page into three tabs 34d017e Point deploys at the moodlogremi.pages.dev project 50f41d2 Add deploy script and document the Astro/Cloudflare setup 93f4623 Add migration for movie/anime tabs, support Spotify links in parser 33c5088 Add Mood Log app (Vinyl/Movies/Anime/Lifelog, Supabase-backed public site) How this site got built, day by day — read straight from the repository's own history at build time.
89f84b0 Add an About tab, auto-fetch covers, and suggest genres up front - New About tab. The prose is fixed, but the "portrait in data" beside it is generated from the log itself — counts, the feelings that recur, what gets returned to — so it stays true as entries accumulate rather than going stale - Covers are now looked up automatically on save when the entry doesn't already have one, so "Fetch missing covers" is only for backfilling old entries - Genres the lookup suggests are pinned ahead of the presets and marked, so the system's guess is what you see first - Removed "Clear all entries" (and the deleteMany call that only served it) Backend tidy-up while in here: fetchEntries now sorts newest-first in the database instead of the client re-sorting in three places, and it propagates errors so a failed load says so rather than looking like an empty log.
18693b8 Add entry editing, pagination, and real cover artwork Editing: each timeline card gets an Edit button for the owner that loads the entry back into the add form, swaps the submit label, and shows a cancel banner. Saving updates in place. An edit survives routine auth-token refreshes — only an actual loss of owner rights discards it. Pagination: 10 per page on both the Timeline (re-rendered) and the Dev Log (hidden/shown in place, since Astro renders it statically; day headings collapse when a page leaves them empty). The pager hides itself below one page. Covers: every lookup source now also returns artwork — iTunes (upscaled from the 100px thumb Apple returns), Spotify/YouTube thumbnails, Wikidata P18, AniList coverImage. Entries fall back to the generated SVG when there's no image or it fails to load. A "Fetch missing covers" utility backfills older entries. The cover_url column is probed once at boot and omitted from writes when absent, so this works against a database that hasn't run the ALTER TABLE yet. Also wired up astro check (0 errors) and pinned down a Tailwind/Vite types skew.
a549e06 Repaint in pastel, rename Overview to Home, and surface the build story - New light pastel palette across tokens, emotions, genre cycle, and type accents, taken from the reference player artwork: soft peach/pink/lavender wash, translucent white cards, muted purple ink - Each tab gets its own illustration instead of sharing the record: a player window (Home), an open journal (Log), a code window (Dev Log). The record only spun on one tab's worth of meaning anyway - Dropped the SIDE A / SIDE B fineprint from Log and Dev Log - Overview renamed Home; hash is now #home - devlog.ts now classifies each commit into work areas (frontend, design, backend & data, database, framework & build, deploy & infra, docs) and reads the stack's versions out of package.json. Home gains a "How it was built" section showing the breakdown, the stack, and recent changes; Dev Log tags each commit with its areas - A tracked pre-push hook redeploys on every push so the live Dev Log always matches GitHub; failures are swallowed so they can't block a push. `npm run ship` does the same explicitly
774a911 Give each tab its own hero copy The banner was one static block shared by all three tabs, so its text didn't describe whatever was actually showing below it. Hero now renders three variants (eyebrow/title/lede/fineprint), toggled by the same showTab() that already switches [data-panel] — Overview talks about the aggregate stats and mood map, Log about adding/browsing entries, Dev Log about the build history.
41f12e8 Scroll to top when switching tabs Keeps the new tab starting at its own beginning instead of inheriting the previous tab's scroll position. Honours prefers-reduced-motion.
9bad919 Add a Dev Log tab and regroup the page into three tabs The nav is now a tab switcher rather than anchor links, with the active tab mirrored to the URL hash so tabs can be linked directly. - Overview holds Summary + Mood Map; Log holds Add Entry + Timeline (the backup/utility row moves here, next to the entries it acts on); Dev Log is new - Dev Log reads `git log` at build time via src/lib/devlog.ts and groups commits by day. Chosen over the GitHub API so it needs no rate limit budget and keeps working while the repo is private; it refreshes on rebuild - "Locate on map" now switches to the Overview tab before scrolling
34d017e Point deploys at the moodlogremi.pages.dev project 50f41d2 Add deploy script and document the Astro/Cloudflare setup 9d141f0 Rebuild as an Astro + Tailwind project Replaces the single hand-written index.html with a real build: Astro for the static shell, Tailwind v4 for styling, TypeScript for the client logic. Output is still a static site — no adapter, no server. - src/components/* hold the page shell; all dynamic rendering stays client-side in src/lib/app.ts, which fills the sections from Supabase - src/lib splits the old monolith into config (media types, emotions, palette), supabase (typed CRUD), art (cover art + radar), parse (link/title lookup) - Design tokens moved into Tailwind's @theme, so colors and fonts are utilities; only the paper grain, record spin, and timeline rail stay as custom CSS - Behaviour and the Supabase schema are unchanged Node was upgraded to 26 (Homebrew) since Astro's Vite needs >=20.12; the old system Node 20.10 at /usr/local/bin is untouched and still resolvable.
0ac4f3a Fix stale note about the parse box being type-gated bef6b33 Update spec for movie/anime parsing and title search 4d789f3 Parse movie and anime sources, and accept a plain title anywhere The parse box is now shown for every media type and takes either a link or a title to search for. - IMDb links resolve through Wikidata (keyless, CORS-open): localized title, director, and genres normalized against this app's presets - MyAnimeList and AniList links resolve through the AniList GraphQL API - Typing a name searches Apple Music (vinyl), Wikidata (movie), or AniList with a Wikidata fallback (anime) — Wikidata is what makes Chinese titles work, since AniList only indexes romaji/English/Japanese - Streaming hosts (Bahamut, Netflix, Bilibili, …) forbid cross-origin reads, so their pages cannot be inspected client-side at all; those links now say so and point at the title search instead - Enter in the parse box triggers a parse
6271811 Update spec for single-page lifelog architecture and Supabase backend 1bde107 Restructure as a single lifelog page with a type selector Vinyl/Movies/Anime are no longer separate tabbed pages. The lifelog rollup is now the only header: one hero, then Summary, Add Entry, Timeline, Mood Map as sections of one page, with nav links as anchors. - One add form; a Type chip row swaps field labels, placeholders, context options, genre presets, submit label, and shows the link parser for Vinyl only - Timeline and Mood Map cover every type at once, filterable by type and by genre (the genre list narrows to whatever the type filter leaves in scope) - Entries normalize to {mediaType,title,creator,...}, dropping the per-type titleKey/creatorKey indirection; DB schema unchanged - Migration is one button covering all three legacy stores - Link parser tolerates messy pasted URLs and supports Spotify - Added cover-art shapes for film/anime genres
93f4623 Add migration for movie/anime tabs, support Spotify links in parser - migrateLocalLegacyData is now config-driven (per-media legacy storage keys) and checks both Claude storage and localStorage, skipping entries already in the cloud - Parser recognizes Spotify links via oEmbed (title only; Spotify does not expose artist or genre)
33c5088 Add Mood Log app (Vinyl/Movies/Anime/Lifelog, Supabase-backed public site) I keep this log because the things I listen to and watch tend to say more about a day than the day itself does. An album isn't just an album — it's whatever I needed at 2pm on a Tuesday.
So each entry records the feeling alongside the thing: what I played or watched, why I reached for it, and up to three feelings that came with it. Nothing here is a review. No scores, no recommendations — just an honest note about where I was.
I also built the site itself, which turned into its own kind of log. The Dev Log tab tracks that side of it.
Written from whatever is currently in the log — it changes as I do.