Every preference Old Bird exposes. The in-app screen, the web viewer, the HTTP API, and the boot receiver all read from the same SharedPreferences("oldbird_prefs"); changes apply live.
on
Reject requests from public IP addresses. The allowlist permits RFC 1918 (10/8, 172.16/12, 192.168/16), link-local (169.254/16), loopback, IPv6 ULA (fc00::/7) and RFC 6598 / Tailscale CGNAT (100.64.0.0/10). Applied before auth, so off-LAN clients never reach the password check.
Turn off only when fronting Old Bird with another auth layer (reverse proxy + mTLS, VPN gateway, etc).
The first run uses username oldbird and a securely generated 12-character password. Tap to reveal the pair, then tap again to copy it.
Replaces the generated defaults with your own viewer credentials for HTTPS, RTSP, and ONVIF. Usernames accept 1–32 ASCII letters, numbers, dots, underscores, and hyphens. Passwords accept 12–128 printable ASCII characters.
Changing credentials means viewers, NVRs, RTSP players, and ONVIF clients must use the new values when they next authenticate or reconnect.
Replaces only the current password with a fresh random value and retains the selected username. Clients must use the new password when they next authenticate or reconnect.
off
Toggles the foreground service that hosts the camera, audio, HTTPS server and HTTP landing page. The same master control appears on the Cameras main screen. Honoured by BootReceiver: if this is on at boot and the CAMERA permission is granted, the service auto-starts.
off
Show a thumbnail next to each camera in the camera list. Off saves a small amount of memory on devices with several lenses.
Read-only display of the discovered LAN address (https://<ip>:<port>). Updates when the service binds.
Sends URL + username + password to another device via the system share sheet.
8443
Port for the encrypted viewer and all camera/audio/recording/RTSP-control endpoints. Range 1024–65535. Server rebinds when changed.
8080
Plain-HTTP port. Serves only the landing page that explains the self-signed-certificate warning and links into the HTTPS viewer. No camera endpoints.
0
Rotate the stream for sideways or upside-down mounts. Choices: 0° / 90° / 180° / 270°. Cross-axis rotations (0↔90, 180↔270) trigger an encoder hub rebuild because the dimensions swap; same-axis rotations are a metadata flip on the running session.
640x480
Choices populated from the camera's reported sizes. Changing reconfigures the capture session on the same open device — no CameraDevice close+reopen.
18
Range 1..100. Affects the MJPEG path only. Default is intentionally low for 24/7 streaming over Wi-Fi; bump to 50–80 for higher fidelity at the cost of bandwidth.
50
Range 1..100. Drives the H.264 encoder bitrate used by RTSP and recording. Live update via the encoder's bitrate parameter; no session drop.
0
Range -24..+24. Camera2 auto-exposure offset. Step is device-specific (typically 1/3 EV per unit). Negative darkens, positive brightens.
0 (no cap)
Caps the camera's auto-FPS range. Lower values let the HAL use longer exposures in low light. Choices: 0 (no cap), 1, 5, 10, 15, 20, 24, 30 fps. Effective fps is always the lower of the user's cap and what the camera advertises.
off
Saves MP4 segments under Android/data/app.oldbird.webcam/files/Movies/. The camera stays on whenever recording is active, regardless of viewer count. Audio is included when microphone access is available; denying it produces a valid video-only MP4.
1800 (30 min)
Choices: 1 m / 5 m / 15 m / 30 m / 1 h / single file. Rollover requests an IDR keyframe, closes the muxer, then opens a new one on the next keyframe.
5
Ring buffer cap. The oldest finalised segment is deleted whenever a new one is finalised past this count.
off
Encodes another stream of MP4 segments and uploads each finalised file via HTTP PUT with Basic Auth. Three retries, exponential backoff. On success the local copy is deleted.
on
Pause uploads on cellular; resume when Wi-Fi returns. Encoding still runs locally so no clip is lost.
300 (5 min)
Independent of the on-device recording cadence. Shorter segments upload sooner; longer ones save server overhead.
Directory URL ending in /, e.g. https://dav.example.com/oldbird/. Each segment is uploaded as <url><filename>.
Use https:// — plain http:// exposes Basic Auth credentials to anyone on the path.
WebDAV account username for Basic Auth.
WebDAV account password. Stored on the device only.
5
Permanent failures are renamed failed-upload-*.mp4 and kept up to this many. Oldest evicted past the cap.
off
Holds the camera alive at idle fps while continuously diffing frames. On detection it bumps fps, optionally records a clip, and fires the configured webhook.
50
Range 1..100. One slider tunes both the per-cell luminance threshold and the minimum-cells-changed count together. Higher = trigger on smaller / fainter changes.
2
Camera fps while waiting for motion. Lower keeps the device cooler; too low can miss fast events.
15
Keep recording for this long after the last detection. Subsequent detections during this window extend the deadline.
on
Save each event as motion-<timestamp>.mp4 in the recordings folder. Independent of the regular Record to device setting; both can run side-by-side.
generic
Choices: generic, custom, ntfy, slack, discord, telegram. The settings UI shows / hides the fields below per provider; the JSON layer (/motion) advertises the same flags so the viewer can do the same.
See Integrations → Motion alerts for the wire format each provider produces.
Used by Generic / Custom / ntfy / Slack / Discord. For Slack and Discord the embedded webhook secret is the auth. For Telegram, leave blank — the URL is reconstructed from the bot token.
Verbatim Authorization header value, e.g. Bearer abc123 or Basic dXNlcjpwdw==. Used by Generic / Custom / ntfy. Leave blank for no auth.
Telegram bot token from @BotFather, looks like 123456789:ABCdef.... Used to build the https://api.telegram.org/bot<TOKEN>/sendMessage URL.
Numeric chat id (private chat or group) or @channelname for public channels. Find your numeric id by messaging your bot then opening https://api.telegram.org/bot<TOKEN>/getUpdates.
Template fired on motion. Placeholders: {camera}, {ip}, {time}, {timestamp}. Default (when blank): {"event":"motion","camera":"{camera}","ip":"{ip}","timestamp":{timestamp}}.
User-supplied templates use raw substitution — you own escaping for whatever format you target.
Override the request Content-Type header. Default: application/json; charset=utf-8. For form-encoded providers (Pushover, etc.): application/x-www-form-urlencoded.
on
Hold a Wi-Fi lock so the stream doesn't stall when the screen is off. Uses the low-latency mode on Android 10+ and the high-performance mode on older versions. Released only when the service is fully idle.
off
Enables the RTSP/1.0 server. Same auth + IP allowlist + rate-limit pipeline as HTTP. With the default username, the URL is rtsp://oldbird:<password>@<phone-ip>:<port>/; replace oldbird after choosing a custom username.
8554
Range 1024–65535. Port change rebinds the listener and drops in-flight sessions.
Opens the Free and Pro screen. Off-LAN viewing requires an active Pro subscription.
Sign in with Google. Required for off-LAN viewing (a Pro feature): the phone registers the camera with Old Bird's relay broker as a Firestore document keyed by your Google UID. Sign-out de-registers this device's camera.
off
Registers this camera to the signed-in Pro account. In version 0.1.11 and newer, enabling while the phone is signed out starts Google sign-in and persists the switch only after sign-in succeeds; cancellation leaves it off. Sign-out also turns it off.
Opens relay.oldbird.app. Sign in there with the same Google account used by the camera phone.
Wipes the Firestore cameras registry and profile for your account, revokes the local Google Drive grant, and signs you out. Satisfies the Play account-deletion policy without a web form.
Human-readable label for this camera in the viewer registration. Also surfaces in motion alerts as the camera field.