LiturgyGen

6. Security and privacy checklist

Worked through on 2026-09-27, before the restructured repository was pushed, and re-checked against the code on 2026-10-09. Boxes are ticked only where the thing is actually true today; where a row has changed its answer, the old answer is left in the row rather than deleted, because what I believed and when is the point of a checklist.

25 of the 26 rows are ticked. Three closed since the first pass — helmet, rate limiting, and secret scanning with push protection — and one row turned out to be wrong rather than stale: the count of commits carrying a personal email address, which was understated by seven.

The one row left open is the author email and surname in the git history, and it is left open deliberately rather than reworded until it passed. A rewrite is possible and was costed; what it cannot do is erase objects GitHub has already served, so the honest state of that row is “measured, bounded and declared”. The row carries the measurement, the three options and the reason for the choice. A security checklist whose boxes are all ticked because the hard row was rephrased is worth less than one that names what is still true.

The longer, rubric-shaped version of this document is SECURITY-CHECKLIST.md in the repository root. This file is the prose one; that one is the table with the evidence commands in it.

Before the first push

The application

Privacy

Not on the standard checklist, but it is the thing most likely to go wrong in this particular project.

The one paragraph for the journal

The riskiest thing in this project is not injection or credentials. The secrets are a connection string and a Supabase service role key, neither of which has ever been committed, and the only personal information is a staff email address and a password hash, both held by Supabase rather than by this application. It is that the app’s entire value comes from text somebody else owns: two published books of intercessions and the New American Bible. A public repository that redistributed either would be a real problem with my name permanently attached, and the first draft of the demo seed generator would have done exactly that. What I did about it: the books never enter version control, the scripture is fetched at runtime and stripped out of anything committed, and the public installer ships without the office’s data. What I knowingly accepted at the time: no rate limiting and no helmet, because this was a single-office local tool. The API then went on a public URL, which is exactly the condition I had written down as the thing that would make both real, and both are now in — the CSP with a test behind it, because the way it fails is silent. What is still open is the author email in the history, and the fact that an edit made through GitHub’s web interface puts it back.