Days older than the first entry ever logged can now be opened. Picking a
date from before anything was recorded landed on a dead end.
Changed
Releases are built by CI. Merging this pull request builds the image,
tags it vYYYYMMDD-N and latest, pushes both, and creates the git
tag. Nothing is built locally any more.
make image, push, release, seed, icons and vendor are gone;
the Makefile is down from 151 lines to 71. The two rare commands are
written out in the README.
Every push to dev now runs make check in CI.
Deployment
No new or renamed environment variables, and compose.yaml is unchanged —
nothing to copy to the server this time. Pull the new image once CI reports
the build finished.
## Fixed
- Days older than the first entry ever logged can now be opened. Picking a
date from before anything was recorded landed on a dead end.
## Changed
- Releases are built by CI. Merging this pull request builds the image,
tags it `vYYYYMMDD-N` and `latest`, pushes both, and creates the git
tag. Nothing is built locally any more.
- `make image`, `push`, `release`, `seed`, `icons` and `vendor` are gone;
the Makefile is down from 151 lines to 71. The two rare commands are
written out in the README.
- Every push to `dev` now runs `make check` in CI.
## Deployment
No new or renamed environment variables, and `compose.yaml` is unchanged —
nothing to copy to the server this time. Pull the new image once CI reports
the build finished.
The script hardcoded 2026-09-05, so at the next midnight that became "some
day in the past" and the assertions quietly changed meaning: today turned
into an unlogged row, and a refute on "Ei merkintää" started matching it
instead of the day under test. Dates are now computed at run time.
That refute was wrong regardless. It denied the string across the whole page,
but every unlogged day legitimately renders one. It now asserts positively
that the entry is still shown while the delete is being confirmed.
The variable rename landed in the repository but not on the server, which
keeps its own compose.yaml and .env. Neither is pulled from here, so the
container came up against the old names. A release touching either now has to
say so in its notes.
Picking a date from before the oldest log entry rendered nothing at all.
history() truncates its window at min(date) — correct, there is no history
before the first entry to be missing — and loadDays widened the window by
inflating the day count, which that truncation then undid. No row for the
selected day meant no board to log it in, so the one thing you would want an
old empty day for was the one thing you could not do. The same happened past
maxHistoryDays, reachable straight from the date picker.
history() now takes the selected day as an explicit floor instead of the
caller guessing a day count, and date() clamps the past at maxHistoryDays the
way it already clamped the future — the list runs unbroken from today down to
the selection, so a picker set to 1994 would otherwise ask for eleven thousand
rows.
While in there:
- entriesBetween replaces the day-at-a-time entryFor loop. Two queries for
the whole window rather than two per day; the widest window a URL can ask
for was 3,600 round trips through a pool of exactly one connection.
- softDeleteMain and updateMain filter on special = 0. The catalog never
lists Tähteet, but a stale tab or a hand-made POST could still have removed
the row migration 0002 guarantees.
- WriteTimeout and IdleTimeout on the server. With one database connection, a
reader stalling on a long history response blocks everything behind it.
Two tests, both of which fail on the old code: a day 100 back with only today
logged, and sides landing on their own day now that they arrive in one query.
Merging a pull request into main is now the whole release. A Gitea
Actions workflow derives the CalVer tag, builds the image and pushes
it with :latest, so nothing is built locally any more.
That made image/push/release redundant, and with them the .release-tag
state file and the main-branch guard — the workflow only runs on main,
which is protected, so the guard had nothing left to catch. The digest
verification went too: it guarded a `make -j` race between image and
push that cannot happen in a single CI job.
seed, icons and vendor ran a few times a year and are written out in
the README instead. Makefile: 151 lines to 71.
Docs referenced the removed targets in sixteen places, including a
CONTRIBUTING note claiming the branch check "has to be local".
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fixed
date from before anything was recorded landed on a dead end.
Changed
tags it
vYYYYMMDD-Nandlatest, pushes both, and creates the gittag. Nothing is built locally any more.
make image,push,release,seed,iconsandvendorare gone;the Makefile is down from 151 lines to 71. The two rare commands are
written out in the README.
devnow runsmake checkin CI.Deployment
No new or renamed environment variables, and
compose.yamlis unchanged —nothing to copy to the server this time. Pull the new image once CI reports
the build finished.