Skip to content

About

Private camera with RAW (DNG) on every lens, detected at runtime, plus pro controls and 4K video. Offline, Google-free Android app with no internet or location permission, part of the VKNXWorks Ctrl series.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

CameraCtrl

A private, offline camera that saves the sensor's own RAW data, on every lens your phone lets apps use.

Latest release Android 15+ License: GPL-3.0 Telemetry-free Offline Sponsor

CameraCtrl is a camera app for people who want the real sensor data. It asks your phone which camera modes it offers, lens by lens, and lets you shoot RAW (DNG) on every lens that has it, alongside or instead of JPEG. It has no internet permission and no location access, so nothing leaves your phone and no photo ever carries your position.

Part of the Ctrl series by VKNXWorks.

Get it on Obtainium

Features

  • RAW from the sensor: saves DNG files with the sensor's own data, before the phone's processing. Open them in LumenCtrl or any RAW editor
  • Every RAW profile, detected on your phone: RAW16, RAW12 and RAW10 are all turned into DNG; RAW_PRIVATE is listed when a lens has it. Nothing is hard-coded per phone model
  • Maximum resolution mode: on lenses where Android offers it (its "ultra high resolution sensor" mode), CameraCtrl shoots the sensor's full pixel count, for example 50 or 200 MP, in RAW or JPEG
  • Every lens: the phone's AUTO multi-camera with pinch zoom, plus each physical lens on its own (ultra-wide, main, telephoto, front) where the phone allows it
  • Camera modes page: everything your phone reports for each lens: sensor size and pixel count, colour filter, RAW profiles and sizes, maximum resolution mode, JPEG and video sizes, 10-bit HDR, ISO and shutter ranges, closest focus and Camera2 level
  • Pro controls: manual ISO and shutter speed (down to the lens's longest exposure), manual focus, white balance presets and exposure compensation
  • Tap to focus, rule-of-thirds grid, self-timer (3 or 10 s), torch
  • Night mode: takes a burst of 6 (handheld) or 8 (tripod) photos, lines them up and merges them into one JPEG with much less noise. It's a multi-frame merge, not one long exposure, and the app says so; RAW stays in Photo mode
  • Interval shooting and timelapses: a photo every 1 s to 10 min, for a number of shots, a length of time or until you stop. Keep every photo, or let CameraCtrl build a timelapse video (30 fps, HEVC or H.264) on the phone. The run goes on with the screen dimmed or off
  • QR code and barcode scanner: reads QR, Data Matrix, Aztec, PDF417 and the common barcodes on the phone. Copy or share what it says; links open only when you tap Open, with the full address shown; Wi-Fi codes open Android's own add-network screen (or copy the password)
  • Video in 4K or 1080p, HEVC or H.264, with sound if you allow the microphone
  • Formats: RAW + JPEG, RAW only or JPEG only, with JPEG quality 90 to 100 %
  • No location, ever: CameraCtrl doesn't have the location permission
  • App lock with its own PIN and optional fingerprint unlock, and Hide in screenshots / Hide in recent apps (all off until you turn them on)
  • Ctrl / Signal look, shared by every Ctrl app: dark and light, high contrast, one violet accent, Space Grotesk and JetBrains Mono

What your phone allows

Android lets each phone maker decide which camera modes other apps may use. CameraCtrl uses every standard Android mode your phone offers, and only those. Phone makers often keep their own extra modes (such as a 200 MP mode, night mode or their own colour processing) for their own camera app. CameraCtrl doesn't use those private modes. Camera modes (the info button in the viewfinder) shows exactly what your phone offers.

Requirements

  • Android 15 or newer, on a 64-bit ARM phone (nearly every phone from the last several years)
  • Works on any Android ROM as a normal app: stock Android, LineageOS, GrapheneOS, CalyxOS, /e/OS and the phone makers' own systems. It doesn't need root.
  • Google-free and de-Googled: no Google Play services, Firebase or other Google libraries, and the app never contacts Google. (The QR scanner uses ZXing, an independent open-source library that only carries a com.google package name.)

Install

  1. Open the latest release on your phone, scroll down to Assets and tap the file that ends in .apk (for example CameraCtrl-v0.1.0.apk). The "Source code" zip and tar.gz files are not the app; you don't need them.
  2. Open it on your phone. Android may ask you to allow installing apps from your browser or file manager.
  3. Updates install over the old version. Your settings are kept.

Automatic updates: on your phone, tap the Obtainium button above. Install Obtainium first; the button adds CameraCtrl and installs every new release for you. If the button doesn't open the app, add https://github.com/VoidedKN0X/CameraCtrl in Obtainium by hand.

Getting started

  • Shoot: tap the shutter. The chip at the top left switches between RAW+JPEG, RAW and JPEG; MAX RES appears on lenses that have a maximum resolution mode.
  • Modes: the row at the bottom: PHOTO, NIGHT, VIDEO, INTERVAL and SCAN. Night and Interval show their options above the shutter (handheld or tripod; interval, when to stop, photos or video). While an interval run is going, the screen shows the last shot and the progress instead of the preview; Dim screen turns it black until you tap it, and Stop ends the run (a timelapse video is then finished and saved).
  • Lenses: the row above the shutter: AUTO is the phone's multi-camera (pinch to zoom), the numbers are the single lenses.
  • Pro: tap PRO for ISO, shutter, focus, white balance and EV. AUTO gives exposure back to the camera.
  • Camera modes: the info button at the top shows what each lens offers.
  • Settings (profile picture): format, RAW profile, maximum resolution, JPEG quality, timer, grid, shutter sound, video resolution and codec, and privacy.

Photos are saved in DCIM/CameraCtrl, videos in Movies/CameraCtrl.

Is it safe to install?

  • Open source. All of CameraCtrl's code is in this repo, under the GPL-3.0 licence. Anyone can read it.

  • Built by GitHub, not on a personal computer. Every release on the Releases page is built by the build workflow on GitHub Actions, straight from the code in this repo. Each build also checks that the app has no network permission and no Google libraries.

  • Always signed with the same key. Android refuses to install an update signed with a different key over CameraCtrl. The SHA-256 fingerprint of CameraCtrl's signing certificate is:

    EC:F6:89:5F:2D:0F:7B:C9:1C:12:11:14:DB:3B:22:18:D5:8C:B4:04:48:F7:79:7D:A0:4C:5E:C5:1F:04:1A:1D
    

    Advanced users can check it with AppVerifier.

Check a download. Every release is built and published by GitHub Actions, never on a personal computer:

  • The release notes end with the APK's SHA-256 checksum. Compare it with sha256sum CameraCtrl-vX.Y.Z.apk (or Get-FileHash on Windows).
  • Each release APK has a signed build provenance attestation. With the GitHub CLI, gh attestation verify CameraCtrl-vX.Y.Z.apk -R VoidedKN0X/CameraCtrl proves it was built by this repo's workflow from the tagged commit.
  • The signing-certificate fingerprint above stays the same for every release.

Permissions. CameraCtrl has no internet permission and no location permission.

Permission What CameraCtrl uses it for
Camera Taking photos and videos.
Record audio (optional) Sound in videos. Asked for when you switch to Video; without it, videos are silent.
Use biometric hardware Optional fingerprint unlock for the app lock.
Hide other apps' floating windows over the PIN screen While the lock or PIN screen is showing, other apps' floating windows are hidden over it.
Run foreground service, of the camera type Only while an interval run or timelapse you started is going: it keeps the camera working with the screen dimmed or off, and shows a notification (if notifications are allowed) with a Stop button. Nothing runs in the background otherwise.
App-internal broadcasts (com.vknxworks.cameractrl.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION) Added by AndroidX so that only CameraCtrl itself can send to its own internal receivers.

See Privacy for what happens to your data.

App lock

Turn the app lock on under Settings > Privacy and security > App lock. It's off until you turn it on.

  • Its own app PIN of at least 6 digits, separate from your phone's screen lock. Very obvious PINs such as 111111 or 123456 are refused.
  • Unlock with fingerprint (optional) only accepts strong biometrics, checked by the phone's secure hardware. The PIN is still needed after the phone restarts and at least every 72 hours.
  • The PIN is never stored. It's stretched with 600,000 rounds of PBKDF2 and mixed with a key held in the phone's secure hardware.
  • Wrong PINs: after 5 tries you wait 30 seconds, doubling up to 15 minutes. Restarting the app or the phone, or changing the clock, doesn't skip the wait.
  • Forgot your PIN? It can't be recovered. The lock screen offers to reset CameraCtrl's settings and turn the lock off. Your photos and videos aren't touched.

Privacy

Telemetry-free. CameraCtrl has no analytics, crash reporting, usage stats or tracking of any kind. It has no internet permission, works fully offline and never connects to the internet.

  • Photos and videos are written straight into your library on the phone. CameraCtrl keeps no copies of its own.
  • No location is ever saved in your photos: CameraCtrl can't read your location at all.
  • The camera is only open while the viewfinder is on screen; it closes when you leave the app. The one exception is an interval run you start yourself: it keeps the camera until the run ends or you stop it, with Android's foreground-service notice showing that the camera is in use.
  • Night mode and the timelapse video are made on the phone. The QR scanner decodes codes on the phone with ZXing; nothing is looked up online, and a link only opens in your browser when you tap Open.
  • Settings are in CameraCtrl's private storage. Android backups don't include them, and CameraCtrl is left out of Android's cloud backup and its phone-to-phone transfer.
  • The Support, Report a bug, Source code and Licence links on the You page open in your browser, only when you tap them.

How CameraCtrl is made

CameraCtrl is a one-person project by VoidedKN0X (VKNXWorks). Much of the code is written with the help of AI (Claude, by Anthropic). I decide what the app does, review the changes and use the app myself. Every change is listed in the changelog, and you can read every line of code here.

Build from source

You need Android Studio, or JDK 17 or newer and the Android SDK.

  1. Clone the repo:
    git clone https://github.com/VoidedKN0X/CameraCtrl.git
    cd CameraCtrl
  2. Build the app:
    ./gradlew assembleDebug
    On Windows, use gradlew.bat assembleDebug.
  3. The APK is in app/build/outputs/apk/debug/. Copy it to your phone and install it.

Dependency verification. Every library and build plugin download is checked against the sha256 checksums in gradle/verification-metadata.xml, and the build fails on any mismatch. When you change a dependency, a plugin or the Gradle version, run the Dependency verification metadata workflow (Actions tab, Run workflow), check the diff of the file it prints and commit it in the same push.

Support the project

CameraCtrl is free and open source. If it's useful to you, you can support development on GitHub Sponsors. Please report bugs and ideas with the bug report and feature request forms. Starring the repo helps too.

Found a security problem? Please don't open a public issue; see SECURITY.md.

The Ctrl series

Native Android apps for self-hosted services and everyday tools, all with the same design.

App What it's for
AdCtrl Control your AdGuard Home DNS server
ArrCtrl Radarr, Sonarr, Prowlarr, Bazarr, qBittorrent, autobrr and Cleanuparr in one app
BeamCtrl TV remote for phones with an IR blaster
CallCtrl Phone app: dialer, call history and in-call screen
CameraCtrl (this app) Private camera with RAW (DNG) on every lens
ChatCtrl Matrix chat client for matrix.org and self-hosted Synapse
ClockCtrl Alarms, timers, stopwatch and world clock
ContactCtrl Contacts: browse, edit, import and export
CraftyCtrl Manage Minecraft servers on Crafty Controller
DateCtrl Calendar for the calendars on your phone and your accounts
FilesCtrl File manager with NFS, SMB, SFTP, FTP and WebDAV
FrigateCtrl Watch and review your Frigate NVR cameras
GalleryCtrl Private, offline gallery with an encrypted vault
ImmichCtrl Photos and backup for your Immich server
JellyCtrl Movies, shows, music and Live TV from Jellyfin
LijnCtrl Live De Lijn bus and tram departures
LumenCtrl Private, offline photo and video editor
MailCtrl Email for Gmail and Proton Mail
MapsCtrl Private, offline maps and navigation
MemoCtrl Notes on your Memos server
NaviCtrl Music player for Navidrome servers
PaperCtrl Scan and browse documents on Paperless-ngx
PrintCtrl Bambu Lab printers through Bambuddy, and Spoolman spools
ProxCtrl Manage your Proxmox VE server
RecorderCtrl Private, offline voice recorder
RideCtrl Offline maintenance, fuel and mod log for your vehicles
SeerrCtrl Request movies and shows on Seerr / Jellyseerr
ShutterCtrl Remote control and photo transfer for Canon cameras
SoundCtrl JBL headphones and speakers, without the account
SumCtrl Offline calculator, unit converter and work tools
SynapseCtrl Administer your Matrix Synapse server
TalkCtrl Cardo intercom settings, radio and updates
TapoCtrl Tapo plugs and bulbs on your home network
TextCtrl Private SMS and MMS messaging
TrueCtrl Monitor and manage your TrueNAS server
WakeCtrl Keep the screen awake, per app or while charging
WrtCtrl Manage your OpenWrt router

License

CameraCtrl is licensed under the GNU General Public License v3.0. © VKNXWorks

QR codes and barcodes are decoded with ZXing core, under the Apache License 2.0.

Fonts, bundled in the app (nothing is downloaded): Space Grotesk and JetBrains Mono, both under the SIL Open Font License 1.1 (FONT-LICENSE-SpaceGrotesk.txt, FONT-LICENSE-JetBrainsMono.txt).

About

Private camera with RAW (DNG) on every lens, detected at runtime, plus pro controls and 4K video. Offline, Google-free Android app with no internet or location permission, part of the VKNXWorks Ctrl series.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages