Changelog
What's new
Recent releases have focused on holding the application in place: a front end split into components, keyboard rings proven by real key presses, the installer under the same coverage requirement as the application and one source of truth for the version. An earlier feature release turned the window itself into pictures; the next added a Guide that names every one of them, reached from a Help menu on the header, which a later one made the home of Check for Updates. The newest releases close gaps between what Meridian said and what it did: redirects to plain HTTP are refused before they are made, uninstalling removes the database it said it would, an import reports every feed it could not add, no picture or media file is fetched over plain HTTP, export keeps your filters and one bad MFEED item no longer silences its feed.
v2.12.0
Export keeps your filters; one bad item no longer silences a feed
- Exporting your subscriptions left every filter you had written out of the file, so moving to another machine or reinstalling lost them. Export and import now carry each feed's filter; files written by earlier versions still import
- A filter with a date bound, such as the published example in the MMSP specification, stopped its feed showing anything and left the previous feed's items on screen, where Mark all read then acted on the wrong feed. Dates now compare correctly, a filter that cannot be read is refused when you save it and a feed that cannot be shown leaves nothing selected
- One malformed item in an MFEED feed discarded the whole feed until its publisher fixed it. Each item is now read on its own: a bad one is skipped and counted, a malformed optional field is dropped and the rest of the feed arrives
- Items are ordered by the moment they were published rather than by the text of their time, so feeds in different time zones sort correctly
- Import reads files saved as UTF-8 or UTF-16 with a byte order mark, refuses an address with no host instead of adding it, treats a feed address in different letter case as one already held, says plainly when the store refuses a feed and no longer holds the window still while it works
v2.11.0
Imports that say what they did; no picture fetched over plain HTTP
- Every import now ends in a report that stays until you dismiss it: how many feeds were added, how many you already had and each entry that could not be added, with the reason. When anything was left out, the dialog is titled Import Incomplete. A feed that could not be added used to be written to the log and nothing else, so an import that half worked looked like one that worked
- A file that is not a Meridian feed list is refused whole, with nothing imported, instead of failing partway through
- A thumbnail in an RSS or Atom feed was drawn from whatever address the feed gave, plain HTTP included; an MFEED document's media, thumbnails, transcripts and captions were not checked at all. Every parser now drops a plain-HTTP media, thumbnail, transcript or caption address, by one rule written once
- A long address in one of the window's message dialogs now wraps inside the dialog instead of running past its edge
v2.10.0
Redirects to plain HTTP refused; uninstall takes the database with it
- A feed or a discovery search that redirected to a plain-HTTP address was followed there, although Meridian said it would not be. Every step of a redirect is now checked before it is made and one pointing at plain HTTP is refused, so the plain-HTTP server is never contacted. A feed that redirects that way is treated as a failed poll and asked again an hour later
- A redirect chain is capped at five steps. A feed that has moved permanently is read from its new address and the move is recorded; the subscription itself keeps the address you gave it
- Uninstalling from the setup program said it would remove your data but left the database behind in the .meridian folder in your home folder. It now removes that folder too, so export your subscriptions first if you want to keep them
- Starting the setup program with --keep-user-data was ignored: an uninstall removed your data regardless. The option is now honoured; the application goes and your data stays
- The site's stylesheet is linked by a hash of its content, so a browser never pairs a new page with an old cached stylesheet. Every page footer now links to the rest of my work; the donate button carries the same mark as every other project site of mine
v2.9.0
Check for Updates moves to the Help menu
- Asking whether a newer Meridian exists is now Help > Check for Updates, where every other application of mine keeps it. It used to be a button on the About dialog, from before Meridian had a Help menu
- The Help menu now reads Guide, Check for Updates, About Meridian. From the keyboard: Enter on the Help mark, Down once, Enter
- The check itself is unchanged: once shortly after launch and once a day, Download, Skip This Version or Later when a newer release exists, silent when GitHub cannot be reached. Asking by hand still reports every outcome. About is now just About, with Close as its only button
v2.8.1
A new donation page
- The Donate button now opens a new PayPal page that suggests £5 and lets you give any amount you choose. Nothing else has changed
v2.8.0
A Guide to every button, under a Help menu
- Every control along the top and the foot of the window is a picture with no word beside it. The new Guide puts each one next to its name, drawn with the same picture the button carries, with a line on what it does
- It then covers what no screen shows for itself: how often a feed is asked for news, that a filter hides items rather than deleting them, what leaves your machine and how the keyboard moves around the window. Like a licence, it reads itself down the page; touch it and it pauses, then carries on from where you left it
- The help mark at the right of the header, which used to open About directly, now drops a small menu holding the Guide and About Meridian, since Meridian has no menu bar. Enter, Space or Down on it open the menu with the Guide already offered; Up and Down move between the two and wrap; Escape closes it back onto the button; Tab carries on round the window
- A licence opened with its text focused rather than its Close button; clicking the text also took focus away from Close. Each licence now opens on Close like every other dialog, its text reached with Tab when it is long enough to scroll
- The About dialog said both licences open from the header. They moved to the strip along the foot in an earlier release; About now says so
v2.7.1
Setup program tooltips that show when you hover
- The setup program's tooltips only appeared while its own window had focus. Hover over it while another program was in front and nothing showed, which is exactly when a hint is most useful. Every setup window, its dialogs included, now shows its tooltips whether it has focus or not
- Meridian itself needed no change: its window already showed tooltips on hover with another program in front
- A commercial licence for my own code is now available alongside the open-source licences, for anybody whose project those terms do not suit
v2.7.0
A window of pictures, plus a way to buy the author a drink
- Every control along the top of the window was an emoji beside a word. An emoji is drawn by whichever font the platform picks, so the row looked different on each of the three platforms Meridian ships to; at a word's height none of them carried much meaning either. They are pictures now, drawn at four times the height of the type the emoji were set in, with the words removed entirely
- Hovering a control names what it does; so does moving to it with the keyboard, which leaves the Tab ring readable without ever touching the mouse. The same words are what a screen reader is given
- The row has been rearranged. The two licences moved off the header into a new strip along the foot, since they state what is true of Meridian rather than acting on what you are reading. What is left on the right is a new button opening the MMSP specification, then the light and dark toggle, then About
- The new strip carries a donation button at its left, apart from everything else because it is the only control that leaves the application. Meridian is free and stays free: no paid tier, no licence key and nothing held back behind a donation
- Neither the donation nor the specification button adds a place Meridian touches the network. Each hands its address to your desktop and the browser does the asking, so the list of six is unchanged. A desktop that declines to open a browser says which page it could not open rather than leaving you pressing a button that appears to do nothing
- Every picture is derived from a single master by the icon generator, cropped to its artwork and scaled by height, so the application carries 705KB of pictures rather than the 13.5MB of source artwork they came from
- The About dialog now carries the year alongside the copyright notice, taking both from the same place the rest of Meridian's identity comes from
v2.6.0
An update check that respects you
- Meridian now notices when a newer release has been published: a few seconds after launch and once a day while it stays open, it asks GitHub's releases API and offers what it finds. Download opens the right file for your platform (installer, DMG or Flatpak, falling back to the release page), Skip This Version silences that version permanently and Later closes the prompt until the next check
- A manual check lives on the About dialog and reports every outcome, including an honest failure when GitHub cannot be reached; it deliberately ignores a skipped version so a declined release stays reachable
- Built not to intrude: only a formally published release can prompt, every failure is silent on the automatic path and the request carries no identifier and nothing about your subscriptions or your reading. The README's account of exactly where Meridian touches the network now names this sixth place alongside the other five
v2.5.1
A selection that survives scrolling
- Selecting feeds in the subscription manager and then scrolling the list quietly dropped every row that scrolled out of view. The selection was tied to the lifetime of the row on screen rather than to the feed; a list only keeps the rows you can see. Select a long list, scroll it to check what you had chosen, only for the confirmation to offer a fraction of it while reporting that smaller number as though it were your selection
- The selection is now held by feed, so scrolling cannot touch it. Confirming a bulk removal deletes exactly what was selected and the dialog counts exactly that. Short lists were never affected, which is why this went unnoticed: nothing is dropped until a list is long enough to scroll
v2.5.0
A hardening release: the front end split, the keyboard proven, the installer tested
- The QML front end is four composition files with their panels, rows and dialogs beside them, where it was four files of more than three and a half thousand lines between them. Nothing about using the application changes
- Every keyboard ring is now walked by real key presses through a real window, forwards and backwards: the window, the reader, the subscription manager and the discovery drawer. Each test was checked by cutting one connection at a time, forty two in all
- Long content reads itself: the licence dialogs and the URL list shown before a bulk subscribe hold still, take themselves down the page, hold at the end and go round again. Touch the surface and it stops where it is, then carries on from there rather than the top
- The size rule reads the QML, the tests and the installer as well as the package; nothing is left over the limit
- The part of the installer that touches your machine is inside the same complete coverage requirement as the application; an upgrade whose swap and rollback both fail now leaves the previous installation in place
- The progress bar fills during a repair and an uninstall. Both reported their work as text rather than as a percentage, so the bar stood empty from start to finish and read as missing; both now report percentages, with the bar itself moving until the first one arrives
- The installer offers to launch Meridian when it has finished, ticked by default, after a repair and a reinstall as much as after a first install. It waits for the window, brings it to the front and then closes itself; untick the box and nothing starts
- The bundled sample subscriptions are now a neutral set in examples/feeds_sample.json, still covering RSS, Atom and MFEED
- The version lives in a single VERSION file at the repository root that the application, the packaging metadata and every build script read
- The protocol version rule is asserted against the specification's own published schema, so the client and the document it implements cannot drift apart
- The site is five focused pages instead of one long scroll, with live download metadata, social previews and structured data
- Every document was read against the code: feed discovery is Feedly's search API and the typeahead is Wikipedia, both now named wherever discovery is described
- The same reading found one undisclosed thing, now stated plainly everywhere: playing a YouTube item loads Google's own player in an embedded browser, so a video you watch is visible to Google as it would be in a browser tab. Nothing about the behaviour changed; it is simply no longer unsaid
- Two dependencies that nothing imported have been dropped, taking with them the claim that feed HTML was sanitised before display. Qt's rich-text engine is what stands between a feed and the reader, as it always was
- A standing technical-debt reference ships with the repository, recording what is open and what is deliberately left alone. It currently records nothing open
v2.4.0
Component-split licensing
- Licensing split by component: user interface under LGPL-3.0, model under Apache-2.0
- Header now shows two licence buttons: "UI Licence" (LGPL-3.0) and "Model Licence" (Apache-2.0), each with its own dialog
- CONTRIBUTING.md added with contribution guidelines and the layer invariant
- Licence texts split into LICENSE-LGPL-3.0.txt and LICENSE-APACHE-2.0.txt, mapped from the root LICENSE
v2.3.0
Cross-Platform Release + Diagnostics
- macOS DMG build, tested on Tahoe
- Linux Flatpak, tested on Ubuntu
- Windows installer rebuilt and re-tested on Windows 11
- Crash diagnostics: stdout/stderr redirected to ~/Library/Logs/Meridian/meridian.log in frozen mode
- About dialog icon and Licence dialog text rendering fixed
- Bulk subscribe confirmation dialog height corrected; it previously showed only one URL
v2.2.0
UI/UX Overhaul + Keyboard Navigation
- Full UI/UX layout overhaul: buttons replace menus throughout
- Complete Tab/Shift+Tab and arrow key navigation across all controls
- Dark/light theme preference persists across restarts via Qt.labs.settings
- Escape closes the Feed Discovery panel from any control
- 371 tests, 100% branch coverage
v2.1.0
Full Keyboard Navigation
- Every interactive element reachable and operable without a mouse
- Tab chain: File menu → Search → Manage → Theme toggle → Feed list → Item list → Open in Browser → wraps
- Amber focus ring on all focusable controls
- Full keyboard nav inside Manage Subscriptions and all its dialogs
- Filter dialog opens pre-populated with existing terms as tabbable toggleable rows
- Left/Right cursor navigates between dialog footer buttons (Cancel / OK)
v2.0.0
Feed Discovery
- Search by topic or keyword, then subscribe to one or many feeds without leaving the app
- Discovery panel runs on an isolated async event loop in a daemon thread
- DiscoveryFetcher ABC with FeedsearchFetcher implementation: same layered boundaries as the rest of the system
- HTTP and HTTPS feed URLs accepted (HTTP feeds follow redirects transparently)
- Splash screen with rounded corners; Win32 mutex prevents multiple instances
- 100% branch coverage maintained including the new discovery stack
v1.0.1
Feed Reader UI + Sample Feeds
- Reworked FeedReader layout: hero thumbnail, media player, sort controls, unread indicator dot
- feeds_export.json ships with the repo: curated RSS, Atom and MFEED subscriptions ready to import
- LGPL-3.0 licence added to Help menu and corrected throughout documentation
- black formatting and flake8 clean across all Python sources
v0.3.0
Windows Installer + Splash Screen
- MeridianSetup.exe: per-user installer with upgrade, repair and uninstall workflows
- Registers with Windows Settings > Apps; creates desktop and Start Menu shortcuts
- No administrator privileges required; user data preserved across upgrades
- Branded splash screen displayed on launch while the app initialises
- Full multi-resolution icon set (16 px through 512 px) for sharp rendering everywhere