Changelog

1,025 changes across 25 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.

Thursday 22 October 2026

Athenana

  • SEO: list /terms in the sitemap

wyome.com

  • Standards: fit the description in a search snippet
  • Refresh the banked archive from the server

Wednesday 21 October 2026

wyome.com

  • Privacy: WyHealth lab results you type in are kept as written, never judged

Monday 19 October 2026

Athenana

  • Keep a pinned card's hidden label inside the card in Safari
  • Say "That's everything" under a list that fits on one page
  • Comments: stop naming Caprasimo as the heading face
  • Reader API clears only rows that carry the state; hide an index before dropping it
  • The apps, icons, OG image and extension toast follow the Floral White retune
  • Headings in Outfit 600, wyome.com's title face, instead of Archivo 800

Sunday 18 October 2026

Athenana

  • Floral White retune: lighter ground, Archivo 800 headings, Public Sans body

wyome.com

  • Refresh the banked archive from the server

Saturday 17 October 2026

wyome.com

  • Refresh the banked archive from the server

Friday 16 October 2026

Athenana

  • Item page: a saved link's address can be edited, and a new one re-reads the page
  • Privacy, pricing and sign-up say what round eight's fixes made true
  • Confirm and unsubscribe pages no longer print their token in the head
  • Opening a newsletter confirmation link no longer confirms it
  • OAuth client registrations are capped, limited per /64 and pruned
  • Opening a blog-email confirmation link no longer confirms it
  • A Letterboxd import reads its CSVs a row at a time
  • The CSV exports no longer hand a spreadsheet a formula to run
  • Quick add keeps today's own date this year west of UTC
  • A note the image pattern cannot read is shown as plain escaped text
  • The save form seeds no alt text from a camera name and waits for an upload
  • A long picture description can no longer delete a link's photos
  • A picture's file name no longer becomes a feed title or a Bluesky post
  • The AI models screen says the search model also writes Answer from these
  • A board search from another site is never ranked by meaning
  • An assistant's searches by meaning stop at a lower ceiling of their own
  • Every StoreKit call in PurchaseStoreTests runs under the clock
  • build-ios.sh prints skipped tests and warns when a StoreKit one skipped
  • build-safari.sh rewrites the bundle id with a sed GNU accepts too
  • The iPhone's screenshot is taken before the Saving toast is drawn
  • The Discover picture proxy has a 2 MB ceiling and a daily budget per account
  • Newsletter issues count against the storage cap and an account's own ceiling
  • A suspended account's mail is discarded, not filed
  • The Apple reconcile logs a live row Apple has no record of, and no renewal info keeps a row's renewal setting
  • The lapsed prune asks Apple before it deletes, and never deletes a paying Apple row
  • A paying Apple subscription outranks an open Stripe dispute
  • Suspend refuses an account that is not approved
  • A changed feed copy keeps an article's pictures until replacements are stored
  • One account's Regular feeds are fetched at most 500 a night
  • A feed's recorded failure never names the address its host resolved to
  • A bot wall's challenge read in Discover is refused, and never kept as a saved item's archive
  • The apps' account links and their tests name the delete-only page
  • The app's own pages lead nowhere but through: sign out, delete, back to the app
  • Deleting an account deletes its Bluesky posts first
  • A schedule can be seen and cancelled whatever the blog is doing
  • A Bluesky post comes down only when its item is made private or deleted
  • A scheduled publish reaches followers with its hashtags
  • Reading an Office file stays inside its ceilings, every one of them tested
  • A real Word upload the bytes accept is no longer refused by mimes:

wyome.com

  • Privacy: Bluesky posts outlive a lapse, an assistant's searches go to Anthropic, newsletter limits, confirm by pressing a button
  • Refresh the banked archive from the server

Wednesday 14 October 2026

WyAuto

  • Pass the capture into the pump Confirm sheet, so it shows what was taken

Monday 12 October 2026

Athenana

  • The app's Delete account and Export open a delete-only page, not the website
  • The app's sign-up sheet has no way to a web sign-in, /pending or its Checkout
  • Inline photos: a keyboard-reachable picker, a network failure in words, bracketed alt text, a described picture previews as its words
  • Sign-up: after Send the link, the page says Check your email
  • iOS tests: a StoreKit call that never answers skips, rather than hanging the run
  • Documents: Word, Excel and PowerPoint, text only, wherever a PDF goes
  • Inline photos: a picture dropped on the save dialog is saved, and you can see it was taken

wyome.com

  • Privacy: an attached Word, Excel or PowerPoint file is kept too

Sunday 11 October 2026

Athenana

  • Inline photos: a new link's note takes pictures; a dropped file of another kind is refused in words
  • Extension 1.1.1: build the right-click menu on every start
  • Maps: the final review's fixes for Explore map
  • Parity: see an Apple host written as a URL in the global CSP policy
  • Privacy: say Explore map loads Apple's map only on the press, and guard it
  • Maps: an Explore map button on the map picture, loading the live map on press
  • Maps: say in the policy's inventory what the map page now allows
  • Maps: the live map page, under the one policy that allows Apple
  • Maps: keep the pin, and decide when a picture can be explored
  • iOS: 1.0.1, for the Safari save toast
  • Firefox release: poll AMO ourselves with a 60-second JWT
  • Extension: tell the iPhone on the page whether a save worked

wyome.com

  • Privacy: say Explore map loads Apple's map only on the press

Saturday 10 October 2026

Athenana

  • Firefox: Watch works there, a sign-in sentence that names no browser, and the release documented
  • Firefox: a fixed add-on id, an update link from app.url, and the chart's browsers
  • Extension: serve the Firefox build and its update manifest, and say so
  • Extension: a keychain seam so the signing test can never sign, and a pinned file set
  • Extension: a Firefox build, staged and signed through AMO
  • Search: Answer from these, a short answer written from the top five
  • iOS: Create an account opens in an ephemeral browser session

WyAuto

  • Build 2 for the crash fix and vehicle deletion
  • Add a confirmed Delete Vehicle, and stop the swipe deleting without asking
  • Select vehicles in pickers by uuid, fixing a crash after adding a vehicle

wyome.com

  • Front page: the extension is for Chrome, Edge, Firefox and Safari
  • Privacy: the extension is for Chrome, Edge, Firefox and Safari
  • Privacy: say what Answer from these sends

Friday 9 October 2026

Athenana

  • Imports: a Goodreads library export, every book read, rated or reviewed
  • AI models: write the cache on save, and read a missing table as defaults
  • Settings: an AI models screen for the operator's key
  • Tests: the storage-cap line is 'left out (storage limit)', not any 'left out'
  • Imports: name Letterboxd on /features and Sharing In
  • Imports: a Letterboxd export, every film reviewed or rated
  • Search by meaning: whole-branch review fixes
  • Privacy: briefing request carries no library; search sentence held on wyome too
  • Say that search by meaning ranks with Anthropic, and hold the claim to the code
  • Search by meaning: no key is the old search, not a failure
  • Search by meaning: wire it into the board and search_items
  • Meaning search: a lock-free version token, moved where search data changes
  • Search by meaning: MeaningSearch, the service
  • Search calls: own effort dial, flattened candidates, per-call timeout
  • Search by meaning: the two Claude calls (searchTerms, rankSearch) and config

wyome.com

  • Privacy: name tags among what search by meaning sends
  • Privacy: say that searching by meaning sends titles and opening lines to Anthropic

Thursday 8 October 2026

Athenana

  • Save to Athenana: name the host, not the title, and keep the copy a day
  • Save to Athenana: clear the waiting link from superseded sign-up rows
  • Save to Athenana: keep a stranger's link through sign-up
  • MCP: drop wiki-link brackets from descriptions and summaries
  • IndieAuth: the consent form may return to the client it validated
  • Standards: a description that fits a search result
  • MCP: a reconnection replaces by provenance, not by name; no single-label hosts
  • MCP: exempt /mcp, /.well-known/ and /oauth/ from www->apex; name the library token
  • MCP: a scope-less connector gets library:read, and the review's OAuth edges
  • Privacy: recount the headings after the third-party list; widen the MCP read-only claim
  • Privacy: name an AI assistant's company as the eleventh third party
  • Say on the public pages that an assistant can read the library and change nothing
  • MCP: a sign-in needs a handle, and loopback accepted narrowly
  • MCP: no handle only for library:read, and four tighter OAuth edges
  • MCP: sign in from Claude over the IndieAuth server
  • MCP: every result fits 10,000 bytes; lapsed accounts may read
  • MCP: POST /mcp with four read-only tools over the library
  • Add the library:read permission for the MCP server
  • Email to-dos: keep a subject's link in the title, and write down the re-read rule
  • Email to-dos: on /features and /compare, held by a parity claim
  • Email to-dos: keep Forgotten senders under Newsletters
  • Email to-dos: the address on /settings/mail
  • Email to-dos: a re-read leaves a marked or done note alone
  • Email to-dos: a third address files a message on Today
  • Inline images: fix final-review findings
  • Inline photos: deterministic form ids, a picture note keeps its body, file dragover, panel alignment
  • Inline photos: say what to do when pictures ride a non-note save
  • Inline photos: Insert image, paste and drop in the note, text and annotation boxes
  • Notes: edit the text after saving; a link's unnamed photos are deleted; tokens stay out of search
  • Inline photos: a new note carries its pictures and rewrites its placeholders
  • Inline photos: give the stranger's item an owner in the 404 test
  • Inline photos: a JSON upload route for a saved note or link
  • Reader: a note's inline photos show at the API address when asked
  • Inline photos: every surface renders a note through ItemText, with its own address
  • Inline photos: resolve photo: tokens to this item's own photos, per reader
  • Plist work budget: 16 per object, not 8; the ceiling unchanged
  • Parity: wyome names feed search and the Feeds page beside Discover
  • Discover controls: review fixes
  • Play buttons in feed search and on the Feeds page
  • Discover: mute, boost or watch from the row
  • Maps: count DrawMap in the third copy of the enrichment budget
  • Maps: the Picture panel shows what public pages show, and the review's loose ends
  • Privacy: say a saved map link's pin goes to Apple, and that it saves private
  • Maps: an uploaded picture outranks the map on public surfaces too
  • Maps: show the map on the board, the item page and, once published, in public
  • Maps: draw a saved map link's pin with Apple and store it
  • Maps: record confirmed Apple docs, guard truncated DER
  • Maps: sign an Apple Maps snapshot URL for a pin
  • Maps: a map link saves private, on every way in
  • Maps: recognise a Google or Apple Maps link and read its pin
  • Quick add: year-bound ISO dates, flash the year on a wrap, survive invalid UTF-8; stricter parity guard
  • Quick add: on /features and /compare, held by a parity claim
  • Quick add: refuse a line with nothing to do in it, and pin the reuse paths
  • Quick add: a line on Today becomes a private to-do
  • Quick add: trim link punctuation and sentence stops before dates
  • Quick add: an exact set of trailing date phrases
  • Document the DL-count limits; failed() for a vanished row; no global const in a test
  • Measure the plist budget's headroom on a deduplicated build, limit 0.6
  • BinaryPlist: an impossible member count is damaged before it is charged; pin the UTF-16 byte check
  • ImportFormat: anchor the XML plist sniff at the start of the file
  • NetscapeBookmarks: an unbalanced file keeps the rest private once a Reading List is entered
  • NetscapeBookmarks: an attribute name does not match inside another's (data-id, data-href)
  • RunBookmarkImport: failed() for a worker killed before its catch
  • An XML-format Bookmarks.plist gets its own refusal sentence
  • SafariReadingList: say 1980 in the date-window comment, and why
  • SafariReadingListImportTest: declare its own helpers so it runs alone
  • Pin the plist work budget's headroom on a 20,000-item file
  • BinaryPlist: a string length past the file is damaged, not a budget overrun
  • BinaryPlist: charge a collection before unpacking its references
  • Items: the search_blob write stops stamping updated_at behind the model's back
  • Sitemap test: pin the clock so the two updated_at stamps agree
  • Checklists: count parses, not seconds, to prove the candidate cap
  • Checklists: labels stop at a nested list, wire() checks the count, tidy-ups
  • Checklists: a refused tick writes nothing, and set() checks the page too
  • Checklists: a stale tick reloads the page instead of flashing
  • Checklists: on /features and /compare, held by a parity claim
  • Checklists: a locked toggle, and a click queue that survives a throw
  • Checklists: tick without a reload
  • Checklists: tick a box, refusing a stale note
  • Checklists: the item page draws its boxes as buttons
  • Checklists: an unplaceable box makes the note read-only, and set() checks its tick
  • Checklists: TaskList, held to the renderer box by box
  • Imports count the tags they applied, not the ones they asked for
  • Watch email: a bounded window, no repeats, watches keyed by feed address
  • Watch email: a daily digest of what your watch rules caught
  • Bluesky: show a post left up wherever the item and the blog now are
  • Bluesky: the whole-branch review's fixes
  • Privacy: Sharing is the eleventh third party now
  • Parity: the share-button matcher accepts the Share-block wording
  • Privacy: Bluesky joins the third parties, and the share sentence says which block it is about
  • Promises: say the server posts new blog posts to the owner's Bluesky, held to the code
  • Bluesky: Try again keeps a maybe-sent row, aged or HTTP 5xx, so the command looks first
  • Bluesky: opt a post out, delete it from Bluesky, try again, on the item page
  • Bluesky reconcile: recognise an uncut link post by its words and card
  • Bluesky reconcile: claim each post atomically; match the link-back only
  • Bluesky: post the blog every five minutes, and withdraw what left it
  • Bluesky record: a cut link links back; pictures upright and not black
  • Bluesky: build the post record for one blog post
  • Bluesky: never flash the app password, and throttle connecting
  • Bluesky: connect an account with a handle and an app password
  • Privacy: name Safari's Reading List as an import, and that it arrives private
  • Correct two false comments in the Safari zip work
  • Import Safari's Browsing Data export: ReadingList.html from the zip, private
  • Safari Reading List: charge string bytes, cap dicts, refuse values the database would
  • Import screen: the reading list tag follows the folders switch
  • Say on the import screen how to bring in Safari's Reading List
  • Import a Safari Reading List through the shared bookmark import
  • Read Safari's Reading List out of Bookmarks.plist, private and dated
  • Bound the plist reader's allocations, charge unpack work, refuse unrepresentable dates
  • Read Apple's binary plist format, lazily and within bounds
  • Discover briefing: paragraphs no longer depend on the model's line breaks
  • AI: Haiku 5.5 replaces Haiku 4.5, as the default and for Hosted
  • Item page: the due-date field adopts organic's .input, as settings fields do
  • Do dates follow-up: due labels on /today, compact email row, visible Due label, /compare lastmod, notes

wyome.com

  • Standards: stamp the page updated 8 October
  • Privacy and standards: an AI assistant can read an Athenana library
  • Privacy: feed search and the Feeds page carry the play buttons too
  • Privacy: say a saved Athenana map link's pin goes to Apple
  • Refresh the banked archive from the server
  • Privacy: WyHealth works out a training plan and stores it with its inputs
  • Refresh the banked archive from the server
  • Privacy: Athenana can post a blog to Bluesky, and the Share block is per press
  • Privacy: Safari's Reading List is an Athenana import, and arrives private

Wednesday 7 October 2026

Athenana

  • Due dates: privacy section after the whole of 'Email you forward in'; reflow docblock
  • Due dates: in the exports, on /features, /compare and the privacy page
  • Due dates: the morning email's delivery gate, tested and checking status
  • Due dates: the morning email
  • Due dates: Today sorts by them, and the labels say so
  • Due dates: set and clear on the item page
  • Due dates: the columns, SetDo::due and the label
  • Blog feeds: ask for the summary flag once a request, restore the owner-count test
  • Blog feeds: carry a link's summary in place of its description
  • Feed playback: the blog's JSON withholds a feed-saved episode's audio too
  • Feed playback: an enclosure must be https, and a feed episode's note names the feed's address
  • Parity: hold wyome's privacy page to the Discover play sentences
  • Feed playback: a feed-saved episode plays for its owner only; the privacy page names Discover
  • Feed playback: a player keeps its own keys, the parity facts see <source> and poster, the note says what is true
  • Feed playback: press play on Discover, remember where you were, save keeps it playable
  • Feed playback: pin enclosure clearing and the watch guard; refuse Unicode whitespace and a bare type
  • Feed playback: enclosures captured and carried to Discover
  • Compare: unique planner section id, drop a characterisation, link the fourth grid
  • Features: the Do mark, held by a parity claim
  • Compare: soften the planner prose to match the cells
  • Compare: the planner grid
  • Planner grid: the data, verified
  • BlogFeedItemTest: name its asset helper apart from AssetServingTest's
  • Portable blog: check blogIsLive() last in blogIsHidden() so only hidden owners pay for it
  • Portable blog: gate post JSON on a live blog, don't forward a handle-less owner, carry photo pictures, drop duplicate covers, avoid N+1 on owner
  • Privacy: the portable blog's feed carries everything but its summaries
  • Promises: a portable blog on the privacy page, /compare and the parity tool
  • Blog: a subscribe page of its own, reachable while the blog is hidden
  • Hidden blog: forwarding, federation and sitemap tests
  • Hidden blog: forward HTML pages to the owner's site; point url fields, directory, sitemap and digest at BlogUrls
  • Blog: serve one post as a JSON Feed item at /s/{id}.json
  • Blog JSON feed pages the whole archive and moves home while hidden
  • BlogFeedItem test: tag names are stored lower-case
  • BlogFeedItem: one published item as a complete JSON Feed item
  • Portable blog: addresses, the switch, and BlogUrls
  • Do mark: Undo from the Done tab goes back to it, and the review's minors
  • Do mark: put the card's To do label in the foot, clear of the kicker
  • Do mark: in both exports, off every public surface
  • Today: assert the Back link label, not the sidebar's /today link
  • Today: j and k walk the list the item was opened from
  • Today: the To do and Done tabs, the bulk bar and the nav row
  • Do mark: a To do label on the card and the row
  • Do mark: the item page control
  • Do mark: the columns and SetDo
  • Reader API: cap uncached newsletter renders, anchor the parity claim, approved copy
  • Reader API: standards section, features line, parity claim, knowledge note
  • StoreItem: clamp a requested visibility to the type's ceiling
  • Reader API: a star saves a private link, and an issue in the background
  • Reader API: read, star saves, mark all read
  • Reader API: subscriptions, folders and streams
  • Reader API: ClientLogin is POST only, and the guards behind it
  • Reader API: sign in with a Reader app token
  • Mail budget: pin the sliding hour with a fixed-window reset case
  • Blog email: keep a confirmed address, prune removed accounts' readers
  • Blog digest: carry ids and decide again at delivery
  • Mail budget: a sliding hour of per-minute buckets, and a confirmation tier
  • Claims: say what blog email promises, on the privacy page, /compare and /features
  • Task 7: Blog email housekeeping — prune expired sign-ups, unsubscribes and digests
  • Blog digests: hourly athenana:send-blog-digests, claiming each day before it mails
  • Blog email: put the confirmation under the transactional mail theme test
  • Mail: the blog digest, its views, and DigestBody
  • Blog email: the owner's switch and a subscriber count, never an address
  • Blog email: one answer for missing, oversized and array input; 404 confirm for a removed blog
  • Blog email: subscribe box, confirmation mail, confirm and one-click unsubscribe
  • Blog email: subscriber and digest tables, models, shared token trait
  • Mail: back off and cap exceptions on budgeted mailables
  • Mail: an outbound budget so every email stays under the 100-an-hour cap
  • Item page: Pin to top of the blog joins the action row; Schedule sits on the inputs' line
  • Newsletters: prune emptied senders, say forgotten senders are listed, guard the 90-day claim
  • Privacy: the newsletter address keeps issues and senders 90 days, fetches nothing until saved
  • Newsletters: Back stays on this app; knowledge note for newsletter capture
  • Newsletters: a gone issue is refused, and a saved one is seen
  • Newsletters: read an issue here, save it as a note, forget a sender
  • Newsletters: no stored mail outlives its account or its sender
  • Newsletters: issues arrive in the pool, kept 90 days, never fetched
  • Mail: the note-making tail is one callable, NoteFromMessage
  • Newsletters: a second address, beside the forwarding one
  • Tests: WatchTest makes its account on the travelled clock
  • Safari release: unregister the export and archive copies after stapling
  • Safari build: --install unregisters the export and archive copies
  • Privacy: Safari's watch check sends no sign-in; one check fetch at pick time
  • Extension: a harmless redirect is not a sign-in wall; readers share offscreen
  • Extension: Confirm verifies a watch with one quiet fetch; Safari fixes
  • Extension: page watch runs on Mac Safari, through a background page
  • Revisit: follow the board's list / board layout
  • IndieAuth: a sign-in from our app revokes its stale app tokens
  • Blog composer: final review fixes (pinned-only page 2, pinned kicker colour, doubled errors, pin guards, tidy)
  • Public claims: correct scheduling wording and record the flip
  • Public claims: blog scheduling, pinning and about page now ship
  • Export: blogged, scheduled and pinned in front matter, CSV columns, about.md
  • Blog about page, actor summary, sitemap entry and timezone setting
  • ActivityPub: a featured collection for the pinned post
  • Pin to top of the blog: one post held first on page one, never duplicated
  • Blog: list scheduled items on What's public, with cancel
  • Blog: athenana:publish-scheduled applies due schedules every minute
  • Blog: schedule a publish from the item page, and cancel it
  • Blog composer: clear schedules and pins when changing visibility
  • Blog surfaces order and date posts by the publish date
  • Blog: blogged_at, the day a post went out, and blogIsLive()
  • Refuse five.co.in referrals, matching wyome.com's block

WyHealth

  • Detect the lab results cap from the total count, not an extra row

Wy5

  • Declare name and coarse location in the privacy manifest
  • Show the leader's first-place share, and say what the off-consensus count counts
  • Add DEBUG launch arguments for reaching screens and a local server
  • Quote ssh arguments in deploy.sh, and create the staging directory remotely
  • Refuse five.co.in referrals, matching wyome.com's block

WyAuto

  • Tell the pump scanner's user how to beat glare, and say so in the listing

WyHome

  • Fit main's new harness and CLAUDE.md to iCloud sync

wyome.com

  • Privacy: Discover's play buttons, and a feed-saved episode stays off public pages
  • Stamp the stylesheet
  • Blog: the pinned post cannot vanish, a tag walk waits for a page in flight
  • Blog: one feed page on load, older posts on request, a 40-tag cloud
  • Blog: never walk a feed page twice, and no failure links that loop
  • Blog: read everything the portable feed carries
  • Standards: Athenana syncs with news readers over the Google Reader API
  • Privacy: a blog on Athenana can offer its posts by email
  • Privacy: a forgotten newsletter sender stays on a block list until undone
  • Privacy: a second Athenana address keeps newsletter issues, 90 days, nothing fetched until saved
  • Privacy: Safari's watch check sends no sign-in; one check fetch at pick time
  • Refuse five.co.in, which launders referrals through redirect.php?ref_host=

Tuesday 6 October 2026

Athenana

  • iOS: the waiting screen says subscribe, and Check again says what it is for
  • iOS: the waiting screen's store opens as a sheet behind "See plans"
  • Sign-in from the app, already signed in on the web, goes on to the app
  • Compare: a third grid, against six blogging platforms
  • Pricing and terms: the iPhone app sells both plans monthly
  • Discover row: one data-key-open anchor; put withoutWatches under its own docblock
  • Page watch: drop link-less items, keep watches out of the briefing, small review fixes
  • Privacy: put the watched-site clause where it reads naturally
  • Page watch: resolve links against the redirected URL, count only accepted checks, abort stalled reads, require Chrome 116
  • Privacy: say what the extension's page watch fetches and when
  • Page watch: the browser re-checks watched pages
  • Page watch: choose the item link, ignore synthetic events
  • Page watch: pick a repeating item on the page
  • Page watch: race-safe inserts, stronger prune test, input caps
  • Page watch: the API the extension writes through
  • Page watch: no summaries, no reader, 255-character titles for watches
  • Page watch: a watch kind of feed the server never fetches
  • Search: pool blank flag from PoolSearch, and the missing save and cap tests
  • Search: in:feeds results on the board, with Save
  • Search: push pool date and site filters into SQL, cap when a source is full
  • Search: in:feeds finds the feed pool, newest first, muted left out
  • Regular feeds: review minors (docblock order, wording, route comments, limit tests)
  • Regular feeds: style the page like Feeds, with bulk Forget
  • Feed rules: fix Steer form layout at 375px, tidy review findings
  • Discover rules: in the export, beside saved searches
  • Discover rules: write them on the topics screen, and see what they hid
  • Tests: move the steer* fixtures to Pest.php so each file runs alone
  • Discover rules: a boost puts up to three stories first, and says so
  • Discover rules: a mute keeps a story off both lists and out of the briefing
  • Discover rules: a feed rule stores the feed id, not its title
  • Discover rules: the tables and the one matcher
  • Compare: a second grid against six feed readers
  • Say at the top of an item when the site blocked the server
  • Privacy: fit the meta description in 160, pin the visit wording
  • Front page: people sharing and visits; visits on a link's own page
  • Discover reader: b goes back to the story you opened, not the top of the list

WyHealth

  • Keep lab figures as written, and tighten the copy and reads
  • Show lab results on the dashboard, flagged against the lab's own range
  • Save only after the form has hydrated, and let React set the method
  • Keep the no-JS POST fallback on the lab form
  • Keep the form's selections after a failed save, and give /labs the brand face
  • Add the pages for entering, editing and deleting lab draws
  • Read and write lab data, telling a failed read from an empty one
  • Name the lab constraints, refuse non-finite values, and test every cross-user path
  • Store lab draws and results as entered, editable only by their owner
  • Write the labs copy, held to the banned-vocabulary list
  • Reject impossible dates and loose numbers, and break ties by id
  • Flag results against the lab's range, validate panels, and build marker rows
  • Add the lab marker catalogue and its unit conversions
  • Start Apple sign-in on the server, and say when it fails
  • Name the last two chosen limits, and keep the zones sweep fast
  • Plan from what was actually done, and guard its inputs

Wy5

  • Bound Apple's share of an account deletion to nine seconds
  • Refuse a second group's copy of a topic, and name the unindexable-title error
  • Refuse to upload ahead of migrations, and let /health see every one
  • Stop list restore re-requesting topics the server refuses at every launch
  • Say an edited list's earlier version still counts, and why a search failed
  • Show the server's own message for invalid_field, and name an unindexable title
  • Let account deletion proceed when Apple's confirmation sheet fails
  • Score group boards by each pick's stored rank, not its position
  • Swap deploys in atomically, keep credentials off the command line, and record migrations
  • Stop timestamps depending on two clocks agreeing, and make /health real
  • Meter every write per user, read by user, and raise Browse's trending cap
  • Report Apple revocation truthfully, and harden sign-in and sign-out
  • Keep the synthetic catalogue and slug fixtures out of Release
  • Add blocking, content reports, re-authenticated deletion and honest errors
  • Show only Commons thumbnails, and give Wikimedia a support contact
  • Make coloured text readable in both appearances and at large type
  • Keep reports after their group is gone, report content too, and mail every one
  • Let a member block another, one-way, from what they see
  • Keep a group's topics inside the group, and withhold standings below three lists
  • Stop a ballot rewriting shared catalogue items, and check new ones with Wikidata
  • Declare privacy, encryption and orientation for App Store submission
  • Filter user-generated text, and refuse a second copy of a member's name
  • Ship Wy5 free, with no in-app purchase

WyHome

  • Keep a recorded standing across coalesced passes; clear denial on return
  • Make Sync now report what each channel actually did
  • Say why a mirroring toggle bounced off when access is denied
  • Leave another device's placeholder alone when repairing identifiers
  • Claim a mirroring channel only if the toggle is still on

wyome.com

  • Privacy: the watch check also sends a short excerpt of each item
  • Privacy: the Athenana extension re-checks pages you ask it to watch
  • Describe what Wy5 actually stores, and keep its join codes off the stats page
  • Publish terms of use for Wy5, linked from every page's footer
  • Refresh the banked archive from the server
  • Privacy: Athenana counts page visits too

Monday 5 October 2026

Athenana

  • Regular feeds: say plainly when a Flipboard feed is not fetched
  • Regular feeds: correct the comments the branch made false
  • Regular feeds: say when one fails, on the page and in the command
  • Regular feeds: prune on every exit of the Discover build
  • Regular feeds: a lost double submit is a duplicate, and keeps the subscription
  • Regular feeds: add and remove them by hand, on their own page
  • Regular feeds: leave Flipboard's aggregations out
  • Privacy: say that feeds read elsewhere are fetched for Regular feeds
  • Discover: Save on a Regular feeds row returns to that tab
  • Discover: a Regular feeds tab, with the reader's way back to it
  • Discover: make the regular-failure test discriminate, and log when the list is capped
  • Discover: build each morning's Regular feeds list and its briefing
  • Discover: one place stores a day's list, for a second list to share
  • Discover: make the list-separation tests discriminate
  • Discover: a row and a briefing belong to a list, and every read names it
  • Feeds: fetch the feeds read elsewhere nightly, and keep them ignored
  • Feeds: an ignored feed can hold entries, for the Regular feeds tab
  • Feeds: one fetch-and-parse core, for a second kind of feed to share

wyome.com

  • Refresh the banked archive from the server
  • Privacy: feeds read elsewhere are fetched for Regular feeds

Sunday 4 October 2026

Athenana

  • Discover reader: remember a Google miss for a day, resolve before a stale copy
  • Privacy: opening a Google News story asks Google where it lives
  • Discover reader: say why a story can't be read, and read Google News stories
  • Discover: decode Google's answer rather than matching it
  • Discover: turn a Google News link into the publisher's address
  • Mac: a UI test for the refused-save notice in the library window
  • Discover reader: b goes back to the Discover list
  • Discover: bound the picture proxy, and keep a day to a day
  • Privacy: say that a Discover story opened here is fetched by the server
  • Discover: Save keeps the copy that was read
  • Discover: a story's title opens it here, with pictures through a signed proxy
  • Discover: fetch a story when it is opened, and keep it for a day
  • RawHtmlArchive: an empty kept copy is no copy
  • FetchPage keeps a page the Discover reader already holds
  • Reader: one public extract-and-finish chain, for a second reader to share
  • Board edit: after Delete, return to the board's first page, not the one scrolled to
  • iOS UI test: the refused-save waiting-screen test launches pending
  • iOS: "Create an account" on the sign-in screen opens the app's sign-up
  • Sign-in from the iPhone app carries no route to a purchase outside it
  • Board edit: Delete stays on the right when pressed, and is a filled button
  • Board edit: reach pages infinite scroll appends, and keep the ring inside the card
  • Board: an Edit mode that selects cards or rows and trashes them together
  • Knowledge: final-review fix wave (policy-parity concept, okf.py escapes and ---, pointers, descriptions)
  • Knowledge bundle: coverage accepts per occurrence and counts short lines
  • Knowledge bundle: okf.py coverage proves a move dropped nothing
  • Knowledge bundle: tools/okf.py index and check, with tests
  • Webmentions: a target that dies mid-read costs one mention, not the run
  • Discover: search the kept daily briefings, and say that is all it searches
  • Disk check: the ratio test proves the trash is counted
  • Disk check: count the feed pictures in the files stored
  • Disk check: one mail per mailbox, whatever the case
  • Disk check: the remembered band only rises
  • Disk check: send the alert at once, and record it only once it went
  • Disk check: mail the operator at 70% and 85% used, nightly
  • Apple News: a story only in News has no article, not Apple's notice
  • iOS release: require the real subscription group id
  • Apple News: read the publisher's page, not Apple's redirect page
  • Apple's two routes join RawBodyRoutes: bounded before any decode
  • Apple IAP: the unlock route decides "mine" by the writer's owner rule (N1)

WyHealth

  • Stack the empty-state lines, and keep the windows DST-safe
  • Show this week's training plan on the dashboard
  • Store each plan with the inputs it came from, readable only by its owner
  • Treat a failed read as a failure, and name every chosen number
  • Decide when a plan stands and say why it changed, in vetted words
  • Derive the plan's inputs and generate a plan, or say what is missing
  • Keep the long session the longest, and pin the volume promises
  • Ramp weekly volume 10 % at a time and split it into sessions
  • Add the plan engine's types and heart-rate-reserve zones

WyAuto

  • Hold Save while a picked receipt photo is still loading
  • Show a receipt at its actual size when zoomed to full size
  • Run one reminder rebuild at a time, the latest winning
  • Read only a definitive 4xx as no such vehicle
  • Test the upgrade from a store written before versioning
  • Rebuild reminders after every change that moves one
  • Keep the source-root constant off the main actor so the tests compile
  • Add CLAUDE.md, describe the hook generically, mark the tier docs superseded
  • Warn on an odometer jump no one could drive
  • Read a 4xx as no such vehicle, and drop superseded lookups
  • Say when the camera fails, and offer to type the figure instead
  • Describe the Reports charts and the camera view to VoiceOver
  • Let a saved receipt be viewed full size and removed
  • Downscale receipts at ingest and stop decoding them in body
  • Turn the reminder switch off when iOS has notifications denied
  • Remind about due-soon and overdue rules, at 9:00, on every foreground
  • Say plainly what the store failure means and what to do
  • Skip the schema source scan where the sources are not on disk
  • Version the SwiftData schema and show a store failure instead of crashing
  • Add picked photos to the pending images instead of replacing them
  • Write numbers back into editable fields in the locale Parse reads

WyHome

  • Say when iCloud status is unavailable; note the sync loop's limits
  • Claim a mirroring channel only once access is granted
  • Give a restored or migrated device its own ID
  • Ship the remote-notification background mode in the iOS app
  • Fold a placeholder only into an older property, and only on its maker
  • Correct the schema deploy guidance and tidy the initializer
  • Add a CloudKit schema initializer, cap attached files, document sync
  • Count only successful imports; treat transient iCloud states as unknown
  • Sync records through iCloud
  • Describe the pre-push hook for this repo, not another project's incident
  • Test recurrence, schedule and search-radius logic with fixed clocks
  • Never sweep a calendar WyHome does not own; read identifiers after commit
  • Tag mirrored identifiers by device and sweep what no record points at
  • Let one device own each mirroring channel
  • Fold the auto-created "My Home" into the real property
  • Add the pure rules behind iCloud sync, with a harness
  • Ignore in-repo worktrees

wyome.com

  • Privacy: a page Athenana cannot read offers a link to the publisher
  • Privacy: opening a Google News story asks Google where it lives
  • Privacy: a Mac keeps WyHome's data after the app is trashed
  • Privacy: WyHome records sync through the person's own iCloud
  • Privacy: opening a Discover story in Athenana is fetched by the server
  • Refresh the banked archive from the server

Saturday 3 October 2026

Athenana

  • iOS: Restore asks again past a refusal, and says when it finds nothing
  • Apple IAP final fix wave: approved copy, 503 for unrecorded purchases, quiet updated_at
  • Feed article: follow an Apple News share, and ask the owner's feeds when a page names none
  • Remove the tag that was pressed, not the board's tag
  • iOS: Restore, Terms and Privacy outside the store view; sharper guard
  • iOS: the subscription screen, on the waiting screen, the menu and a refusal
  • iOS: end a purchase listener with its account
  • iOS: finish a purchase only on a refusal of the purchase itself
  • iOS: StoreKit 2 purchases, posted to the server and finished on its answer
  • iOS: drop a purchase's answer that outlives its account
  • iOS: read /me whole and post a purchase's signed transaction
  • Billing: stable switch key, live channel for card declines, device-neutral cancel sentence
  • Billing: acknowledgment, reminders and standing emails for Apple subscribers
  • Billing: reconcile fix round, sandbox expiry stated, dry run and unmatched rows honest
  • Billing: athenana:reconcile-apple, the Apple half of the nightly reconcile
  • Decode no stranger's JSON before a ceiling can refuse it
  • Billing: queue the two-subscriptions notice, split the admin ledes
  • Billing: say so when an account pays twice, and show Apple on /admin/users
  • Billing: a double subscriber keeps Manage billing and loses the switch
  • Billing: the web offers an App Store subscriber no checkout
  • Billing: bound the unlock body before anything decodes it; no store for an admin
  • Billing: /me names the purchase token and channel; the app's unlock route
  • Billing: refuse an oversized Apple notification before anything decodes it
  • Billing: receive App Store Server Notifications V2
  • Billing: decide an Apple subscription's ordering in the database
  • Billing: record an Apple subscription and admit its owner
  • Billing: AccountStanding reads Apple subscriptions beside Stripe's
  • Billing: every App Store Server API failure is AppStoreUnavailable
  • Billing: read a subscription's status from the App Store Server API
  • Billing: the Apple tables, the account token and the product map
  • Billing: globalise the Apple test helpers, test forged chains under the real root
  • Billing: verify Apple's signed data against a pinned Apple Root CA G3
  • Round six low: the web holding page says the account isn't open yet
  • Round six low: the Mac library shows a refused queued save's sentence
  • Round six low: the call site's file-URL flag is pinned, not only its rule
  • Round six low: the migration compares the old stamp with the signed-in account
  • Round six low: the Read menu's Open Original takes the toolbar's rule
  • Round six low: a web address beside the link is the link, not a quote
  • Round six low: the outbox migration carries only this account's old entries
  • Round six low: the Mac opens an original only when it is a web address
  • Round six low: a picture whose file cannot be read is never loaded whole
  • Round six low: the waiting screen says the account isn't open yet
  • Round six low: a refused token stops the outbox replay and signs out
  • Round six low: the MyMind PDF's temporary copy never outlives the import
  • Round six low: the pending-deletion exemption is free access the account has now
  • Round six low: a won dispute does not cost the month carry
  • Round six low: pin callsModel() across every enrichment stage
  • Round six low: every reader takes the subscription derive() takes
  • Round six low: a MyMind import's kept PDF counts against the storage cap
  • Round six low: the pending-account purge spares a live grant
  • Round six low: a lapse ends the month carry
  • Round six low: a purged item keeps its tag and image slot for the month
  • Round six low: no model call for an item whose owner was removed
  • Round six low: refuse the Portal while any dispute is open, granted or not
  • Round six low: record the renewal's period end before the standing reads it
  • Round six low: a charging subscription outranks a newer one that ended
  • Round six low: the sign-up maximum fill time is floored above the minimum
  • Round six low: the feed-extras claim follows the flag into key()
  • Round six low: the referrer-spam skip fires only on an address-served site
  • Round six low: suspending a paying account says its billing goes on
  • Round six low: a site's own clicks skip the referrer-spam block
  • Round six low: a suspended session is signed out of /pending
  • Round six low: a sign-up form's signed stamp has a maximum age
  • Round six low: every sign-up outcome but a bot spends the global cap
  • Round six low: the feed-extras claim checks each call asks for extras
  • Round six low: restore lifts a suspension and approves nothing
  • Round six low: the reading API deals by the switches the screen offers
  • Round six low: a replayed save is the duplicate, not refused at the cap
  • CLAUDE.md: www and scheme folded in match(), the 555 unit change is hygiene
  • Feed article: measure as the reader does, keep less, fold www and scheme
  • Feed article: a new feed copy drops the stored pictures, and the backfill re-images
  • CLAUDE.md: the reader asks the site's feed first; the 555 budget everywhere
  • athenana:backfill-feed-articles: one host, each feed fetched once
  • ReadableArticle: put the raw-markup warning on the public chooser
  • Reader: use the feed's article unless it is only an excerpt
  • Enrichment: keep the feed's copy of a saved article
  • Find a saved page's article in the feeds it advertises
  • Feeds: keep each entry's full content beside its summary
  • Tag board: Jump to offers related tags, not the most used
  • Round six: one vanished checkout or subscription no longer skips the rest
  • Round six: the prune leaves a row a webhook wrote after its Stripe read
  • Round six: a created event Stripe has already cancelled gets an end date
  • Round six: a past_due subscription's unpaid invoice may still be charged, and the screens say so
  • Round six: an abandoned checkout beside a grant is not "still billed"
  • Round six: a stray is re-checked against live accounts at the moment it is cancelled
  • Round six: an open checkout cannot outlive the account it would charge
  • Round six: a granted account that pays is told so, and can stop paying
  • Round six: a subscription webhook writes Stripe's current state, not the payload's
  • Round six: the lapsed prune asks Stripe before it deletes a payer
  • Round six: a grant releases held saves, through the payer's own step
  • Round six: lapse only on an open latest invoice
  • Round six review: the allowance claim checks the Retry form, and /pricing covers the year
  • Round six review: every deletion sentence reads its days from config, and names the dispute
  • Round six review: a price-check verdict is about the config it judged
  • Round six review: the Switch to Hosted is held to the price check too
  • Round six review: count only previews a person sent, not one the server fetched
  • Round six: say on /terms and in the free-access emails that a lapse ends in deletion
  • Round six: check the advertised prices against Stripe, and pause checkout on a mismatch
  • Round six: an uploaded preview counts against the storage cap
  • Round six: an API 402 names no website, plan or checkout
  • Round six: /pricing no longer promises that capped saves are read later
  • Accessibility review fixes: skip links, main landmarks, a shortcut off switch
  • Tumblr import: escape !, ~~ and & so a body renders as written
  • Tumblr import: route the job, name it on Sharing In, and write it down
  • Tumblr import: every post a private, pending item
  • Tumblr import: a damaged zip entry is a sentence or a null, and the temp copy never leaks
  • Tumblr import: open the export in any of its three measured shapes
  • Tumblr import: read one post file, from the measured template
  • Tumblr import: linear emphasis edges, break-safe emphasis, more block elements
  • Tumblr import: a post body into Markdown, by allowlist
  • iOS capture: text that is only a web address is a link, not a note

WyHealth

  • Close the final review: pre/post-push checks, rollback, and comment fixes
  • Tell an RLS refusal from a missing grant, and check prod holds 0019's
  • Grant each table's privileges explicitly, and anon none
  • Build a database from the migrations alone and hold it to a grant matrix

WyAuto

  • Stack the Log and Coming-due rows at accessibility text sizes
  • Stack the Garage row's figures at large accessibility text sizes
  • Tell an unreachable lookup apart from one that found nothing
  • Drop the last free-tier and paid-path wording from comments; README test count
  • Show the scan buttons before camera permission has been asked
  • Draft the App Store listing, capture screenshots, and correct two claims
  • Add the privacy manifest and export-compliance flag for submission
  • Sell WyAuto for $1.99 with every feature included

WyHome

  • Give VoiceOver the state of the remaining job checkboxes
  • Give VoiceOver a name for the intake checkbox and every form text field
  • Stop the visit row's long-press preview clipping its first letter
  • Offer the search radius in the units the results are shown in
  • Shorten the intake title on iPhone so it fits beside its buttons
  • Remove stale copies of intake sources from the repo root
  • Read properties in display order where the first one matters
  • Leave the dryer vent off the demo schedule
  • Open documents in a page-sized sheet on iPad
  • Say "Every year", not "Every 1 years", in the job editor
  • Stop the Maintenance due-soon tile counting overdue jobs
  • Scope the six-month chart on Today to the selected property
  • Add a DEBUG-only demo store for screenshots
  • Close three open items from the visits merge
  • Add the privacy manifest App Store Connect requires
  • Sell WyHome for $4.99 up front and drop the subscription

wyome.com

  • Privacy: an Athenana plan can be an App Store subscription sold by Apple
  • Privacy: WyAuto syncs through iCloud and looks vehicles up with NHTSA and the EPA
  • Privacy: an unopened Athenana account with free access from us is not deleted at 30 days
  • Privacy: an unopened Athenana account with free access from us is not deleted at 30 days
  • Refresh the banked archive from the server
  • Accessibility review fixes: contrast, a main landmark, no timed refresh

Thursday 1 October 2026

Athenana

  • Deck settings: stop offering the two switches the apps can no longer deal
  • Serve .webp as image/webp
  • Features: drop the phone tile, and show the reader's article text
  • Features: show the product in the hero, from a staged demo library
  • Billing: show a pending plan change scheduled in Stripe
  • Mail: every email wears the weekly newsletter's look, and fetches nothing
  • Billing: Switch to Hosted asks for confirmation before it charges
  • Refuse referrer spam ahead of everything else, copied from wyome.com's block
  • Billing: after paying for Own key, land on the key screen with a welcome panel
  • Pending: the full wordmark at every width
  • Pending: no sidebar, so the page centres in the window
  • Pending: one page with the price grid, not eight stacked cards
  • Open registration review fixes: pending and suspended API refusals worded apart
  • Open registration: an account opens when it subscribes, and an invite with a plan opens at once
  • Tags: one tab strip across Tags, Manage and Suggested
  • Admin: the members table gets the full width; empty dispute lists are a plain line
  • Pricing: name the Hosted model as Claude Haiku, without the version
  • Parity: pin call sites and one answer; record the rulings
  • Sign-up: four abuse protections, the pending flash, one error, the nav pair

Wy5

  • Refuse referrer spam at the API docroot, copied from wyome.com's block

wyome.com

  • Refuse the outreach-link-building campaign by its path, and two more hosts by name
  • Athenana: an account opens when it subscribes

Wednesday 30 September 2026

Athenana

  • Records: the third retirement, the pricing page, and the claims that hold them
  • Claims: sign-up and the Hosted extras, held to the code on every page that makes them
  • Front page: a pricing band below Recently saved, alternating in both states
  • Pricing: fit the public top bar on one row, and assert the allowance by sentence
  • Pricing: a public page, from one price source and the config the plans enforce
  • Sign-up: re-check the address under lock inside the claim, and print a refusal once
  • Sign-up: the link's page creates a pending account, and nothing else does
  • Sign-up: one answer for every address, a queued link, and three throttles
  • Sign-up: a links table that creates no account, and its nightly prune
  • Billing: state the hosted model by its public name, from the one pin
  • Billing: one source for the four prices, and the facts a pricing page states
  • Reconcile and acknowledgment: review fixes I1-I4 and minors
  • Billing: withhold the acknowledgment from a refunded, cancelled subscription
  • Reconcile: approve paying accounts, sweep unknown subscriptions, apply disputes
  • Share sheet: ask a declared picture's file-url item and its NSImage before refusing
  • Share sheet: read a declared picture through its file representation, and say so when nothing can
  • Mac share: the regenerated Info.plist carries "Save to Athenana"
  • Share sheet: a bare file URL to a picture is that picture, and the Mac logs what it is handed
  • Mac share: the extension is "Save to Athenana", not a second "Athenana"
  • Mac share: review fixes — refuse the unprovisioned install, probe first
  • Mac: a share extension, "Save to Athenana" in every app's Share menu
  • Mac: one shared group for the token and the outbox, and a one-time move
  • Mac: the share sheet's decisions compile and pass on macOS
  • CSP: let Subscribe and Manage billing redirect to Stripe
  • Merge fix: price Sonnet 5.5 where the branch priced Sonnet 5
  • Step 6 review: say which fraud warnings are refunded, date the privacy page today
  • Billing step 6: privacy and pricing wording, seven parity claims, delete subscription rows with the account
  • Billing 5C follow-ups: disputed deletion wording, no-email log split, grant tie-break, pass-2 catch test, records
  • Billing 5C fix wave: warn and prune disputed accounts, gate the prune on the final warning, catch per-notice failures
  • Picture panel: let the server judge a pasted image address
  • Picture panel: stop nesting forms, so the URL box submits again
  • Billing: reconcile survives stored period ends, trashed owners and wider outages
  • Billing: nightly reconcile against Stripe, and prune long-lapsed accounts
  • Billing: pin the deletion-day boundary and skip grant notices for accounts that keep a plan
  • Billing: send the free-access-ending and deletion-warning notices
  • Billing: an abandoned new checkout does not hide the lapse behind it
  • Billing: queue the standing emails, narrow the free-ended case, quiet EFW lapse
  • Billing: email on card declined, lapse and the end of free access
  • Billing notices: key on a subject, so a grant or an account can have one
  • Billing: lapse clock survives disputes and abandoned checkouts; column migration runs before the backfill
  • Billing: lapsed_since and a standing-changed event
  • Smoke: hold the anchored pass and position exemption
  • Standing: honest copy for uncovered podcast accounts and expired free grants; comment fixes
  • API: anchor the pass and position exemption so a share target cannot ride it
  • Billing: no nightly discovery build or feed refresh outside good standing
  • Billing: release held saves when an approved account first reaches good standing
  • Webmentions: renewal reopens the withdrawn ledger row
  • Mac: the reading keys work while an article is loading
  • Mac: put the reader's toolbar at the window's trailing edge
  • Lapsed gate: a Kindle job queued before the lapse refuses at run time
  • Podcast: the operator's credential is for admins and grants, and a lapsed feed is a 404
  • Lapsed gate fix round 1: account and item screens name the archive, not 'publishing is off'
  • Lapsed gate: an account out of good standing is archived on every public surface
  • Lapsed gate: keep a lapsed account's backlog un-stamped, and fold in review minors
  • Lapsed gate: AI, mail, imports and MyMind stop for an account not in good standing
  • Lapsed gate fix round 1: pass/position open, Micropub trash closed
  • Lapsed gate: 402 on the API and Micropub create/update
  • Lapsed gate fix round 1: banner for approved accounts only, narrower OPEN, secret removal stays open
  • Revert the Mac title-bar change (11fc3bb4)
  • Lapsed gate: the web middleware, the export list and the standing banner
  • iOS on a Mac: no "Athenana" in the title bar, and the window takes the ground
  • Billing: the standing predicate, its scope, and a backfill of billing_state

wyome.com

  • Say that anyone can create an account with an email address
  • Privacy: WyHealth still signs in with Apple only; date today
  • Privacy: paid Athenana plans, Stripe, billing records, lapse and deletion; correct the sign-in sentence
  • Changelog: read each project's upstream as well as its checkout
  • Refresh the banked archive from the server

Tuesday 29 September 2026

Athenana

  • Mac: the reader's head carries the details; no inspector, no title, search lets go
  • iOS: dropped-save notice follow-ups from the final review
  • iOS: an in-flight replay's refusal cannot outlive sign-out
  • Mac UI tests: pin the reader's typography, not inherit the owner's
  • Mac: the list draws its own selection, and its type is smaller
  • iOS: stage a refused queued save in fixture mode, test and screenshot the dropped-save notice
  • Account: give the Your data panel the #export anchor the app links to
  • iOS: Export your library in the account menu
  • Picture by address: say to upload it when a site refuses the server
  • Outbox: do not report a refusal through onDrop once purged
  • iOS: show the server's sentence when a queued save is refused on replay
  • Mac: the list column takes the card colour, not a grey
  • Extension: state a 402 or 413 as the server's own sentence
  • Billing: the fraud email names a denied account and says what this run did
  • Billing: a skipped fraud warning records its account and amount
  • Billing: refuse the Portal on the server while a payment is disputed
  • Billing: a lost dispute lifts only once a renewal is paid after it
  • Admin evidence: no after-charge figures without a charge date, and reach disputes on removed accounts
  • Admin: list disputes and fraud warnings, and print the evidence for a dispute
  • Billing: run the early fraud checks before claiming the row
  • Billing: finish an early fraud refund that failed after the money moved
  • Billing: refund an actionable early fraud warning and cancel at once
  • Mac: a held space does not repeat, and CLAUDE.md says where the keys go
  • Billing: closed disputes stay closed, open events stop renewal, paying again clears a lost dispute
  • Mac: a reading key works on every press, not only the first
  • Billing: record disputes, stop renewal, read disputed
  • Admin step-up stamps the session without logging a sign-in
  • Log sign-ins (time and method, no IP) for the dispute evidence packet
  • Mac: an app icon, a grey list column, and a wider one
  • Keep denied payers in Paid, not admitted; terms says about a month
  • Admin: denying an account cancels its Stripe subscription first
  • Billing: the monthly plan's yearly reminder names no date in its subject
  • Billing: back the acknowledgment job off so a short outage cannot lose it
  • Guard against changing a subscriber's price; record step 4B
  • Billing: a dry run must not spend the missed-window alert
  • Billing: send the advance renewal reminders
  • Billing: make the acknowledgment's failure tests discriminate
  • Billing: acknowledge a first payment or a switch by email, once per invoice
  • Billing: record the checkout consent, with the words shown
  • Billing: record the Stripe period end and show "Renews on"/"Ends on"
  • Billing: a terms page, and the support address from config
  • Mac: an empty library says "Nothing saved yet."
  • Mac: the list's last line says what kind of end it is
  • AI: Sonnet 5.5 replaces Sonnet 5 as the default and the account choice
  • Settings sidebar: a Billing row below Account

wyome.com

  • Refresh the banked archive from the server

Monday 28 September 2026

Athenana

  • Billing: account deletion cancels without proration
  • Smoke: give the refund guard positive fixtures
  • Mac: a new page 1 drops the old walk's pages, and ⌘R refreshes the list
  • Billing: let a lapsed account subscribe again when nothing blocks it
  • Billing: let a granted-and-subscribed account's confirming page finish
  • Billing: a revoked or expired grant with no subscription reads lapsed
  • Billing: cancel Stripe subscriptions before deleting an account
  • Billing: react to invoice.payment_failed on WebhookReceived
  • Guard against refunds from code; record step 4A
  • Mac keys: one move per press, and the end measured at the press
  • Fix round 1: point every plan-wording site at Plan::label()
  • Mac: j, k and space in the list and the page
  • Admin: show what payment could not do on /admin/users
  • Mac reader: its own top air, and one gap above the summary
  • Mac: Reeder's reader head, and the toolbar's Keep
  • Billing: fix round 1 for /settings/billing (reviewer findings)
  • Billing: /settings/billing — the Portal, Switch to Hosted, and the ladder
  • Mac: a refresh with no overlap takes page 1 whole, cursor and all
  • Mac: the whole library survives offline, the foreground and approval
  • Mac: every item newest first, in Reeder's row shape
  • Billing: fix round 1 for task 6 (reviewer findings)
  • Kit: LensFilter.all, the whole library with no query item
  • Reading API: a lens with no filter is the whole library
  • Billing: checkout from /pending and /settings/billing (task 6)
  • Mac: the tag-pill test finds the header by identifier; the app was right
  • Billing: fix round 1 for the Stripe webhook (reviewer findings)
  • Billing: the webhook moves standing and approves a payer
  • Billing: fix round 1 for ApproveUser -- conditional update, honest flash
  • Billing: ApproveUser, one approval path
  • Billing: a paid Hosted account is covered and capped like a grant
  • Billing: an unreadable latest invoice reads as past_due, never a 500
  • Mac shared state: review fixes to labels, sign-out doc, wording and the last row
  • Billing: plan, billing_state and the one function that writes them
  • subscriptions.user_id must be a ULID, not a BIGINT
  • Install Cashier, pin Stripe out of the suite
  • Mac: Next and down-arrow tell the server the card was passed
  • iOS/Mac: one AppState for both apps; MacState is gone
  • Put the storage line first under Your data, and say none yet
  • Show a save refusal exactly once, the plain save page included
  • Say what reads the storage figure now, in config and .env.example
  • Fetch no remote mail picture for an account already at its cap
  • Ask MyMind for nothing at the storage cap, and clear a stale note
  • Say files were left out on their own, not as an enrichment failure
  • Count everything a pending account sends against its byte budget
  • Count a note's or highlight's file against the storage cap
  • Show a capped account how much of its storage its files use
  • Import past the storage cap without the files, and count what was left out
  • Write the storage cap's note before enrichment starts, as one key, in neutral words
  • Save forwarded mail without its files at the storage cap, and say so on the item
  • Refuse a gallery photo past the storage cap, from every source
  • Refuse a capture, a Micropub photo or an uploaded PDF past the storage cap
  • Make StorageQuota the storage cap, and pending's byte budget one of its answers
  • Fix wave item 9 and tidies
  • Fix wave item 7: a disabled five-Ws box no longer unticks a feed
  • Fix wave items 1, 2 (part 2): account screen copy for month vs year exhaustion
  • Fix wave item 2 (part 1): the bar follows the nearest limit, items name what ran out
  • Fix wave items 4, 5, 8: tag cap counts items, fix the month-reset test
  • Fix wave item 3: check the year before the month in HostedPlan::check()
  • Fix wave item 6: stop logging AllowanceExhausted refusals
  • Show a Hosted account its month of AI reading in words and a bar
  • Disable the five-Ws box for Hosted accounts and pin their bulk exclusion
  • iOS: draw the fixture picture at 3×, as the renderer did
  • Mac: the waiting screen matches the phone's
  • Pin Hosted accounts to Haiku 4.5 and a 24,000-character summary input
  • Refuse a Hosted account's model call before it is sent, at its allowance
  • HostedPlan's year check consumes AiLedger::yearStart(), not a re-derived window
  • Add the Hosted plan's allowance, read off the ai_spend ledger
  • Bind the admin passkey proof to its account; guard launch grants on Give
  • Record the operator's AI spend on every model call
  • Mac: MacState takes round five's AppState rules
  • WIP: spend ledger pieces (prices, cost maths, ai_spend table, workspace tap)
  • Mac: docs say the two UI defects are fixed, and what this wave found
  • Mac: review minors — sidebar faces, a VoiceOver clear, one first load
  • Mac: prove the keychain once before a session is built on it
  • Mac: emptying the search field clears only a search lens
  • Mac: a refresh or a re-deal leaves the open article open
  • Mac: the reader registers with the deck
  • Mac: Return in the sidebar search deals the lens; two UI tests read the Mac tree
  • Mac: the back as an inspector, and the Read menu
  • Mac: a link saved from the Mac says so; the text menu has one name
  • Mac: the reader in the detail column
  • Mac: the library window — Handpicked, the stopping point, search and lenses
  • Mac: fix Sign in button to match iOS's QuietButtonStyle
  • Mac: sign-in, the waiting screen, settings and the app's root
  • Mac: the sidebar's model — rows, the stopping point, next and previous
  • Mac: MacState — the session, the stores and the purge, without the App Group
  • Mac: the AthenanaMac target, its test bundles and bin/build-mac.sh
  • iOS: move the reader's page support, typography and the sign-out sentence out of the views; Theme on AppKit too
  • Kit: SystemKeychain takes a service and the data-protection keychain

wyome.com

  • Refresh the banked archive from the server

Sunday 27 September 2026

Athenana

  • Add the free-grant screen and grant invited accounts
  • Require a recent passkey for the admin area
  • Keep export open for waiting and suspended accounts
  • Close the operator-key leaks behind free grants
  • Add athenana:storage-report and the StorageQuota measurement
  • Round five low: ReaderMove keeps its own doc comment
  • Round five low: a stale outbox forgets in memory only
  • Round five low: count the prepared picture, and keep a 20 MB one
  • Round five low: an offline deck asks again
  • Round five low: ← skips cards a refresh dropped
  • Round five low: count the multipart copy in the share sheet's batch
  • Round five low: fill the reader template in one pass
  • Round five low: stamp the outbox file with its account
  • Round five low: a refused self-delete returns to /pending#delete
  • Round five low: an empty pin length is thirty days, not zero
  • Round five low: the total-order guard reads the direct chain as code
  • Round five low: Select all on dead links reaches the rows scroll.js appends
  • Round five low: refreshing the demo account ends its browser sessions
  • Round five low: say truly why a waiting account's trash is not counted
  • Round five low: narration cuts figures with the DOM, not a regex
  • Round five low: fetch and render choose pictures by the same rule
  • Round five low: the web reader parses our own asset address, never echoes it
  • Round five low: a page of highlight cards loads its sources in one go
  • Round five low: the cached :images reader names no host and tracks its pictures
  • Item page: Move to trash beside Pin, visibility on its own line below

wyome.com

  • Refresh the banked archive from the server

Saturday 26 September 2026

Athenana

  • Round five: a throttled save says the server is busy, not that you're offline
  • Round five: a stale page 2, or its failure, lands nowhere
  • Round five: an approval check answers only for the account it started for
  • Round five: a refresh keeps the card on screen when the page lands
  • Round five: a main page landing in a dealt lens goes under it
  • Round five: an account approved while the app runs gets its deck
  • Round five: "Continue reading" works on a cold launch
  • Round five: sign-out revokes the token, and the token stays on this device
  • Round five: a captive portal's 200 is not a save
  • Round five: a waiting account can delete itself, and its sign-out asks
  • Round five: review minors — take back a failed capture's directory, and two deploy-wait notes
  • Round five: DELETE /api/v1/token revokes the request's own token
  • Round five: a failed file write takes back the capture API's new row
  • Round five: say what the UTC migration's failed_at skip really does
  • Round five: the Kindle build decides its pictures from sizes before reading any
  • Round five: positions and highlight context read the pictured rendering
  • Round five: the pending purge takes a denied waiting account too
  • Round five: a waiting account can delete itself from /pending
  • Round five: our app's one-tap screen grants only the app's own scopes
  • Round five: a byte budget for a waiting account's files
  • Features and compare: bring them up to date, iPhone app held back
  • iOS: ready the app for App Store submission
  • SEO: fit /compare and /standards in a snippet, and list three missed pages
  • Privacy: say what happens to a pending account's saves
  • iOS: delete what the readable-only rule made unreachable
  • iOS: load only what has something to read
  • Apple's cancelled return is the sign-in screen, not a 405

wyome.com

  • Athenana: signing in is a passkey, a password or Apple
  • Privacy: an Athenana account waiting for approval, and its saves
  • Refresh the banked archive from the server

Friday 25 September 2026

Athenana

  • Sign-in carries the app's request in ?next=, not only the session
  • iOS: the pull line stays; Home and only readable results on a tag
  • iOS: no compass; Home, pull for details, a waiting screen
  • Sign-in returns to the app; pending accounts can save; a demo account
  • Pin: ring the whole list row, not just its left edge

wyome.com

  • Refuse three more referrer-spam hosts by name, and re-file what was already banked
  • Refresh the banked archive from the server

Thursday 24 September 2026

Athenana

  • Card API: a live pin is Item::isPinned(), the one predicate
  • iOS UI tests: find the results, wait for the page, and wait for the reader to go
  • iOS: the back asks for publish, says gone and each rung, and trash lands in place
  • iOS: the reader shows its page when it is parsed, not when its pictures land
  • Search: an operators-only term is dropped, and a ranked lens is always total
  • Card API: visibility needs the new publish scope, not update
  • IndieAuth: withdraw our app's auto-approve for a one-tap screen
  • iOS: the back of a card manages it
  • iOS: the next reader arrives without the chrome flashing in
  • iOS: a search or a tag is a column of results
  • Card API: Listen later and Send to Kindle from the back
  • Card API: pin, tags and visibility from the back of a card
  • iOS: Handpicked goes on as you scroll, and search shows nothing until you ask
  • Lens: rank a search by title, then density
  • iOS: sign in with no server field, the web's wordmark, and Sign out once
  • IndieAuth: our own app skips the consent page on a first-party navigation
  • Pin: bring the spec up to what was built, and hold ?view=list onto page two
  • Pin: the card's edge is a ring outside the card, and the current item still wins
  • Pin: a heavier ink edge on a pinned card and row, and a word for a screen reader
  • Pin: the Pinned tab follows the board's layout, and isPinned() is one predicate
  • iOS restyle fix wave M3: the share extension's regenerated Info.plist
  • iOS restyle fix wave M3, M7 and the walk's tooling
  • iOS restyle fix wave I3, M4 and the owner's four calls
  • iOS restyle fix wave I2: the system tint wired, and it is accentInk
  • iOS restyle fix wave I1: the pager's pages drawn back up to the screen's top, words placed by the window's inset
  • iOS restyle, Task 10 step 1: the screenshot walk, committed and gated
  • iOS restyle, Task 9: sign-in, the account control, the link sheet and the share sheet onto the theme
  • iOS restyle, Task 7 fix round 2: "back" names the back's stack, not its scroll view
  • iOS restyle: the lens list is the landing's column, with the chip
  • iOS restyle, Task 7 fix round: the flip cannot wedge, the back clears the chip
  • iOS restyle: the flip is a flip — CardBack behind a 3D turn, the back sheet gone
  • iOS restyle, Task 6 fix round: the head clears the revealed bar, and the tint carries ink only
  • iOS restyle: the reader in mymind's shape on athenana's colours, Literata by default
  • iOS restyle, Task 5 fix round: the full card's text on a panel, and the stopping point said once
  • iOS restyle: the full card, the lens chip, the offline line, the stop and the end onto the theme
  • iOS restyle Task 4 fix round 1: lazy-fetch guard, real highlight coverage, surface/shelves rename
  • iOS restyle: the landing is one column of small cards, today's deck, ending in the pause card
  • iOS restyle Task 3 fix round 1: light-mode image card, top-cropped pictures, five minors
  • iOS restyle: the small card in four shapes, and the pause card
  • iOS restyle compass fix round 2: spec §9 gets the disabled arm, off hoisted beside dim
  • iOS restyle compass fix round 1: prove the press, restore Size's rationale, four minors
  • iOS restyle: the compass is the dial, chosen by the owner
  • iOS restyle: two compass treatments behind -AthenanaCompass, for the owner's choice
  • iOS restyle Task 1 fix round 1: accentInk, Literata-Regular, readerTitle, a scoped share appex
  • iOS restyle: the theme, athenana's tokens dark-first, and the three faces bundled

Built 2026-10-23 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.