Daily Bible for Omarchy
A bar plugin for Omarchy that tracks your place in
the Bible, one chapter at a time -- no browser, no app, no network calls.
The bar always shows the next chapter you haven't read; click it (or use
the keyboard shortcut you bind) to open it, read, and mark it done. Want to
read more than one chapter in a sitting? Just keep marking chapters read --
there's no daily cap. Use the arrows or h/l to browse other chapters
without disturbing your progress. Starting somewhere other than Genesis 1
(or resuming a plan you already started elsewhere)? Open "Go to book &
chapter", pick a reference like Mark 2, and it becomes your current
chapter -- canonical order continues on from there.
Ships with the World English Bible (WEB), which is in the Public Domain, in canonical order (Genesis to Revelation). Only one translation and one order for now -- see "Where this goes next" below.

Status
Working v1, built and smoke-tested against a live Omarchy (Quattro) shell:
manifest validates with omarchy plugin validate, both QML files lint clean
against the real qs.Commons/qs.Ui modules, and the bar widget + panel
were confirmed rendering real data live -- including marking a chapter read
via a real keypress and confirming the advanced position survives a full
shell restart. It has not been exercised by more than one person or
over a long run, so treat it as an early build.
Install
omarchy plugin add https://github.com/jcstone/omarchy-daily-bible.git --enable
That clones this repo into
~/.config/omarchy/plugins/io.github.jcstone.daily-bible/ and enables it.
Pass left or right to omarchy plugin enable afterward if you want to
move it to a specific side of the bar.
Optional: bind a key in Hyprland to
omarchy-shell io.github.jcstone.daily-bible toggle to open/close it
without reaching for the mouse.
Uninstall
omarchy plugin remove io.github.jcstone.daily-bible
This removes the plugin folder (a backup is kept alongside it) and its bar
entry. It does not touch ~/.local/state/omarchy/plugins/io.github.jcstone.daily-bible/progress.json
-- delete that yourself if you want to drop your saved reading position too.
Forking this into your own plugin
Third-party plugins install to a directory named after their id, and that
id is also what you bind a keyboard shortcut to -- so if you want to publish
your own copy (a different translation, a different reading order, etc.),
pick a new permanent id first and replace every occurrence of
io.github.jcstone.daily-bible and "Justin Stone":
manifest.json "id": "io.github.jcstone.daily-bible" -> your id
manifest.json "author": "Justin Stone" -> your name
Model.js PLUGIN_ID = "io.github.jcstone.daily-bible" -> same id as above
LICENSE "Copyright (c) 2026 Justin Stone" -> your name
Model.js's PLUGIN_ID is the single source of truth BarWidget.qml and
Panel.qml both read from, so those two files need no edits.
How it works
data/index.json-- book metadata in canonical order (id, name, slug, chapter count). Combined withchapterCount, this is enough to derive a flat, ordered list of every chapter in the Bible (1189 of them) without a separate plan file --Model.chapterAt(books, flatIndex)walks it.data/web/<book>.json-- one file per book,{"<chapter>": [{"verse": N, "text": "..."}, ...]}.~/.local/state/omarchy/plugins/<id>/progress.json-- the only persisted state:{"nextIndex": N}, the flat index of the next chapter you haven't read. Written only when you mark a chapter read.Model.js-- pure reading-progress math (flat-index <-> book/chapter, formatting references) with no Qt dependency, so it can be reasoned about (and re-tested with plainnode) independent of the shell.BarWidget.qml-- the bar button. Always shows the chapter atnextIndex-- your actual current reading -- regardless of what the panel is currently browsing.Panel.qml-- the reading view. Loads only the one book needed for the chapter on screen (lazily, viaFileView), not the whole Bible at once. Browsing (prev/next chapter, or jumping back to your current chapter) only moves a session-local cursor; marking a chapter read is the only thing that advances and savesnextIndex, and it's only offered while you're viewing your actual current chapter -- rereading an old chapter can't accidentally rewind your progress. "Go to book & chapter" is the other waynextIndexcan change: picking a book and chapter there sets it directly (viaModel.indexForBookChapter, the inverse ofchapterAt), so that's the chapter the bar shows next and canonical order resumes from it.
No settings, no accounts, no network access at runtime. The only network
use anywhere in this repo is scripts/build_bible_data.py, a one-time (or
whenever-you-want-to-regenerate) build step -- it is not part of the
running plugin.
Regenerating the data
The data/ directory is checked in, so you don't need to run anything to
use the plugin. To rebuild it (e.g. to pick up upstream text corrections):
python3 scripts/build_bible_data.py
This pulls the WEB text from
TehShrike/world-english-bible
and the canonical book order from
TehShrike/books-of-the-bible,
both public-domain-sourced, and writes data/index.json and
data/web/*.json. Takes under a minute; no API key needed.
Where this goes next
Deliberately left out of v1, in rough order of "probably worth doing soon":
- A visible way to know the plugin exists: right now discovery is
entirely "read this README." A
preview.pngand a short description inmanifest.json'sbarWidget.description(already there) are the only hooks the marketplace listing gives you. - More than one reading order. Canonical straight-through is the simplest to implement and the easiest to verify, not the most popular -- chronological and M'Cheyne-style (multiple passages per sitting, cycling through different parts of the Bible in parallel) are common asks, and would need a real ordered plan structure instead of the current flat canonical list.
- More than one translation. Anything else public-domain (KJV, ASV,
Douay-Rheims) is a straightforward extension of
scripts/build_bible_data.py. A copyrighted translation (ESV, NIV, ...) would need to go through that publisher's official API under their terms instead of being bundled -- see the git history / conversation this was built in for why that split matters. - Streaks / read history.
progress.jsononly remembers where you are, not when you read each chapter -- no streak counter, no calendar of which days you read on. That's a bigger state shape (a log, not just a pointer) and a design decision about what "missing a day" should do. - Multi-monitor / multi-instance correctness.
progress.jsonis watched (watchChanges: true) so a second bar instance picks up a change, but this hasn't been tested with more than one monitor.
License
MIT for the plugin code (see LICENSE). The bundled World English Bible
text is in the Public Domain.