# Changelog All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [1.0.6] - 2026-11-02 ### Added - Store channel filters can leave values out, such as kids' wear, a brand or a store, with a δΈηœ‹ toggle beside each option. ### Changed - The store channel search field is narrower on wide screens. ## [1.0.5] - 2026-11-02 ### Changed - Store channels put search, filters and sort on one row. Filters and sort apply as soon as they are picked; the button only runs a typed search. - Store channel headers show the last fetch and the sources on the meta line, and the page-size switch sits next to the list/gallery switch. - Gallery cards lead with the brand and show the struck reference price, the current price and the discount. Scores and relevance buttons stay in the list view. ## [1.0.4] - 2026-10-30 ### Changed - Digest emails use compact dark entry blocks with prominent prices and deadlines, source links, and saved-brief links. The admin preview uses the same template. ### Fixed - Long email links wrap on narrow screens, and English and Chinese digest punctuation clearly separates labels, details, and channel navigation. ## [1.0.3] - 2026-10-29 ### Fixed - Release cleanup removes numeric and commit-based image aliases individually. Images with other tags are retained, and obsolete untagged release images are removed. ## [1.0.2] - 2026-10-29 ### Fixed - Admin navigation wraps on narrow screens, keeping every action visible in longer languages. Global navigation uses 44px touch targets without enlarging pointer-based desktop controls. - Research health checks the latest run and reply request in each unarchived session. Recovered and archived failures remain in history without raising current warnings. - Research replies now have their own health row, including queued work and expired leases. System attention counts cover both queues, with links to the affected history or conversation. ## [1.0.1] - 2026-10-29 ### Fixed - Current news channels no longer rank months of history as current content. They share Featured's rolling time window, defaulting to 24 hours, using publication time or first collection when unavailable. - News-window labels and bulk read actions now match that scope. Explicit searches and the archive keep historical content, and live product and auction listings remain unaffected. ## [1.0.0] - 2026-10-29 ### Added - Numeric releases from the canonical Python package version, immutable Git release tags, version-reuse and regression checks in CI, and version-labelled container images. - Task-centered channel administration and clearer mobile reading, search recovery, single-item undo, price references and email return links. - PartyMap Civic automation: Owner-approved Civic Watches gather New Zealand official, party and licensed media sources daily, generate and independently verify four-locale entries, and seal them into Civic Batches delivered through a local two-phase spool. Civic runs on two timer-started units with its own locked image (ADR-0013). Schema version 5. See [PartyMap Civic automation](docs/civic.md). - Per-Channel fetch scheduling: each Channel now chooses either a fixed interval (every 3 or 6 hours) or a daily wall-clock time in its own IANA timezone, defaulting to `Pacific/Auckland`. A daily schedule is anchored to its calendar slot instead of the last successful fetch, so a late run never pushes the next day's fetch later, and a manual "fetch now" does not move the automatic schedule. Existing Channels keep their current interval behavior on upgrade. - Owner-only Research Sessions: a persistent, one-time question investigated with the existing credentialless connectors, a visible AI-proposed Research Plan, durable asynchronous evidence collection and clustering, a conclusion-first citation-backed Research Synthesis, stable per-session citation numbers, owner evidence curation (exclude or annotate an Evidence Item), and a durable long-running chat with versioned Conversation Memory. See [Research a question](docs/user-guide.md#research-a-question). - An always-on durable Research worker for Research Runs and Research Chat replies. See [`deploy/README.md`](deploy/README.md#research-worker-adr-0009). - Global English-default localization for the web interface, email delivery, alerts, and language-aware AI output, with Simplified Chinese, Japanese, Korean, Spanish, French, and German support. - Owner-triggered, asynchronous full-article AI briefs with cached results, regeneration, partial-content warnings, and a dedicated responsive reading page. - A safe, resumable, and reversible migration for rewriting existing unread summaries. - An admin model selector that applies one validated Copilot model to future rankings, comment summaries, summary rewrites, and article briefs. - Per-channel highlight-count and minimum-score settings for Channel pages and daily digests. - Home-dashboard read/unread views, counts, and owner voting controls. - All About Auctions upcoming-lot monitoring with public bids, descriptions, estimates, seller-stated RRP, fee-inclusive cost, stable-lot refreshes, and Tracker AI ranking. - Immutable Editorial, Monitor, and Tracker Channel workflows with definition-driven ranking, persistence, lifecycle, events, navigation, and notification behavior. - Dedicated Channel panels: Editorial reading and feedback, Monitor catalogue search and changes, and Tracker watched, ending-soon, upcoming, and permanent-history sections. - Strict Source compatibility declarations enforced by admin forms, persistence, collection, and startup contract tests. - Generic Tracker Watches and follow-up reminders, with All About Auctions as the first adapter and compatibility-preserving auction reminder storage and deployment names. - Owner administration safety and operations: typed destructive confirmations, seven-day transactional recovery, recent activity, bounded non-persisting Source test samples, Channel onboarding, delivery history, and cross-worker System Health. - Email Group calendar schedules with local weekdays, times, and IANA timezones, plus non-mutating email previews and test sends. - Research Source management, enforced work-budget previews, run/snapshot/synthesis history, synthesis-only retries, unread completion state, and localized completion emails. - International designer-clearance monitoring for THE OUTNET, Mytheresa, END., and YOOX, with verified markdown thresholds and listing-currency preservation. - Every Channel in a digest email carries a status line (sources OK, listings tracked, or no changes), and a capped Channel says how many more events are waiting. - A nightly host-side SQLite backup that restores each archive into a scratch file to verify it before keeping it, and `deploy/release.sh` for SHA-tagged releases from clean commits. - CI that runs Ruff and the test suite on every push. - A "Refresh list" button next to the LLM model picker in Global settings. The picker now lists the models your Copilot account offers instead of a built-in list that went stale. The web container still has no Copilot token, so the Research worker fetches the list within a few seconds and again every day. The row says when the list was fetched, and flags a refresh that failed or never started, or a saved model that is no longer offered. - Reading pages carry Open Graph and Twitter card tags with a social card image, so a shared link previews with its title and description; a deep-read brief previews with its bottom line. The pages still send `noindex, nofollow`. An Apple touch icon joins a favicon redrawn in the new mark. - Any RSS or Atom feed can be an Editorial source. Paste the feed or just the site's address: Beehive finds the site's feed and names the source after it. Feed URLs are fetched with the same DNS pinning and redirect checks as deep reads. - **Who can read** in Global settings: keep the reading pages open to anyone with the link, or make them private so that only the signed-in Owner can read them. Signed-out visitors go to the sign-in page and come back to the page they asked for. See [ADR-0011](docs/adr/0011-optional-private-reading.md). ### Changed - Background jobs run in one always-on jobs worker instead of timers, marker files and oneshot containers: scheduled fetching, **Fetch now**, deep reads, digests and reminders. **Fetch now** works on a local install, the admin's **System** chapter shows whether the worker is running and what is waiting, and there are three units to install instead of sixteen. A Channel's failure alert email is now really sent, at most once every six hours. See [ADR-0012](docs/adr/0012-one-jobs-worker.md) and the upgrade steps in [`deploy/README.md`](deploy/README.md#move-to-the-jobs-worker-adr-0012). - The admin area is redesigned as a dark "datasheet" with its own shell and stylesheet (`admin.css`, self-hosted Archivo). The five tabs became four numbered chapters (Channels, Email groups, Global settings, System) in a contents rail that counts what needs attention. Forms are parameter tables with the setting and its note side by side, lists are banded tables whose long names, URLs and errors wrap instead of overflowing, and failing or paused Sources are listed first on the Channels chapter. Fields for URLs, queries, addresses and subjects wrap and grow, so the whole value stays visible, and table cells never split a count, time or address. Unsaved changes are marked and counted in a sticky save bar, including after a rejected save. Removing a Source now asks for its name or shop domain instead of its connector type, and the activity log names Sources by their current label. The Chinese UI says 钑道 instead of Channel. Old `?tab=ai` and `?tab=delivery` links still work. - The reading pages (home, channel pages, archive, search and deep-read briefs) and the Owner's workspace (Research, Watch List) share the admin's dark datasheet design, and the old `beehive.css` stylesheet is gone. The home page is a desk with a section per Channel. Every page numbers its sections in the contents rail and states each one's count or state in its heading. The sheet has no width cap: on wide screens sections sit side by side and long tables set their rows in newspaper columns. The archive groups and filters by Auckland day, search sorts each page of hits into a section per Channel, and `/channels/` redirects home. - Email Groups now consume actionable Channel events and may render mixed Editorial, Monitor, and Tracker sections without sending empty scheduled messages. - The digest timer now evaluates Email Group schedules and Research completion notifications every 15 minutes. Individual groups remain governed by their own interval or calendar schedule. - The fetch timer now runs every 15 minutes as well. Individual Channels remain governed by their own interval or daily calendar schedule. A Source whose last automatic attempt failed waits an hour before its first retry, and the wait doubles with each further failure up to 24 hours. - New ranking summaries state the strongest evidence-supported conclusion in one sentence instead of only describing the article topic. - Failed article briefs now identify the failing stage, explain whether the LLM ran, and provide a safe next step without exposing internal error details. - Reddit deep reads fall back to stored self-post text when Reddit blocks automated page access, with an explicit warning about missing comments, edits, links, and truncated long posts. - Featured now ranks only content published during a configurable Auckland calendar-day window, defaulting to three days and falling back to fetch time when publication time is unavailable. - The SQLite schema is versioned with `PRAGMA user_version`. `init_schema` only migrates a database that is behind and refuses one that a newer, incompatible release migrated; `--mode migrate` is the explicit release step. - Digest events expire: Editorial news after 3 days, Monitor discoveries after 7 days, and price drops and restocks after 3 days, but never before the group's next scheduled email, so a weekly group still gets the whole week. Listings from a Source whose data is stale are held back from email until it recovers. A new catalogue Source's first snapshot is a baseline and sends no discovery emails. - Every fetch outcome is logged to the journal, and digest warnings name the Source the way the admin UI does, say how long it has been failing, and flag a Source that silently stopped fetching. - SQLite runs with `synchronous=NORMAL`, and each fetch is ingested in a single transaction. - Container units log each line once and keep Podman lifecycle events out of the journal. The research-reconcile and deep-read backstop timers run hourly and every 30 minutes. ### Fixed - The brand displays the numeric application version instead of a commit hash. Commit IDs remain diagnostic metadata, and the redundant Reading label is removed. - Certificates that chain to the compromised eMudhra intermediate CAs are rejected. The shared image upgrades `ca-certificates` when it is built, and the Civic image pins patched Python and uv images and certifi 2026.10.19. - Civic notices are now emailed (one combined message at most every six hours) instead of piling up unsent. Notices older than 48 hours are suppressed. - A Civic Candidate backed only by Stuff or The Post is rejected at once instead of being held and retried daily for 14 days. - A party site that refuses detail pages no longer uses up a Civic Run's hydration budget. - The Spinoff source reads its politics article sitemap; its RSS feed was removed. - Editorial digests permanently suppress repeated stories with the same publisher and exact headline, even when Google News republishes them under a new GUID on a later day. - Digest subjects and channel delivery dates now use each Email Group's configured timezone instead of the UTC date. - Failed manual fetches no longer delay the next automatic Channel slot, and paused Sources no longer distort the next-fetch preview. - Shopify collections with more than 1,000 products are fetched completely instead of retiring every listing past the fourth page, and Land & Sea no longer truncates listings past 100 pages. - A Monitor snapshot that would retire most listings at once is held until a second snapshot in a row confirms it, so a briefly empty storefront response no longer retires the catalogue. - A discount change on a clearance listing reranks it again. - A clearance Channel's Sources line names each retailer instead of repeating `international_clearance`. - An official feed description ending in an unfinished `&` sequence, such as "R&D", no longer loses its last paragraph. - The sign-in return path refuses `/\host` and paths with tabs or newlines, which browsers turn into a link to another site. - Article fetches for research (and now deep reads and feeds) keep their 20-second limit when they run on a worker thread. A server that trickled its response one byte at a time could hold them far longer. ## 0.1.0 - 2026-07-14 Initial public alpha release. ### Added - Self-hosted, single-user AI news aggregator with per-channel interests, fetch intervals, and email recipients. - AI ranking, concise summaries, and optional comment summaries. - Read/unread state and owner-only feedback controls. - Scheduled and manual collection cycles. - Daily email digests via Azure Communication Services. - SQLite storage and rootless Podman Quadlet deployment units. - Source adapters for six supported source families: - Reddit public subreddit Atom feeds - Google News search-query RSS feeds - Hacker News official Firebase API - Reserve Bank of New Zealand official RSS - New Zealand Government official RSS - Federal Reserve official RSS [Unreleased]: https://github.com/sinmentis/beehive/compare/v1.0.3...HEAD [1.0.3]: https://github.com/sinmentis/beehive/releases/tag/v1.0.3 [1.0.2]: https://github.com/sinmentis/beehive/releases/tag/v1.0.2 [1.0.1]: https://github.com/sinmentis/beehive/releases/tag/v1.0.1 [1.0.0]: https://github.com/sinmentis/beehive/releases/tag/v1.0.0