Commit Graph
100 Commits
Author SHA1 Message Date
stan 45943543c2 trackers: one-click spotting links: header flyout (hover/focus, delayed close, side-aware), chips on the spotting tile, mobile sub-links
Deploy production / deploy (push) Successful in 1m8s
2026-10-25 12:18:33 +00:00
stan d8490ce94f trackers: group cars, trains, planes and wildlife under one spotting tracker with /trackers/spotting landing page and category switcher
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 12:08:38 +00:00
stan 5226ed7fec trackers: colourful tracker icons on /trackers and home tiles, 3/4-column desktop grid with lift hover
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 11:27:56 +00:00
stan 704880dc98 trains: stricter Commons photo matching (category files must name the type; no maps, class interiors, trucks)
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 00:13:30 +00:00
stan 5f940e8196 trains: pokedex pages (builders, operators, countries, detail, random) and registrations
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 00:11:50 +00:00
stan 8c0fc74283 trains: Wikidata/Wikipedia import, Commons photos and refresh scripts
Deploy production / deploy (push) Successful in 1m13s
2026-10-25 00:09:07 +00:00
stan ef9524aa0f trains: schema and migration
Deploy production / deploy (push) Successful in 1m5s
2026-10-24 23:22:20 +00:00
stan 8515cf0e9c wildlife: photos script without response cache (it outgrew JSON.stringify)
Deploy production / deploy (push) Successful in 1m5s
2026-10-24 22:42:26 +00:00
stan 602ea9c8e1 wildlife: fetch English names without the NL place (it localised them to Dutch)
Deploy production / deploy (push) Successful in 1m6s
2026-10-24 22:27:16 +00:00
stan 42b6b6568a wildlife: pokedex pages (list, groups, group, species detail, random) and registrations
Deploy production / deploy (push) Successful in 1m4s
2026-10-24 22:04:15 +00:00
stan ba44365c71 wildlife: iNaturalist/Wikidata/GBIF import, CC photos and refresh script
Deploy production / deploy (push) Successful in 1m8s
2026-10-24 21:58:35 +00:00
stan 3f251145be wildlife: schema and migration
Deploy production / deploy (push) Successful in 1m4s
2026-10-24 21:54:25 +00:00
stan 59b35c0886 planes: pass maker sources to the maker page
Deploy production / deploy (push) Successful in 1m3s
2026-10-24 20:51:49 +00:00
stan eccae362ec planes: stricter photo matching, skip company articles, payload-not-pax
Deploy production / deploy (push) Successful in 1m8s
2026-10-24 20:26:13 +00:00
stan 6696bc7162 planes: pokedex tracker pages, cards, makers, random 2026-10-24 20:10:36 +00:00
stan 2259965a28 planes: wikidata/wikipedia import, commons photos and refresh script 2026-10-24 20:10:36 +00:00
stan cc6c7c8ede planes: schema and migration 2026-10-24 20:10:36 +00:00
stan 6249e6daeb start: server links -> stan-ovh (Tailscale), drop Webmin from home-collector
Deploy production / deploy (push) Successful in 1m4s
2026-10-24 18:41:53 +00:00
stan 085a30bec8 pc: PC setup tracker at /trackers/pc on the hardware schema
Deploy production / deploy (push) Successful in 1m4s
- model the existing hardware schema in Drizzle (devices, components, new sensitivities)
- idempotent reconciling migration: new columns, checks, setup_overview view, grants, meta.tables
- seed: main PC labels/hostnames, planned AMD X3D + RTX 5090 build, stan-ovh (OVH RISE-S),
  other devices, sensitivity placeholders (no invented cm/360)
- owner-only add/edit via modals; public view hides notes/order numbers
- trackers dropdown entry + icon, seo/title/sitemap, owner write prefix
2026-10-24 17:55:48 +00:00
stan 8442d59b68 cars: brand logos everywhere (search cards, brand grid, model headers), stricter logo matching + curated fixes, logo refresh in cars-photos
Deploy production / deploy (push) Successful in 2m24s
2026-10-24 17:43:47 +00:00
stan fac49b57ba music: near-realtime now playing (currently-playing every 5 s while playing, 30 s idle backoff, Retry-After, recent plays ~10 s after a track change, holder-based lease) and a public SSE stream /api/listening/stream feeding the listening card live with client-side progress
Deploy production / deploy (push) Successful in 2m35s
2026-10-24 17:28:33 +00:00
stan 7636f0b2bc cars: keep MAZDA2/JAECOO7 names (no false typo strip), canonical upload.wikimedia.org thumbs, tidier gallery captions/credits
Deploy production / deploy (push) Successful in 2m34s
2026-10-24 16:54:14 +00:00
stan bf0a1e1d2a cars: Wikimedia Commons photos (cars.photos, card heroes, model gallery + lightbox, brand hero/logo), cars:photos + cars:refresh with --report-new, fold duplicate names (Golf VI, Peugot, Mustang Mach 1, Model 3/Y, i10/i30, Ceed, Lynk & Co)
Deploy production / deploy (push) Successful in 3m0s
2026-10-24 16:44:38 +00:00
stan 901d12f71d Header tiles: Trackers dropdown, dashboard and quick add as hoverable monochrome tiles
Deploy production / deploy (push) Successful in 2m48s
Lift + tint on hover, visible focus ring, aria-current for the dashboard,
colourful icons on a black-and-white surface, prefers-reduced-motion respected.
2026-10-24 16:17:27 +00:00
stan 771f64c168 drizzle: chain osu_match_cache snapshot after tasks_auto_handle
Deploy production / deploy (push) Has been cancelled
2026-10-24 16:16:19 +00:00
stan 46703f1a6c map finder: quick lists from my listening (top/recent/now/Spotify top/liked), Artist - Title without Spotify, owned playlists via the user token, rich beatmap cards (cover, mapper, status, BPM, length, star chips, preview, osu!direct), mode/status/star filters, DB result cache (music.osu_match_cache)
Deploy production / deploy (push) Has been cancelled
2026-10-24 16:15:56 +00:00
stan 0aa14cebf3 Quick add task from the header (owner): modal, g t shortcut, auto_handle + Daisy webhook
Deploy production / deploy (push) Has been cancelled
- + button next to Dashboard (desktop and mobile sheet), lazy-loaded native <dialog>
- POST /trackers/tasks/quick inserts source 'quick-add', notes, due date, priority
- tasks.tasks.auto_handle (default false) with a Daisy badge in the tracker
- DAISY_TASK_WEBHOOK_URL/KEY/HEADER: fire-and-forget POST {task_id, title}, 3 s timeout
2026-10-24 16:13:45 +00:00
stan 3903317a59 spotify: manual 302 for external redirects in /api/spotify/connect (kit refuses redirect() to external origins)
Deploy production / deploy (push) Has been cancelled
2026-10-24 16:12:10 +00:00
stan 4738f10ad1 header: trackers menu as a 2-column grid (desktop and mobile) with a coloured inline-SVG tile per tracker
Deploy production / deploy (push) Successful in 2m41s
TrackerIcon + #lib/tracker-icons: one gradient rounded tile and a few stroke paths per
tracker (tasks, money, books, cars, music, health, groceries, houses, energy, games, skins,
pets, lists), distinct colours, readable in light and dark. No icon library. Test checks
every tracker has a unique tile and tasks/money/books stay first.
2026-10-24 16:06:39 +00:00
stan bc58e97776 start: show the normal site header on /start (with the owner dashboard button, highlighted there); no footer on the new-tab page
Deploy production / deploy (push) Successful in 2m36s
/start is no longer immersive, so it loads the lazily imported SiteChrome like other pages.
Only the book reader still skips the chrome. hidesFooter() keeps the footer off /start.
2026-10-24 16:03:06 +00:00
stan b757269151 music: self-hosted scrobbler (Spotify poller, Last.fm + streaming-history importers, /trackers/music, homepage listening card)
Deploy production / deploy (push) Successful in 2m37s
- music schema: artists/albums/tracks (+album art), plays with source + dedupe, now_playing,
  spotify_auth, import_state; plays_deduped view hides Last.fm scrobbles Spotify also has
- in-app Spotify poller (60s, leased) started from hooks init; no new role or env needed
- /api/spotify/connect + callback (owner only), /trackers/music public stats
- scripts: music-poll, music-import-lastfm (resumable), music-import-history
- deploy/music-collector: optional host timer with its own role
2026-10-24 15:57:40 +00:00
stan 45c124a365 cars: default to most-common-in-NL order; dex numbers oldest first with unknown years last (--renumber)
Deploy production / deploy (push) Successful in 2m41s
2026-10-24 15:47:44 +00:00
stan 9e30e4246f cars: import handles models without years, keeps roman numerals upper-case; don't cache an empty overview
Deploy production / deploy (push) Has been cancelled
2026-10-24 15:46:25 +00:00
stan a04e5faebe houses: zero-pad Leefbaarometer grid cell ids (cells west of x=100 km, e.g. Zevenhuizen, Rotterdam)
Deploy production / deploy (push) Has been cancelled
2026-10-24 15:45:26 +00:00
stan 113eb54cd9 houses: Leefbaarometer liveability per listing (PDOK geocode + LBM 2024 grid/buurt), min-score filter and sort; store every regional listing (no price caps at scrape time)
Deploy production / deploy (push) Successful in 2m33s
2026-10-24 15:40:32 +00:00
stan e95b7da1e3 cars: car pokedex tracker (brands, models, US variants from RDW + fueleconomy.gov), import script, search/filter UI, model pages
Deploy production / deploy (push) Has been cancelled
2026-10-24 15:39:08 +00:00
stan cc4b10f239 site: owner-only dashboard link in header, mobile menu and homepage (g then d from any page); /start skips the site chrome JS
Deploy production / deploy (push) Successful in 2m56s
- Header/footer moved to #lib/components/SiteChrome.svelte, returned by a universal
  +layout.ts load only for non-immersive pages, so /start and the book reader never
  download icon libraries, dropdowns or the bits-ui Sheet. /start: 36 -> 18 JS files,
  133 -> 78 KB gzip.
- Header logo is a hashed asset (inlined), so it is cached with the build.
- inlineStyleThreshold 4096: tiny page/component CSS is inlined into the HTML.
- Umami is not loaded on /start.
2026-10-24 15:35:38 +00:00
stan 2bd668bf5e start: private new-tab dashboard at /start (tasks, notifications, backups/timers, server + containers, service status, trackers, editable links, / search)
Deploy production / deploy (push) Successful in 2m39s
- home schema: home.links (seeded, owner-editable) and home.snapshots (written by a host collector)
- deploy/home-collector: stdlib Python + systemd user timer (60s) that snapshots /proc stats,
  docker containers, systemd timers, service HTTP checks and ntfy topics via a limited role
- extras/newtab-extension: MV3 new-tab override, zipped to static/newtab-extension.zip
- owner-only pages skip Google Analytics; /trackers/health#body anchor for weigh-ins
2026-10-24 15:21:29 +00:00
stan 61ae72e50b money scenarios: forecast horizon 1–100y (?horizon=), today’s-euro view, scaling gridlines, career paths with job hops and plateaus, crash cycles per portfolio, retirement at 68 with withdrawals, salary path table
Deploy production / deploy (push) Successful in 2m49s
2026-10-24 15:13:20 +00:00
stan c4689adda4 groceries: fix search 500 (pg_trgm word_similarity lives in public, app search_path is $user); guard test for unqualified trgm calls
Deploy production / deploy (push) Successful in 2m32s
2026-10-24 15:07:08 +00:00
stan 807f8af167 groceries: grouping ignores 'durum tarwe' and possessive store lines (Jumbo's), so house pasta lines up across stores
Deploy production / deploy (push) Successful in 2m49s
2026-10-24 15:03:39 +00:00
stan 8c9a08afa1 houses: set cache-control once (layout already does; the page load threw header_already_set for the owner)
Deploy production / deploy (push) Has been cancelled
2026-10-24 15:03:36 +00:00
stan b5748e5ae5 houses: one row per listing when a hand-added link is scraped later
Deploy production / deploy (push) Successful in 3m0s
The nightly scraper and worker API now take over an existing row (e.g. source=manual)
whose link is the same listing (normalized URL, or the Pararius key / Funda, Kamernet,
Vesteda id in it) instead of inserting a copy; typed values are kept where the scrape has
none. house-listing update/add give manual rows with such links the site key unless
another row has it, update accepts --source/--source-id, and lookups by link ignore
tracking params. scripts/house-rekey.ts backfills existing manual rows.
2026-10-24 14:59:03 +00:00
stan c827deb395 money scenarios: contract timing for salary extras (13th month in Nov, holiday pay in May, bonus in Aug, net estimates from the contract)
Deploy production / deploy (push) Successful in 2m32s
2026-10-24 14:46:32 +00:00
stan 8a29d5ad59 money: pessimistic/realistic/optimistic scenarios on the wealth chart (realistic by default), editable assumptions, yearly table and milestones
Deploy production / deploy (push) Successful in 2m30s
2026-10-24 14:39:26 +00:00
stan 35f78ec829 Money: private Documents page with admin-only file endpoint
Deploy production / deploy (push) Successful in 2m32s
Lists contracts/pension docs with written summaries, an inline viewer and
download at /trackers/money/documents. Files and summaries live on the host
(MONEY_DOCUMENTS_ROOT, bind-mounted read-only by deploy-remote.sh), never in
git or static/; the file endpoint is admin-only (401/403) and private, no-store.
2026-10-24 14:32:28 +00:00
stan 8818dde99d houses: keep Kamernet to the Gouda region (small-city pages are padded with listings from all over NL), share GOUDA_REGION
Deploy production / deploy (push) Successful in 2m42s
2026-10-24 14:22:58 +00:00
stan 07d2c70973 health: smart-scale columns, deduped body measurement imports, quick-add form
Deploy production / deploy (push) Successful in 2m32s
2026-10-24 14:16:10 +00:00
stan b51fef14fd houses: nightly Kamernet + Vesteda scraper, dedupe by address, owner-only /trackers/houses
Deploy production / deploy (push) Successful in 2m44s
- scripts/house-scrape.ts: polite nightly scrape (honest UA, 6-10 s apart, stops a source on 403/challenge), ingest + price history + removals, ntfy alerts on a separate topic (max 5 + summary, first run seeds)
- address_key + duplicate_of: copies on another source link to one listing, manual wins
- /projects/house-tracker -> /trackers/houses (308), owner only (404 otherwise); filters for min m2, rooms, source, Gouda region default; notes, add-by-hand form, total rent, also-on links
- scripts/house-db.sh: run the house-listing CLI as the limited house_cli role
- deploy/systemd/house-scrape.{service,timer}
2026-10-24 14:13:29 +00:00
stan ea7d64a556 Dockerfile: ship house-tracker helpers so the listings CLI runs in the prod image
Deploy production / deploy (push) Successful in 2m44s
2026-10-24 14:09:13 +00:00
stan 6e528da403 house tracker: CLI to add, update, list and remove listings by hand
scripts/house-listing.ts (bun run house add|update|list|remove|restore) upserts
house.listings on (source, source_id) derived from the listing URL or address,
derives city_slug, records price_history, and accepts flags or JSON.
2026-10-24 14:09:13 +00:00
stan 85da5afdfe money: wishlist tier totals fit on one line (compact €, scales with card, exact amount in tooltip)
Deploy production / deploy (push) Successful in 2m54s
2026-10-24 14:09:07 +00:00
stan 427f4ed095 groceries: nightly AH/Jumbo catalogue import, unit-price normalisation, product groups and compare UI
Deploy production / deploy (push) Successful in 2m48s
2026-10-24 14:01:26 +00:00
stan 8dde5aa302 money: Revolut statement importer (CSV/Excel/PDF) with dedupe, dry run and start-balance removal
Deploy production / deploy (push) Successful in 2m34s
2026-10-24 13:48:01 +00:00
stan 5f67ad36e7 Groceries: private tracker at /trackers/groceries (stores, products, price history per store, favorites, cheapest highlighted); seeded AH, Jumbo, Lidl, Plus
Deploy production / deploy (push) Successful in 2m40s
2026-10-24 13:25:49 +00:00
stan b77c3f8cf5 Tasks: import TickTick backup CSV (csv: keys, matched against API rows, rekeyed when the API returns them)
Deploy production / deploy (push) Successful in 2m29s
2026-10-24 03:28:14 +00:00
stan 1754ea9316 Tasks: ignore placeholder checklist completion dates from TickTick
Deploy production / deploy (push) Successful in 2m34s
2026-10-24 03:10:53 +00:00
stan 6a127de950 Tasks: TickTick history sync (export + idempotent import, start_at/time_zone); trackers ordered tasks, money, books with single-noun names
Deploy production / deploy (push) Successful in 2m33s
2026-10-24 03:05:05 +00:00
stan 9d08e6af23 Lists: owner-only database browser/editor for all tables (meta.edit_log audit)
Deploy production / deploy (push) Successful in 2m33s
2026-10-24 02:52:18 +00:00
stan 941a9f16e1 data browser wip 2026-10-24 02:52:18 +00:00
stan c8205e474e Money: wish list sorted by tier then price (desc), theme-aware tier colours
Deploy production / deploy (push) Successful in 2m31s
2026-10-24 02:43:31 +00:00
stan 81ee02f11a books reader: fix the error when leaving a PDF (back button)
Deploy production / deploy (push) Has been cancelled
pdf.js 6 removed PDFDocumentProxy.destroy(), so the PdfReader teardown threw
"destroy is not a function" on every unmount, breaking the client-side
navigation back to the book page (and sometimes showing the error page).
Close the document through its loading task instead (closePdf), which also
cancels a load still in flight. Test covers the pdf.js API and closePdf.
2026-10-24 02:40:32 +00:00
stan eb80a830f5 Task + goal tracker: private tasks schema, /trackers/tasks page, idempotent seed import (daisy-import)
Deploy production / deploy (push) Successful in 2m38s
2026-10-24 02:37:48 +00:00
stan 988c6c31a9 Money: move /projects/money-tracker to /trackers/money, rename to Money, 308 redirects from old paths (bank-callback query kept)
Deploy production / deploy (push) Successful in 2m49s
2026-10-24 02:37:07 +00:00
stan 2af279e8a9 Money tracker: vertical month/year gridlines on wealth chart, keep range in ?range= URL param
Deploy production / deploy (push) Successful in 2m36s
2026-10-24 02:25:13 +00:00
stan faeb76a7e7 books reader: zoom, 1/2-page spreads, scroll vs paged mode
Deploy production / deploy (push) Has been cancelled
- Zoom buttons + Ctrl/Cmd +/-/0, Ctrl+wheel/trackpad pinch, touch pinch on PDFs;
  PDF scales the pdf.js render (sharp re-render after it settles), EPUB scales text.
  Remembered per format, and per book.
- One/two pages side by side: PDF rows with the cover alone, foliate max-column-count.
- Scroll vs Pages mode for both engines; PDF paged shows one page/spread fitted to the
  screen, prev/next move a whole spread; spreads stack when scrolling.
- Reading position is kept across zoom/spread/mode changes; progress keeps saving.
- layout.ts helpers with unit tests; old flow/fontSize/pdfZoom settings migrate.
2026-10-24 02:24:35 +00:00
stan a022c45499 Money tracker: accounts can be left out of total wealth (include_in_total)
Deploy production / deploy (push) Successful in 2m32s
Adds money.accounts.include_in_total (default true). Excluded accounts keep their own balance and line, but are left out of net worth, invested, this month, the projection and the total/All accounts lines.
2026-10-24 02:14:03 +00:00
stan 6f82d1350e deploy: write the books compose override in the deploy account home
Deploy production / deploy (push) Successful in 2m32s
Run #79 failed at "sudo tee /opt/personal-website/compose.books.yml": the deploy
account may only sudo-tee .env. Write the override to ~deploy instead; the
compose CLI runs as root and reads it from there.
2026-10-24 02:04:12 +00:00
stan 7a039b23f4 deploy: check the books dir from a root container (deploy user cannot traverse /home/stan)
Deploy production / deploy (push) Failing after 2m12s
Run #78 skipped the /books mount because [ -d /home/stan/books/library ] runs as
the deploy account, which has no access to /home/stan (0750). Check inside a
container with the dir bind-mounted instead; the mount itself is done by dockerd.
2026-10-24 01:59:11 +00:00
stan 8445eef3cf books migration: only call meta.sync() when permitted; deploy runs it as the app role
Deploy production / deploy (push) Successful in 2m35s
Run #77 failed in db-migrate with "permission denied for function sync": in prod
meta.sync() is granted to personal_app/personal_ddl, not to the schema owner
(personal) that runs migrations. The migration still registers the books tables in
meta.tables and syncs when it can (dev); deploy-remote.sh now runs
scripts/db-meta-sync.ts as DB_URL after migrating. Verified on a prod clone with
SET ROLE personal / personal_app.
2026-10-24 01:53:30 +00:00
stan 1d4cfd58c5 books: import zod as a namespace so tests pass under the Bun runtime in CI
Deploy production / deploy (push) Failing after 2m20s
The Docker build runs vitest via bun (no Node in oven/bun), where the named
`{ z }` import from zod 4 resolved to undefined; the rest of the repo already
uses `import * as z from 'zod'`.
2026-10-24 01:47:10 +00:00
stan 763d7881fb Money tracker: Knab CSV import, multi-bank linking, sum reconcile, history range
Deploy production / deploy (push) Failing after 23s
- Knab statement exports: per-account ids (knab:<account>:<Referentie>), routed by IBAN,
  transfers between own accounts merged into one tracker account are dropped (interest kept)
- Import: multiple files, hand-entered twins get the import id, hand entries equal to the
  sum of 2-3 payments within a day are replaced by them
- bank-link --bank revolut|abn|knab with per-bank default account; ASPSP notes printed
- bank-sync: longest history on an account first sync (--full to force), sum reconcile,
  per-session status so one bank failing does not mark the others
- Timeline: 1 year / 3 years / All history range
2026-10-24 01:37:40 +00:00
stan 2cada618bf books: regenerate migration as 20261024013208_books after money_bank_balance (old 010449/010518 would sort before the applied 011919 and be skipped)
Deploy production / deploy (push) Failing after 27s
2026-10-24 01:35:04 +00:00
stan 7914b0140b books-ingest: --no-move rehearsal mode, stable cover filenames, finished status, module-level log 2026-10-24 01:31:57 +00:00
stan 178fa8ddce books-ingest: safer title/ISBN matching, junk-author filter, GB quota breaker 2026-10-24 01:31:57 +00:00
stan 9c8f20a618 books: immersive reader route, PDF resume fix, scalable placeholder covers, read-only books mount in prod deploy, README 2026-10-24 01:31:57 +00:00
stan 9c46e281c2 books-ui: library, detail page, EPUB/PDF reader, reading status/rating/sessions migration, progress/notes APIs, owner gating and tests 2026-10-24 01:31:57 +00:00
stan 8b2dfed239 books: schema, migration and ingest script (rebased onto main; migration regenerated after money_bank_sync) 2026-10-24 01:31:57 +00:00
stan 2da375451a Money tracker: bank balance is the source of truth for synced accounts
Deploy production / deploy (push) Successful in 2m43s
Sync stores the bank-reported balance (ITAV preferred) on the account and keeps
one Bank balance adjustment row so the tracker total equals the bank balance.
Accounts panel shows the bank balance and flags any drift.
2026-10-24 01:20:20 +00:00
stan e4de2dcec3 Add privacy and terms pages
Deploy production / deploy (push) Successful in 2m28s
2026-10-24 00:50:46 +00:00
stan 00c1e8b1e7 money: quick-add bar, server-filtered transactions page, CSV import dedupe + Revolut statements 2026-10-24 00:50:46 +00:00
stan 9a1b21ec39 money: Enable Banking client, bank-link consent CLI, bank-sync with reconcile, systemd timer (not installed) 2026-10-24 00:50:45 +00:00
stan b1ce715ec7 money: bank-sync schema (account scope/iban/external uid, transaction external id/source, bank_sessions) 2026-10-24 00:50:45 +00:00
stan 064d41595f preflight: verify health grants and energy data
Deploy production / deploy (push) Successful in 2m20s
2026-10-24 00:27:29 +00:00
stan fa2456b99e Merge branch 'energy-tracker' into energy-merge 2026-10-24 00:25:34 +00:00
stan 8aa689af64 health: drop hair_progress; owner = Stan's account email only
Deploy production / deploy (push) Successful in 2m22s
Regenerated the (not yet deployed) health migration without hair_progress.
2026-10-24 00:22:24 +00:00
stan 8275f1fb22 Add private health tracker (owner-only)
- health schema: vaccinations, body_measurements, workouts, nutrition_daily,
  sleep (generated hours), medications, hair_progress, appointments
- migration with updated_at triggers; grants to personal_app only
- /trackers/health overview with add/edit/delete, owner-gated (404 otherwise),
  noindex + private no-store, hidden from listings for non-owners
- owner-only JSON/CSV import endpoint and scripts/health-import.ts
2026-10-24 00:14:07 +00:00
stan 0cf5d44062 Add energy tracker (/projects/energy)
Public, read-only page over the ned-collector energy schema: latest-hour
mix and per-source utilization, generation vs consumption with CO2
intensity (day/week/month/12 months/all years), NED forecast, gas storage
by year and per site, and gas-fired power share vs storage fill.
Incomplete hours (sources not summing to the NED total) are left out and
partial days/months/years are marked.
2026-10-23 23:11:27 +00:00
stan 88837af624 Rename repo/image path to stan/website; retag legacy images on rollback
Deploy production / deploy (push) Successful in 2m23s
2026-10-23 22:53:23 +00:00
stan 45f2bbb198 db-refresh-dev: own dev DB as personal_dev, no prod grants; PG_CONTAINER mode
Deploy production / deploy (push) Successful in 3m49s
2026-10-23 22:27:17 +00:00
stan 36af5675e9 Merge db-schemas: Drizzle schemas, prod-only pipeline, trackers
Deploy production / deploy (push) Failing after 14s
2026-10-23 22:09:54 +00:00
stan 7e69d1e888 ui: separate trackers from projects; keep header dropdown on top
- /trackers index, Trackers section on the homepage and in the header nav;
  /projects lists only projects (tracker URLs unchanged)
- header is its own z-50 layer and <main> is isolated, so maps, charts and
  sticky tables no longer paint over the nav dropdowns
2026-10-23 22:03:59 +00:00
stan 2915135ed8 deploy: prod-only pipeline with Drizzle migrations; dev refresh + preview
- push to main builds, backs up prod (pg_dump 17), runs db-migrate + seeds,
  preflights and deploys; rollback = workflow_dispatch with rollback_tag
- staging workflow, promote step and migrate-*.ts / old SQL removed
- DB_URL = app role, DB_MIGRATE_URL = owner role
- scripts/db-refresh-dev.sh (prod dump -> local dev DB), scripts/preview.sh <branch>
2026-10-23 22:03:59 +00:00
stan 4cfe6bad6c app: lists on meta tables, schema-qualified SQL, typed columns
- lists read/write real lists.* tables via meta.tables/meta.columns and the
  SECURITY DEFINER meta functions; typed extra columns in the item forms
- old numeric list URLs 308-redirect to the slug
- include_recurring is boolean, osu accuracy/pp/rate numeric
- raw SQL qualified with the new schemas
2026-10-23 22:03:42 +00:00
stan 64fb8df262 db: Drizzle schemas on domain Postgres schemas, baseline migration, reorg SQL
- pgSchema tables for auth, money, house, ref, games, cs, animaldex, site, meta
  (lists excluded via schemaFilter; runtime list tables are managed by meta.*)
- drizzle/ baseline matches the reorged DB exactly (catalog diff = 0 on rehearsal)
- db/reorg: one-time SQL that moves the flat public schema (rehearsed on a prod copy)
- scripts/db-migrate.ts: migrator with --init to record the baseline and a guard
  against running the baseline on a non-empty, unrecorded database
2026-10-23 22:03:42 +00:00
stanandClaude Opus 5.5 f94e3dc8ac fix: use namespace zod import in house tracker types
Test and deploy staging / staging (push) Successful in 2m46s
`import { z } from 'zod'` is undefined when vitest runs under Bun (as in the
Docker build), matching the earlier fix in eca43c8.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 22:20:22 +00:00
stanandClaude Opus 5.5 54924b39f0 feat: upgrade to SvelteKit 3 and adapter-bun
Test and deploy staging / staging (push) Failing after 43s
Run the sveltekit-3 migration and finish its manual tasks:

- Move kit config into the sveltekit() Vite plugin; drop svelte.config.js
- Replace $lib with #lib subpath imports
- Declare env vars in src/env.ts and import them from $app/env/{private,public}
- Consolidate param matchers into src/params.ts
- Use error(status, message), Response.json, refreshAll and goto reset/shallow
- Fall back to a full page load when goto rejects a login return path

Switch from adapter-node to adapter-bun: the build script runs Vite under
Bun (the adapter requires it) and the image starts with `bun ./build`.
Runtime env names (PORT, BODY_SIZE_LIMIT, ADDRESS_HEADER, ...) are unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 22:17:30 +00:00
stan b52e9188f4 house worker 2026-10-11 22:05:05 +00:00
stan ecd49fc410 fix: parse real Pararius search titles correctly 2026-10-11 21:38:47 +00:00
stan 4ea0ba2d48 fix: enforce house worker request spacing and ignore local secrets 2026-10-11 21:14:41 +00:00