Deadlines, closing dates, and reminders that can be changed
The calendar draws four kinds of entry now and the key along the top is
also the filter; the diary file carries deadlines and closing dates as
all-day entries. A listing you are considering can tell you before it
closes, under Settings. A reminder can be put off, edited or deleted,
from its row and from the API — which is the first and only thing the
API deletes, so the scope table says which is which (#238).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Nothing in the wiki mentioned gunicorn, and the image has just acquired an
opinion about it that an operator may well want to change: two minutes for a
request rather than gunicorn's thirty seconds, because thirty is a budget for a
page and not for drawing a PDF on a small machine, and a worker retired every
five hundred requests so that a process answering one person's instance does not
run for months.
GUNICORN_CMD_ARGS is the one lever over any of that, so the page says what it
holds by default, that setting it replaces the whole string rather than adding
to it, and which flags live in the image's command instead and are therefore not
affected. It also answers the question an operator asks next, which is whether
more workers would help: they would not, and what actually keeps one slow
request from blocking the others is that the slow views no longer hold the
database while they work.
Closes#220
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The scheduler fails quietly: nothing errors, reminders simply stop arriving, and
the first person to find out is the one who missed a deadline. It now writes the
time of each finished pass where both its own container healthcheck and the
metrics endpoint in the web container can read it, so *Health, metrics and logs*
gains the heartbeat, the two new numbers beside it, and three alerting rules --
one for the loop having stopped, one for it running but not getting through, and
one for deliveries that have been failing for an hour. The reminder count there
also changed meaning: it was every reminder anybody had ever set and not done,
which grows because the instance is being used and so could not be alerted on.
Refs postulo/postulo#221
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The capture rate limit counts fetches, on the form and on the API alike
POSTULO_CAPTURE_RATE was described as bounding "captures, per account", and until now it
bounded the capture form and nothing else -- so the page that documents the capture API
said nothing about a limit that did not apply to it. It applies now, and what it counts
is the fetch: a capture sent without html spends it, a capture that brings its own page
does not and answers to POSTULO_API_RATE as before. That distinction is the thing a
client author has to know, so it is written where they are reading: in the capture
section, and again beside the other statuses, where 429 was missing entirely.
Refs postulo/postulo#194
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
compose.postgres.yml now carries a scheduler of its own, so a PostgreSQL
instance no longer has to go without reminders, gone-quiet notices, store
copies and syncs. The commands here named only the SQLite file, which would
have started a scheduler reading a database that is not the one the instance
uses. (#219)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Configuration, Writing a plugin: the Browser notifier and form_attributes()
Configuration gains "In the browser" under Notifications: the two ways a
browser notification arrives, which third party the push way involves and
what it can and cannot read, what the notifier needs (HTTPS, scripts,
outbound HTTPS, the scheduler), and why rotating the field key ends every
subscription. Writing a plugin documents the optional form_attributes()
method, and why a plugin still cannot ship JavaScript of its own.
Refs postulo/postulo#209
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Document the whole API surface: every call, the machine endpoints, the plugin API
The API named every call, but the scope each needs lived in prose, and
the discard reasons and what /me answers were not written anywhere. It
gains both, and one list of all 39 calls with method, path and scope,
generated from the API's own routers.
/healthz, /metrics and /logs answer machines about the instance and
were only rows in Configuration. Health, metrics and logs says what
each returns, how it is switched on and guarded, the rate limit, the
parameters /logs takes, and every metric with its labels.
The plugin guide was postulo's docs/PLUGINS.md and never reached the
wiki. It is Writing a plugin now, opening with every kind of plugin,
its entry-point group and the interface it satisfies, and carrying a
reference of all 37 names postulo.plugins.api promises -- eight of
which the guide had never named. It also says plainly that a
notifier's Notification, and the client's DestinationRefused, are used
from outside the surface today.
The sidebar gains a Building on it group for the API and the plugin
guide, and the three pages that linked to docs/PLUGINS.md link here.
postulo's tests/test_wiki_surface.py now reads these three pages
against the code.
Refs postulo/postulo#170
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Take the pages over from postulo/wiki, which this repository now replaces
Until now this was a copy of postulo/wiki, refreshed by postulo's
scripts/publish-wiki.sh whenever somebody remembered to run it. The last
time was 5 September (postulo@9645ee1). This brings it to postulo@b6cfb8f7:
- the four pages that never arrived: Accessibility, Hardening, Listings
and Reports;
- the seventeen that had changed since;
- the images, which the script never copied because it copied *.md and
nothing else, so Home has shown its logo and its Buy me a coffee button
broken since the day they were added.
Nothing here was lost: every earlier commit is a publish, and the pages
they left matched postulo/wiki at 9645ee1 exactly.
From here pages are written in this repository and nowhere else.
Refs postulo/postulo#169
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>