github jchultarsky/mirador v1.22.0
1.22.0 - 2026-10-08

latest release: v1.22.1
3 hours ago

Release Notes

Added

  • A note's body takes the line keys every one-line field has. Ctrl+E
    goes to the end of the line, and Ctrl+U, Ctrl+K and Ctrl+W delete to
    its start, to its end and the word before the cursor. They did nothing in
    the body, though the title above it has always had them. Each acts on the
    cursor's line and never takes a line break. A selection is let go first
    rather than deleted, and the key acts from the cursor, the selection's
    moving end. Ctrl+A still selects the whole body, and still goes to the
    start of a one-line field. The README is where the four are listed: the
    ? overlay cannot open while a note is being edited, since ? is typed
    into it.

Fixed

  • The key map's explanations arrive whole. At its widest the dialog gave
    them 34 cells and nineteen were longer, so they ended in … on every
    screen. It now grows to 100 columns, and the six longest — four of arrange
    mode's and the task list's two priority keys — are reworded to fit.
  • An empty panel offers the key you gave it. The task, notes, markets and
    agenda panels' empty states, and the watch log's line about where calendar
    entries come from, named the default key whatever [<widget>.keys] said.
    They name the key the panel reads now, and leave the offer out when the
    action is unbound.
  • An empty markets, notes or task panel says its whole hint. The markets
    and notes hints went to the terminal at full length, so at the width the
    shipped layout gives the markets panel the hint stopped just after the key
    it names, and a notes search that matched nothing said "Nothing matches
    this search. Esc to clea" in a pane 40 columns wide, with nothing to say
    the rest was gone; the task list's was cut to one row with an …, so a
    narrow panel lost the key it names over rows left blank. All three wrap
    into the rows the panel has now, and end in … only where those run out.
    With no search and no failed save, an empty notes panel gives its sentence
    every row above the status line, rather than the half under a blank list
    and a row saying no notes, and an empty task list gives it the row that
    said the sort order of nothing; an empty markets board writes in the row
    its header would take and may grow as tall as the hint needs.
  • Wrapped text no longer leaves a gap where a row breaks. A note, a
    headline or a task's notes carried spaces at a break over to the next row:
    the one after a word exactly as wide as its row, and the second of two
    after a full stop wherever the row broke between them. The row they were
    carried to was indented by a cell or, when the
    next word did not fit beside the space, left blank. A no-break space, an
    ideographic space or a tab at a break is taken the same way.
  • An empty watch log says when its explanation has been cut. Its rows ran
    off the foot of the panel in silence: at 100x34 the default dashboard's
    log stopped mid-sentence at "the day turning, a task", and a log 30 cells
    by 10 rows stopped at "Calendar entries come from", before the key that
    sentence names. The last row that fits now ends in ….
  • An external panel's line cut short by the render budget says so. The
    host reads only as much of a line as its rows can show, and a line too
    dense for that budget, such as one heavy in combining marks, stopped where
    the budget did, over rows left blank and with nothing to say the rest was
    missing. It now ends in ….
  • Esc in the notes search box clears the search. It closed the box and
    left the half-typed term filtering the list, where the task filter's Esc
    drops it and the README says both do.
  • The notes title and search line draw their caret where typing lands.
    The caret was drawn after the text wherever the cursor was, so after
    Home or an arrow it sat at the end while typing went in elsewhere. A
    title longer than its field lost the caret off the edge, and a search
    longer than its line lost it to the … that cut the term. The watchlist's
    symbol line had the same fault and has the same fix.
  • The weather's forecast opens on the hour in progress for the whole of
    that hour.
    Open-Meteo stamps its current conditions every fifteen
    minutes, and the table compared that stamp with each hour's to the minute,
    so from :15 to :59 the hour already under way counted as past and the
    table began at the next one, beside an observation stamped at 14:15.
    It compares to the hour now.
  • A quote whose day's change cannot be stated is refused rather than
    drawn as inf.
    Numbers too large for the parser were already refused,
    but two it accepts can still overflow once subtracted or divided — a price
    of 1e308 against a close of -1e308 printed +inf in the change column,
    and against a close of 1e-10 printed +inf%. A price that had moved from
    a close of zero printed the whole price as the day's change beside
    +0.00%, because no percentage can be taken of zero. The row now falls
    back as for any failed fetch, to the last good price with its age or to
    –, and says numbers out of range in the response.
  • A calendar path naming a pipe, a device or a directory is refused, by f
    and by the reader alike.
    The 10 MB limit was checked against the size the
    file reported before reading, and a pipe reports 0, so f pointed at a FIFO
    read it whole. A pipe nobody was writing to was worse: opening one waits for
    a writer, so the agenda stopped reading until a restart and reloading…
    never went away. Anything but a regular file is now refused before it is
    opened, saying what it is — a pipe, not a calendar file — so /dev/zero
    is no longer read until memory runs out, ending the
    dashboard. The read itself now stops a byte past the limit and says so.
  • The day's percentage runs the way the day's change does when the
    previous close was below zero.
    A close can be negative — oil futures
    settled at −37.63 in April 2020 — and the percentage took the close's sign,
    so a rise from −10 to −5 read +5.00 beside -50.00%. It is measured
    against the close's size now, and reads +50.00%.
  • --migrate-config sees a table header with a comment after it.
    [theme] # my colours is a header to TOML, but the migration reads the
    file as text and did not count it as one, so a retired key under it was
    neither rewritten nor mentioned in the load error, which pointed at
    --print-config rather than at the migration. Comments are now read past
    the same way the layout editor reads past them, while a # inside a quoted
    name, as in [plugins.config.'chan#1'], is still not taken for one.
  • Two disks of one size are two rows unless their name says they are one,
    or their free space all but matches.
    The disk panel folded volumes of
    one capacity whose free space was within a percent, which is twenty
    gigabytes on a 2 TB disk, so two backup disks of one model fifteen
    gigabytes apart were one row, named after the first and showing the
    second's free space. The percent now holds only for volumes the platform
    gives one name, as it does the two halves of a Mac's disk, which drift
    apart by hundreds of megabytes while it is written to at full speed.
    Volumes named apart, or not named at all, are one row only when their free
    space is within a ten-thousandth of the size, never under 128 MiB and never
    over a percent. Two disks of one size and one name — both left Untitled
    — whose free space is within a percent are still one row, and so are two
    of any names within that tighter line, until enough is written to one of
    them to carry it past; nothing a free-space reading reports can tell them
    apart.
  • Hiding the seconds with s hides them from a time_format that spells
    them with a flag.
    The zone table found the seconds by searching for
    %S, so %H:%M:%-S kept them, under a big clock that had dropped its
    own, and %H:%M %%S, which draws 16:47 %S, lost its S and drew
    16:47 %. The format is read the way strftime reads it now, flags,
    widths and %% included, and %X and %r lose their seconds as %T
    always did. A fraction of a second goes with them — %f, %N, %.3f —
    where it used to stay and draw 09:05.123, a minute with a decimal
    fraction of one; and a %r table keeps the wider time column its PM
    needs with the seconds on as well as off.
  • The zone list draws an identifier whole or not at all. Beside each
    city the list drew the zone it writes to zones.toml, at full width, and
    on a terminal narrower than about fifty columns the dialog's edge cut it:
    Australia/Melbou, which is no zone. The identifiers are now shown on
    every row when the longest in the list fits beside the cities, and on
    none when it does not — typing narrows the list and can bring them back —
    and a city with no room ends in ….
  • A plugin is told to stop even when it has fallen behind. shutdown
    went into the same 256-message queue as everything else and was dropped
    when that was full, so a plugin that had stopped reading was killed at the
    end of its grace without the message the protocol promises. It now goes
    ahead of everything still in that queue, which is discarded rather than
    sent first. A hello not yet written still goes before it, and what the
    pipe already holds still arrives ahead of it.

Install mirador 1.22.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/jchultarsky/mirador/releases/download/v1.22.0/mirador-installer.sh | sh

Install prebuilt binaries via powershell script

powershell -ExecutionPolicy Bypass -c "irm https://github.com/jchultarsky/mirador/releases/download/v1.22.0/mirador-installer.ps1 | iex"

Download mirador 1.22.0

File Platform Checksum
mirador-aarch64-apple-darwin.tar.gz Apple Silicon macOS checksum
mirador-x86_64-apple-darwin.tar.gz Intel macOS checksum
mirador-x86_64-pc-windows-msvc.zip x64 Windows checksum
mirador-aarch64-unknown-linux-gnu.tar.gz ARM64 Linux checksum
mirador-x86_64-unknown-linux-gnu.tar.gz x64 Linux checksum

Verifying GitHub Artifact Attestations

The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:

gh attestation verify <file-path of downloaded artifact> --repo jchultarsky/mirador

You can also download the attestation from GitHub and verify against that directly:

gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>

Don't miss a new mirador release

NewReleases is sending notifications on new releases.