Changelog

What changed in each release of the Android and desktop apps. They share one version number. Downloads and checksums for every version are on the builds page.

0.2.0, in progress

Not released yet

These changes are finished and will ship in the next release. Until then, the downloads are the latest release below.

Protocol: Camlane Stream Protocol 1.2, plus 1.3’s recording indicator and 1.5’s watchers (only optional additions; 0.1 phones and receivers still work together).

Added

Modes (phase A of three modes)

  • A mode picker on first launch, and later from the device list or Settings. Android offers Share camera and mic (today’s app) and Camera (a monitoring camera); Watch shows as coming soon. The desktop offers Share camera and mic and Watch.
  • Each Android mode keeps its own battery saver, keep-screen-on and auto-reconnect settings, so switching never loses a choice. People updating from 0.1 who pick Share keep their current settings, and opening a connect link or QR code before choosing a mode picks Share.
  • Desktop recorder for Watch mode: each camera’s video is stored as received (no re-encoding) in one-minute segments encrypted with AES-256-GCM, with a SQLite index of segments and motion events (from the phones’ STATE power.motion). Per camera: Off, Motion only (default; keeps the minutes with motion plus one minute either side) or Continuous. Retention defaults to 1 week, oldest first, keeping pinned events. Recording never runs in Share mode.
  • Recording indicator (protocol 1.3, CONTROL and STATE recording): a recorded phone shows a “Recording” pill on its camera screen and “Recording.” in its notification, and the desktop shows “Recording” in the sidebar. Phones too old to show it are flagged on the desktop.
  • Settings → Recording on the desktop (Watch mode): Off / Motion only / Continuous, per camera too; keep 1 day to 1 year; an optional size limit for all cameras together (“until N GB”, oldest first); space used and free with a recommendation such as “1 week uses about 5 GB of your 310 GB free”, and how long the size limit lasts; encryption on by default.
  • Small recordings (protocol 1.3, RECORD_VIDEO): a recorder asks the phone for a second, small stream encoded from the same picture, and records that instead of the live stream. Settings → Recording → Quality: Small (360p, 10 fps, 250 kbit/s), Standard (480p, 15 fps, 500 kbit/s; default) or High (the live stream); camlane-cli watch --quality. On a Xiaomi Pad 7, Standard recorded 3.2 MB per minute instead of ~39 MB. Older phones are recorded from the live stream as before.
  • Storage targets (protocol 1.3, RECORD_UPLOAD): a phone in Camera mode stores on the first computer in its list that answers (Settings → Recordings: best first, most free room recommended), records on itself while none does (encrypted with an Android Keystore key, up to 5 GB and 1 week by default) and uploads that when a computer is back, deleting each minute only once it is stored. Recorders advertise their room (store in mDNS and the probe reply, storage in HELLO_ACK); the Recordings timeline shows what the camera recorded itself and what it still holds.
  • camlane-cli watch: the receiver as a headless recorder (Watch mode) with the same settings as flags: --record off|motion|continuous, --camera "Pixel 8=continuous", --keep day|week|month|year, --max-size 200GB, --recordings-dir, --no-encrypt. It prints the storage line and recommendation, a line when each camera starts or stops being recorded, and a warning for phones that can’t show it; record N continuous on stdin changes one camera while it runs. camlane-cli listen is Share mode and never records.
  • camlane-cli recordings list (with space used and free) and recordings export --camera <name> --from 14:05 --for 5m -o clip.mp4: recordings as a normal MP4 (H.264, decrypted), starting at the keyframe before the chosen time. Times can be now, -10m, 14:05 or a full date.
  • Desktop Recordings page: pick a camera and a day, see a 24-hour timeline of what was kept with motion marked, click to choose a start, and export 1 min to 1 hour as an MP4 to Videos/Camlane, with “Show in folder”.
  • Play recordings on the desktop without exporting them: seek by time (from the keyframe before), play and pause, frame step, jump to the previous or next motion, and speeds from 0.25× to 100×. From 8× only keyframes are decoded, so 100× used 11–27% of one core in testing. Frames reach the page like the live preview (at most 30 fps), on their own low-priority thread.
  • Month heatmap on the Recordings page: each day shows how much was recorded, how much had motion and (once sound events exist) voice; open a day for its 24 hours and pick an hour to play it. A month for 8 cameras loads in 9–17 ms from a per-hour summary in the index (schema 2; older indexes are filled in once on first open).
  • Delete all recordings on the Recordings page, after a confirmation: every camera’s recordings and their index entries, and what Private AI learned from them. Exported clips, the key and settings stay, and only files the index lists are removed, so other files in a folder you chose are safe.
  • Recording people: consent and the law: audio vs video, one-party and all-party consent, examples from the US, the EU, the UK and India, and what the recording indicator does and doesn’t do. General information, not legal advice.

Two-way audio (#42, protocol 1.6)

  • Talk to a camera from the desktop: hold Hold to talk on the Camera page (or click it to keep talking), pick the microphone, and watch the level. The phone plays your voice from its loudspeaker, shows “aryan-pc is talking” (or “Someone is talking”) on the camera screen and in its notification, and turns on echo cancellation while it plays so you don’t hear yourself come back. One talker at a time; a talk ends on release, after 2 s without audio, or when the phone disconnects.
  • Talk audio is Opus, mono, 48 kHz in 20 ms packets (new message TALK_AUDIO, CONTROL talk, STATE talkback). Android 10 and newer can play it; older phones and older Camlane versions say so on the desktop instead of failing.
  • Android: Talkback volume in Settings → Audio, also settable from the desktop (talkback.volume).
  • camlane-cli listen: talk N, talk N tone (a 1 kHz test tone), talk off, talk inputs, talk input ID and /talk.

Private AI (fully offline), foundation (#48)

  • Settings → Private AI (fully offline) on the desktop: off by default; when on, it looks only at recordings of the cameras you opt in one by one, on this computer, and nothing is uploaded. A “Private AI on” pill shows in the sidebar while it is on.
  • Background worker: when a recording segment finishes, it decodes a few pictures from it (never the live stream) and runs the installed analyzers, keeping to a CPU budget (15 % of one core by default), at the lowest thread priority, pausing on battery (Linux). EmbeddingGemma 2 stores a 256-d description of a picture every 10 s, for search and activities later.
  • ai.db next to recordings.db: embeddings now, plus empty tables for people, faces, appearances, tags and notes. Everything that describes a person is encrypted with the recordings key; data is removed with the recordings it came from, and Delete all AI data removes it at once.

Camera wall (desktop, phase 1 of the camera wall)

  • A Wall page shows every camera in an automatic grid (1 to 16 tiles, as large as the window allows), by name or in an order set by dragging (or Alt and the arrow keys). Each tile shows the camera’s name, battery and time left, and Rec, Motion and Paused indicators; Privacy mode and Mic off appear once phones send them. Watch mode opens on the wall. The receiver now takes up to 16 cameras (was 8; Settings → Cameras).
  • Full screen for the wall (F11 or the button) and for one camera (double-click a tile or press Enter). Esc steps back one level, and every full-screen view has a visible way out.
  • Pop out any camera, or the whole wall, into its own window with an optional “Keep on top”. Windows come back with the same size, position, monitor and full screen after a restart (wall.json next to config.json); closing a pop-out returns the tile to the wall. On Wayland the compositor places windows, so only size and full screen (on the right monitor) come back.
  • Region zoom in full screen and pop-outs: scroll, pinch, drag a rectangle or press +/−; drag or use the arrow keys to pan; double-click or 0 resets; a locator inset shows where you are. The picture follows input on the next frame (CSS transform of what is already decoded), and a sharper stream of just the visible region replaces it about 0.2 s after input stops, up to the camera’s own resolution.
  • Night view on this computer only: Off, Auto (turns on when the picture is dark) or On, with a Brighten setting. It lifts shadows and smooths sensor noise over time where the picture is still; the camera, other viewers and recordings are unchanged.
  • Snapshot (a full-size still in Pictures/Camlane), “Save last minute” (from the recorder) and Talk (hold to talk, or click to keep talking, for phones that can play your voice) in full screen and pop-outs.
  • Each tile asks the preview server for its own size and region (/slot/N/view.mjpg), so small tiles cost little and hidden ones nothing. Measured on an i7-12700 desktop (Radeon RX 6700 XT) with 9 fake cameras (6 at 720p30, 3 at 1080p30): the 9-tile wall adds about 0.12 of a core to decoding, the web view 4% of a core with GPU compositing, no dropped frames; a 1080p camera in its own window costs about a third of a core more (a full-size JPEG every frame). Preview JPEGs use jpeg-encoder’s AVX2 path (15–40% faster).

People library (#49)

  • Private AI can recognise people in recordings, like a photo library. It is off by default and needs two opt-ins: Settings → Private AI → Recognise people, then each camera. While it runs, the sidebar says “Private AI on, people”. It runs on this computer only, with YuNet face detection and SFace face templates (OpenCV Zoo) on frames sampled from recordings.
  • Name a person once and their earlier and later appearances get the name. Camlane names someone only after you confirm they know the camera recognises them and agree, and it records when you confirmed. Unnamed faces are grouped into “Unknown 1, 2…”. Unnamed groups that turn out to be one person, or a person who is already named, merge on their own. Two named people merge only when you do it. You can also merge by hand, split off faces that aren’t the person, and remove a name.
  • No duplicates: each person keeps at most five face samples that differ from each other, plus a cover. A new face replaces a sample only when it scores higher on quality (sharpness, size, how frontal it is, exposure). Near-identical faces and poor ones aren’t stored; poor faces are still matched.
  • People page: everyone as rows, filtered by camera. For each person: their faces, a month heatmap with a 24-hour strip (the Recordings heatmap with a “Seen” mark), the appearances of the chosen day or hour with Play to open the recording there, and a month report of days present, visits (for example “came 09:10–10:40”), time on camera and cameras, plus activities once #50 adds them. In a test with 50 people over 30 days, the page’s queries took 34 ms (12 ms in a release build).
  • Only face templates are stored, unless Keep a picture of each person is on (off by default). Without it, the page cuts faces out of the recordings in memory while they exist; turning the switch off deletes the stored pictures. Sightings are deleted with their recording (the default), after 7, 30 or 90 days, or never. Unnamed people go with their last sighting; named people keep their samples until they are deleted. Delete all recordings also removes the sightings seen in those recordings, whatever the setting, and unnamed people left with none. Retention keeps applying while Private AI is off.
  • Delete person removes their templates, pictures, name, sightings, and the tags and notes linked to them. The database overwrites deleted entries (secure_delete).
  • Export the log of sightings as CSV or JSON, and save a named person as a file encrypted with a passphrase (Argon2id, AES-256-GCM). Another Camlane can import the file to recognise the same person. Importing asks for the same consent, adds no duplicate when the person is already there, and keeps the file’s picture only where pictures are turned on. Exports go to Documents/Camlane; Camlane never sends them anywhere.
  • ai.db schema 2: appearances are linked to their recording and matched sample, unnamed people are numbered, consent is recorded and face boxes are kept. Databases from #48 are upgraded in place.

Activities, questions, highlights and day summaries (#50, phase 1)

  • Private AI can say what people were doing (“cooking”, “on a call”, “going out”). It is a third opt-in, Settings → Private AI → People → Suggest what people are doing, and works on the cameras that recognise people. Each person’s sightings are cut into stretches of up to 30 seconds, described by the pictures EmbeddingGemma 2 already embedded (no extra model run), and compared with a list of activity words and with the stretches you tagged before. Words come with Camlane; you can add your own and remove any.
  • Tag this? on the new Activities page: moments it can’t name, or that are unlike anything tagged so far, become questions with a picture, a short clip (a few pictures from the recording, played on request) and its best guesses as chips. Your answer tags that moment and the moments on that camera that look the same, and is kept as an example so the next suggestions improve. At most one question per person and camera every 15 minutes; Ask about what it can’t name turns them off.
  • Activities page for any day: a written summary per camera and per person (for example “Maid was here from 09:10 to 10:10, cleaning and cooking.”), the activity log with Right, Change… and Remove, and the day’s highlights. Summaries are fixed sentences filled in from what is stored, each time you look; no language model and nothing leaves the computer.
  • Highlights: Save highlight… in the Recordings player keeps the moment with a picture of it, the person seen then and a note. The recording around it is kept by retention and Motion only until you delete the highlight; the Recordings timeline marks highlights in teal.
  • The month report on the People page lists the activities tagged or suggested with confidence. Deleting a person removes their activities, tags and highlights; Delete all recordings removes those of the deleted recordings; tags follow the sightings’ retention. Activity words, stretches, tags, notes and pictures are encrypted with the recordings key like other Private AI data.
  • Gemma tokenizer in Rust (tokenizer.json from the model’s files, no new dependency) so words can be embedded next to pictures. ai.db schema 3; databases from #48 and #49 are upgraded in place.

Studio audio (desktop)

  • Noise cancellation for every phone: Standard (RNNoise via nnnoiseless, adds 10 ms, about 0.5% of one CPU core per phone) and Strong (DeepFilterNet 3, adds 30 ms, about 5% of a core per phone, leaves 50 dB of room tone instead of dead silence). Standard is on by default; Off passes the phone’s audio through.
  • A studio chain per phone: high-pass filter, noise gate, de-esser, compressor and 3-band EQ, with the presets Natural (default), Podcast, Broadcast, Warm, Bright and Custom. Every stage has its own switch and settings, and every change is live.
  • Master loudness: keeps the microphone at about −16 LUFS (BS.1770 K-weighted, adapts only while someone talks), plus a limiter that keeps peaks under −1 dBFS (1 ms look-ahead).
  • Meters on the Audio page: output level, loudness, level adjustment, limiter, added delay, and per phone the input and output level, gain reduction, noise floor, CPU and whether someone is speaking.
  • Headphone monitoring: play the processed microphone on any output of the computer (never into the virtual microphone).
  • Measured on an i7-12700, the whole standard chain costs 0.5–0.65% of one core per phone and adds 10 ms (plus 1 ms for the limiter).

Several phones

  • Auto mixer: every phone is mixed with gain sharing, so whoever is speaking gets the level and room noise doesn’t add up across phones.
  • Stereo pair: two phones become the left and right of one stereo microphone, lined up by the PING/PONG clock offsets and then by GCC-PHAT cross-correlation of sound both phones hear (within ±50 ms). In a test with one phone’s microphone 12 ms late, it found 11.98 ms within a second and kept the channels aligned to one sample.
  • Auto-director: cuts the program to whoever is speaking, using each phone’s voice activity, with a shortest shot (3 s), a hold time, a pause after any manual cut (15 s), an optional wide shot when nobody talks, and optional preference for cameras whose auto-framing sees a face.
  • Program layouts: picture in picture (any corner), side by side and a 2×2 grid, with cut or dissolve, composited into “Camlane Camera”. Every camera visible in the layout gets the red tally and its full bitrate.

Battery saver (Android and desktop)

  • Battery saver mode on the phone (Settings, the Quality sheet, or from the desktop’s Camera page): full frame rate while something moves or a face is in view, 5 fps after 3 s of stillness, back to full rate on the next movement. The bitrate follows the frame rate, the camera’s own frame rate is lowered, the screen may turn off, and the Wi-Fi performance locks are released.
  • Standby: the desktop asks phones that nobody is watching (not in the program, no tile or preview open, no app reading their own virtual camera) for 1 fps, and wakes them with a keyframe the moment they are shown. On by default with several cameras (“Pause cameras nobody is watching” in Settings).
  • Thermal steps: the phone lowers its frame rate, then its resolution, before Android starts throttling (thermal headroom on Android 11+, thermal status on Android 10, battery temperature before that), and returns to your settings after a cool minute.
  • The phone reports its power mode, frame rate, charging state, estimated draw and battery time left; the desktop shows them on the Camera page and on the multiview tiles, and warns when a phone in battery saver runs on battery.

Android

  • Phone noise reduction (Settings → Audio, or the desktop’s Camera page): Android’s own noise suppression and automatic gain, a low-power alternative to the desktop’s noise cancellation. Shown only on phones that have it.

Watch from other computers (#39, protocol 1.5)

  • A computer in Watch mode is a recorder: other computers on the network can watch its cameras live, see each camera’s battery, time left and heat, list recordings and download them as MP4. Phones keep their one connection to the recorder, so watchers cost them nothing.
  • Watchers pair once with the recorder’s PIN (also when phones need no PIN) and reconnect silently with their own token. The recorder lists them on its Pairing page, where they can be forgotten one by one.
  • Live video is relayed exactly as the phone sent it, never re-encoded: a new watcher starts on a fresh keyframe, and a watcher on a slow link drops to the next keyframe instead of falling behind, without slowing the phone, the recording or other watchers. Over loopback the relay added 0.2 ms.
  • Downloads resume where they stopped after a lost connection.
  • Alerts: battery at 20% and 10%, a recorded camera running on battery, a camera stepping down because it is hot, a camera offline for 30 seconds and back online. Watchers that connect later get the alerts that still hold.
  • Desktop: Pairing → Remote recorders pairs with another recorder (by address or found on the network) and lists its cameras. A camera you show becomes one of your own camera tiles: put it on program, in a layout or on “Camlane Camera”, with its sound if you want it.
  • camlane-cli view: find, cameras, live (stats with the latency through the relay, a raw .h264 file, or a virtual camera with --out /dev/videoN), timeline, download (resumes) and alerts. The recorder side is camlane-cli watch.

Command line

  • camlane-cli listen gains --noise, --preset, --no-studio, --mix, --stereo L,R, --layout, --second, --dissolve, --director, --no-standby and --monitor, --audio-out none for a headless receiver, and the stdin commands /meters, layout, director, noise, mix and power.

Protocol 1.5 (docs/PROTOCOL.md 4.19–4.24)

  • HELLO role: "watcher" and HELLO_ACK role: "recorder", mDNS and probe role=recorder; CAMERAS, SUBSCRIBE, UNSUBSCRIBE, REQUEST (list_segments, list_events, download, cancel), RESPONSE, DATA and ALERT; relayed STREAM_CONFIG, STATE, VIDEO, AUDIO and STATS carry the camera’s channel in the frame’s flags byte.

Protocol 1.2 (docs/PROTOCOL.md)

  • CONTROL power (normal, saver, standby) and STATE power; the audio.phone_ns control; tally program for every camera visible in a program layout; how receivers use the clock offset to align audio from several phones.

Changed

  • The privacy policy describes recordings (Watch mode): video only, stored on the recording computer and never uploaded, AES-256-GCM encryption with the key in the OS keyring, retention and size limit, exported clips and deletion. It also corrects the desktop settings folder on Windows and macOS. The Play data safety notes now say that Videos are no longer processed only ephemerally once the recorder ships.
  • Every phone’s audio is now decoded and processed, not only the one on the microphone, so voice activity, meters and mixes are always current. Processing works in mono, which suits voice; with noise cancellation and studio processing both off, a stereo phone passes through in stereo as before.
  • The desktop closes its preview streams while its window is hidden.
  • Each phone hears a tally message only when its tally changes.

Fixed

  • Desktop: with more than five or six cameras, the Dashboard’s camera tiles stopped updating: web views allow about six connections per host, and each live picture holds one. Every camera now has its own loopback preview port, pictures that are no longer shown end their streams (WebKit kept reading them), and the Dashboard’s pictures stop while another page is shown.
  • Android: a connect link or typed address without a receiver id no longer reaches another receiver on the same computer (for example the desktop app next to camlane-cli on another port). The phone now matches the receiver id by host and port, and leaves the reverse-connect fallback off when it can’t tell which receiver is meant.
  • Pairing by PIN over the firewall fallback no longer times out. When the computer’s firewall made the computer call the phone (reverse connect), typing the PIN took longer than the computer’s 15-second handshake limit: pairing failed with handshake failed: … (os error 11) on the computer, and the phone asked again with “That PIN didn’t match”. The phone now asks for the PIN with no connection open and then connects with the PIN ready, a PIN in a camlane://connect link is used without asking, and a dropped connection is retried with the PIN already typed. The computer also waits up to 2 minutes for the PIN on connections it dialed, so phones on Camlane 0.1.0 pair too. The protocol is unchanged; the timing rules are in docs/PROTOCOL.md sections 2.4 and 6.

0.1.0

Released

First public release. Protocol: Camlane Stream Protocol 1.1.

Added

Android app (app.camlane, Android 8.0+)

  • Camera2 capture up to 4K30, 1440p and 1080p60, with only the modes each camera supports offered. Manual ISO, shutter, focus distance, white balance, exposure compensation, zoom across lenses, torch and stabilisation.
  • Auto-framing with zoom lock: keeps faces in frame by cropping a larger capture, with Wide, Medium and Close framing and a speed setting. Uses the camera’s own face detection, with an on-device face model as the fallback.
  • Effects on the GPU: filters, brightness, contrast, saturation, temperature, sharpness, vignette, mirror, 3D LUT import (.cube) and background blur (on-device selfie segmentation with LiteRT).
  • Hardware H.264 in Constrained Baseline profile with no B-frames, adaptive bitrate that backs off when Wi-Fi is busy, a send queue capped at about one frame, and a Wi-Fi low-latency lock while streaming.
  • 48 kHz audio: raw PCM or Opus, with source selection and gain.
  • Discovery by mDNS and UDP probe, QR and camlane://connect links, and manual IP. PIN pairing with silent reconnects.
  • Firewall fallback: when the computer’s firewall blocks the connection, the computer dials the phone instead, with no setup.
  • Multi-camera: shows its camera number and a red or green tally light (with an optional tally bar).
  • Streams with the screen off through a foreground service. Live readouts for fps, bitrate, latency and queue.
  • Links to the desktop downloads, plus “Send link to my computer”.

Desktop (Linux, Windows, macOS beta; Tauri app and camlane-cli)

  • Receiver with a staged decode pipeline: 1080p in about 5 ms per frame and 4K30 without drops on a modern CPU. Live preview at the stream’s frame rate and an end-to-end latency readout.
  • Multi-camera: up to 4 phones by default (8 maximum). A multiview grid with tally borders, cut to program with a click or keys 1–8, audio follows the program camera or a pinned one, and cameras in preview drop to a lower bitrate.
  • Virtual camera: Linux v4l2loopback, with “Camlane Camera” for program and “Camlane Camera 1–4” per phone. Windows OBS Virtual Camera (experimental). macOS virtual camera coming soon.
  • Virtual microphone: created automatically on Linux (PipeWire/PulseAudio). Windows via VB-Cable, macOS via BlackHole.
  • Remote control of every phone setting, including auto-framing.
  • Firewall help: reverse-connect fallback, a one-click “Allow phones on my local network” (ufw and firewalld on Linux, Windows Firewall), ufw and firewalld profiles in the .deb, and an installer firewall rule on Windows.
  • Secure Boot detection with the exact fix when the v4l2loopback module is blocked.
  • Bundles: Linux deb and AppImage, Windows NSIS and MSI, macOS dmg (beta).

Design and web

  • A single design system across both apps and the web (“gray card”: neutral grays, teal accent, Barlow), with a new logo and icons.
  • Download pages at https://camlane.live/download that always point at the latest release, served from the public aryan0078/camlane-releases repo.

Funding and privacy

  • No feature is gated, limited or slowed by ads or payment, in any build.
  • The prebuilt APK on GitHub Releases is the ads flavor; Google Play gets the same build. It shows one Google AdMob banner on each screen: the device list, the camera screen, settings, about and the QR scanner. Dialogs and sheets have none. Banners never cover the camera picture or any control. It has no full-screen (interstitial), video, rewarded, pop-up or app-open ads. The camera screen banner stays visible while streaming but doesn’t refresh until the stream ends (measured: refreshing during a stream cost more than 5% in queue delay). Ads don’t load offline. Consent is requested via Google UMP in the EEA, UK and Switzerland (Settings → Privacy & ad choices).
  • MONETIZATION.md, PRIVACY.md (published at https://camlane.live/privacy), .github/FUNDING.yml (GitHub Sponsors).

Project

  • Camlane Stream Protocol v1 specification (docs/PROTOCOL.md).
  • Documentation: setup guides, troubleshooting, architecture, testing checklist, roadmap, releasing, FAQ, comparison, use cases.

Security

  • v1 sends media in cleartext over the LAN; see SECURITY.md for the threat model. TLS-PSK is planned for 0.2.