Changelog

965 changes across 27 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.

Sunday 6 September 2026

Athenana

  • Refuse a push that restores an older version of a file
  • Give a two-band caption its separators back instead of five undifferentiated tokens
  • Restore the charset fix, and stop the MyMind client calling itself self-hosted
  • Mark year boundaries on the timeline axis before the live library crosses one
  • Fix three timeline tests that named a guard they never exercised, and add a fourth that had none
  • Record that the worktree isolation stops at sys_get_temp_dir()
  • Honour a charset declared after the first non-ascii byte
  • Declare a default for the month count the markup supplies
  • Fix two numbers review caught: a stale test count and a stale fixture percentage
  • Close two holes in the colour guard
  • Draw the strip as a grid, in tokens, with no colour literal
  • Put the timeline behind /tags, and say what it left out
  • Read the series with two joins that never touch a global scope
  • Separate a project from a tag that had one busy month
  • Make the peak-not-mean test able to fail
  • Measure a tag's month against its own share, not against a count
  • Give the timeline a dense month axis and its eight thresholds
  • Drop every imagedestroy(): a no-op since 8.0, deprecated in 8.5
  • Add the mail capture to the policy parity guard
  • Guard the two privacy policies against the code, not against each other

WyHealth

  • Ask deployed-ref about web/, not about HEAD
  • Bless the header set the server-rendered theme produces
  • Take an atomic lock before writing the audit's state
  • Refuse a push that restores an older version of a file

Wy5

  • Add nosniff to the API docroot
  • Refuse a push that restores an older version of a file

WyAuto

  • Refuse a push that restores an older version of a file

WyHome

  • Refuse a push that restores an older version of a file

wyome.com

  • Track this account's other .htaccess files, and stop rsync publishing them
  • Refresh the banked archive from the server
  • Stop saying a saved email's pictures are shown when you read it

Hosting monitor

  • Bless nosniff on six sites and the two .htaccess files that carry it
  • Probe the three .app domains, which serve the placeholder too
  • Correct today's done entry: the placeholder is not gone from the box
  • Bless the two keys e06f9cb predicted, and nothing else
  • Give --only its own scratch paths, and refuse --baseline --only
  • Assert that /data/ still refuses anonymous requests
  • Both placeholder roots now serve the account; record what the probe cost
  • Read the shortest certificate from the run, not from memory

Saturday 5 September 2026

Athenana

  • Stop the privacy page promising pictures the reader no longer shows
  • Fix the two review-blocking gaps left by dropping <img> from the reader
  • Make the reader text-only: drop every image, for every item
  • Make the overlay actually scroll, and stop promising a button the markup cannot deliver
  • Add a scrollable overlay for the mail capture, keeping the JPEG link as fallback
  • Make the reading link a button, matching the capture's own weight
  • Escalate the mail capture probe once instead of raising the ceiling
  • Decide the tag board and the search board on total(), and come back to the first page of the same list
  • Skip Readability entirely for saved mail, not just when it throws
  • Point FetchMail at logContext(), so the log shape has one copy
  • Keep the proposed-tag tail on a page past its end, and clamp against the tail the screen renders
  • Decide the tag manager on total(), and come back to a page that exists
  • Give logContext() FetchMail::describe()'s exact shape, trace included
  • Log a rejected row's shape, never the row, from every catch-all that logs
  • Scrub the refused mail insert through DatabaseErrorReport
  • Teach the second timeout derivation about the capture stage too
  • Fix mail-capture safety gaps: scoped photography, timeouts, temp-file leaks

wyome.com

  • Refresh the banked archive from the server

Hosting monitor

  • Rebuild the panel on a schedule, and record two fixes in it
  • Pin the remote locale, after a Terminal run cried backdoor
  • Retire the partner watch, and say what retiring one costs
  • Bless four changes: two header sets, dropped favicons, vanished partner

Friday 4 September 2026

Athenana

  • Decide the blog and the webmention list on total(), and come back to a page that exists
  • Log a refused mail insert without the mail it refused
  • Stop paying for followers on servers that stopped answering
  • Configure the mail capture, and write down what the probes taught
  • Report a database failure without the row it failed on
  • Give a test file its opening tag, so PHP runs it instead of printing it
  • Decide who is allowed to speak X-Forwarded-*, and trust nobody by default
  • Decide what is public on total(), and come back to a page that exists
  • Make installing the Safari app something you ask for, and prove the release script
  • Stop an older save's timer from wiping a newer save's failure badge
  • Stop the fade erasing a short capture, and stop calling a truncated one whole
  • Clean up only the temp files a test made, not a shared glob
  • Show the capture in the item body, capped, with a way into the whole thing
  • Put the mail capture in the enrichment chain, behind the screenshot
  • Fix Task 5 review findings: doc the capture env keys, and match their names to the plan
  • Write down what eighteen branches learned, and fix what went stale
  • Photograph a forwarded message, and refuse to store a photograph of an error page
  • Stop a private message being written where the whole box can read it
  • Cut an over-long capture to fit its column instead of losing the save
  • Accept a capitalised h-entry instead of refusing it as an unknown type
  • Prepare a stored message for a renderer reading from disk
  • Test the three parsers nothing named, and fix four holes they found
  • Catch the throw a hung convert produces in CaptureImage
  • Test the extension's one security decision, and the four scripts that had none
  • Read the two API clients' JSON against the ceiling instead of buffering it
  • Stop the inbox fetching a stranger's URLs on a stranger's connection
  • Encode the capture at the size it is worth storing
  • Name what a received mention points at, instead of calling it the front page
  • Fix CaptureImage::trimBottom() — ImageMagick reads trim colour from the corner pixel, not -background
  • Cover athenana:normalise-tag-case, the last untested command
  • Measure a capture with ImageMagick, since GD cannot hold the probe
  • Fix two review findings on the HeadlessChrome extraction
  • Pin the clock in the three test files that straddle midnight
  • Record a stage's error on a model the failed save has not dirtied
  • Stop composer setup migrating whatever database .env happens to name
  • Give the browser one driver, since there are about to be two callers
  • Ask for a credential before wiping the library, not just the word "delete"
  • Stop the digest sorting a whole day's entries
  • Make the Micropub read half token-only too, not just decoratively scoped
  • Page the dismissal register, and ask for a day sargably
  • Make the MyMind dry run classify, and fail a run that imported nothing
  • Ask one method for kept passages, so both screens carry both guards
  • Ship only the manifest's closure, and check the keys the manifest uses
  • Stop federating as an account that has been removed
  • Say on the privacy page that the server now fetches a message's pictures
  • Give each token minter its own flash key, and put the API panel back
  • Store the capture as JPEG, width-capped
  • Carry the new remote floor through ForwardedMailTest's limits helper
  • Put the two text-extraction docblocks back on the methods they describe
  • Stop calling every remote-image failure an SSRF refusal
  • Bound one message's picture pass by a wall clock, not only by a count
  • Count outbound requests against the remote-image ceiling, not stored pictures
  • Refuse a DOCTYPE by where the grammar allows one, not by the first 2 KB
  • Refuse only a declared 1x1 or 0x0 remote picture, not everything under 8x8
  • Fold the approval path's reindex into the one helper the other tag paths use
  • Document the two remote-image env keys the merge brought a test for
  • Give the capture path its three units: localise, measure, close the holes
  • Bank the remote-image work, which the owner has since declined

wyome.com

  • Refresh the banked archive from the server
  • Say that forwarding an email in fetches its pictures

Thursday 3 September 2026

Athenana

  • Document the two follower ceilings in .env.example
  • Pin every outbound credential in phpunit.xml with force="true"
  • Fail a test that makes an unfaked HTTP request, instead of letting it out
  • Make a disk that refuses a file say so, instead of returning false
  • Send a Content-Security-Policy, so the reader has a second layer
  • Cap how many followers a blog, and one host, can put on it
  • Say what went wrong on a passkey instead of swallowing every failure
  • Read xcodebuild's own exit status, so a failed build cannot install a stale app
  • Document every env key config/ reads, and default the session cookie to Secure
  • Ask the database for the entries the digest keeps, not for the whole day
  • Expire a cache-first entry when the server said it would, not when the LRU does
  • Claim the arrow keys only where there is a list to walk
  • Approve a proposed tag as one transaction instead of a loop per item
  • Rebuild search blobs a page at a time instead of hydrating every item
  • Make one idempotency key one item, in the database rather than in a SELECT
  • Bind a verified signature to this host, this actor and one use
  • Fit page metadata and tag names to their columns before the save
  • Make recrop-captures' dry run answer the question the real run acts on
  • Bind the Apple state token to the browser that started the flow
  • Give prune-trash a dry run, and stop an empty env from meaning "purge everything"
  • Stop an unreachable host wiping the verdict a reachable one gave
  • Refuse a tag rename onto a slug another tag holds, instead of 500ing
  • Stop a second spelling of one address buying a fresh limiter bucket
  • Compare prose, not padding, when deciding the note can go
  • Drop the flattened note when the page really carries the words
  • Correct the fourth cache comment, and name the marker test for what it proves
  • Say what the tagging cache really does, and log the number that proves it
  • Give the model calls a real ceiling instead of a share of the job's
  • Stop the reader printing a blank line where a picture was not asked for
  • Save a forwarded email the way a saved page is saved
  • Stop the sidebar overwriting the layout it was meant to return you to
  • Let an account read its forwarding address back instead of once
  • Give the enrichment job a budget it can actually finish inside
  • Stop a lock that lives exactly as long as the gap to the next run
  • Give an untitled link a readable headline, and stop tags sizing the text column
  • Take the feed images too, which are not under items/
  • Stop Apple sign-in putting the relay address back over a chosen one
  • Make the list's tag column stand still, which was the eyesore rather than the chips
  • Save a forwarded email as a note, from a secret address per account
  • Give the list row the board's picture and the API's description
  • Widen the discovery thumbnail to the shape publishers actually send
  • Bound every guarded fetch while it reads, not after it has allocated
  • Say what the logo fetch actually does on failure, which is not retry
  • Say once what a URL this app stores as a link, and ask it at every door
  • Stop a reset link registering a passkey, because the row never said what it was for
  • Give five paged queries the id tiebreak, and a guard so the sixth cannot skip it
  • Walk the library instead of hydrating it, and pin the loop that does the work
  • Scope --restore to one account, which it never was
  • Take the files with the account, on the path where the promise is legal
  • Guard the discovery table's shape, which no content assertion can see
  • Show the picture a feed already published, on Discover and on the feeds page
  • Raise the briefing cap to 1,000, because 500 was about to become a working limit
  • Import the two classes browsingDraw() named in full
  • Show the description a source already supplied on Discover
  • Pin the revisit browsing clock, which failed for five minutes a day
  • Put a daily briefing on what the feeds carried at the top of Discover

WyHealth

  • Replace a decorative test of my own with one that bites
  • Show wakes since the last completed sync, not just each count alone
  • Ask iOS for time to finish a drain, and end the assertion properly
  • Bound each step of a drain, so a stalled call cannot outlive it
  • Complete the background refresh task instead of going silent on expiry
  • Make the sync gate a lease, so a suspended drain cannot stall forever
  • Make the choice reach every route, not just the three with tokens.css
  • Move the cookie write out of the component, and test its format
  • Charts read the palette instead of one theme's literals
  • Make the active pill readable in dark mode
  • Add the control, and keep it out of the URL
  • Count media rules, not mentions of the phrase
  • Swap the lockup in one place instead of two that can disagree

Wednesday 2 September 2026

Athenana

  • Pin the feed rotation to its seed, verified by removing it
  • Draw the discovery list from the reader's own feeds first
  • Rewrite the two reset tests the email-address index made unstorable
  • Render the message in a test, because Mail::fake() never does
  • Record the second retirement, and what the DNS actually says
  • Let an account set its own email address, so the password is usable
  • Fix the guard tripping bin/worktree, and a false claim in its own message
  • Stop the redemption screen telling a returning account it is being created
  • Throttle the reset request to protect an inbox, not an account
  • Stop a worktree reaching the database that belongs to another checkout
  • Let somebody ask for a reset link, and say plainly it may not arrive
  • Give one link mechanism two lifetimes, and make spending one spend the rest
  • Retire the ban on a reset route, and keep the ban on a second token table
  • Draw the two destinations as buttons, and lead with the wait
  • Beat the .authcard form margin reset, which was eating the gap
  • Put the wordmark and the wait caveat where the signing in happens
  • Stop the sign-in caveat collapsing under a shorter button
  • Point the front page at the login screen, not at one provider
  • Record in CLAUDE.md that the no-password property was retired, and by whom
  • Let an admin hand out a one-time link for somebody who is locked out
  • Set, change and clear a password from its own settings screen
  • Sign in with an email address and a password, without needing any script
  • Give an account somewhere to keep a password, and retire the test that said it never would
  • Assert structurally that there is still no password, and no key in an export
  • Let an admin invite somebody who has no Apple ID, without sending anything
  • Sign in with a passkey, and apply UserStatus before any session exists
  • Let an account keep several passkeys, and refuse to remove its only way in
  • Verify a passkey for real, and prove the verification can fail
  • Give a passkey somewhere to live, and let an account exist without Apple
  • Resolve DNS through the container, so a test can answer the lookup

WyHealth

  • One colour table that a choice can override, not two that drift
  • Let the server render the theme it is going to serve
  • Give charts a two-column palette, held to a measured floor
  • Parse the theme choice, and say what the server writes for it

Tuesday 1 September 2026

Athenana

  • Stop double-escaping the meta tags, and measure the title not its markup
  • Precache the fonts at the URL the browser actually asks for
  • Write down the effort coupling and the resolution table
  • Register the worker, tell it whose caches these are, and say when offline
  • Add the screen for setting, replacing and removing an AI key
  • Assemble and serve the service worker
  • Resolve the key, model and effort for the acting account
  • Put the worker's decisions in a plain module, and test them
  • Serve a manifest, and a page for when the network is gone
  • Render the manifest icon set from the mark already in the repo
  • Build the SDK client through a factory, so a test can see which key was sent
  • Store a per-account AI key, and make the model carry its own effort
  • Grey a dismissed discovery row, at the dimmest value that stays readable
  • Address branch review: restore proof, mass-assignment fix, backlog note
  • Show what has been dismissed, and let it back
  • Fix round 1: replace the URL-only dismissal-view test
  • Dismiss a discovery link, and take it back
  • Fix round 1: pin discovery ranking mode in the slot-back test
  • Stop offering a link that was dismissed
  • Record a dismissed discovery link
  • Record that production runs Haiku again, and why
  • Make the 65-character title bound true, not usually true
  • Close the Micropub create path to a browser session

WyHealth

  • Stop the chart inventing months nobody measured
  • Say the pair even when nothing collapsed, and draw the window rather than the rows
  • Narrate the series the charts actually draw, and stop overclaiming the thresholds
  • Delete topActivities, and make the fake client see the RPC it is asked for
  • Task 7 fix round 1: honest empty state, drop the in-progress trailing bucket
  • Close two saveProfile coverage gaps from review
  • Panel 10: insights, bounded to computed single-metric findings
  • Cover saveProfile, the one web write path with no test
  • Fix round 1 on the insights computation
  • Task 5 fix round 2: complete log truncation, mirror the sessions-missing case
  • Stop the session log overflowing, and say when totals are missing
  • Add the insights computation, with no I/O and a banned-word test
  • Actually pin the dev server to Node 22
  • Panel 4: activity and training over collapsed sessions
  • Fix double-counted Other and unstable colours in StackedActivity
  • Add the stacked activity chart
  • Fix nullable test in fetchActivityBuckets to catch copy-paste regression
  • Add fetch function tests to workouts test suite
  • Add the workouts wrapper over the two session RPCs
  • Count the sessions each total was actually summed over
  • Aggregate collapsed sessions in Postgres, per bucket per activity
  • Bound the session window at both edges, not just p_from

Monday 31 August 2026

Athenana

  • Micropub action=delete and action=undelete, through the trash
  • Add public/js test harness and fix scroll.js announcement + count
  • Micropub action=update, with the refusals written down
  • Micropub q=source: read one post back as the mf2 that made it
  • Refuse an address the page declares about a different document
  • Four from the backlog: archive 404/410, a disclosed restore, a trashed blob, a dialog colour
  • Stop an over-long image_url costing the whole save
  • Say in the privacy policy that a saved video is not only a song
  • Pin FetchVideoThumbnail into the enrichment chain
  • Admit a video's own cover to the front page, and pin youtu.be into the fetch guard
  • Keep SoftDeletingScope in the backfill's item query
  • Backfill covers for videos saved before they could play
  • Narrow the permalink/front-page fix to url-sourced video only
  • Unify the video/preview suppression rule across all three public surfaces
  • Fall back to the item's own picture when a video has no cover
  • Fix Task 3 Round 1: Replace inert tests with ones that verify the YouTube guard
  • Stop photographing a video we already have the cover of
  • Fetch the cover for a video the url names
  • Fix Task 1 Round 2: restrict href to anchors in expectNothingFetchedFromGoogle(), add helper test
  • Fix Task 1: revert view changes, add expectNothingFetchedFromGoogle() helper, update test
  • Correct the plan: a page about youtube may name youtube
  • Play a video the url itself names

WyHealth

  • Collapse double-recorded workouts into sessions
  • Record who wrote a row, by a name a rename cannot move
  • Correct the sleep docstring: 72 minutes, not 24
  • Average sleep over the nights that measured it
  • Pin the dev server to Node 22, and rule on the in-bed months
  • Retire the pre-RPC aggregation path and record what Phase 3b proved
  • A profile form, because two panels and all of Phase 4 need one
  • Panel 6: what the watch recorded, and nothing about what it means
  • Panel 5: sleep, in stages, and the ten years it was dropping
  • Panel 2: cardio fitness, and what it cannot say yet

wyome.com

  • Say that a saved YouTube link gets a play button too
  • Refresh the banked archive from the server

Hosting monitor

  • Panel: record the SSH kex finding, correct a stale cert note
  • Lock the state directory, after a collision nearly ate the baseline
  • Bless four intended additions to wyome.com

Sunday 30 August 2026

Athenana

  • Stop a video saving as "YouTube", and read a page in its own encoding
  • Make a fileless image save say what it DID receive
  • Count each account's items on the admin screen, without the scope lying
  • Stop a three-letter search matching everything, and let short items rank
  • Add a second search mode, for describing a thing rather than naming it
  • Make the discovery lede follow the ranking setting instead of asserting one
  • Shrink an image before sending it, so a phone photo can be described at all
  • Stop telling an account with nothing waiting that it is at the limit
  • Give the image backfill a --force, for a backlog somebody has decided to pay for
  • Describe saved images, so they can be found by describing them
  • Read author and publication date from a page's structured data
  • Correct the dates the session's midnight crossing put wrong
  • Add IndieAuth, so a Micropub client can actually get a token
  • Count what the conditional requests actually save
  • Show the topics the day was built from, not a fresh guess at them
  • Ask feeds whether anything changed before downloading them again

WyHealth

  • Panel 3: fifteen years of body composition
  • Round the value axis, which was printing raw floats
  • Panel 1: today, against its own thirty days
  • Give the dashboard a shell, a window, and an honest freshness panel
  • One panel shell and one chart vocabulary, in the brand's colours
  • Move the colour table out of the landing page
  • One window for every panel, snapped to local midnight
  • Let one instrument describe a night, and union what it wrote
  • Return a night whole when the window starts mid-sleep
  • Sessionise sleep where the rows are, and say why that moved
  • Say why a panel is empty when the RPC fails
  • Bucket in Postgres, because 25,511 rows do not fit through PostgREST

wyome.com

  • Refresh the banked archive from the server

Saturday 29 August 2026

Athenana

  • Correct the date I got wrong in ten places, and record the audit on the board
  • Put the last month's features on the features page
  • Name the three sources the morning reading list searches
  • Move the ignored feeds onto their own page
  • Make j and k walk the draw, and stop the draw moving while you read it
  • Revisit: the things you saved and stopped opening
  • Offer the reader when the page is archived, not when body_text happens to exist
  • Say on the board that the keyboard shortcuts exist
  • Put a kept passage's own visibility switch beside it
  • Show a kept passage where you go looking for it, and say it is private
  • Keep a passage from the reader
  • List every blog tag page in the sitemap
  • Fold ?page=1 into the bare blog URL instead of self-canonicalising
  • Give every public page a real og:image instead of none
  • Stop the search box swallowing every keyboard shortcut, and make j work on an item
  • Read the article, rebuilt from the page already on disk
  • Give each tagged blog page its own title and description
  • Say 'not yet' rather than printing an infinity sign
  • Stop the summary estimate promising a date it cannot reach
  • Give the keyboard a way through the board, and say what the keys are
  • Keep yesterday's discovery list, and let the page look back
  • List /features, /blog and every blogger's page in the sitemap
  • Give public pages real titles, descriptions and Open Graph tags
  • Self-canonicalise a paginated blog instead of collapsing it into page one
  • Play a YouTube Music share without searching for it
  • Draw the day's discovery list at random, a few links per topic
  • Mark a failure that is an answer, so it is not re-billed nightly
  • Take summary and summary_hash back out of the fillable allowlist
  • Carry the summary into the CSV export
  • Record the attempt when the model has nothing to say
  • Stop the summary backfill spending an enrichment retry it never makes

wyome.com

  • Name Athenana's three reading-list sources here too
  • Refresh the banked archive from the server
  • Redirect http to https, which nothing was doing
  • Regenerate sitemap.xml with today's lastmod dates
  • Fix SEO monitor findings: titles, descriptions, canonicals, og tags, sitemap

Thursday 27 August 2026

Athenana

  • Retire the publiccard vocabulary, and restore the rule it took with it
  • Backfill summaries for text already stored
  • Show the summary on the item page, labelled and private
  • Cover the summarise()-returns-null skip branch in SummariseItem
  • Summarise the whole article, once per version of its text
  • Delete the dead public/_card.blade.php, and stop citing it as a surface
  • Ask Claude what a whole article argues
  • Let each Claude call site carry its own effort setting
  • Fence the summary out of every public surface before it exists
  • Move Feature/Summaries to correct alphabetical position in DB_TRANSACTIONAL_DIRS
  • Give an item its own summary, apart from the publisher's blurb
  • Tag with Sonnet 5, and correct a config note that described fiction
  • Name the import formats where the link to them is
  • Say 1 tag, and let bold mean the service you came from
  • Say which reader an import came from, and stop promising Pocket HTML
  • Open a zipped export and take the CSV out of it
  • Refuse an unreadable import instead of reporting zero rows
  • Read Instapaper and Pocket exports, and detect which is which
  • Record that an unknown import format silently imports nothing
  • Exempt the API by the request line, not the rewritten URI
  • Stop the canonical-host redirect breaking every iOS Shortcut

WyHealth

  • Backfill percentages that were stored as fractions
  • Backfill percentages that were stored as fractions
  • Show imperial without storing it
  • Send a percentage as a percentage
  • Make a stored percentage mean percent, at the one place all data passes

Wednesday 26 August 2026

Athenana

  • Put Sign out against the sentence it acts on
  • Name the JSON feed too, and drop the two settings pills
  • Give the account screen the blog's feed address, and four boxes instead of two
  • Recover production's HSTS block into git before a deploy eats it
  • Every public page declares its own canonical address
  • A video on a blog post hides the page preview, not every picture
  • Bring the feeds up to parity with the blog page
  • Send www to the apex, and plan the canonical tag that backs it up
  • Import an OPML to drop feeds you already read elsewhere
  • Stop re-enrichment renewing an approval's thirty days
  • Say what the ceiling spared, not only what stopped it
  • Let a hand edit still promote an approved tag to manual
  • Stop re-enrichment deleting a tag the person typed
  • Name the signature headers that arrived when it cannot read them
  • Make the detach that this branch depends on actually run
  • Say what the inbox drops, and why it refuses
  • Stop the nightly enrichment vouching for its own tags
  • Stop overstating the no-downgrade guarantee, and pin two untested lines
  • Stop a machine sync from taking back a hand-typed tag
  • Show the tags on a blog permalink, for every type

Wy5

  • Apply migrations from deploy.sh, and never ship code while reading
  • Run the whole group suite against the harness, not production
  • Strip the space with AUTO_INCREMENT when normalising
  • Make topics from inside a group, not from Browse
  • Select the group board from topics, not from ballots
  • Seed 116 curated topics, with a guard that proves they do not collide
  • Show a group its own topics at one vote
  • Make a topic from inside a group, and never demote on merge
  • List topics by listing state, not by ballot count
  • Give a topic an explicit listing state
  • Add a disposable local API harness for integration tests
  • Raise the seed set to ~118 and get density from featuring instead
  • Singularize the -es plurals that were splitting topics from themselves

WyHome

  • Use American spelling throughout

wyome.com

  • Take the video's own cover, not the feed's poster
  • Close the last closeable gaps against Athenana, and classify the rest
  • Match Athenana's blog entry, and build the video facade ahead of the feed
  • Host permalinks on wyome, add a tag cloud, and spec the video gap
  • Track .htaccess, close the directory listings, serve a real 404
  • State the permalink on blog entries, and plan it for RSS
  • Render the feed's image on the blog, and correct two false comments
  • Add the Search Console verification token for wyome.com
  • Stamp the stylesheet at 6959b781
  • Take the wordmark to 48px
  • Scale the wordmark up to the site's header size
  • Redraw the logo o as one ring instead of three

Tuesday 25 August 2026

Athenana

  • Make the tag-provenance backfill atomic and self-preserving
  • Sweep every public route for queries that match nothing signed out
  • Re-source the tags MyMind gave us
  • Render the blog's tag navigation for the people who read it
  • Judge a tag's recency by the item's save date
  • Stop calling every imported tag manual
  • 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

Built 2026-09-07 06:00 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.