Skip to content

0.9.0

Choose a tag to compare

@jeffpaul jeffpaul released this 02 Sep 21:39
· 93 commits to main since this release
12a3da8

Added

  • Replaced the Images/Videos/Audio/Notes links flanking +New with a persistent bottom nav: Timeline, Explore, +New, Search, Me. Explore, Search, and Me are real routes (/daymark/explore, /daymark/search, /daymark/me), so a direct link or refresh lands correctly, and the active tab shows via aria-current="page". (#123)
  • Explore: a non-chronological browsing destination — "Browse by type" (Image/Video/Audio/Note) and "Following" (your subscriptions) hand a preset off to Search rather than duplicating it. Memories, collections, and suggested content are future sections. (#123)
  • Search: promoted out of Home's collapsible header search bar into its own screen and nav destination, reusing the same keyword/type/source query — Home no longer has an inline search UI. (#123)
  • Me: a minimal personal-identity screen — avatar/display name, a link into Search scoped to your own Marks, a view-only Drafts list (tap to resume editing), and links to Notifications, the wp-admin Subscriptions screen, and WordPress's own profile/logout. (#123)
  • Composer autosave: your in-progress Mark (caption, media, alt text, destination, category) now saves automatically to a real draft as you compose — no manual save step, though it still requires a connection like the existing manual Save as Draft. (#122)
  • A typed-but-unsent Notifications reply is similarly protected against being lost when you switch to another reply or navigate back to Notifications. (#122)
  • Every Timeline item now shows its own site icon (a Mark's own avatar, or a subscribed site's icon) as its own leading element, separate from the item's thumbnail — a single click filters Timeline to that source, the same Source filter Search already offers. (#120, #125)
  • A site icon degrades gracefully to a plain letter glyph if it fails to load — a subscription's icon is sometimes an unverified guess at the site's /favicon.ico, which doesn't always resolve. (#144)
  • Timeline cards now render by content kind instead of one uniform row, inspired by (not copied from) Path's own timeline: a type-indicator icon sits beside the site icon, threaded to the item above/below by a connecting line. (#144)
  • Image, gallery, video, and mixed-media Marks get a media-dominant card (full-width photo banner, secondary caption, a play button for video, a format badge for gallery/video/mixed); audio gets a compact artwork-and-metadata row; a Note Mark stays a lightweight typography-first row and now shows its own caption text when it carries more than the title alone does. (#144)
  • A subscription post's plain-text posts split into Article (longer excerpt, optional thumbnail) and Link (compact bordered mini-card, no image) — an approximation, since the feed source doesn't yet preserve real content length to tell a genuinely short post from a truncated one. (#144)
  • Every media-dominant kind falls back to a branded placeholder panel, not a blank space, when there's no real photo to show — the common case for a video or audio Mark. (#144)
  • Timeline now includes every published post on your site, not just ones created through Daymark's own composer — a real featured image gets the same media-dominant treatment an Image Mark gets, real body text reads as an Article card, and anything else falls back to a plain row. It carries no ⋯ Edit/Delete menu, since Daymark's composer isn't the right tool for editing block-editor content — use wp-admin for that. (#144)
  • Filtering Search or Explore to one specific type (Image, Video, …) still only ever matches true Marks, since an ordinary post has no such type of its own to filter by. (#144)
  • A Timeline card's relative timestamp ("Just now", "12m ago", shifting to a plain date after a week) is now a real <time> element carrying the exact date and time as its title — hover it, or have a screen reader announce it, for precision at any age. (#144)
  • A single-image or gallery Mark's card now gets a noticeably taller photo banner (320px, up from 176px) than the other media-dominant kinds — the photo is the content for these two types, so it gets more room instead of being cropped to a modest strip. (#144)
  • Tapping a Timeline card now expands its content right in place, below the card, instead of navigating you away (a Mark or your own ordinary post) or opening an overlay (a subscription post). Tap again to collapse; only one card is expanded at a time. (#144)
  • What you see is just that post's own content — no comments, navigation, header, or footer pulled in along with it, whether it's a Mark, an outside post, or a subscribed site's post. A "View full post ↗"/"View original ↗" link is still there for the real page. (#144)
  • Offline-first creation: compose, publish, or save a draft with no connection at all — Daymark saves it on your device and shows the same success screen as if you were online, then publishes or syncs automatically the moment you're back online. A new Pending section on Home shows what's still waiting. (#127)
  • Composer autosave now falls back to the same offline saving. Covers a session already open when you go offline (or start one offline) — loading /daymark itself for the very first time still needs a connection. (#127)
  • The AI Assist sheet's "Add a tag" field now suggests matching tags already used on your site as you type — tap one instead of typing the full name. (#128)
  • Optimistic publishing: tapping Publish or Save as Draft no longer waits for the upload to finish — you're back on the confirmation screen immediately, and the Mark uploads and syndicates in the background, which matters most for a large video, a podcast episode, or a big gallery. (#130)
  • A Pending row on Home shows it in progress and clears once it's done; the confirmation screen fills in the permalink and syndication status once the background upload confirms. (#130)
  • Camera-first capture: tapping Image, Video, or Audio now opens your device's camera or microphone directly, ready to capture — "Choose from library instead" is still right there, just not the default. (#132)
  • A new home-screen shortcut (long-press the installed icon) jumps straight into the composer, skipping Home and the +New tap. (#132)
  • Share sheet integration: share a photo, link, or text to Daymark from any app on your phone — it creates a draft and opens straight into the composer with it already loaded, ready for a caption. Requires having added Daymark to your home screen. (#133)
  • AI Assist can now generate a transcript for an audio or video Mark — tap "Generate transcript" in the composer. Once a Mark has a transcript, its AI-suggested caption and title are grounded in what's actually said, so "summarize podcast" falls out of the existing suggestions rather than being a separate feature. (#135)
  • AI Assist can also improve, not just regenerate, an image's alt text via a new "Improve with AI"/"Suggest with AI" button. Both are exactly as optional and non-blocking as the rest of AI Assist: no configured provider means no button, and a failed request just leaves the field for manual entry. (#135)

Changed

  • For developers: the four wordpress.org screenshots (.wordpress-org/screenshot-*.png) still showed the plugin's previous identity, Moment. Regenerated against a live 0.9.0 build with current Daymark branding and content. (#117)

Removed

  • Daymark_Migration, the one-time storage conversion from the plugin's previous identity, Moment (≤ 0.5.0), to Daymark, deprecated since 0.7.0. If your site still runs Moment (≤ 0.5.0), you must upgrade through an intermediate 0.6.x–0.8.x release first — jumping straight to this version will not convert your old Moment data. (#36, #117)
  • The Images, Videos, Audio, and Notes section pages, their daymark/* blocks, [daymark_*] shortcodes, Daymark_Renderer, and the @wordpress/scripts block-editor build that existed only to power them — superseded by Explore's "Browse by type" section. Existing pages move to Trash (not hard-deleted) on upgrade, and old URLs 301 to /daymark/explore instead of a bare 404. (#123)

Fixed

  • For developers: uninstall.php now cleans up everything the Subscriptions feature and the POSSE microformats2 work added — the daymark_subscriptions table, cached content, the poller's cron event, related options/user meta, and rate-limiter transients. (#116)
  • For developers: the SPA router now tears down the previous screen's outside-click/Escape dismiss listeners before rendering the next one, instead of leaving them attached to document. Not user-visible today, but closes off a failure mode for a future screen. (#64, #115)
  • Several tappable controls were sized below the app shell's own documented 44px minimum tap target: the Timeline item's ⋯ menu trigger, the site icon filter button, the tag remove ("×") button, the Notifications reply screen's Send button, the ⋯ menu's delete-confirmation buttons, and the Search screen's filter chips. All now size off the shared --daymark-tap-min token. (#128)
  • Subscribing to a site captured its feed <link> tag's own title — commonly WordPress's default "{Site Name} » Feed" convention — instead of the plain site name. Now reads the site's own <title> tag; the old value is kept as a new feed_title column for a future multi-feed subscription. (#140)

Developer

  • Added product principles documentation. (#118)
  • Added design principles documentation. (#119)
  • Added a Mission statement as the authoritative lens above the product principles, in CLAUDE.md, README.md, and readme.txt. (#136)
  • Composer autosave requests (autosave=1) use a new, independent Daymark_Rate_Limiter::ACTION_AUTOSAVE bucket rather than ACTION_PUBLISH, so background autosave activity can never exhaust the budget for a real Publish/Save as Draft tap. (#122)
  • Audited the app shell against "gesture-friendly, large touch targets, comfortable thumb reach, minimal text entry" and documented it as a named commitment. (#128)
  • Added GET /daymark/v1/tags (existing post_tag terms matching a search string) backing the new tag autocomplete. (#128)
  • publishInBackground()/syncPendingMark() extend the offline-first-creation IndexedDB pending queue to a queue-first, always-on mechanism for a deliberate Publish/Save-as-Draft tap, rather than only a connectivity-failure fallback. (#130)
  • The pending-record schema gained a status field (uploading/queued/error) so renderPendingItem() can show which is true instead of every pending item saying "Offline". (#130)
  • Added a shortcuts entry to the PWA manifest pointing at #create. share_target was considered and deliberately deferred — tracked in #131 — since it needs its own service-worker scope decision. (#132)
  • Added share_target to the PWA manifest and a new {base}/share route (Daymark_Share_Target) receiving the OS share-sheet POST directly — no service-worker involvement needed, since a share-target delivery is a real top-level navigation the server can handle like any other form submission. (#133)
  • No REST nonce is possible from an OS-originated request; relies on WordPress's SameSite=Lax auth cookie plus a Sec-Fetch-Site check as defense in depth. (#133)
  • Daymark_AI_Assist::get_transcript_suggestion()/generate_transcript() add audio transcription, mirroring the existing vision alt-text pattern; new POST /daymark/v1/ai/transcript endpoint, manual/author-triggered only. A mocked transcript is an empty string rather than a fabricated placeholder. (#135)
  • get_image_alt_suggestion()/generate_vision_alt() accept an existing_alt value so "Improve with AI" refines existing text rather than describing from scratch. (#135)
  • AI-organized galleries were considered and deliberately deferred: no manual gallery-reorder UI exists yet for an AI ordering to sit on top of — tracked in #134. (#135)
  • Daymark_Subscription_Source_Feed::normalize() now also sniffs a subscribed post's content/description HTML for media (sniff_content_media()) when RSS enclosures carry no format signal — closing the gap where an inline <img>/<video>/<audio> with no <enclosure> always fell through to standard. (#138)
  • A microformats2 u-photo/u-video/u-audio class counts regardless of surrounding text length; a bare <img> only counts when the accompanying text is short. A full mf2 h-entry connector (#84), the WP REST API's format field for WP-to-WP subscriptions (#137), and ActivityPub/Microsub following (#88) are tracked separately. (#138)
  • CI: the Hooks Docs workflow now runs on push to main only, not on pull requests. The PR Playground Preview workflow no longer re-runs on every push to an open PR. (#139)
  • Added GET /daymark/v1/marks/{id}/content backing the Timeline's inline-expand panel: renders post_content via apply_filters( 'the_content', ... ) in isolation, so the response is just that post's own content, never the page a permalink visit would render around it. Not gated on _daymark_is_mark, matching GET /timeline's own inclusive query. (#144)
  • Daymark_Subscription_Poller::extract_body_html() is hardened alongside it: <nav>/<header>/<footer>/<aside> elements are stripped wherever they appear, and the fetched page's <article> element is preferred over its whole <body> when present, with a defensive pass dropping a trailing id="comments"/id="respond" container. (#144)
  • Reordered every changelog section (0.1.0 through 0.9.0) to a consistent category order — Added, Changed, Deprecated, Removed, Fixed, Security, Developer — content unchanged, documented in CONTRIBUTING.md. (#147)

Full Changelog: 0.8.0...0.9.0.