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.