Configuration
Three separate things, often confused: what the operator sets for the whole instance, what the process is told through its environment, and what each account chooses for itself.
config.toml
Written to ~/.config/ontoplano/config.toml on first run, and edited by
the operator or through /admin. Its shape is the OntoplanoConfig
interface, so this table is that interface.
[server]
| Key | Type | Means |
|---|---|---|
host |
string |
— |
port |
number |
— |
[database]
| Key | Type | Means |
|---|---|---|
path |
string |
— |
[week]
| Key | Type | Means |
|---|---|---|
firstDay |
number |
— |
generateDay |
number |
— |
[registration]
| Key | Type | Means |
|---|---|---|
mode |
RegistrationMode |
— |
[account]
| Key | Type | Means |
|---|---|---|
allowEmailChange |
boolean |
Whether a person may move their account to another address. |
allowEmailChange
Whether a person may move their account to another address.
Off unless the instance says otherwise: an email address is what an account is here — it signs in and it receives the reset link — so letting it be changed is the operator's call, not the account holder's.
[reports]
| Key | Type | Means |
|---|---|---|
clientErrors |
boolean |
Whether the app may ask people to send in client-side errors. |
clientErrors
Whether the app may ask people to send in client-side errors.
Off by default: a stack trace is somebody's data leaving their browser, so the instance opts in, and then each person is asked once and can say no. Nothing is ever sent before both have said yes.
[ui]
| Key | Type | Means |
|---|---|---|
undoSeconds |
number |
Seconds a delete waits, undoably, before it happens. Zero turns it off. |
[media]
| Key | Type | Means |
|---|---|---|
maxKilobytes |
number |
The biggest single picture this instance accepts, in kilobytes. |
recipeImages |
number |
How many pictures one recipe may carry. One of them is the main one. |
entryImages |
number |
How many pictures one notebook entry may carry. |
accountMegabytes |
number |
Everything one account's pictures may add up to, in megabytes. |
maxKilobytes
The biggest single picture this instance accepts, in kilobytes.
Enforced on the server against the bytes actually received, not against what the browser said it was sending. Pictures are rows in the same SQLite file as everything else, so this is also the number that decides how fast that file grows.
[newsletter]
| Key | Type | Means |
|---|---|---|
enabled |
boolean |
Whether this instance keeps a list of people to tell when it changes. |
origin |
string |
The site allowed to post the form, if the form is not on this host. |
enabled
Whether this instance keeps a list of people to tell when it changes.
Off unless the instance says otherwise, like every other feature that collects an address from somebody who is not an account holder: a self-hosted install has nothing to announce, and a subscribe form on it is a box that fills up with whatever crawlers put in it.
On, it opens one public endpoint — /api/subscribe — which takes an
address, sends one confirmation, and does nothing at all until that
link is followed.
origin
The site allowed to post the form, if the form is not on this host.
ontoplano.com is a different origin from app.ontoplano.com, so the footer form is a cross-origin POST and the browser will not send it without being told. Empty means same-origin only, which is what a self-hosted instance wants even with the list turned on.
[instance]
| Key | Type | Means |
|---|---|---|
tagline |
string |
The one line under the name on the signed-out front page. |
tagline
The one line under the name on the signed-out front page.
Here rather than in the component because it is the operator's sentence, not the app's: somebody running this for a household or a team should be able to say what their instance is without editing Svelte. Empty falls back to the line below.
Environment
Every ONTOPLANO_* variable the code actually reads, and where it is
read. A variable that stops being consulted leaves this table by
itself, which is the point — an env var nobody reads any more is the
kind of thing that stays in a deployment script for years.
| Variable | Read in |
|---|---|
ONTOPLANO_ALLOW_PUSH |
scripts/guard-push.mjs |
ONTOPLANO_APP_URL |
scripts/build-docs-site.mjs |
ONTOPLANO_ASSET_ORIGIN |
scripts/build-twa.mjs |
ONTOPLANO_BACKUP_RETENTION_DAYS |
src/lib/server/services/legal.ts |
ONTOPLANO_BAN_CONTROL |
src/lib/server/services/protection.ts |
ONTOPLANO_BAN_CONTROL_CMD |
src/lib/server/services/protection.ts |
ONTOPLANO_CONFIG_DIR |
src/lib/server/config.ts |
ONTOPLANO_CONTACT_EMAIL |
src/lib/server/services/legal.ts |
ONTOPLANO_DATA_DIR |
scripts/migrate.mjs, src/lib/server/config.ts |
ONTOPLANO_DEMO |
src/lib/server/settings.ts |
ONTOPLANO_DEMO_EMAIL |
src/lib/server/settings.ts |
ONTOPLANO_DEMO_MAX_ACCOUNTS |
src/lib/server/settings.ts |
ONTOPLANO_DEMO_TTL_MINUTES |
src/lib/server/settings.ts |
ONTOPLANO_DOCS_URL |
src/lib/server/settings.ts |
ONTOPLANO_FAIL2BAN_LOG |
src/lib/server/services/protection.ts |
ONTOPLANO_FAMILY_SEATS |
src/lib/server/settings.ts |
ONTOPLANO_HEALTH_TOKEN |
src/lib/server/settings.ts, src/routes/api/jobs/reminders/+server.ts, src/routes/api/jobs/weekly-reviews/+server.ts, src/routes/healthz/+server.ts |
ONTOPLANO_HTTPS |
src/hooks.server.ts |
ONTOPLANO_JURISDICTION |
src/lib/server/services/legal.ts |
ONTOPLANO_MAIL_FROM |
src/lib/server/services/push.ts |
ONTOPLANO_OPERATOR |
src/lib/server/services/legal.ts |
ONTOPLANO_ORIGIN |
scripts/build-twa.mjs |
ONTOPLANO_OWNER_ID |
src/lib/server/settings.ts |
ONTOPLANO_PAYMENT_PROVIDER |
src/lib/server/settings.ts |
ONTOPLANO_POLICY_UPDATED |
src/lib/server/services/legal.ts |
ONTOPLANO_PRICE_CURRENCY |
src/lib/server/settings.ts |
ONTOPLANO_PRICE_FAMILY_MONTHLY_CENTS |
src/lib/server/settings.ts |
ONTOPLANO_PRICE_FAMILY_YEARLY_CENTS |
src/lib/server/settings.ts |
ONTOPLANO_PRICE_MONTHLY_CENTS |
src/lib/server/settings.ts |
ONTOPLANO_PRICE_YEARLY_CENTS |
src/lib/server/settings.ts |
ONTOPLANO_REGISTRATION |
src/lib/server/services/registration.ts |
ONTOPLANO_REQUIRE_VERIFIED_EMAIL |
src/lib/server/services/access.ts |
ONTOPLANO_REVIEW_MAIL_OFFSET_HOURS |
src/lib/server/services/review-mail.ts |
ONTOPLANO_SELF_HOST |
src/lib/server/services/billing.ts, src/lib/server/settings.ts |
ONTOPLANO_SELLS |
src/lib/server/services/billing.ts |
ONTOPLANO_SITE_COOKIE_DOMAIN |
src/lib/server/settings.ts |
ONTOPLANO_SITE_URL |
src/lib/server/settings.ts |
ONTOPLANO_SKIP_MIGRATION_CHECK |
src/lib/server/db/assert-migrated.ts |
ONTOPLANO_STAGING |
src/lib/server/settings.ts |
ONTOPLANO_TRIAL_DAYS |
src/lib/server/settings.ts |
ONTOPLANO_TRIAL_REQUIRES_CARD |
src/lib/server/settings.ts |
ONTOPLANO_TRUST_PROXY |
src/lib/server/rate-limit.ts |
ONTOPLANO_VAPID_PRIVATE_KEY |
src/lib/server/services/push.ts |
ONTOPLANO_VAPID_PUBLIC_KEY |
src/lib/server/services/push.ts |
Per-account settings
Rows in user_settings, one per account per key. These are choices a
person makes about their own copy of the app, not the operator.
| Key | Constant |
|---|---|
onboarding.done |
ONBOARDED_KEY |
planner.grid_end_hour |
GRID_END_KEY |
planner.grid_start_hour |
GRID_START_KEY |
shopping.currency |
CURRENCY_KEY |
ui.hiddenSections |
HIDDEN_SECTIONS_KEY |
ui.navOrder |
NAV_ORDER_KEY |
ui.sectionColors |
SECTION_COLORS_KEY |
ui.style |
STYLE_KEY |
ui.theme |
THEME_KEY |
ui.tutorialSeen |
TUTORIAL_KEY |
user.timezone |
TIMEZONE_KEY |
week.firstDay |
WEEK_FIRST_DAY_KEY |
week.generateDay |
WEEK_GENERATE_DAY_KEY |