home..

Loose Ends

Apr 26

Slow through Wednesday, then Thursday opened up. Wednesday I kept opening things and closing them. Nothing stuck – not a bad mood, just flat. Then Thursday I stopped waiting for it and started working anyway, and it came. Most of the real work landed in the last two days.

apps/tally

Tally moved into the apps monorepo a week ago. A few things broke in transit. Footer links still pointed at the old standalone GitHub repo – fixed to the monorepo path. iOS target had two variables declared var that were never mutated; flipped them to let, regenerated the xcodeproj so Xcode would finally see SettingsView. Added ROADMAP.md with a live brain dump: earning-per-hour drift, a scaling earnings graph, and a single config field for income bumps.

v3.1.0 landed Thursday. Three additions: a DTC application tracker (filed April 2026, sitting at the CRA processing step), a CRA upcoming payments section with GST/HST $174.50 flagged for June 5, and a timing warning that blocks report submission before the 28th of the period. PWD bumped to week 8, decision pending. All four went into the web app and the iOS SwiftUI target at the same time.

Design system pass followed. Dollar amounts now count up from zero on first render – 600ms ease-out via requestAnimationFrame. A 2px bar beneath each amount tracks position in the 30-day cycle, pulse dot at the leading edge. Three or fewer days to payday shifts the dot amber. Paid amounts fade to 35% opacity until undone. The PWD active step breathes. Tab switches fade at 0.22s. None of it was strictly necessary but the page stopped feeling static.

nulljosh.github.io

The portfolio got a full rebuild Thursday. The carousel-plus-device-frame layout had become hard to maintain and broke in light mode.

Replaced it with a typographic list: weight-200 hero, prefers-color-scheme auto light/dark with a manual toggle, GitHub contribution heatmap with click-to-expand year popovers, and a live stats strip (films, TV, code, writing, weather, coffee). Added Currently and Background sections. The index.html went from 2,081 lines to a net 655 added (1,426 removed). Cadence added to the project list while in there. Two follow-up fixes: flex-wrap on the items list to prevent overflow on mobile, and the Currently section brought in line with the items style.

apps/roost

FavoritesContext was running Array.includes() inside a filter memo – O(n) per listing on every render. Derived a favoriteSet via useMemo, swapped all lookups to Set.has(). Added vercel.json with security headers.

The vibe pass followed: ported the portfolio dark editorial design over. Same treatment as spark – dark background, typographic hierarchy, flat colors.

apps/spark

Got the same vibe pass as roost: portfolio dark editorial design applied end-to-end.

apps/dose

Extracted shortDate, shortTime, and longDate into shared date utility functions. They were inline and duplicated across several views.

Security

Pass across dose, fuse, life, spark, and tally: added X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, X-XSS-Protection, and HSTS to each vercel.json. Hardened .gitignore across the monorepo, dotfiles, and the portfolio repo to block .env variants from staging.

apps/life

The money line was behind – updated to call out trillion-dollar AI labs by name. Version bumped to 4.1.1.

dotfiles

General todos brain-dump committed. Ticked off two completed items: savings prompt and a stale downloads deletion script.

thursday

Pre-calc in the afternoon. Math test coming up, keeping it steady. The week started as loose-end cleanup and turned into a full build session by Thursday night.

friday

Tally refactor: extracted renderTracker() and TimelineCard out of ContentView.swift. Duplicate scaffolding was spread across three tracker types. Collapsed to two functions.

Submitted the remaining school assignments. Science project still needs to go in – that’s next week’s problem.

Did a broader codebase cleanup pass. The Vercel hack earlier this week was a good forcing function. Hardened security headers, tightened .gitignore across everything, audited exposed env vars. Good to have it done.

On the AI tooling side: Opus 4.7 is a disappointment. GPT 5.5 is decent but not a clear winner. Considering moving more work to Codex. Nothing decided yet.

monday

claude-usage got the biggest update yet. Budget progress bars landed – each limit (session, weekly, extra) now shows $X/$Y with a bar that tracks spend. Then the entire dashboard was rebuilt as a 4-tab React UI from a design handoff. Tabs for Overview, Sessions, History, and Settings. The old single-page layout is gone.

Roost got a pixel art avatar generator – deterministic 8x8 sprites from username hash, renders as SVG. Added a migration step to README for the avatar_url column.

dose: Concerta added to the substances list.

systems restructure: cleared all 21 legacy subsystem implementations (NullOS, nullC, voxel-engine, blockchain, bittorrent, container-runtime, physics-engine, and 14 others) from the repo. The implementations were years of from-scratch proofs-of-concept. Repo now holds only top-level config and docs. Crash last night corrupted the git index mid-commit – fixed with a manual object rehash on startup this morning, then pushed clean.

sunday

Cleared out a backlog of project notes that had piled up in Downloads as PDFs – one per repo, each just “next steps?” and a sentence or two. Triaged the lot, deleted nulljosh/path (stub repo, never used), updated roadmaps across nyc-web, bcgd, spark, dose, and tally with the outstanding items.

Also found the cadence tracking question: the journal git history was squashed to a single commit earlier in the month, which nuked cadence’s commit graph for that repo. Nothing to fix – cadence tracks forward from here.

School tracking updated. All Pre-Calc 12 learning guides done (units 1–7). Biology 12 all done – nine units, every project submitted. The school web dashboard now shows the full unit breakdown and the UVic transcript submission (Apr 23). Only thing left is the pre-calc module tests. Need 77%+ for UVic CS admission.

Also redeployed bcgd/web – it had been redirecting to the Vercel login screen since Apr 14. Fixed with a fresh prod deploy. Laid out a prioritized multi-session roadmap covering NYC difficulty levels, epiphany critical fixes, cadence API wiring, tally payment chart, and a bcgd site clone.

Portfolio got a second pass. Wiretext and Fuse added to the portfolio project list, projects reordered by shipped quality, Currently section updated to match where things actually are.

NYC city sim got a difficulty selector: Easy, Medium, Hard. Easy starts with generous resources, Hard starts constrained. Makes the game actually worth replaying from a blank slate.

Tally CRA payments section got sparkline bars – a small horizontal bar behind each amount scaled relative to the largest payment. Pure visual, no data change.

Cadence submodule ref bumped to pull an iOS/macOS API fix.

Deleted browser, browser-ios, and nyc-wallpaper from the apps monorepo. All three were placeholder scaffolds with no active development. Dead weight, gone.