Releases: oernster/meridian
Meridian v2.3.0
Release Notes
Meridian is now cross-platform.
- This release brings Meridian to all three major desktop systems.
- The app that has always run on Windows is now available for macOS and Linux as well, and it is the same Meridian on each.
- The entire feed reading experience, with nothing held back on any platform.
One app, every desktop
| Platform | Available as | Tested on |
|---|---|---|
| Windows | Installer | Windows 11 Pro |
| macOS | Disk image (.dmg) | macOS Sequoia |
| Linux | Flatpak | Ubuntu 26.04 LTS |
On macOS and Linux the experience matches Windows feature for feature. The Linux
edition is fully self-contained and is expected to work across most modern
distributions, not only the one it was tested on.
About dialog
- showed no icon; Licence dialog showed no text
Crash Diagnostics
When running as a frozen windowed app, stderr is /dev/null, making any crash
completely silent and undiagnosable.
Fix:
- On startup in frozen mode,
stdout/stderrare redirected to
~/Library/Logs/Meridian/meridian.log(created on demand). - A top-level
try/exceptaroundmain()writes the full traceback to that log
before exiting.
UI Fix
- Bulk Subscribe Dialog updated
- The "Subscribe N feeds" confirmation dialog and the post-subscribe result dialog
each showed only one feed URL because theDialoghad no explicit height.
Repository Hygiene
.gitignore updated appropriately
Meridian v2.2.1
Minor release
- Updates to About dialog to reflect credits and other relevant details.
Meridian v2.2.0
Meridian Release Notes
UI/UX overhaul of layout.
Buttons instead of menus and more.
Keyboard Navigation Overhaul
Complete Tab/Shift+Tab and arrow key navigation across all controls in the main window and feed reader detail pane.
Dark/Light Theme Persistence
Theme preference (dark/light) now persists across restarts.
Feed Discovery Panel: Escape to Close
Pressing Escape while the Search/Discovery drawer is open now closes the panel:
- From the search field: Escape first closes autocomplete if open, then cancels an in-progress search, then closes the drawer
- From any other control in the panel: Escape closes the drawer immediately
Test Coverage
- 371 tests, 100% branch coverage
Meridian v2.1.0
Release Notes
Keyboard Navigation
Full keyboard navigation implemented across the entire application. Every interactive element is reachable and operable without a mouse. This involved a substantial number of deliberate, fine-grained UX decisions - the kind that are glaringly absent when missing but become completely invisible once in place, because the experience simply feels natural. When done well, keyboard navigation of this depth is indistinguishable from magic: no dead ends, no skipped controls, no jarring jumps, no phantom Tab presses to nowhere.
Tab chain order
File menu → Help menu → Search → Manage → Theme toggle → Feed select-all checkbox → Feed sort buttons (non-active only) → Feed list → Item sort buttons (non-active only) → Mark all read → Item list → Open in Browser → wraps to File menu
Behaviour
- Tab / Right cursor: advance to next item
- Shift+Tab / Left cursor: return to previous item
- Down/Up cursor: navigate within a list (feeds or items); open a menu dropdown from the menu bar; navigate autocomplete suggestions in Search
- Enter/Space: activate focused item or select a highlighted autocomplete suggestion
- Escape: close dialogs, cancel search, dismiss autocomplete
- Active sort buttons are excluded from the keyboard chain; only selectable (non-active) sort options are reachable
- Inside an open menu dropdown, Tab/Right moves to the next top-level menu rather than cycling submenu items; Up/Down navigates within the submenu
- The Remove button (bulk feed delete) enters the tab chain only when feeds are selected
- The Search button in the Search pane is skipped in the tab chain when the query field is empty
- Manage Subscriptions pane auto-focuses the URL field on open
Focus ring
All focusable controls display an amber (orange) border when keyboard-focused, consistent with the existing hover style.
Dialogs
- About: keyboard focus lands on Close button on open; Enter/Escape closes
- Licence: keyboard focus lands on licence text on open so Up/Down scrolls immediately; Tab moves to Close button which shows amber focus ring; Backtab returns to text; Enter/Escape closes
Manage Subscriptions - Extended Keyboard Navigation
Full keyboard nav inside the Manage Subscriptions pane and all its dialogs.
Tab chain (within the pane)
URL field → Subscribe button (when URL valid) → Select-all checkbox → Remove Selected button (when feeds selected) → Feed list → per row: row checkbox → Filter → Edit → Remove → wraps to URL field
Behaviour
- Enter/Space: activate any focused control (buttons, checkboxes, list items)
- Left/Right cursor: navigate between buttons within a row (Filter ↔ Edit ↔ Remove), or between dialog footer buttons (Cancel ↔ OK)
- Filter button: Enter opens filter dialog
- Edit button: Enter opens edit URL dialog; Enter inside the URL field (when non-empty) accepts
- Remove button: Enter opens remove confirmation dialog
Filter dialog
- Opens pre-populated with existing filter terms shown as tabbable, toggleable rows
- Existing terms default to active (ticked); Space or Enter toggles each term on/off
- Right cursor navigates to next term or the text field; Left cursor to previous term
- New terms typed in the text field are appended to active terms on accept
- Enter inside the text field accepts the dialog (saves combined filter)
- Deactivating all terms and leaving text field empty clears the filter
Documentation
- README.md: features list updated to reflect keyboard navigation and filter dialog improvements
- ARCHITECTURE.md:
FeedListModelroles updated (feedDescription, feedFilter);AppControllerslot list updated; QML file descriptions updated for SubscriptionManager filter dialog, FeedDiscovery, AboutDialog, LicenceDialog; keyboard navigation design decision added (Button/Enter quirk, Tab-chain approach, Left/Right footer nav)
Meridian v2.0.0
Release Notes
Feed Discovery
Meridian now ships a first-class feed discovery workflow backed by the Feedly search API. Users can search by topic or keyword and subscribe to one or many feeds in a single flow, without leaving the app or knowing any feed URLs in advance. The discovery panel runs on a dedicated async event loop in a daemon thread, completely isolated from the UI and poll scheduler threads.
The discovery stack is built to the same layered boundaries as the rest of the system: a DiscoveryFetcher ABC defines the backend contract, FeedsearchFetcher provides the Feedly implementation, and DiscoveryService owns enrichment logic (subscription state, source type inference). Source type inference was extracted from SubscriptionService into a shared module to eliminate duplication. The AppController async lifecycle was extended to support clean shutdown with in-flight request cancellation.
Keyboard Accessibility
All interactive controls across the main reader, subscription manager, and discovery panel are now reachable and operable by keyboard. Tab order is consistent and left-to-right throughout. List views are single tab stops: arrow keys navigate within them, Tab and Shift+Tab move between sections. Focus state is visually indicated on all custom controls. Space toggles the selection checkbox on the focused feed row; Space on the check-all control selects or clears the entire list.
Startup Behaviour
The application window is raised to the front and given input focus immediately after the splash screen closes. A named Win32 mutex prevents multiple concurrent instances: if Meridian is already running, a second launch exits silently. The splash screen is rendered with rounded corners via a per-pixel alpha mask, relying on PyInstaller's frameless transparent window to composite cleanly against the desktop.
Feed Compatibility
Feed subscriptions now accept both http:// and https:// URLs. A previous constraint that rejected plain HTTP URLs blocked discovery-sourced subscriptions for feeds that the Feedly index still carries over HTTP (including well-known science and journal feeds). Feeds served over HTTP are fetched normally; the network layer follows redirects and respects any server-side HTTPS upgrade transparently.
Quality
100% branch coverage maintained across all modules including the new discovery stack. A pre-existing pytest-asyncio configuration gap that had silently prevented 34 async tests from running was also resolved in this release.
Meridian v1.1.0
Minor release
- Fix icon sizes to prevent blur.
Meridian v1.0.1
Release Notes
Feed Reader UI
- Reworked
FeedReader.qmllayout and item delegate for improved readability and interaction - Hero thumbnail displayed at full width in the detail pane with aspect-fill cropping
- Media player integrated for video, audio, short, and livestream item types
- Sort controls (Newest / Oldest / A-Z) added to the item list header
- Unread indicator dot shown on unread items in the list
Sample Feeds
- Added
feeds_export.jsonwith a curated set of RSS, Atom, and MFEED subscriptions - Updated default feed list with current technology channels and blogs
- Import via File > Import Feeds... in the menu
Documentation
- README restructured with separate Installation (pre-built releases and run from source) and Sample Feeds sections
- Releases page linked for pre-built Windows installer downloads
- License corrected to LGPL-3.0 throughout (README and LICENSE file)
- Add LGPL3 Licence to Help menu.
Code Quality
- Applied
blackformatting across all Python sources - Added
.flake8configuration aligning line length with black (88 chars) - Resolved all
flake8warnings: removed unused imports (F401), duplicate imports (F811), unused variables (F841), and added# noqaannotations for intentional post-setup imports (E402)
Meridian v0.3.0
Meridian Release Notes
Windows Installer
Meridian now ships as a proper per-user Windows installer (MeridianSetup.exe).
- Single-file installer with install, upgrade, reinstall, repair, and uninstall workflows
- Registers with Windows Settings > Apps for clean system integration
- Creates desktop and Start Menu shortcuts with the Meridian icon
- No administrator privileges required
- User data preserved across upgrades by default
Splash Screen
A branded splash screen now appears immediately on launch while the application initialises, displaying the application name, version, and author.
Application Icon
Meridian now ships with a full multi-resolution icon set (16 through 512px) and an ICO file, providing correct icon rendering across the desktop, taskbar, Start Menu, and Windows Explorer.
Build Infrastructure
buildexe.py: produces a self-contained PyInstaller onedir bundlebuildinstaller.py: packages the bundle into a distributableMeridianSetup.execreate_icons.py: generates the full icon set from the source PNGcreate_splash.py: generates the versioned splash screen image