Omahub
← All plugins
J

Daily Bible

by Justin Stone

A Bible reading plan in the bar: one chapter at a time, in canonical order, remembering where you left off. Ships with the World English Bible (public domain).

Security review

Potentially dangerous behavior detected · 4 findings

Deterministic scan — not a security guarantee

High
Risk level
High
Analyzed commit
9d43408
Scanned
2 weeks ago
  • high destructive_filesystem …/web/john.json:1

    Low-level disk manipulation or write command.

    parted my garments among them. For my cloak they cast lots.” Therefore the soldiers did these things."}, {"verse": 25, "text": "But standing by Jesus’ cross were his mother, his mother’s sister, Mary 
  • high destructive_filesystem …/web/genesis.json:1

    Low-level disk manipulation or write command.

    parted, and became the source of four rivers."}, {"verse": 11, "text": "The name of the first is Pishon: it flows through the whole land of Havilah, where there is gold;"}, {"verse": 12, "text": "and 
  • high destructive_filesystem …/web/mark.json:1

    Low-level disk manipulation or write command.

    parted his garments among them, casting lots on them, what each should take."}, {"verse": 25, "text": "It was the third hour, and they crucified him."}, {"verse": 26, "text": "The superscription of hi
  • high destructive_filesystem …/web/leviticus.json:1

    Low-level disk manipulation or write command.

    parted hoof, is unclean to you."}, {"verse": 7, "text": "The pig, because it has a split hoof, and is cloven-footed, but doesn’t chew the cud, is unclean to you."}, {"verse": 8, "text": "You shall not

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

None
AI risk level
None
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
9d43408
Reviewed
2 weeks ago

Daily Bible is a QML plugin that displays checked-in public-domain Bible text and persists only a reading-progress file under the plugin's state directory. The deterministic scan's high-risk flags are false positives: the word 'parted' in verses such as John 19:24 matched a disk-partitioning rule, but no destructive commands exist. The only script is a data-generation utility that writes to data/web and is not part of the plugin runtime.

  • The deterministic scan's destructive_filesystem findings on data/web/*.json are false positives caused by Bible text containing the word 'parted', not actual disk commands.
How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/jcstone/omarchy-daily-bible --enable
Other #bar

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.

bar widget showing "📖 Gen 2"

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 with chapterCount, 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 plain node) independent of the shell.
  • BarWidget.qml -- the bar button. Always shows the chapter at nextIndex -- 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, via FileView), 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 saves nextIndex, 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 way nextIndex can change: picking a book and chapter there sets it directly (via Model.indexForBookChapter, the inverse of chapterAt), 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.png and a short description in manifest.json's barWidget.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.json only 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.json is 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.