<feed xmlns='http://www.w3.org/2005/Atom'>
<title>lectio.git/README.md, branch perf/hoist-date-independent-work</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=perf%2Fhoist-date-independent-work</id>
<link rel='self' href='https://git.labunix.xyz/lectio.git/atom?h=perf%2Fhoist-date-independent-work'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/'/>
<updated>2026-07-29T06:24:34Z</updated>
<entry>
<title>feat(cli): --cal-dump NAME to generate a commented calendar template</title>
<updated>2026-07-29T06:24:34Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-29T06:24:34Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=4ef5570c348e2d8d83c67e049b06e7b5d1a7542d'/>
<id>urn:sha1:4ef5570c348e2d8d83c67e049b06e7b5d1a7542d</id>
<content type='text'>
Replace the static examples/sanctorale-of.ini with a `--cal-dump NAME` flag
that writes the running universal calendar to ~/.config/lectio/calendars/NAME.ini
as a fully-commented layer template (every celebration present, all commented).
Uncomment one day and edit a field to override it; enable with `use = NAME`.

- Form-aware: respects -l/--lectionary, so `-l trad --cal-dump x` dumps the 1962
  calendar (322 entries) and the default dumps the OF calendar (212 entries).
- Entries sorted by date then slug; refuses to overwrite an existing file.
- Always in sync with the embedded (or sanctorale-overridden) calendar, so no
  stale checked-in template to maintain.
- Update help text, man page (OPTIONS/FILES/EXAMPLES) and README to match;
  drop examples/sanctorale-of.ini.
</content>
</entry>
<entry>
<title>examples: ship a commented sanctorale calendar-layer template</title>
<updated>2026-07-28T23:10:06Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T23:10:06Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=802cedfa3b92a07247bf513b90e0fdff71201294'/>
<id>urn:sha1:802cedfa3b92a07247bf513b90e0fdff71201294</id>
<content type='text'>
Add examples/sanctorale-of.ini: every universal Ordinary Form sanctorale entry
as a COMMENTED calendar-layer block (date, rank, class, colour, name.&lt;lang&gt;).
As shipped it changes nothing; to alter a day you copy it into
~/.config/lectio/calendars/, uncomment its block, edit a field, and enable the
layer with `use =`. The layer overlays the embedded calendar field by field, so
untouched days keep their defaults (verified: uncommenting St Sebastian with
rank=feast makes it displace the ferial). Header documents suppress/add/readings.
Man page and README point at it.
</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>caldata: backfill Polish names for the whole OF universal sanctoral</title>
<updated>2026-07-28T17:10:23Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T17:10:23Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=a9faf42cfbb1c060ac69f703f0c78616656566cb'/>
<id>urn:sha1:a9faf42cfbb1c060ac69f703f0c78616656566cb</id>
<content type='text'>
Add name.pl to the 132 universal-calendar celebrations that lacked it, so all
212 now carry Polish names (was 80). They follow the existing liturgical style
-- genitive case, "św. &lt;name&gt;, &lt;title&gt;" / "świętych ...", feast events in the
genitive -- hand-curated from standard Polish nomenclature and keyed to each
entry's name.en/name.la. Polish patrons use their Polish forms (Adalbert -&gt;
św. Wojciech, John of Kanty -&gt; św. Jana Kantego, Hedwig -&gt; św. Jadwigi
Śląskiej). Verified: feast/solemnity saints render their Polish name as the
day header, optional memorials appear as Polish options in the day's others.
</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>docs: document corpora split, name localisation, and corpora licence</title>
<updated>2026-07-28T16:19:08Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T16:19:08Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=771ec96f07499d6efbcb587f94e30ffcbc4e0e58'/>
<id>urn:sha1:771ec96f07499d6efbcb587f94e30ffcbc4e0e58</id>
<content type='text'>
- README: only the Vulgate is embedded by default; new "Scripture corpora"
  section explains the fullbible tag and the runtime corpora dir, and new
  "Localising day names" section covers ui_language = &lt;code&gt; +
  names/&lt;code&gt;.ini for day names and calendar-layer name.&lt;lang&gt; for saints.
  License section now states the bible corpora are not covered by the AGPL.
- NOTICE: add a "Scripture corpora -- embedding and licence" section listing
  each corpus's provenance (vul/wuj/drb/grb, all public domain) and the
  default-embeds-vul-only policy.
</content>
</entry>
<entry>
<title>licence: relicense MIT -&gt; AGPL-3.0-or-later</title>
<updated>2026-07-28T12:02:54Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T12:02:54Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=0586599fc6020df996c4278230eeea99b9d070cb'/>
<id>urn:sha1:0586599fc6020df996c4278230eeea99b9d070cb</id>
<content type='text'>
lectio was MIT, which let anyone take it closed. The concern is not people
selling it -- no licence stops that, and the AGPL does not try to -- but
someone building a proprietary product on it and giving nothing back.

Plain GPL would leave the obvious hole open: lectio-web is a network
service, and hosting is not distribution, so a modified lectio-web could be
run as a paid subscription API without ever publishing a line. AGPL section
13 closes exactly that.

LICENSE is the verbatim FSF text. README carries the standard notice.

Section 13 requires a modified network-reachable version to PROMINENTLY
offer its source to the users interacting with it, so the offer ships with
the code rather than living only in a file nobody fetches:

  - GET /source          plain text, no template or config dependency, so
                         it answers even when something else is broken
  - page footers         every full page (fragments render inside one)
  - JSON envelope        "source" / "license"
  - iCal header          X-LECTIO-SOURCE / X-LECTIO-LICENSE

The feed fields are not redundant: an /api/calendar.json consumer or an
.ics subscriber never loads a page, so the footer alone would miss them.

config.SourceURL is the single source of truth, and says in its comment
that a fork running as a service must repoint it -- an offer that leads to
someone else's code is not an offer.

Tests pin all of it. This is a licence obligation, not a feature, so it
should fail loudly if a later change drops it.
</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>chore: bump to 0.35.0 + README for calendar API (JSON/iCal)</title>
<updated>2026-07-27T19:44:17Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-27T19:44:17Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=e661227e10d2b6de4ab659fd9586d0a1479650dc'/>
<id>urn:sha1:e661227e10d2b6de4ab659fd9586d0a1479650dc</id>
<content type='text'>
</content>
</entry>
<entry>
<title>rename the pl scripture version to bt (Biblia Tysiąclecia); v0.4.0</title>
<updated>2026-07-24T07:55:36Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-24T07:55:36Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=a865374755480a4aef2a6156afccdf08a91422ea'/>
<id>urn:sha1:a865374755480a4aef2a6156afccdf08a91422ea</id>
<content type='text'>
The niedziela.pl scraped Polish paragraph text is the Biblia Tysiąclecia
translation; rename its version code from "pl" to "bt" and its i18n label
to "Biblia Tysiąclecia (niedziela.pl)" everywhere the scripture VERSION is
meant, across config, i18n, render, web, tui, cli and both binaries' help
text. Language-role "pl" (ui_language, traditional_lang, i18n.Get lang,
--lang validation) is untouched. Behavior is identical -- bt is still
dropped for offline/traditional and substituted with wuj.
</content>
</entry>
</feed>
