Hub everything on this hub, set by hub admins in Hub settings.
Team each team, set by its admins in Team settings.
Account each person, for themselves, on the Account page.
Satellite each registered phone or Pi, either stored on the hub (its page under Satellites) or kept on the satellite itself (the phone's Settings screen, the Pi's .env).
This page lists every setting and permission with the levels where it exists: where to change something, who may do what, and how a value set at one level meets the others. In the tables, a level badge names a level, and a role badge such as Member the lowest team role allowed (Hub admin means hub admins only).
Default: what a level gets when it sets nothing itself, named after where it comes from: "Hub default (Off)", "Team default (On)".
Override: a lower level setting its own value instead of the default. The level above can allow it or not: a padlock beside the setting, open for "Teams may override" or "Satellites may override", closed when they may not.
Locked: a level above does not allow overriding. The setting shows its value, greyed, with "Locked by the hub" or "Locked by the team".
Hub admin: the hub-wide role (is_platform_admin in the code, where the hub level is still called platform).
Device: only the computer or phone someone signs in from, as in the two-factor "remembered devices". A recording phone or Pi is a satellite.
Settings from the registry (everything satellites receive, the team's detection thresholds and language, and each person's preferences; table below): one rule for all of them. The hub sets a value for every team, a team may set its own, a satellite its own where the setting reaches satellites. A level that sets nothing follows the one above, and says so ("Hub default (30 s)"); the built-in default stands at the top. A level can lock the one below: the hub for every team (and their satellites), a team for its satellites. Under a lock, a level keeps its own value but it does not apply, and a new one is refused with 403 LOCKED_BY_PLATFORM or LOCKED_BY_TEAM (the API codes keep the code names). A new team follows the hub for everything, except its language when its creator reads another one.
Where they are stored: each level's value in today's columns and keys (platform_settings, tenant_settings, satellite_config_overrides; NULL = follow the level above), the locks in setting_locks. One writer checks and saves every change (PATCH /api/settings/effective), and the Python worker and SQL readers get resolved values from two views generated from the registry: tenant_settings_effective (per team) and satellite_settings_effective (per satellite, which the worker uses for the minimum confidence and range filter of the satellite whose chunk it analyses).
Hub switches over team options: a team can open itself to newcomers only while allow_public_teams is on, and publish a public page only while allow_public_pages is on.
A person's preferences (languages, date and time formats, start of week, PDF paper, voting from the detection list) are registry settings at the account level: the hub sets everyone's default (Hub settings, Defaults), a person their own on the Account page, and choosing "Hub default" goes back to it. A person's languages win over the team's wherever that person reads names (web pages, PDF and CSV exports, shared links); a person who has not chosen a language reads in the team's language within that team, else the hub's. Alerts and scheduled exports use the team language. The hub's lock on the language binds people too.
In the Levels column, a badge names each level where the setting exists, top down; "kept on it" marks a satellite setting stored on the satellite itself rather than on the hub.
Declared once in the settings registry (packages/shared/src/settings.ts), which the hub, the web pages, the phone and the Pi all read; this table is generated from it. The audio filter switch turns off both gates before upload, the silence gate and the YAMNet bird gate with its category drops, on phones and Pis alike Pi 1.6.5.
Setting
Key
Default
Allowed
Levels, top down
Can lock the level below
The satellite may set it
Where
Audio filter
audio.filterEnabled
on
on, off
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Silence gate (RMS)
audio.silenceFloor
0
0 to 0.01
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
YAMNet bird threshold
audio.birdThreshold
0.05
0 to 2
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop amphibian chunks
audio.drop.amphibian
on
on, off
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop insect chunks
audio.drop.insect
on
on, off
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop machine / loud-event chunks
audio.drop.anthropogenic
on
on, off
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop human voice chunks
audio.drop.human_voice
on
on, off
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop other-animal chunks
audio.drop.other_animal
on
on, off
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Outbox soft cap
upload.outboxSoftMb
5000 MB
100 MB to 50000 MB
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Outbox hard cap
upload.outboxHardMb
8000 MB
100 MB to 100000 MB
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Outbox max age
upload.outboxMaxAgeHours
720 h
24 h to 2160 h
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Heartbeat interval
upload.heartbeatSec
30 s
10 s to 120 s
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
On-satellite inference
inference.onSatellite
off
on, off
HubTeamSatellite
HubTeam
yes
Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Minimum confidence
inference.minConfidence
10 %
0 % to 50 %
HubTeamSatellite
HubTeam
Hub settings › Defaults; Team settings › Detection; satellite page
Range filter threshold
inference.rangeFilter
0.01
0 to 0.05
HubTeamSatellite
HubTeam
Hub settings › Defaults; Team settings › Detection; satellite page
Language
display.language
en
^[a-z]{2}(_[A-Za-z]{2})?$
HubTeamAccount
Hub
Hub settings › Defaults; Team settings › General; Account page
Phone (Settings screen): keep the screen on, record when the app opens, vibrate on detection, GPS on or off and its interval, manual position, name. The phone also remembers whether it was recording, so that an update resumes it.
Raspberry Pi (.env, OTAVI_SAT_*): capture mode and audio input, sample rate and chunk length, GPS mode and fixed position, whether the YAMNet model runs at all, telemetry interval, data folder, log level. Its .env may also set starting values (inference mode, minimum confidence, range filter, YAMNet threshold, recording profile) that the hub replaces on its first configuration push.
Before the first configuration: phones and Pis run with the registry's defaults (DEFAULT_SATELLITE_CONFIG), the same values the hub sends a team that sets nothing (phone 1.27+, Pi 1.6.4).
Roles inside a team, lowest first: viewer, member, admin, owner. A hub admin may do in every team what its owner may. The registrant of a satellite is the person who registered it.
"Manage a satellite" means: a hub admin, an admin of the satellite's team, or its registrant while the team's policy is "members". A satellite's own key may act on that satellite only: rename it, rotate its key, edit its settings.
A role counts in the team the action concerns: the team being viewed for lists and statistics, the item's own team for anything done to a detection, a rule, a note or a satellite. An API key acts for one team with the role it was given; "not an API key" marks what needs a person signed in.
Every action is declared once, in the permissions registry (packages/shared/src/permissions.ts), with who may perform it and what gates it. The web offers what the rule allows (the same declarations), each API route names the action it performs, and one guard applies the rule to every route: 401 when no one is signed in, 403 when the role or the kind of caller is not allowed, 404 when the team or the item is out of reach. The tables below are generated from the registry.
See satellites, their settings, schedule and history
Viewer
–
Register a satellite, or re-register or replace one after a reinstall
Member
team policy "admins": admins only; re-registering: its registrant, an admin, or a member taking over a team-owned satellite (its device id, which only the satellite and its managers know, proves it)
Rename a satellite, change its settings, rotate its key
whoever manages it, or its own key
admin-only settings; a setting may be locked by the hub or the team; values outside the registry's range are refused; the phone's own settings screen changes the settings marked for it
Make a satellite's settings admin-only
Admin
–
Change its recording profile, update its software, fetch its logs, archive or delete it
Hub settings, defaults and locks for teams included
Hub admin
–
Accounts: edit, block, reset a password or two-factor, add to or remove from a team, delete
Hub admin
not another hub admin, except resetting two-factor (the lost-device way back in); deleting: not a team's sole owner; adding an owner: only to a team without one (a team has one owner, handed over from its Members page)
Classifier models, model comparison, calibration coverage
Hub admin
–
Android releases
Hub admin
–
Storage and retention
Hub admin
–
The species image cache
Hub admin
–
The audit log
Hub admin
–
System status, the inference queue and its workers