Commit Graph
100 Commits
Author SHA1 Message Date
stan 772e699655 data holders: private tracker of every organisation holding my address, email, phone or IBAN
Deploy production / deploy (push) Has been cancelled
dataholders schema (orgs + identity) with migration and personal_app grants,
idempotent CSV import (upsert on name+login, never wipes, keeps site edits and
ticks), owner-only /trackers/data-holders with search, filters, pagination,
inline edit/add and a moving checklist per identifier
2026-10-25 16:10:24 +00:00
stan fd4a34b495 money: thick €0 baseline on the wealth charts (all modes) so dips toward zero or below stand out
Deploy production / deploy (push) Successful in 1m8s
2026-10-25 16:06:48 +00:00
stan 80803ef5ac games: automatic CS2 / PUBG / R6 match history — games.matches, match_players, seasons, snapshots, accounts; in-app poller (Leetify, FACEIT, Steam share codes, PUBG API, Ubisoft) every 20 min plus scripts/games-ingest.ts for backfills; match history, stats, maps and seasons on the per-game pages
Deploy production / deploy (push) Successful in 1m6s
2026-10-25 16:00:48 +00:00
stan 9114b5433b money: archived accounts (accounts.archived) — closed banks stay in history, net worth and charts but leave the quick balances, quick add and account pickers; archived section in the accounts panel; quick add defaults to Revolut
Deploy production / deploy (push) Successful in 1m7s
2026-10-25 15:42:40 +00:00
stan 968ec34ac5 games: collapse non-featured game chips behind +N more; slide-only flyout animation
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 15:25:41 +00:00
stan d79b73ad83 games: per-game pages, games.library table, games group in header/tiles/start
Deploy production / deploy (push) Successful in 1m7s
2026-10-25 15:20:45 +00:00
stan 037a525f91 spotters: brands, makers and operators with a logo first, activity order kept inside each group
Deploy production / deploy (push) Successful in 1m6s
2026-10-25 15:05:11 +00:00
stan 8045362852 money: left-align accounts list rows (undo Button centring, fixed height and nowrap)
Deploy production / deploy (push) Successful in 1m6s
2026-10-25 15:00:49 +00:00
stan 152880f5ab spotters: 120 website-icon logos for makers and operators without a free Commons logo
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 14:51:33 +00:00
stan 7aeb31c46a spotters: stricter logo checks (no photos, plates, insignia or old names; --recheck), planes operator bonus weighted down for historic types, Türkiye for iNat
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 14:44:27 +00:00
stan 3668c9e383 gitignore python bytecode
Deploy production / deploy (push) Successful in 1m11s
2026-10-25 14:24:50 +00:00
stan 4af041719c start: wider spotting tile, filter narrows spotting chips
Deploy production / deploy (push) Has been cancelled
2026-10-25 14:24:11 +00:00
stan 27987fb8e7 reading: owner archive / restore / delete / merge for books (⋯ menu on cards, rows and detail pages), archived filter, tombstones so merged ids redirect and the ingest never recreates deleted works, books-quarantine.py for deleted files
Deploy production / deploy (push) Successful in 1m11s
2026-10-25 14:22:40 +00:00
stan 8a8ed1642e start: trackers section mirroring the header dropdown (same order and icons, spotting chips, f filter)
Deploy production / deploy (push) Successful in 1m11s
2026-10-25 14:21:23 +00:00
stan 11fa8ec006 spotters: fix 500 on detail pages of seen items (timestamp comes back as text); logos script uses small separate Wikidata queries
Deploy production / deploy (push) Successful in 1m10s
2026-10-25 14:10:53 +00:00
stan 0f8db8e432 music: fix tooltip and streak spacing, sort genre tooltip, shorter clock cells
Deploy production / deploy (push) Successful in 1m10s
2026-10-25 14:06:43 +00:00
stan 516bc15545 music: Last.fm-style stats with 7d/30d/1y/all ranges and genres
Deploy production / deploy (push) Successful in 1m14s
- Range picker (?range=7d|30d|1y|all) drives every section; the hours chart
  covers the whole range (daily for 7d/30d, weekly for 1y, monthly for all).
- Genres from Last.fm artist top tags (music.artist_tags, normalised and
  filtered), split by artist listening time, with a per-bucket stacked chart.
- Listening clock, new artists, comparison with the previous period and top
  movers, streaks, milestones, top albums with art, rank changes.
- music.play_facts materialized view (refreshed by the app when plays arrive)
  plus a per-range cache keep the page fast.
- scripts/music-fetch-tags.ts backfills tags, most-played artists first.
2026-10-25 14:03:39 +00:00
stan 5e4cd83748 spotters: logo coverage script (Wikidata logo/icon, multi-language infobox, website icon fallback), cheaper planes operator queries, refresh adds logos for new orgs
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 13:54:27 +00:00
stan 7d6cee26a8 house tracker: contact status per listing (whose turn, last message, viewing) and labelled filters
Deploy production / deploy (push) Has been cancelled
2026-10-25 13:53:33 +00:00
stan df081b8058 music: backup play log from now-playing samples (origin nowplaying; 30 s or half the track, ignoring pauses and seeks); recently-played takes those rows over with its exact timestamp
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 13:52:38 +00:00
stan d6c5dde2c1 reading: hide book-only stats on the papers/articles tabs, site letter on articles without an image
Deploy production / deploy (push) Successful in 1m10s
2026-10-25 13:48:05 +00:00
stan e31e1be73f reading: split the book tracker into books, papers and articles (kind column + migration classifying 20 papers), segmented tabs with counts, article cards that open the link, owner + add link with server-side unfurl, kind switch on detail pages, /trackers/reading alias
Deploy production / deploy (push) Successful in 1m8s
2026-10-25 13:42:51 +00:00
stan 7b5faf6e74 start: collapsible link groups (remembered per browser), links filter (f, Enter opens first match), brand marks + saved favicons for bookmarked sites
Deploy production / deploy (push) Has been cancelled
2026-10-25 13:41:59 +00:00
stan 628e5cb9b3 music poller: a 429 on recently-played pauses only the play log for the full Retry-After; now playing keeps polling every 5 s; player 429s honour Retry-After up to 24 h
Deploy production / deploy (push) Successful in 1m8s
2026-10-25 13:25:25 +00:00
stan 253cd69424 spotters: most-active-in sort with country/region selector, collection tracking (seen marks, progress, filters), refresh scripts score activity and report new NL entries
Deploy production / deploy (push) Has been cancelled
2026-10-25 13:24:37 +00:00
stan 3f294df337 music: hours tooltip opens on tap (focus no longer closes it straight away)
Deploy production / deploy (push) Successful in 1m7s
2026-10-25 13:21:28 +00:00
stan 20ad42b247 handleError for SvelteKit 3: ids only for unknown errors, compact 404 log line; error page suggestions prefer the real parent over the section
Deploy production / deploy (push) Successful in 1m10s
2026-10-25 13:15:41 +00:00
stan 92d6da959d daisy-hook: accept a full "Name: value" header setting, redact the key from logs, retry once; start: brand icons on link and service tiles (trimmed simple-icons + saved favicons, monogram fallback)
Deploy production / deploy (push) Successful in 1m7s
2026-10-25 13:12:16 +00:00
stan a89a187346 Global error page: ErrorView with per-status copy, did-you-mean suggestions, error ids from handleError, static error.html; 404 instead of 500 for bad progress ids; tolerate full header line in DAISY_TASK_WEBHOOK_HEADER and stop logging raw fetch errors
Deploy production / deploy (push) Successful in 1m9s
2026-10-25 13:10:51 +00:00
stan f86c8ef294 spotters: activity (per-country score) and seen (collection) tables for cars, planes, trains, wildlife
Deploy production / deploy (push) Successful in 1m7s
2026-10-25 13:09:02 +00:00
stan 85c6f89e36 music: styled hover/focus/tap tooltip with exact hours and date on the hours-per-day chart
Deploy production / deploy (push) Has been cancelled
2026-10-25 13:08:06 +00:00
stan cc34f5751b spotters: fix random 404 on client navigation (random is a page load, not an endpoint shadowed by [slug]); square logo tiles everywhere
Deploy production / deploy (push) Has been cancelled
2026-10-25 13:07:26 +00:00
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