<feed xmlns='http://www.w3.org/2005/Atom'>
<title>lectio.git/cmd, branch main</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=main</id>
<link rel='self' href='https://git.labunix.xyz/lectio.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/'/>
<updated>2026-08-18T16:08:20Z</updated>
<entry>
<title>fix(clectio-gen): write the verse keys gzipped as well as plain</title>
<updated>2026-08-18T16:08:20Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-18T16:08:20Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=fd3eda0da228d2417b8b7f9007533e214d7a5e80'/>
<id>urn:sha1:fd3eda0da228d2417b8b7f9007533e214d7a5e80</id>
<content type='text'>
clectio's Makefile unpacks gen/verses_&lt;form&gt;.keys from the COMMITTED .gz, and
its clean target deletes the plain file. clectio-gen wrote only the plain one,
so regenerating the tables without separately re-gzipping the keys left
gen/liturgy_&lt;form&gt;.h indexing verses the packed text did not hold.

clectio then dereferenced a NULL verse pointer. That shipped: 1246 of the 10957
EF dates in the 2025-2054 range segfaulted, 11% of the calendar. OF was
unaffected -- its tables had not been regenerated since the keys were last
packed.

The two artefacts are generated together, so they are now written together and
cannot drift. OF's keys are byte-different after this (Go's gzip, not gzip(1))
but content-identical, verified.
</content>
</entry>
<entry>
<title>lectio-ef-dump: emit the Epistle and Gospel citations</title>
<updated>2026-08-15T00:07:29Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-15T00:07:29Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=3ad70f087f30075e6414d85195a5ca037e14f627'/>
<id>urn:sha1:3ad70f087f30075e6414d85195a5ca037e14f627</id>
<content type='text'>
colitur's differential compares reading citations from this release onward,
and needs them per day rather than per lectionary key -- this engine resolves
a feria to the preceding Sunday's Mass itself, which is exactly the behaviour
the differential has to check.
</content>
</entry>
<entry>
<title>lectio-ef-dump: add name_en/name_pl columns</title>
<updated>2026-08-12T12:52:02Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-12T12:52:02Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=ef171295a5d7b7cc40ad7367e142de4234a4eb54'/>
<id>urn:sha1:ef171295a5d7b7cc40ad7367e142de4234a4eb54</id>
<content type='text'>
The verification instrument this task's own diff comparisons run
against emitted season/week/slug/rank/colour but no display name at
all, so it was structurally incapable of seeing the 322-line name.pl
deletion (fix round 2) -- the season/rank/colour columns it already
printed were all still correct, since name is a wholly separate field
naming.CelebrationName reads independently, and no diff against this
tool's own prior output could ever have caught the regression.

Appends two fixed columns after colour (before the existing +other
tokens): the observed celebration's own name.en and name.pl (spaces
replaced with "_" so the line stays whitespace-delimited; "-" for an
empty name, matching the week column's own convention). Format is
documented in the package doc comment as a departure from colitur's
matching day-line format: a straight diff against colitur's output
must now ignore these two trailing-before-others fields.
</content>
</entry>
<entry>
<title>cmd(lectio-ef-dump): new EF calendar dumper for colitur's differential oracle</title>
<updated>2026-08-11T23:35:35Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-08-11T23:35:35Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=2386a4551aec94252168a8554269ee423d516882'/>
<id>urn:sha1:2386a4551aec94252168a8554269ee423d516882</id>
<content type='text'>
Prints one line per day, sorted ascending, for a civil-year range: date,
weekday, season, week, observed slug, rank, colour, then zero or more
+slug tokens for the day's other (losing) candidates. The line format
matches colitur's `colitur day` output field-for-field so the two
streams diff directly; every column carries lectio's own vocabulary
(season names, slugs, rank/colour spellings) with no translation toward
colitur's — that mapping belongs to the differential comparator, not
this dumper.

Uses calendar.Compute with Selection{Form: "old"} over the embedded
tridentine layer (caldata.Tridentine()), mirroring the setup already
used by oracle_ef_test.go. Lives in cmd/ because internal/calendar
cannot be imported outside this module; colitur's build is untouched.

Note for the comparator: lectio has no RG 111 commemoration-admission
logic, so the trailing +slug tokens are the day's losing candidates,
not admitted commemorations.
</content>
</entry>
<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>
</feed>
