AI photo organizer — label, rename, and enhance photos locally. No cloud required.
Built for KODAK CHARMERA keychain cameras. Works with any JPEG folder.
v0.6.0 — NAS + Google Drive + Dropbox sync, guided storage wizard, 41 tests. Changelog
You bought a cute KODAK CHARMERA (or similar keychain camera). It takes fun photos. But the files are named PICT0042.jpg, there's no metadata, and organizing them is painful.
Plug in your camera, and Charmera Companion automatically imports, labels, and renames your photos using a local AI model running entirely on your machine. No cloud uploads. No API keys. No subscriptions.
Camera connected → Import 36 photos → AI: "A brown dog on the couch" → b 03-30-2026 brown dog on couch.jpg
See the CLI in action
$ charmera detect --json
{"detected": true, "path": "/Volumes/SDCARD"}
$ charmera batch-label /Volumes/SDCARD/DCIM/ --rename --dry-run
[1/36] PICT0001.jpg...
PICT0001.jpg: A brown and white dog sitting on a couch → b 03-30-2026 brown and white dog sitting on a couch.jpg
PICT0002.jpg: A sunset over the ocean with orange sky → b 03-30-2026 sunset over the ocean with orange sky.jpg
PICT0003.jpg: Two people laughing at a park bench → b 03-30-2026 two people laughing at a park bench.jpg
...
Labeled 36/36 photos (dry run — no changes made)
$ charmera label PICT0001.jpg --json
{
"description": "A brown and white dog sitting on a couch, gazing at the camera",
"tags": ["dog", "indoor", "couch", "pet"],
"file": "PICT0001.jpg"
}Plug in your camera and a popup appears. Click "Import" and photos are automatically analyzed by a local vision model. Supports multiple Ollama models — moondream (fast, 1B), llava (better quality, 7B), bakllava, and more. The app auto-selects the best available model. You can also drag and drop any folder onto the app to import.
Configure your naming pattern: b {MM}-{DD}-{YYYY} {content} transforms PICT0042.jpg into b 03-30-2026 sunset at the beach.jpg. Renaming happens automatically after AI labeling, or manually via the Apply to Library button in Settings.
Search photos by AI-generated descriptions and tags. Click a tag to filter. Full-text search across your entire library.
Drop any folder onto the app window to import photos. A bright yellow overlay appears — release to start importing.
Find identical photos by file hash. Keep the original, hide the duplicates (files stay on disk).
- Configurable naming pattern with live preview
- Token buttons:
{MM}{DD}{YYYY}{content}{counter}{original} - AI status monitoring
- Boot splash screen editor for your camera
Keyboard Shortcuts
| Shortcut | Action |
|---|---|
Cmd+1 |
All Photos |
Cmd+2 |
Recent Imports |
Cmd+3 |
Tags |
Cmd+4 |
Duplicates |
Cmd+F |
Focus search |
Cmd+, |
Settings |
I |
Toggle info panel (in photo detail) |
← → |
Navigate photos |
Esc |
Back to grid |
Why Charmera? — comparison with Google Photos, Apple Photos, digiKam
| Feature | Charmera | Google Photos | Apple Photos | digiKam |
|---|---|---|---|---|
| AI labeling | Local (Ollama) | Cloud | Cloud | Plugin |
| Privacy | 100% local | Uploads everything | iCloud | Local |
| CLI / automation | Full JSON API | None | None | Limited |
| Keychain camera support | Built for it | Generic | Generic | Generic |
| Cost | Free | Storage limits | iCloud sub | Free |
| Custom naming patterns | Yes | No | No | No |
| Open source | MIT | No | No | GPL |
Architecture
Tauri 2 Desktop App
├── Frontend: Solid.js + Tailwind CSS v4
│ ├── Vintage Kodak 1987 design system
│ ├── Camera auto-detect + import popup
│ ├── Photo grid with film frame styling
│ └── Settings with naming pattern editor
│
└── Backend: Rust (3 crates)
├── charmera-core (library)
│ ├── ai → Ollama/moondream vision labeling
│ ├── catalog → SQLite with WAL, full-text search
│ ├── import → Camera detect, file hash, smart rename
│ ├── thumbnails → 256px sharded cache
│ ├── splash → Boot screen editor (960×720)
│ └── export → JPEG export pipeline
├── charmera-app → Tauri commands
└── charmera-cli → Agent-friendly CLI with --json
brew tap h3qing/tap
brew install charmeracurl -fsSL https://raw.githubusercontent.com/h3qing/Kodak-Charmera-Companion/main/scripts/install.sh | bashPrerequisites: Rust, Bun or Node.js, Ollama
# Clone
git clone https://github.com/h3qing/Kodak-Charmera-Companion.git
cd Kodak-Charmera-Companion
# Install the Tauri CLI (one-time, adds `cargo tauri` subcommand)
cargo install tauri-cli --locked
# Pull a vision model (pick one)
ollama pull moondream # Fast, 1B params, basic descriptions
# ollama pull llava # Better quality, 7B params (recommended if you have 8GB+ RAM)
# Install frontend deps
cd frontend && bun install && cd ..
# Run in development (builds the Rust shell + starts the Vite dev server)
cargo tauri devNo camera? Click "Try with sample photos" on the welcome screen to generate test images and explore all features.
# Install the charmera CLI onto your PATH
cargo install --path crates/charmera-cli
# Detect camera
charmera detect --json
# → {"detected": true, "path": "/Volumes/SDCARD"}
# List photos on connected camera
charmera list --json
# Import with auto-detection
charmera import
# Label a photo with local AI
charmera label photo.jpg --json
# → {"description": "A brown dog on the couch", "tags": ["dog", "indoor", "couch"]}
# AI-rename a photo (label + rename in one step)
charmera rename PICT0042.jpg --json
# → {"original": "PICT0042.jpg", "new_name": "b 03-30-2026 brown dog on couch.jpg", ...}
# Dry run (show proposed name without renaming)
charmera rename PICT0042.jpg --dry-run
# Label + rename an entire folder
charmera batch-label ./vacation/ --rename --json
# → labels every photo, renames with AI descriptions
# Dry run — see proposed names without renaming
charmera batch-label ./photos/ --rename --dry-run- Connect camera — mounts as USB mass storage at
/Volumes/SDCARD - Auto-detect — app polls every 5s, shows popup when new photos found
- Import — reads DCIM folder, hashes files (blake3), generates thumbnails
- AI Label — sends each thumbnail to best available Ollama vision model
- Tag Extract — parses description for 55+ keyword categories
- Smart Rename — applies naming pattern, renames directly on SD card
- Browse — search by description, filter by tags, multi-select & export
Compatible Cameras
Built for the KODAK CHARMERA (Generalplus CBB3 chipset), but works with any camera that mounts as USB mass storage with JPEG photos in a DCIM folder.
| Spec | Value |
|---|---|
| Photos | 1440×1080 JPEG |
| Video | 1440×1080 @ 30fps MJPEG |
| Boot splash | 960×720 JPEG (SPIDCIM/SPI00.jpg) |
| Connection | USB mass storage |
For firmware hacking details, see docs/hardware-guide.md.
The UI is inspired by the physical camera — bright Kodak Yellow, the iconic rainbow stripe (red → orange → black → blue → purple), and retro 1987 typography. It's designed to feel like holding the actual camera.
Contributions welcome! This project uses:
- Rust for the backend (3-crate workspace)
- Solid.js + Tailwind v4 for the frontend
- Tauri 2 for the desktop shell
# Run tests
cargo test
# Build frontend
cd frontend && bun run build
# Development mode
cargo tauri devPlanned features — star the repo to follow progress:
- Dark mode toggle
- Face detection — group photos by person
- Linux support — auto-detect cameras on Linux (v0.3.0)
- Windows support — volume detection for Windows (v0.3.0)
- Video thumbnails — preview AVI clips from the camera
- CLIP embeddings — semantic photo search ("photos near the ocean")
- Cloud sync — Google Drive & Dropbox via desktop apps (v0.6.0)
Have an idea? Open a discussion or file a feature request.
MIT — see LICENSE for details.
Not affiliated with Kodak. KODAK and CHARMERA are trademarks of their respective owners.

