Changelog

607 changes across 22 active days in the last 30.

Every line below is a commit message, published as written. Merge commits, tooling commits and planning notes are left out; nothing is summarised or rewritten. Today is still in progress and will grow until the next build.

Tuesday 25 August 2026

Athenana

  • Alternate the bands down a person's blog, one to a post
  • Drop the stand-in picture, and band the blog pages
  • Band the front page too, and sweep the vocabulary it replaced
  • Build the features page as bands
  • Record the owner's ruling: a trashed item does not count as a use
  • Put the sign-in caveat under the button, at the button's width
  • Spell the features page out, all of it
  • Write down why the protections see trashed items and the counting does not
  • Give the vocabulary test tags the window can actually see
  • Make the counting-trap test actually read a use count
  • A top bar on the marketing pages, and the blogs line after the stream
  • Refuse to delete a hand-applied tag in the applier, not just the decider
  • Reject a --target that is not a positive integer
  • Move budgetTag to tests/Pest.php so the ceiling command's tests run alone
  • Run the tag ceiling nightly at 03:25
  • Require --user with --target so an override always names its account
  • Add athenana:enforce-tag-ceiling
  • A video on any item, and the song's video under its cover
  • Decide which tags must go for an account to fit under its ceiling
  • Give each account a configurable tag ceiling, defaulting to 900
  • Extract tag removal so prune and ceiling suppress identically
  • Show the model the most-used tags rather than the first 200 alphabetically
  • Stop collecting feeds that could never carry anything
  • Put the edit box with the tags, not at the foot of the page
  • Draw the tags once, and say which public page it means
  • Move InstallPageTest off the real Safari build
  • Assert the stamp against the instance that produced it
  • Truncate on the way out, not just on the way in

WyHealth

  • Count background wakes, because a timestamp could not survive being read
  • Show the lockup at its documented minimum size
  • Make background delivery say whether it is actually on
  • Rewind the sync cursor when a drain finishes
  • Keep a baseline run from overwriting the last real report
  • Audit the deployment daily, and keep the baseline free of secrets
  • Start HealthKit where a session is guaranteed, not at launch
  • Stop advertising Next.js in the x-powered-by header
  • Send signed-in users to wyhealth.app, not to the socket we bound
  • Refuse to deploy uncommitted web/ code, and stamp what shipped
  • Send HSTS, so the first request is never the insecure one
  • Build the landing page out of the mark's own geometry

Wy5

  • Show people their own topics in Browse, whatever the list count
  • Open a newly created topic, which the browse threshold had made unreachable

WyAuto

  • Fetch the EPA figures, and record that they were fetched
  • Offer camera readings on the entry screen, confirmed before they land

WyHome

  • Make a second property reachable, and pick the state from a list

wyome.com

  • Say why the NUL-wrapped record separator is actually safe
  • Refuse to publish an empty changelog over a good one
  • Close three ways a suppressed name still reached the public page
  • Rebuild the changelog every morning, from a laptop that may be asleep
  • Put Blog in the footers too, where it never was
  • Put Changelog in the nav, and the Blog link the statistics page never got
  • Write the page, stamp the stylesheet, and put it on the server
  • Make the two suppression lists disagree loudly instead of quietly
  • Keep a client's name off a public page, whole commit at a time
  • Group the commits by day and render them, escaping every subject
  • Make a record boundary something a commit message cannot forge
  • Read paths as git stores them, and fail loudly on a record we cannot parse
  • Read each repo's log, with merges judged by parent and not by word
  • Judge a commit by the files it touched, not by how it was worded
  • Drop tooling and process commits, and keep the ones about merging
  • Name the seven projects, and refuse two worktrees of one repo
  • Ignore the SDD scratch, and put referrers/ back in the nav task
  • Add wyhealth.app to the statistics, and stop counting HTTPS twice
  • Ignore the panel's meta.json, but keep the panel

Hosting monitor

  • HSTS on all four .com hosts, and a correction
  • Send HSTS where the vhost will take it
  • Record what got fixed, and question how
  • Render the checks and what to do about them
  • Look at directory modes, not just file modes
  • Watch the whole box, not just the one site on it

Monday 24 August 2026

Athenana

  • Drop the stand-in tile above a video, and stop cropping the frame
  • Size the song facade on every surface, not only the blog
  • Show a matched song's video on the front page and the permalink
  • Recognise the non-breaking space Apple actually sends
  • Let a song entry sit with the posts around it
  • Write down the key the song-video feature needs
  • Keep the play marker legible over a dark video still
  • Collapse the third copy of the image-storing body
  • Stop recording an undecodable answer as "there is no video"
  • Make the facade's privacy assertion able to fail
  • Correct what the privacy policy says about Apple and about Google
  • Name Google in the privacy policy, and say what pressing play discloses
  • Keep a song's own metadata when re-reading it
  • Move the song-video play handler out of an inline onclick
  • Move feedFor() into Pest.php so a parallel run can see it
  • Show a matched video behind a facade that calls nobody
  • Move song test helpers into tests/Pest.php so a single file runs alone
  • Publish the preview image in RSS, not only in JSON Feed
  • Copy the video cover locally so the facade never calls Google
  • Narrow the FindSongVideo test catch-all and forbid stray requests
  • Find a song's video during enrichment, and only ever ask once
  • Match a song to a video by duration, or not at all
  • Security: redact API key from exception messages
  • test isTopicChannel() directly instead of through HTTP searches
  • Add a YouTube client that is inert without a key
  • Add the song_video column, which must record a miss as well as a hit
  • Recognise a shared Apple Music track without asking a model
  • Make the feeds screen usable at three hundred subscriptions
  • Let another site read a blog's feeds
  • Send the picture with a photo
  • Deliver only what a receiver can show, and keep the outbox correct
  • Federate the blogs: Activity Streams and ActivityPub
  • Match public image geometry to the private area
  • Stop one numerically-named tag from breaking the whole bulk reject
  • Show received mentions on a post, once the owner says so
  • Fix entry image sizing, blog back-links and tag navigation
  • Correct the privacy policy for what shipped today
  • Let each page advertise its own feeds, and only its own
  • Give each person their own blog
  • Give the writing somewhere to live
  • Give images and highlights a page, and raise their cap to blog
  • Do not finish with an item on a question that was never put
  • Replace the private/public boolean with a three-rung ladder
  • Carry links only in the anonymous stream
  • Stop publishing a link's private annotation in the feeds
  • Fall back to the archive when a site refuses to talk to a server
  • Say how much "Reject everything below" would actually reject
  • Gate the front page on consent rather than on role
  • Accept posts over Micropub
  • Publish the front page as RSS and JSON Feed
  • Emit the XML declaration from PHP, because this server runs short tags
  • Publish a sitemap, generated from what is actually public

WyHealth

  • Close the plaintext port, and move the deploy off Passenger
  • aggregate respiratory_rate and oxygen_saturation daily
  • let a user update their own sample rows
  • never 500 because one page repeated a bucket key
  • Build the dashboard here, ship the result to DreamHost
  • aggregate high-volume metrics into daily buckets on the device
  • add a reversible ingest circuit breaker
  • carry the device timezone on the profile instead of hardcoding Denver
  • show per-page sync progress and the brand lockup on the home screen
  • background delivery and BGAppRefreshTask drive sync without the app open
  • sync sleep stages and heart events
  • sync workouts through the same paged anchored path
  • paged resumable sync — backfill and delta share one anchored path
  • iOS payload types and the full 23-type quantity mapping table
  • ingest workouts, sleep stages and heart events alongside samples
  • full v1 metric type list with per-type canonical unit enforcement
  • schema for workouts, sleep stages, heart events and profile timezone
  • the dashboard logo lost half its wordmark in dark mode
  • adopt the WyHealth logo system — app icon, favicons, dashboard lockup
  • a single reading rendered as an invisible dot, reading as missing data
  • iOS app — native Sign in with Apple, HealthKit sync engine, XcodeGen project
  • dashboard steel thread — steps and weight charts, last-synced indicator
  • ingest edge function — validated, idempotent, RLS-bound
  • Next.js app with Apple sign-in, protected dashboard, RLS isolation tests
  • core schema — profiles, samples, sync_state with RLS

wyome.com

  • Show a rolling month, and stop hiding data behind a gap
  • Privacy: the song play button, and the third party it reaches
  • The statistics page said one site was a real network hop; none is
  • Name WyHealth's domain, without linking to it
  • Add tools/crop.py, because sips crops from the centre
  • Scroll the page before capturing, or lazy images never load
  • Add tools/shoot.py — screenshot a page in both colour schemes
  • Publish the Athenana blog on wyome.com
  • Give WyHealth its real icon
  • Rewrite Athenana's description for the consent model and blogs
  • Add WyHealth to the site, ahead of its launch
  • Refresh the banked archive from the server
  • Commit the sitrep panel; keep only its local server scratch ignored
  • Move the referral totals down beside the list they total
  • Move the referrer prose down to the referral list it describes
  • Refresh the banked archive from the server
  • Show whether the sites are actually up, on the statistics page
  • Run the archive pull daily, so it does not depend on remembering
  • Add --pull, so the banked archive cannot rot unnoticed
  • Refresh the banked archive from the server, adding 24 August
  • Ignore the local sitrep-panel scratch directory

Sunday 23 August 2026

Athenana

  • Give the test suite enough memory to finish
  • Show a note's own comment on its public page, and promote a photo to header
  • Offer only your own photos to a gallery, never a link's preview
  • Add a photo to a gallery from the web, or from your own library
  • Give a post a photo gallery
  • Show a note's own picture on its card
  • Let a note be published, with its own entry style and a permalink
  • Fetch photo thumbnails from MyMind, because GD will not make them
  • Fetch MyMind photos from /objects/{id}/blob
  • Read entityType when importing, so photos stop becoming empty notes
  • Serve the item page's picture from the owner's own route
  • Stamp asset URLs so a replaced picture is actually seen
  • The photo Shortcut is installable by anyone now
  • Keep the summary when the page cannot be read again
  • Drop the "all N tags" link from the jump-to row
  • Stop claiming a page is fine when the site would not answer
  • Rewrite the summary when a link is read again
  • Read a saved link again, and say so when the page has gone
  • Move Discovery topics onto Discover and out of the menu
  • Stop the suggestion count displacing the tag icon
  • Offer a 90% threshold on the suggested-tag bulk reject
  • Move Manage tags onto the Tags screen and out of the menu
  • Actually send the page a suggested-tag decision was made on
  • Give the board's search help a gap under it
  • Ship the photo Shortcut that actually works, and drop the diagnostic
  • TEMPORARY: log the shape of a refused image save
  • Capture the working photo Shortcut
  • An image action with no input produces nothing
  • Offer all five Shortcuts on the Extensions page
  • Capture the Song Shortcut — all five now exist
  • Capture the Notes Shortcut, and check the input is actually read
  • Check that a capture's body matches the type it declares
  • Capture the News and Photo Shortcuts, and check every capture
  • Drop the Suggested tags entry now that Tags carries the way in
  • Make suggested tags reachable, and visible, on a phone
  • Serve a Shortcut that saves links, and stop the capture clobbering
  • Pin the payloads for five single-purpose shortcuts
  • Treat a save that carries a link as a link, whatever came with it
  • Space the wordmark's dot, and enlarge the mark in the icons
  • Use the real wordmark on the public page, and let it follow the theme
  • Give every checkout its own test database
  • Owe a mention to every public link, as the owner decided
  • Source Webmentions from the permalink, and stop withdrawing on rotation
  • Note the pictures a page carried, so one can be chosen later
  • Let a picture you set by hand win on the board too
  • Set an item's picture from a URL as well as a file
  • Let an item be given its own picture, or have it replaced
  • Receive Webmentions: accept, verify, store, display nothing
  • Give every public item a page, and read the front page as a blog
  • Keep your place in the suggestion queue after every decision
  • Stop the suggestion queue burying its own good suggestions
  • Export the library as Markdown notes, not just as a spreadsheet

wyome.com

  • Add wyome.com's sitemap, and move two credential backups out of a web root
  • Add robots.txt to all five sites that were missing one
  • Add broken links, missing files and most-requested pages
  • Add the bot/human split and bandwidth to the statistics page
  • Move the statistics page to /statistics/, leaving a redirect behind
  • Add a country map to the referrers page, geolocated offline
  • Publish the referrers page, add a traffic chart, and build it nightly
  • Add an unlisted referrer page built from every site's access logs

Saturday 22 August 2026

Athenana

  • Save a search as a shelf that never needs filing
  • Schedule the backfill, and stop the two bulk passes double-spending
  • Send Webmentions for the front page's links, and withdraw them when they leave
  • Back-fill the library that was imported and never read, without ruining it
  • Import a bookmarks file, and cap what enrichment may cost
  • Make the all-tags link land on all the tags
  • Move MyMind sync off the sidebar and give imports a home on Account
  • Pin the Public/Private switch to one column on What's public
  • Recognise a bot-wall however the message phrases it
  • Say what failed in words, instead of printing the exception
  • Save the link the share sheet gave us, whatever else came with it
  • Lay the public page out as masonry, not a stretching grid
  • Add a dark theme, solved for contrast parity rather than chosen
  • Badge a saved link whose original page is gone
  • Export everything you have saved as a CSV
  • Label the bottom bar's icons
  • Pin that every Shortcut request must report its result
  • Add two keyboard shortcuts
  • Reveal the search operators that already worked
  • Add a markdown reference beside the fields that accept it
  • Merge API tokens into the Extensions page
  • Rename Members to Admin, and let the owner see their own front page
  • Say so when a save brings something back from the trash
  • Fit feed titles to their column, and correct three stale notes
  • Six more findings from the usability review
  • Show the domain rather than a bare URL on an untitled link
  • Stop the visibility controls claiming things they cannot know
  • Four small fixes from the usability review
  • Record that filling the infinite-scroll seam was declined

Wy5

  • Correct spelling in the typeahead, not only on submit

wyome.com

  • Say what Athenana's front page shows, and that it sends Webmentions

Friday 21 August 2026

Athenana

  • Draw Random as a pill matching Save something
  • Keep tag ids out of the query string, so the WAF stops eating selections
  • Move Random back to the sidebar, under Save something
  • Say on the board when a page could not be read
  • Take the product name from config in the new feed copy
  • Add a way to subscribe to a feed by pasting its URL
  • Stop mobile list rows destroying the title, and give mobile a way out
  • Strip session/cookie middleware from the public preview route
  • Stop the host's mod_expires overriding our own Cache-Control

Thursday 20 August 2026

Athenana

  • Write down the fleet-wide backfill, and correct the index comment
  • Say what is public in a way that is true for every account
  • Make the public surfaces agree, and make the kill switch kill
  • Say in the privacy policy what is now shown publicly
  • Add the account-wide keep everything private switch
  • Add the What's public screen
  • Let one item be marked private or public
  • Show the owner's recent public links on the landing page
  • Serve publisher previews publicly, and nothing else
  • Open / to the public and move the board to /board
  • Apply the PublicItems rules as global scopes so an orWhere cannot escape
  • Add PublicItems, the one definition of publicly visible
  • Add is_private to items and keep_items_private to users
  • Stop TagCounts::sort() deprecating on every board render

Wednesday 19 August 2026

Athenana

  • Merge the two install screens, and move Random into the jump row
  • Fix rankDiscoveries() returning [] on every live call

Tuesday 18 August 2026

Athenana

  • Remove the List nav entry, which duplicated the board's layout switch
  • Read image dimensions from the header, not the guarded decode path
  • Populate width/height on uploaded image assets
  • Lead image items with a metadata panel instead of the enrichment apology
  • Add a Random link that opens one item from the whole library
  • Name the title field in the heading above it
  • Say in the log why the discovery ranking fell back
  • Gate discovery-save enrichment dispatch on wasRecentlyCreated
  • Fix branch-level review findings on the discovery list
  • Add discovery topic settings and close out the feature
  • Add the Discover screen and one-tap saving
  • Fix review findings: name the trashed-item scope decision, prove wrapper resolution with a real redirect
  • Build a day's discovery list and schedule it for 5am Eastern
  • Cover the malformed-body failure mode in rankDiscoveries tests
  • Stop the privacy page pointing at a repository nobody can read
  • Rank a discovery shortlist with Claude
  • Extract the guarded fetch shared by the three discovery sources
  • Add the three discovery sources
  • Apply Pint style fixes to TopicsForToday (import ordering, FQCN)
  • Resolve a day's topics: ten most used plus five seeded wildcards
  • Add the discovery items and topics tables
  • One token, asked once — and the install question is confirmed working
  • Recapture the Shortcut, and record the double token prompt
  • Test and document the captured Share to Athenana artefact
  • Follow the artefact: it is called Share to Athenana, and Apple signs it
  • Make the item title editable
  • Show a saved photo whole instead of cropping it like a screenshot

Wy5

  • Stop the member-ballots checks depending on hand-made fixture data
  • Stop the server deleting every non-Latin character from a slug
  • Fold vocabulary variants into one topic, and keep thin ones out of Browse
  • Say what a topic is asking for, not just its category

WyAuto

  • Add one camera wrapper and the confirmation every scan passes through
  • Read entitlement from StoreKit and mirror it nowhere
  • Reach vPIC and the EPA, and ask them for JSON
  • Decode both spec APIs, including the menu that is not an array
  • Let the labels assign pump roles and the arithmetic check them
  • Rank odometer candidates rather than picking one

WyHome

  • Let a job be rebooked after a contractor does not turn up
  • Fix two bits of copy nobody could see until the menus worked
  • Group every form, so long labels stop breaking sheets on macOS

wyome.com

  • Describe how Athenana is actually saved to, on all three pages

Monday 17 August 2026

Athenana

  • Say the Chrome listing is public, because it is
  • Fix iPhone setup screen being unreachable on the device it is for
  • Raise the screenshot ceiling to match the server, and correct why
  • Fix orphaned/world-readable temp file and fail-open token guard in ios/import.php
  • Add ios/import.php to capture, verify and sign the Shortcut
  • Serve the committed Shortcut from the setup screen
  • Add an iPhone setup screen that mints a save-only token

Sunday 16 August 2026

Athenana

  • Separate the Tags heading from the note form's Save button
  • Say when a feed URL has stopped being a feed
  • Render markdown in notes, annotations and descriptions
  • Hold coined tags for review instead of creating them
  • Add and remove an item's tags one at a time, with suggestions
  • Show each feed's latest ten entries, refreshed once a day

Saturday 15 August 2026

Athenana

  • Delete a trashed item for good, and keep your place on the tag screen
  • Add Google's HTML verification file to the web root
  • Serve the Google site-verification token from the web root
  • Prepare the Chrome Web Store listing
  • Build for distribution by exporting an archive, not by signing a build
  • Fix three ways the release scripts reported success without it

Friday 14 August 2026

Athenana

  • Ship the Safari extension as a download, not a build
  • Put the new mark on the extension, and its own palette in the badge
  • Give the app a real favicon, drawn to the design mark
  • Sort the tag lists, on both screens
  • Draw the card's focus ring inside the card, not under its clip
  • Make the tags on a card and a row navigate
  • Delete a selection of tags, not one row at a time
  • Stamp every asset URL, so a deploy cannot leave a stale stylesheet
  • Sweep the contrast failures the earlier tasks banked, and two nobody had found
  • build a variant group from its bucket, not back from its pairs
  • Close a comment that was silently voiding a contrast fix
  • Put back the launch config I wrongly deleted
  • say what each tag rule knows, and stop asserting duplication
  • manage tags on the system's grid, and suggest near-duplicates
  • settings, admin, auth and trash on the system's components
  • the reader view, the save modal and the first-run screen
  • Say what the chip-shedding thresholds actually do
  • Make --env=testing safe, and write down why
  • browse by tag, and a board filtered to one
  • infinite scroll, as progressive enhancement over the paginator

Wy5

  • Merge search results instead of discarding them on a spell-check hint

WyHome

  • Fix the same dead-button bug on four more screens
  • Make every button on Maintenance actually open its sheet
  • One calendar event per project, not one per sync
  • Apply the three fixes the whole-branch review surfaced but did not fix
  • Close the gaps a whole-branch read found in visit scheduling
  • Warn when property deletion can't clean up a visit's calendar event
  • Fix visit paywall showing document copy, and stale free-trial text
  • WyHome Plus: track contractor visits
  • Count booked visits when deleting a property
  • Remind me the evening before a visit
  • Fix Task 8 review findings: keep a done visit's event, sync after cancel, and stop orphaning events on revoked calendar access
  • One calendar entry per visit, replacing the jobs' due-date events
  • Fix Task 7 review findings: register Visit in the schema, tag visits with their property, and use Card instead of a bare Section
  • Show what's expected, on Today and on the contractor
  • Fix visit completion cost parsing to match app convention
  • Mark a visit done, one job at a time
  • Fix three review findings in the visit editor

wyome.com

  • Take Athenana's real icon, and retire the accent-marker machinery

Thursday 13 August 2026

Athenana

  • Commit the design package, and take two things from the list mockup
  • Make the list a real list: 36px rows, not reflowed cards
  • Reset the card's padding, and untrack a launch config
  • Rebuild the card: type colour, kickers, washed thumbnails
  • read the List preference from a cookie, not a client-side redirect
  • three review findings — Caprasimo cascade, List active state, icon weight
  • close the whitespace gap before the wordmark's dot
  • athena -> athenana everywhere a name is chosen
  • replace the horizontal header with the Organic sidebar shell
  • adopt the Organic design system, retire Pediment
  • self-host Caprasimo and Figtree
  • the Pediment identity — palette, mark and wordmark

WyAuto

  • Give the monthly chart's axes labels a reader would choose
  • Rebuild the export when an entry changes, not just when one is added
  • Fix Reports chart line rendering in accent orange instead of label color
  • Bound the trailing-12 window the same way in both places it's read
  • Stop rounding the CSV's headline rate to whole cents
  • Stop an unmeasurable vehicle's cost from inflating the monthly rate
  • Fix the monthly-cost chart's silent gap-bridging and empty-window ghost
  • Chart cost by month, with cost per mile over it
  • Qualify monthlyMiles' telescoping claim for backward readings
  • Apportion miles to months so the trend reconciles
  • Bucket spend by month and category
  • Offer the export from Settings, and stop claiming nothing is uploaded

WyHome

  • Book a visit from a job
  • Guard VisitCommitter against re-entry the transition rules allow
  • VisitCommitter, the only thing that writes a visit
  • Persist the free-allowance migration on write, not just in memory
  • Key the free allowance by feature, so the next one adds no state
  • Fix two review findings: Contractor.visits inverse, and activeVisit excludes stale unresolved visits
  • A Visit model, many-to-many with the jobs it covers
  • Visit scheduling rules, and the tests for them
  • Fix two conflicts the pre-flight scan found in the plan
  • Reading the same document twice no longer duplicates its repairs
  • Right-click a document to read it for jobs

Tuesday 11 August 2026

Athenana

  • resolve the canonical link, or the save dies with no item
  • survive an in-flight job, and stop the browser sniffing served assets
  • read name="og:image", and resolve two href forms correctly
  • one definition of the guarded request, not two
  • a scrape must not replace a client-supplied preview, and must not orphan its file
  • never refuse a save because of an unusable preview image
  • fall back to the preview image in the card and detail views
  • accept image_url, which the extension has always sent
  • run the preview-image stage after the screenshot
  • fall back to the page's own image when no screenshot exists
  • extract og:image from a fetched page
  • let the redirect guard's rejection propagate
  • a guarded, bounded image fetcher
  • share the bounded read and the image sniff

Wy5

  • Surface the account-deletion receipt instead of discarding it
  • Scope the no-store fix to the API, and fix a wrong comment about standings
  • Turn off mod_expires to actually close the cache-header duplicate
  • Stop caching authenticated API responses, and harden three more decoders
  • Decode a removed member, and stop refresh blanking the board
  • Make removal stick, throttle the code oracle, and stop four screens lying
  • Document groups, retire the stale deferral note, and fix three deferred defects
  • Compute the group board on device and show who picked what

WyAuto

  • Add the three derived columns to the export
  • Render the ledger as invariant CSV
  • Project a wider row for export than the engines need

WyHome

  • An urgent finding sets its own first date, even when it matches a schedule
  • Make a review row show what the report said
  • A bare item number starts a finding, and a tool to see why it did not
  • Fixture tests for the intake parser, and three fixes they found

Monday 10 August 2026

Athenana

  • set the screenshot ceiling to a size that measured reliable
  • send a screenshot the host will actually accept
  • run the queue worker continuously as a systemd user service
  • stop a server capture replacing the extension's screenshot, and say when tagging is still running
  • request the host permission during the user gesture
  • sign the Safari build, or Safari never lists it
  • the product is called Athenana on screen
  • a Safari build that actually builds
  • an age floor on tag pruning, so it is safe to run as routine
  • pruned tags stay pruned across a re-sync
  • normalise tag casing to lower case, everywhere

Wy5

  • Fix review finding: leaving a group left you looking at it
  • Show a group's members, its headroom and what it can compare
  • Fix Groups review findings: headroom at 0 groups, real sign-in from empty state
  • Add the Groups tab, with account headroom stated up front
  • Wire groups into the app store
  • Add the groups API client
  • Add group fixtures for codes, capacity and board orientation
  • Fix GroupCode.normalize to match PHP's ASCII-only, codepoint-wise keep-filter
  • Add the group domain types and Crockford join codes
  • Report group memberships removed on account deletion
  • Reject an unknown or non-member report subject instead of 500ing
  • Manage group membership: leave, remove, rename, rotate and report
  • Fix hidden-topic leak and add leak/absence checks for member ballots
  • Serve every member's ballot for one topic in a single request
  • Fix uncaught per-row crash in topic_status() turning into a false PASS
  • Fix silent-failure false-PASS in the shared-topics negative checks
  • Read groups and the topics their members share
  • Lock the per-user group cap inside the join transaction
  • Join a group by code, throttled and capped inside the transaction
  • Make group creation transactional, close the per-user cap race, and reject non-string names
  • Create groups, with the caps enforced and reported by the server
  • Fix group_code_normalize() to be UTF-8-safe
  • Add group code generation, normalization and name sanitizing
  • Add the groups schema, avoiding the GROUPS reserved word
  • Ignore the subagent-driven development scratch directory
  • Make topic creation reachable, and point the app at wy5.app by default

WyAuto

  • Parse numbers strictly, and stop Total disagreeing with cost per mile
  • Cover the destructive and relationship paths with tests
  • Let a service rule be marked done, edited, and added
  • Enable CloudKit sync
  • Add the app icon, and the asset catalog it needed
  • Add reminders, settings and the README; set the signing team
  • Attach receipts to an entry, and scope the v2 subscription
  • Add reports, with the vehicle filter in a menu rather than a list row
  • Hoist the driving rate out of the per-rule loop

WyHome

  • WyHome Plus: a $10/year tier that reads inspection reports and estimates
  • Add the app icon
  • Deleting a property no longer strands its files

wyome.com

  • Add the app icons, and correct two privacy claims Wy5 had outrun

Sunday 9 August 2026

Athenana

  • store the extension screenshot on arrival, and tag from the description
  • make Claude's effort parameter optional, and the badge actually visible
  • stop tuning the GD memory ceiling and route large images to ImageMagick
  • crop the captures GD cannot even open, via ImageMagick
  • crop captures to a card shape, or the board is a wall of slivers
  • bound the capture download while reading, not after
  • the sync could not backfill a missing capture
  • count tag usage off the pivot, or the prune deletes everything
  • keep MyMind's PDF page renderings, and prune the imported tag tail
  • sniff screenshot bytes, because their CDN calls everything octet-stream
  • ask the object before spending a request on its screenshot
  • the MyMind screenshot endpoint returns whole PDFs, so check what came back
  • measure an image before decoding it, or one screenshot kills the import
  • a date slice the API refuses must not cost the whole library
  • walk the MyMind library in date slices, because it cannot be fetched whole
  • sign MyMind tokens with the decoded secret, not the base64 text
  • Fix Safari browser extension breakage in context menu and error handling

Wy5

  • Add Wy5 Premium: list history and taste comparison

WyAuto

  • Add vehicle detail and the standard service rules

Saturday 8 August 2026

Athenana

  • oversized screenshots, http localhost, and silent failures
  • scope dedupe by type and honour idempotency_key
  • guard Test connection against empty/malformed input like Save
  • options page with per-origin permission and a connection test
  • manifest, settings, API client and the save path
  • map API responses to badge states and readable errors
  • read page metadata, preferring what the page says about itself
  • payload building with a derived idempotency key
  • MyMind settings screen, and close out Phase 4
  • athena:mymind-sync, resumable by being idempotent
  • map a MyMind object to an Athena item, idempotently

Wy5

  • Complete account deletion, and add the tip subscription
  • Add Sign in with Apple

WyAuto

  • Add a DEBUG-only sample fleet, and fix the copy it exposed

WyHome

  • Track several properties, not just one

wyome.com

  • Rename Athena to Athenana, drop self-hosting, adopt the wordmark logo
  • Extend the no-analytics claim to all four, having checked Athena
  • Stamp the stylesheet URL so a 30-day cache cannot serve stale CSS
  • Apply the Wyome design: palette, logo, Outfit and an inverted band
  • Stop the home page contradicting the privacy page about Athena

Friday 7 August 2026

Athenana

  • MyMind client with credit-aware rate limiting
  • per-request HS256 token for MyMind, deliberately not the Apple signer
  • encrypted per-user MyMind credentials and a sync run record
  • complete the enrichment chain and close out Phase 3b
  • feeds settings screen and OPML export, still polling nothing
  • read text out of images with Claude vision instead of Tesseract
  • auto-tagging via Claude, with the user's own vocabulary in a cached prefix
  • image items via the capture API, with thumbnails and dominant colour
  • screenshots from the extension, falling back to headless Chromium
  • serve stored assets behind an ownership check, plus GD image helpers

Wy5

  • Fix the .htaccess directive that 500s the whole site on FastCGI

WyAuto

  • Apply the both-sides-or-neither rule to fleet mpg too
  • Fix round 2: a vehicle contributes both its miles and its money, or neither
  • Fix round 1: stop cost per mile spanning unrelated odometers
  • Add the Today dashboard
  • Fix round 1: protect the two fields Save does not gate
  • Add the ledger and the entry editor
  • Fix round 1: stop a mistyped number erasing a saved one
  • Add the garage and the vehicle editor
  • Add the theme, the formatters and the five-tab shell
  • Fix round 1: move the nonisolated fix to the initializers, not the callers

wyome.com

  • Fix privacy disclosure gaps and other whole-branch review findings
  • Add the privacy page, with its no-sharing claim scoped by name
  • Add the support page
  • Build the home page and the site's one stylesheet

Thursday 6 August 2026

Athenana

  • chain fetch and extract, document the cron worker, close out Phase 3a
  • extract readable text, page metadata and feeds from fetched HTML
  • fetch pages behind the SSRF guard and archive raw HTML gzipped
  • enrichment chain skeleton that records stage errors without losing the item
  • capture API that inserts pending and queues enrichment
  • SSRF guard rejecting private, loopback and reserved fetch targets
  • Sanctum API tokens with a copy-once settings screen
  • trash pruning command, smoke tests, and Phase 2 documentation
  • account deletion that purges items, tags and trashed records
  • tag rename, merge and delete so the vocabulary can be kept tidy
  • item detail with editable notes and tags, plus trash and restore
  • search over a denormalised blob, splitting terms between MATCH and LIKE
  • masonry board with four card treatments and a per-device layout switch
  • create links, notes and highlights from the web UI with dedupe
  • canonicalise URLs so one article does not become three cards
  • per-user tags with slug matching and source-tracked attachment
  • items schema with ULID keys, enums, and a global tenancy scope
  • gate access on account approval and notify the admin of new sign-ups
  • admin approval queue with approve, deny, suspend and restore
  • Sign in with Apple via stateless Socialite and a single-use state token
  • resolve an Apple identity into a user with first-login capture
  • generate and cache the Apple ES256 client secret at runtime
  • local-only dev sign-in bypass and placeholder board
  • user schema with ULID keys, status enum, and no password column
  • scaffold Laravel 13 app with MySQL 8, Pest, and Athena config

Wy5

  • Add the DreamHost deploy script and record the target environment
  • Set the development team for device signing
  • Reach the item detail from your own list, and add the Associates tag
  • Convert prose and identifiers to US English
  • Author the app icon in Icon Composer as a layered iOS 26 icon

WyAuto

  • Add the SwiftData models and the projection seam
  • Fix DueEngine: calendar-only rules can now be overdue
  • Add the due engine and the standard interval catalogue
  • Fix round 1: pin rollingMPG to the mileage-weighted formula
  • Add the cost engine
  • Derive a driving rate, with its basis attached
  • Add the domain value types
  • Stand up the project, the test target and the first engine
  • Ignore the SDD scratch directory
  • WyAuto: design for a vehicle cost-per-mile tracker

wyome.com

  • Design the wyome.com static site

Wednesday 5 August 2026

Athenana

  • Add Phase 1 implementation plan: foundation and access
  • Add Athena design spec

Tuesday 4 August 2026

Wy5

  • Add app icon

Monday 3 August 2026

Wy5

  • Add Wy5 — top-five lists with community statistics

WyHome

  • WyHome: house maintenance, quotes, contractors, documents and warranties

Built 2026-08-25 13:19 from the last 30 days of git history. This page is rebuilt daily from a laptop, so if that date is old, the laptop was off — not the projects.