Files
menologion/README.md
T
funkpower 7beb53fc94 the documented way to use this did not work
`import qs.horologion.modules` was the README's headline instruction and it
fails outright: Quickshell resolves `qs` against the host config root, not
the subtree, so in an empty shell the type is unavailable and in a populated
one the widget would have silently bound to the host's Config and Theme
instead of its own. The imports inside are now relative and each directory
carries a qmldir, so `import "horologion/modules"` works in any host and the
three pieces really are usable on their own.

  - refresh() dropped a request made while a run was in flight, so a
    jurisdiction or date set a moment after startup never took effect until
    midnight. It queues now.
  - The waybar script exited non-zero on its error paths, and waybar hides a
    module whose script does that -- so a missing typikon made the module
    vanish rather than say so, and the .error CSS was dead. An unrecognised
    --format field raised instead of rendering empty, and the tooltip
    interpolated unescaped text into Pango markup, which matters because
    --update-menaion fetches commemorations from a page nobody here controls.
  - The installer aborted the whole run at the point where it printed
    'leaving it alone', and a wholly successful run exited 1 because the last
    statement was a failed [ -d ] test under set -e. --help demanded typikon,
    which is what --help would have told you to install.
  - eww painted every day with the feast colour and printed a dangling
    separator, because it compares against "" and eww renders a JSON null as
    the string "null". The parenthesised ?: form two lines away was already
    right. The week list also repeated today.

pip install typikon installed nothing; there is no such package, and that was
the first line of every install path. Pascha now carries its label instead of
being a bare ISO date in a corner.

tests/smoke.sh covers the scripts, which is where all of this lived and where
nothing was covered. It caught two of these while being written.
2026-09-18 10:29:37 -04:00

4.3 KiB

horologion

Desktop front ends for typikon — the Orthodox liturgical day on your desktop, in Hyprland (Quickshell), waybar or eww.

Everything is computed locally by typikon, so none of this touches the network, and the widget re-reads only when the date rolls over — the answer changes at midnight and at no other moment.

The widget during the Nativity Fast

Install

typikon first, since all three front ends shell out to it:

$ pipx install git+https://git.pumpin.online/funkpower/typikon
$ typikon --set-default rocor     # or antiochian, oca, greece, ...

Then:

$ git clone https://git.pumpin.online/funkpower/horologion
$ cd horologion && ./bin/horologion-install

That links rather than copies, so git pull updates what you are running. Pass quickshell, waybar, eww or bin to do just one.

Quickshell

A desktop widget for Hyprland and anything else Quickshell runs on.

$ quickshell -p ~/.config/quickshell/horologion/shell.qml

It sits on the background layer, so it behaves like part of the wallpaper — always under your windows, never stealing a click.

To drop it into a shell you already have, link this directory in beside your own and import it by path:

import "horologion/modules"

Horologion {}

The imports inside are relative, so the widget always resolves its own Config and Theme rather than silently binding to yours and inheriting whatever they happen to mean.

Three pieces, each usable on its own:

services/Typikon.qml a singleton wrapping the CLI — bind to it from anything
services/Theme.qml colours, from JSON, with defaults for every key
modules/Horologion.qml the widget

Set a jurisdiction per-widget if you want one different from your default:

import "horologion/services"   // for Typikon

Horologion {
    Component.onCompleted: Typikon.jurisdiction = "moscow"
}

Typikon.forDate takes an ISO date and shows a different day, which is how you look at what Great Week will ask of you before it arrives.

Colours

Theme.qml reads ~/.config/horologion/colors.json, or whatever HOROLOGION_COLORS points at, and watches it for changes. Every key has a default, so the widget is legible with no file at all. See quickshell/colors.example.json — the flat shape most theme generators already emit.

waybar

"custom/typikon": {
    "exec": "horologion-waybar",
    "return-type": "json",
    "interval": 1800,
    "on-click": "typikon --days 7"
}

The module's CSS class is the fast level — .xerophagy, .wine_oil, .fish — so a day's discipline reads off the colour without reading the text. .obligatory is added only where a particular law actually binds, which under the Typikon is never: the Orthodox Church keeps the fast as tradition, not as precept. waybar/style.css has a starting palette.

Change what the text says with --format:

$ horologion-waybar --format '{emoji} {fastLabel}'
$ horologion-waybar -j moscow --format '{emoji} {churchDate}'

eww

(include "horologion/horologion.yuck")

Then (horologion) for the full panel or (horologion-bar) for one line. horologion.scss carries the styling; its colours are !default variables, so set your own before the @import.

What it shows

The feast or the day's principal commemoration, the fast and why, the season, the week ahead, and Pascha.

The church date is always in the corner. On the new calendar it echoes the wall calendar; on the old it is the answer you came for. Below, ROCOR on 7 January — which is 25 December, and the Nativity.

The Nativity on the old calendar

Forefeasts, afterfeasts and leave-takings get their own quiet line rather than crowding out the commemoration that makes the day itself. They repeat for days at a time, and a widget that leads with "Post-festive Day of the Exaltation" for a week has told you nothing.

The legend is built from the week in view, not hardcoded, because the levels a tradition uses are its own — six under the Typikon, three under Ruthenian particular law — and the words for them differ too. Great Week uses nearly all of them:

Great and Holy Week

Licence

GPL-2.0-only — see LICENSE.