These are the install’s shared settings — see the Library section in
Profiles & Access for what they control. A
profile’s own name, color, and password are edited through
PATCH /api/profiles/:id, not here.
GET /api/settings
GETAny session
Returns the current settings.
Response
{
"settings": {
"recipesPerPage": 50,
"searchResultLimit": 10,
"imageMaxSizeMb": 10,
"showIngredientGramHints": false
}
}PATCH /api/settings
PATCHAdmin only
Updates one or more settings. All fields optional — only send what’s changing.
Request body
| Field | Type | Notes |
|---|---|---|
recipesPerPage |
integer 10–500 | How many recipes the Library and Favorites grids show per page |
searchResultLimit |
integer 1–100 | How many results the search dialog shows before “keep typing to narrow it down” |
imageMaxSizeMb |
integer 1–100 | Largest photo accepted by uploads (hero image or step photo), in MB |
showIngredientGramHints |
boolean | Show an approximate gram weight next to convertible ingredient quantities (e.g. “1 cup flour (~120g)”), calculated offline from a built-in density table. Off by default. |
Response: { "settings": PublicAppSettings }, or 400 if a field is
outside its allowed range.
GET /api/export
GETAdmin only
Streams a zip archive of the whole install — every recipe’s metadata and
photos, every profile’s collections and cooking state, the profile list
(passwords stripped down to a hasPassword flag), and the settings
above. The archive mirrors the storage backend’s own layout
(recipes/<id>/metadata.json, recipes/<id>/image.<ext>, and so on)
file-for-file, plus top-level recipes.json, profiles.json, and
settings.json summaries. Nothing is buffered in memory — files stream
straight from storage into the response — so this works the same way
whether the library has ten recipes or ten thousand.
The shopping list is deliberately left out — it’s a working list, not part of the library. There’s no matching import endpoint yet; this is a one-way, read-only download.
Response: 200 with Content-Type: application/zip and a
Content-Disposition: attachment header, or 403 if the active profile
isn’t an admin (or on the public demo, where export is disabled
entirely).