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.