<feed xmlns='http://www.w3.org/2005/Atom'>
<title>lectio.git/cmd, branch v0.45.0</title>
<subtitle>offline Catholic daily readings and liturgical calendar in Go, with CLI, TUI and web clients</subtitle>
<id>https://git.labunix.xyz/lectio.git/atom?h=v0.45.0</id>
<link rel='self' href='https://git.labunix.xyz/lectio.git/atom?h=v0.45.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/'/>
<updated>2026-07-29T07:55:22Z</updated>
<entry>
<title>feat(clectio-gen): apply a calendar layer/sanctorale when generating</title>
<updated>2026-07-29T07:55:22Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-29T07:55:22Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=0db24ba21a67c99d79d321fc82391e13656c40e4'/>
<id>urn:sha1:0db24ba21a67c99d79d321fc82391e13656c40e4</id>
<content type='text'>
Add opt-in flags so clectio's tables can be regenerated from a customized
calendar instead of only the embedded universal one:

  clectio-gen -caldir DIR -use a,b [-sanctorale DIR] &lt;new|old&gt; y0 y1 out/

- -caldir + -use stack calendar layers (rank, colour, name, reading.*) over the
  calendar; -sanctorale DIR applies a full of.ini/ef.ini replacement.
- The BOOK table stays hermetic (LECTIO_CONFIG still points nowhere), so the
  generator can't read a stale user books.ini -- calendar customization and the
  book aliases are kept separate concerns.
- config.SetCalendarsDir lets CalendarsDir be pointed at an explicit layer dir
  without a full config tree (and without an unrelated books.ini there).

Verified end to end: a layer adding a feast with a proper gospel regenerates
into liturgy_of.h + verses_of.keys, and the rebuilt clectio shows it. Default
(no flags) output is byte-identical to before. make test green.
</content>
</entry>
<entry>
<title>help: refresh -h/--help for lectio, lectio-ui, lectio-web</title>
<updated>2026-07-28T21:39:17Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T21:39:17Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=fd950f027300d3185c7b66b06981eddcfcfead4f'/>
<id>urn:sha1:fd950f027300d3185c7b66b06981eddcfcfead4f</id>
<content type='text'>
The help text predated this session's changes. Update all three binaries:

- Taglines: drop "(Polish + 4 versions)" -&gt; "offline ... daily readings (OF + EF)".
- Versions: state that only the Latin Vulgate is built in; wuj/grb/drb are
  optional (make build-full, or drop &lt;code&gt;.tsv/.ini into the corpora dir); a
  missing version renders "(not in &lt;code&gt;)".
- --ui-lang: now any code (en, pl, ...), not just pl|en; note names/&lt;code&gt;.ini,
  ui/&lt;code&gt;.ini, custom calendars and the sanctorale override.
- lectio-ui: drop the removed "bt" version and the no-op -o/--offline flag from
  the help (the tool is fully offline; --offline only ever dropped bt).
- lectio-web: drop -o/--offline; add a one-line description of what it serves.

No behaviour change; full suite green.
</content>
</entry>
<entry>
<title>bible: add Douay book aliases Osee-&gt;Hosea, 2 Esdras-&gt;Nehemiah; clectio-gen hermetic</title>
<updated>2026-07-28T20:49:54Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T20:49:54Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=4bb88c667edc90a5563791dff62ae52ea070b2ee'/>
<id>urn:sha1:4bb88c667edc90a5563791dff62ae52ea070b2ee</id>
<content type='text'>
Two EF Ember-day lessons ("Osee 14:2-10", "2 Esd. 8:1-10") rendered as
"(not in vul)" because the lookup path (ResolveBook, English dialect) lacked
these Douay-Rheims book forms -- they existed only in the Latin dialect, which
ResolveBook does not consult. Add them to the [en] dialect so both lectio and
clectio resolve them (the text is present in vul: Hosea 14, Nehemiah 8).

Also make clectio-gen hermetic: it now points LECTIO_CONFIG at a nonexistent
path so it always uses the EMBEDDED calendar/lectionary/book table, never the
running user's ~/.config/lectio (whose stale books.ini was silently dropping
~30 EF readings from the generated data). It warns on any reading it cannot
resolve. Full range 2025-2054 now generates with 0 dropped readings.
</content>
</entry>
<entry>
<title>cmd/clectio-gen: generator for the tiny C build; bible.LookupKeyed</title>
<updated>2026-07-28T20:08:06Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T20:08:06Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=723f223690ce6a01124ea5fbd12e1a90ee0ab3f4'/>
<id>urn:sha1:723f223690ce6a01124ea5fbd12e1a90ee0ab3f4</id>
<content type='text'>
clectio (~/git/projects/clectio) is a tiny suckless-C daily-readings build
that compiles the calendar, citations and scripture text in. clectio-gen is
its data compiler: it reuses this engine to compute, for a year range, each
day's name/colour/readings and emits corpus-independent C tables plus the
verse KEYS, so the C side is a dumb lookup and the hard liturgical logic
stays here (oracle-validated).

- bible.LookupKeyed(version, ref) returns each resolved verse's
  (book, chapter, verse) key, mirroring Lookup's splitting/versification.
  clectio-gen uses it to record the exact pericopes a lectionary cites.
- Verified: clectio's output is byte-identical to lectio's readings, day
  names 157/157 over a 3-year sample.
</content>
</entry>
<entry>
<title>caldata: allow an external universal sanctorale to override the embedded one</title>
<updated>2026-07-28T17:22:40Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T17:22:40Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=d5d175118138249fe7d9e85d1bc65fb0b7e3a398'/>
<id>urn:sha1:d5d175118138249fe7d9e85d1bc65fb0b7e3a398</id>
<content type='text'>
The universal calendar of saints can now be refreshed or replaced without a
rebuild: if ~/.config/lectio/sanctorale/of.ini (OF) or ef.ini (EF) is present
and parses, caldata.Base uses it instead of the embedded calendar; a missing or
malformed file falls back to the embedded default, so the binary stays
self-contained and correct out of the box. Local diocesan/national additions
keep layering on top via calendars/ + `use` (unchanged). The temporal cycle and
precedence rules stay in code -- only the sanctorale is data.

- caldata.SetSanctoraleDir hook (mirrors bible/naming/i18n); Base() prefers the
  external file per form. config.SanctoraleDir(); wired in the CLI, TUI and web
  entry points. Tests cover override, no-file, and malformed-file fallback.
- README: new "Calendar of saints" section (two tiers: overlay via `use`,
  replace via sanctorale/&lt;form&gt;.ini); config comment notes the override.
</content>
</entry>
<entry>
<title>i18n: make all UI chrome user-translatable via ui/&lt;code&gt;.ini</title>
<updated>2026-07-28T17:03:15Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T17:03:15Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=9100973576f87adcadaf6c8b331df7e729aeb117'/>
<id>urn:sha1:9100973576f87adcadaf6c8b331df7e729aeb117</id>
<content type='text'>
The interface chrome (version labels, TUI keybar/messages, CLI banner words,
web control labels, section-heading words) was English/Polish hardcoded in Go.
It is now data: the English and Polish tables ship as embedded lang/en.ini and
lang/pl.ini, and any language is user-overridable at &lt;config&gt;/ui/&lt;code&gt;.ini,
resolved per key with an English fallback. With ui_language = &lt;code&gt; plus a
names/&lt;code&gt;.ini, the WHOLE interface -- chrome, day names, saint names -- is
translatable without a rebuild.

- i18n.Get loads the embedded English baseline, overlays the embedded/user
  language file, caches per lang; field &lt;-&gt; INI-key mapping is by reflection
  (lang.go) so the tables and files stay in sync automatically. Edge-space
  values (e.g. "error: ") are double-quoted so the INI trim keeps them. The
  Go tables move to golden_test.go; TestGoldenMatchesEmbedded asserts the
  embedded files still parse back to them, and TestGenerateLangFiles
  regenerates them (LECTIO_GEN=1).
- config.UIDir(); wire i18n.SetUserDir in the CLI, TUI and web entry points.
- README/config: document ui/&lt;code&gt;.ini alongside names/&lt;code&gt;.ini.
</content>
</entry>
<entry>
<title>naming: localise liturgical day names in any language</title>
<updated>2026-07-28T16:15:29Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T16:15:29Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=539a7c71b60115144959f712ef5966f48c63f9f0'/>
<id>urn:sha1:539a7c71b60115144959f712ef5966f48c63f9f0</id>
<content type='text'>
Add internal/naming, which renders temporal day names and celebration
display names from the calendar engine's slugs in any language. English is
the built-in baseline; a language is data -- an embedded lang/&lt;code&gt;.ini
(pl shipped) and/or a user file at &lt;config dir&gt;/names/&lt;code&gt;.ini that
overrides it key by key. Names compose from a small vocabulary plus
per-language format templates, so word order and grammatical case can
differ (e.g. Polish genitive "3. Niedziela Okresu Zwykłego"); any string a
language omits falls back to English.

- Move day-name generation out of calendar (calendar.HumanizeSlug removed,
  calendar stays a pure engine) into naming.DayName; the English golden
  cases carry over verbatim.
- naming.CelebrationName unifies the three duplicated resolvers
  (cli/readings/calfeed): name.&lt;lang&gt; -&gt; English -&gt; Latin -&gt; humanized slug.
  Saint names stay in the calendar data (name.&lt;lang&gt;), overridable via
  calendar layers.
- config: ui_language now accepts any code (lower-cased, not clamped to
  en/pl) so names/&lt;code&gt;.ini applies; UI chrome still resolves en/pl and
  falls back to English. Add NamesDir(); wire naming.SetUserDir (and the
  previously unwired bible.SetUserCorporaDir) in the TUI and web mains too,
  so external corpora and name files work across all three binaries.
</content>
</entry>
<entry>
<title>refactor: remove the niedziela/missalemeum scrapers, bt, traditional_lang</title>
<updated>2026-07-28T10:50:31Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T10:50:31Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=7b220084cf3951c8cde0582efdfcf628afc64336'/>
<id>urn:sha1:7b220084cf3951c8cde0582efdfcf628afc64336</id>
<content type='text'>
The daily view now computes entirely offline (previous commit), so retire the
network path and everything that served it:

- Delete internal/tradlit (missalemeum) and the niedziela scraper from
  internal/liturgy (fetch/store/parse + fixtures); keep Section, DayInfo and
  ExtractCitation.
- Remove the "bt" version everywhere (render gatherBT + branches, config,
  i18n, web form, TUI) and bible.ToEnglishRef (Polish citation converter).
  A legacy config carrying "bt" migrates to "wuj" on load (config.migrateBT).
- Remove the traditional_lang config field and the -g/--lang flag from all
  three binaries.
- Drop the now-dead flags -R/--refresh, -o/--offline, -u/--update,
  -C/--clean and the harvest/clean commands.
- New defaults: versions = wuj,vul,grb,drb; default_version = vul.

Update the README (offline-by-design, no harvest/update), help text, and
stale niedziela/bt doc comments. Tests updated for the offline reality;
go test ./... and go vet ./... are clean, all three binaries build and run
offline (OF + EF, compare, web).
</content>
</entry>
<entry>
<title>feat: books.toml -&gt; books.ini, multi-language (add Latin dialect), config-scoped citation display</title>
<updated>2026-07-27T12:59:14Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-27T12:59:14Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=cb3379f41c06a94085c77fe359709b46712850dc'/>
<id>urn:sha1:cb3379f41c06a94085c77fe359709b46712850dc</id>
<content type='text'>
books.ini with [en]/[pl]/[la]; parseBooks reads INI (bible drops go-toml).
Latin dialect resolves EF citations (Eccli-&gt;Sirach, Apoc-&gt;Revelation, Luc...);
sigla_style gains 'latin'. Reading citations now DISPLAY in the configured
sigla (FormatRef(SiglaLang)), not raw English. One-shot books.toml-&gt;books.ini
user migration (go-toml now config-only). Web settings editor -&gt; books.ini.
</content>
</entry>
<entry>
<title>tui reader: bookmarks (m=mark w/ note, b=list/jump/delete, per-verse via top-visible verse) + remember last place; v0.18.0</title>
<updated>2026-07-24T14:07:14Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-24T14:07:14Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=0321ea57f5c561215a8dea111ed7f3ea7b05594e'/>
<id>urn:sha1:0321ea57f5c561215a8dea111ed7f3ea7b05594e</id>
<content type='text'>
</content>
</entry>
</feed>
