Skip to main content

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)

Source distribution for cameradeck 0.1.0
File Size Uploaded Provenance
cameradeck-0.1.0.tar.gz 216.0 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for cameradeck 0.1.0
File Interpreter ABI Platform
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 log

Release 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 log

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

Select from 2 files

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 log

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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page