CameraDeck
A browser-based camera console for Raspberry Pi. Take full-resolution photos, run continuous capture, browse your library, and copy files off the Pi—all on your local network.
CameraDeck uses Picamera2 and libcamera. The web UI is served by the Pi; it needs no cloud account, CDN, or internet connection once installed.
What it does
- Capture: single photos or continuous capture, defaulting to 5 photos/s. Actual throughput depends on your camera, exposure, and storage.
- Camera controls: live preview, exposure, gain, white balance, focus where supported, and mounting orientation.
- Library: thumbnails, full-size viewing, range selection across pages, original/metadata downloads, ZIP downloads, and deletion with progress.
- Transfers: push your media to another machine over SSH with rsync, or copy it to a local mounted drive. Transfers continue after you close the browser.
- Status: free disk space, CPU temperature, and Pi throttling warnings.
Capture is photo-only. Existing video files from older versions remain viewable.
Requirements
- A Raspberry Pi running 64-bit Raspberry Pi OS Trixie (Debian 13).
- A working Picamera2/libcamera camera: check
rpicam-hello --list-cameras. - Python 3.11 or newer, reliable power, and enough storage for your photos.
CameraDeck does not install camera drivers or firmware. Bookworm's NumPy-1-based camera modules are not compatible with this release's NumPy 2 dependencies.
Install
Install the OS dependencies, then create a virtual environment that can see the camera packages supplied by Raspberry Pi OS:
sudo apt install python3-picamera2 python3-venv python3-pip python3-av ffmpeg rsync
python3 -m venv --system-site-packages ~/.venvs/cameradeck
~/.venvs/cameradeck/bin/python -m pip install cameradeck
~/.venvs/cameradeck/bin/cameradeck
Open http://127.0.0.1:8080 in a browser on the Pi. The PyPI package includes the compiled web UI; Node.js and a Git checkout are not needed to run it.
Connect from another device
Set a password before listening on the network:
read -rs -p 'CameraDeck password: ' CAMERADECK_PASSWORD; echo
export CAMERADECK_PASSWORD
~/.venvs/cameradeck/bin/cameradeck --host 0.0.0.0
Open http://<pi-ip>:8080 on the same trusted network. HTTP is not encrypted;
do not expose CameraDeck directly to the internet. Use an SSH tunnel, VPN, or
HTTPS reverse proxy for access beyond a trusted LAN.
Storage and options
cameradeck --host 127.0.0.1 --port 8080 --media /path/to/photos
Use the full executable path above unless you have activated the virtual
environment. Packaged installs save to ~/.local/share/cameradeck/media by
default, or $XDG_DATA_HOME/cameradeck/media when set. --media overrides it.
Photos, JSON metadata, thumbnails, and previews live in that directory alongside the library index, saved settings, and private session key. Keep the entire directory when moving an installation. Sessions survive restarts; changing the password signs existing sessions out.
There is no automatic deletion. Capture stops accepting new photos below a 256 MiB free-space reserve. At 5 photos/s, a run can produce 18,000 photos/hour. Monitor storage, back up your files, and verify remote copies before deleting.
Run one CameraDeck process at a time, and stop other camera applications first. Capture sequences and rsync continue until stopped, even if you close the tab. ZIP downloads and browser-driven batch operations need the page to stay open. Do not run CameraDeck as root or exchange CSI cameras while powered.
Updates and boot service
See UPDATE.md for safe upgrades, rollback, and the existing checkout-based systemd setup. Always check that the instance is idle before stopping or upgrading it.
The example service and power-control rule in deploy/ are optional and are not
installed by pip. They target a Git checkout; do not copy them unchanged for a
PyPI installation. CameraDeck does not need root privileges to run.
Run from source
A source checkout needs a local UI build. Install Git and uv, then clone:
sudo apt install git
git clone https://github.com/markosnarinian/cameradeck.git
cd cameradeck
From the checkout, install the pinned Node/npm toolchain, then run:
uv venv --system-site-packages
uv sync --frozen --no-dev
python3 scripts/frontend.py build
uv run --no-dev python app.py
Source runs keep the existing default storage location, media/ in the checkout.
Do not commit static/dist/. The build helper stages the UI and verifies it at
startup; never restart after a failed build.
For development, run uv sync --frozen, build the UI, then uv run pytest -q.
Browser tests require Chromium (CHROMIUM selects its executable); camera tests
use synthetic requests. Real-camera acceptance still requires testing preview,
exposure, sustained capture, and skipped frames on your hardware.
To build a release, run uv build with the pinned Node/npm on PATH. Both the
wheel and source distribution include the UI. GitHub Actions tests the source,
validates both distributions, and publishes on a matching v<version> release.
The PyPI account must authorize this repository's python-publish.yml workflow
and pypi environment as a Trusted Publisher before the first publication.
Metadata
Release files for cameradeck 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| cameradeck-0.1.0.tar.gz | 216.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cameradeck-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 430.4 kB
Release files / cameradeck-0.1.0.tar.gz
| Download URL | cameradeck-0.1.0.tar.gz |
|---|---|
| Size | 216.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d76679ea4bd25c12cb3e1a5785a83af5217bd28ced7e901bf4973c052c85fcf1
|
|
BLAKE2b-256 checksum How to use checksums |
8ee18aece4fe3d9858abf2c78b22ce3b62478e70912cf275c2b0df8954aed0ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / cameradeck-0.1.0-py3-none-any.whl
| Download URL | cameradeck-0.1.0-py3-none-any.whl |
|---|---|
| Size | 214.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3c021f930fad37b74a127550351e226dcc05dbb03f169f833f86796ee115071a
|
|
BLAKE2b-256 checksum How to use checksums |
805a09135b42ecda429cdba79c54e533c924a333a473ce7b9f17aa49236357ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logSecurity for cameradeck 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for cameradeck-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.