Settings and permissions by level

Otavi decides things at four levels:

  • 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).

Words used here

  • 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.

How the levels combine

  • 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.

Settings

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.

Settings from the registry

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 Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Silence gate (RMS) audio.silenceFloor 0 0 to 0.01 Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
YAMNet bird threshold audio.birdThreshold 0.05 0 to 2 Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop amphibian chunks audio.drop.amphibian on on, off Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop insect chunks audio.drop.insect on on, off Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop machine / loud-event chunks audio.drop.anthropogenic on on, off Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop human voice chunks audio.drop.human_voice on on, off Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Drop other-animal chunks audio.drop.other_animal on on, off Hub Team Satellite Hub Team 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 Hub Team Satellite Hub Team 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 Hub Team Satellite Hub Team 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 Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Heartbeat interval upload.heartbeatSec 30 s 10 s to 120 s Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
On-satellite inference inference.onSatellite off on, off Hub Team Satellite Hub Team yes Hub settings › Defaults; Team settings › Satellites; satellite page, the phone's settings
Minimum confidence inference.minConfidence 10 % 0 % to 50 % Hub Team Satellite Hub Team Hub settings › Defaults; Team settings › Detection; satellite page
Range filter threshold inference.rangeFilter 0.01 0 to 0.05 Hub Team Satellite Hub Team Hub settings › Defaults; Team settings › Detection; satellite page
Language display.language en ^[a-z]{2}(_[A-Za-z]{2})?$ Hub Team Account Hub Hub settings › Defaults; Team settings › General; Account page
Second languages display.secondaryLanguages none up to 2, each ^[a-z]{2}(_[A-Za-z]{2})?$ Hub Account Hub settings › Defaults; Account page
Date format display.dateFormat relative relative, datetime-local, datetime-iso, date-only, time-only, datetime-short, datetime-long Hub Account Hub settings › Defaults; Account page
Date format on hover display.dateFormatSecondary datetime-local relative, datetime-local, datetime-iso, date-only, time-only, datetime-short, datetime-long Hub Account Hub settings › Defaults; Account page
Time format display.timeFormat 24h 24h, 12h, 24h-seconds, 12h-seconds Hub Account Hub settings › Defaults; Account page
Start of week display.startOfWeek 1 1, 0, 6 Hub Account Hub settings › Defaults; Account page
PDF paper size report.paperSize a4 a4, letter Hub Account Hub settings › Defaults; Account page
Vote from the detection list verification.showVoting off on, off Hub Account Hub settings › Defaults; Account page

Access and joining

Setting Levels Default How it resolves Where
Sign-up without an invite (allow_self_registration) Hub on hub only; an invite always works Hub settings › Access
Team creation by anyone signed in (allow_tenant_creation) Hub off hub only; hub admins always may Hub settings › Access
Teams people can join or find (allow_public_teams) Hub off gates the team's joining options below Hub settings › Access
Public team pages (allow_public_pages) Hub off gates the team's public page Hub settings › Access
How people join (join_policy) Team invite only applies while allow_public_teams is on Team › General
Role given to newcomers (default_join_role) Team viewer team Team › General
Listed in the team directory (listed) Team off needs allow_public_teams Team › General
Public page, with towns (public_page, public_page_places) Team off needs allow_public_pages; towns need the page Team › General
Who adds satellites (device_policy) Team members team Team › General
Two-factor sign-in Account off; required for hub admins account Account

Detection and inference

Setting Levels Default How it resolves Where
Confidence bands (confidence_high, confidence_low) Team 0.85, 0.4 team; used by the hub's inference Team › Detection
Votes needed for a verdict (verification_consensus) Team 3 team Team › Detection
Temporal aggregation: on, hits needed, window Team on, 2, 30 min team Team › Detection
Unconfirmed detections kept for (tentative_retention_hours) Team 24 h team; applied by the hub's retention sweep Team › Detection
Non-bird categories shown (show_*) Team hidden team Team › Detection
Watchlist species Team none team Team › General
Active classifier and embedding model Hub chosen in the model registry hub Hub settings › Models
Compare mode and its sample rate Hub single, 10 % hub; a rate of 0 compares no chunk (hub 0.68+; it used to mean all of them) Hub settings › Models

Satellites: schedule, status and admin-only settings

Setting Levels Default How it resolves Where
Marked offline after (offline_timeout_minutes) Team 5 min team; the offline alert rule has its own delay (15 min) Team › Satellites
Recording profile Satellite continuous satellite only satellite page, phone
Admin-only settings (config_locked) Satellite off satellite; when on, only team admins can change its settings, not the satellite itself nor the person who registered it satellite page
Name and position Satellite kept on it set at registration; GPS or manual the satellite reports them phone Settings, Pi .env
Archived Satellite no satellite; the next heartbeat clears it satellite page

Storage, retention and images

All hub level.

Setting Default Where
Retention sweep on (retention_enabled); every retention setting below waits for it off Hub settings › Storage
Audio soft and hard caps 50 GB, 60 GB Hub settings › Storage
Audio kept for, best recordings kept per species, silent chunks kept for 30 days, 10, 6 h Hub settings › Storage
Android releases kept 5 Hub settings › Storage
Gallery photos per species 5 Hub settings › Storage
Wikimedia access token and contact address none Hub settings › Images
iNaturalist as a second photo source, allowed licences off; CC0, CC BY, CC BY-SA Hub settings › Images
Smart square thumbnails on Hub settings › Images
Delay between photo downloads automatic Hub settings › Images

Alerts

Setting Levels Default Where
Alert rules Team four built-in rules per team Alerts › Rules
Alert channels (email, Slack, Telegram, Google Chat, Discord, webhook) Team none Alerts › Channels
Vibrate on each detection Satellite kept on it off phone Settings

Display and language

Setting Levels Default How it resolves Where
Bird-name languages Hub Team Account English account, else the team's language (which follows the hub unless the team sets its own) Account, Team › General, Hub settings › Defaults
Date and time formats, first day of the week Account relative dates, 24 h, Monday account Account
Paper size of PDF reports Account A4 account Account
Voting controls on detections Account off account Detections page
Web interface language and theme English, dark the browser header menu
Phone interface and species language Satellite kept on it the phone's language the phone's system language phone

Settings kept on the satellite itself

  • 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).

Deployment switches

Set in the hub's .env by whoever runs the server; see Configuration.

  • OTAVI_AUTH_PLATFORM_ADMIN_EMAILS: who becomes a hub admin.
  • OTAVI_AUTH_MFA_ENCRYPTION_KEY: makes two-factor sign-in available.
  • OTAVI_EBIRD_API_KEY: expected species and eBird-based rarity.
  • OTAVI_SMTP_*: every email (welcome, invites, email alerts, emailed exports).
  • OTAVI_HUB_METRICS_TOKEN: the Prometheus metrics endpoint.
  • OTAVI_BACKUP_*: nightly backups.

Permissions

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.

Account

Action Who Gated by
Create an account anyone allow_self_registration, or an invite
Sign in (with the second factor once set up) and sign out anyone –
Reset a forgotten password by email anyone –
Change one's preferences, profile and password; download one's data the person an address listed as hub admin is reserved for that admin
Set up two-factor sign-in: authenticator app, passkeys, backup codes, remembered devices the person hub admins cannot turn it off
Delete one's account the person not a hub admin, nor a team's sole owner (hand the team over first)

Teams

Action Who Gated by
See one's teams anyone signed in –
Create a team (and own it) anyone signed in (not an API key) allow_tenant_creation; hub admins always may
Browse the directory, join a team or ask to join, withdraw a request anyone signed in (not an API key) allow_public_teams and the team's join policy
Leave a team anyone in the team (not an API key) not its owner
Approve or refuse requests to join, block someone, lift a block Admin approval grants viewer or member
Invite people, revoke invites Admin (not an API key) roles up to admin; bulk invites: viewer or member
See the members and pending invites, change a role, remove a member Admin not the owner; an admin's role or membership: the owner
Hand the team to someone else Owner (not an API key) –
Read team settings Viewer –
Change team settings Admin opening the team up and a public page need the hub switches; a setting may be locked by the hub
Create a team API key Admin through the API, no page yet
Read the team's activity feed Member –

Satellites

Action Who Gated by
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 whoever manages it –
Listen to a satellite live Member –
Move a satellite to another team Hub admin –

Detections and data

Action Who Gated by
See detections, audio, statistics, recording sessions and field notes Viewer the team's non-bird visibility
Follow detections as they arrive Viewer –
Vote on a detection, mark the call on the spectrogram Member (not an API key) –
Comment on a detection Member (not an API key) deleting a comment: its author or an admin
Pin a detection so retention keeps its audio Member –
Share a detection with a public link Viewer –
Write field notes and add photos Member (not an API key) adding photos, editing and deleting: the author
Export detections (CSV, JSON, eBird, iNaturalist, xeno-canto) and PDF reports Member –
Schedule exports by email or webhook Admin through the API, no page yet
Refit the confidence calibration Admin –
Species names, translations, photos and facts; software versions anyone signed in –

Alerts

Action Who Gated by
Read the alerts inbox, rules and channels Viewer a channel's settings (addresses, webhook URLs): admins only
Mark an alert read Member –
Create, change, test or delete alert rules and channels Admin built-in rules keep their trigger and cannot be deleted

Hub

Action Who Gated by
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 Hub admin –
Prometheus metrics the metrics token, or a hub admin –

Public

Action Who Gated by
Landing page, hub counters, species showcase, sign-up options, privacy page facts, health anyone –
A team's public page anyone allow_public_pages and the team's public page
A shared detection anyone with the link promoted detections only; never the satellite's name or position
The latest Android release anyone –