Skip to content

h3qing/Kodak-Charmera-Companion

Repository files navigation

Charmera Companion

Charmera Companion

AI photo organizer — label, rename, and enhance photos locally. No cloud required.
Built for KODAK CHARMERA keychain cameras. Works with any JPEG folder.

Rust Tauri 2 Solid.js Ollama MIT License 41 tests v0.6.0


v0.6.0 — NAS + Google Drive + Dropbox sync, guided storage wizard, 41 tests. Changelog

Charmera Companion — photo grid view

Photo Detail View — AI labels and film strip navigation

Photo detail with AI labels

The Problem

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.

The Solution

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"
}

Features

Auto-Import & Label

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.

Smart File Renaming

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.

Browse & Search

Search photos by AI-generated descriptions and tags. Click a tag to filter. Full-text search across your entire library.

Drag & Drop

Drop any folder onto the app window to import photos. A bright yellow overlay appears — release to start importing.

Duplicate Detection

Find identical photos by file hash. Keep the original, hide the duplicates (files stay on disk).

Settings & Customization

  • 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

Quick Start

Homebrew (CLI only)

brew tap h3qing/tap
brew install charmera

One-Line Install (full app)

curl -fsSL https://raw.githubusercontent.com/h3qing/Kodak-Charmera-Companion/main/scripts/install.sh | bash

Manual Install

Prerequisites: 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 dev

No camera? Click "Try with sample photos" on the welcome screen to generate test images and explore all features.

CLI (for automation & AI agents)

# 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

How It Works

  1. Connect camera — mounts as USB mass storage at /Volumes/SDCARD
  2. Auto-detect — app polls every 5s, shows popup when new photos found
  3. Import — reads DCIM folder, hashes files (blake3), generates thumbnails
  4. AI Label — sends each thumbnail to best available Ollama vision model
  5. Tag Extract — parses description for 55+ keyword categories
  6. Smart Rename — applies naming pattern, renames directly on SD card
  7. 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.

Design

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.

Contributing

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 dev

Roadmap

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

License

MIT — see LICENSE for details.

Not affiliated with Kodak. KODAK and CHARMERA are trademarks of their respective owners.