Skip to content

Releases: oernster/meridian

Meridian v2.3.0

03 Jun 09:26

Choose a tag to compare

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/stderr are redirected to
    ~/Library/Logs/Meridian/meridian.log (created on demand).
  • A top-level try/except around main() 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 the Dialog had no explicit height.

Repository Hygiene

.gitignore updated appropriately

Meridian v2.2.1

03 Jun 03:57

Choose a tag to compare

Minor release

  • Updates to About dialog to reflect credits and other relevant details.

Meridian v2.2.0

03 Jun 03:35

Choose a tag to compare

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

02 Jun 13:23

Choose a tag to compare

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: FeedListModel roles updated (feedDescription, feedFilter); AppController slot 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

02 Jun 04:41

Choose a tag to compare

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

01 Jun 19:56

Choose a tag to compare

Minor release

  • Fix icon sizes to prevent blur.

Meridian v1.0.1

01 Jun 18:16

Choose a tag to compare

Release Notes

Feed Reader UI

  • Reworked FeedReader.qml layout 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.json with 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 black formatting across all Python sources
  • Added .flake8 configuration aligning line length with black (88 chars)
  • Resolved all flake8 warnings: removed unused imports (F401), duplicate imports (F811), unused variables (F841), and added # noqa annotations for intentional post-setup imports (E402)

Meridian v0.3.0

01 Jun 16:27

Choose a tag to compare

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 bundle
  • buildinstaller.py: packages the bundle into a distributable MeridianSetup.exe
  • create_icons.py: generates the full icon set from the source PNG
  • create_splash.py: generates the versioned splash screen image