Open-source, cross-platform (Linux/Windows/macOS) AI photo captioning and IPTC/XMP metadata tool for photographers. Pure Go, no CGO, single static binary.
ImageArc never rewrites your image pixels. It calls out to
ExifTool to write standard IPTC/XMP metadata: in-file
for JPEG/TIFF, and Lightroom-style .xmp sidecars for RAW (CR2/CR3/NEF/ARW/DNG/...).
- AI captioning via local Ollama (llava, qwen2.5vl, qwen3-vl) — fully implemented, works offline.
- Provider interface ready for Anthropic, OpenAI, Gemini, and any OpenAI-compatible endpoint (stubs included, easy to fill in).
- Non-destructive metadata writes through ExifTool: caption, keywords, byline, location, headline, date — mapped to both IPTC and XMP fields.
- Recursive folder pipeline with a configurable worker pool and live progress.
- CSV catalog builder, with or without AI (
--no-aijust reads existing IPTC). - Per-client JSON templates (byline, location, keyword prefixes, caption prefix).
- Embedded dark-theme web UI: batch runner with a live activity log (SSE), metadata editor, and catalog builder — no external CDNs, one binary.
- No lock-in: everything lands in plain CSV, JSON, and XMP/IPTC.
Requirements:
- Go 1.22+ (to build from source)
- ExifTool on your
PATH- Linux:
sudo apt install libimage-exiftool-perl(or your distro's package) - macOS:
brew install exiftool - Windows: download from exiftool.org and add to
PATH
- Linux:
- Ollama for local AI captioning, plus a vision model:
ollama pull llava # or: ollama pull qwen2.5vl / ollama pull qwen3-vl
go build -o imagearc ./cmd/imagearc
GOOS=linux GOARCH=amd64 go build -o dist/imagearc-linux-amd64 ./cmd/imagearc
GOOS=windows GOARCH=amd64 go build -o dist/imagearc-windows-amd64.exe ./cmd/imagearc
GOOS=darwin GOARCH=arm64 go build -o dist/imagearc-macos-arm64 ./cmd/imagearc
imagearc caption ./photos --provider ollama --model llava --recurse
Dry run (caption only, no metadata written):
imagearc caption ./photos --dry-run
With a client template and a custom worker count:
imagearc caption ./photos --recurse --template client.json --workers 4
client.json:
{
"name": "Acme Wedding Co",
"byline": "Jane Doe Photography",
"location": "Austin, TX",
"keywordsPrefix": ["wedding", "acme-co"],
"captionPrefix": "Acme Wedding Co:"
}imagearc catalog ./photos --recurse -o catalog.csv
--no-ai is the default and only mode today: catalog reads existing IPTC/XMP
via ExifTool and writes CSV — no network, no AI calls.
imagearc serve --addr localhost:8733
Opens your browser to a dark-themed UI for batch captioning (with a live activity log), a metadata editor, and catalog building.
imagearc version
ImageArc maps fields to both IPTC and XMP so readers using either standard pick them up:
| Field | IPTC | XMP |
|---|---|---|
| Caption | Caption-Abstract | dc:Description |
| Keywords | Keywords | dc:Subject |
| Byline | By-line | dc:Creator |
| Location | Sub-location | iptcCore:Location |
| Headline | Headline | — |
| Date | DateCreated | — |
For RAW files, a <file>.xmp sidecar is created (if missing) and then updated
via ExifTool — the original RAW file is never touched. For JPEG/TIFF, ExifTool
writes in place with -overwrite_original (a backup is skipped since nothing
but metadata changes, and the pixel data is untouched by ExifTool tag writes).
ImageArc writes standard IPTC/XMP, so photo managers that read embedded metadata (Shotwell, digiKam, Lightroom, darktable) pick up the AI captions and keywords as tags — no plugin needed. A right-click "Caption with ImageArc" action for GNOME Files/Nemo/Caja and the Shotwell workflow are in integrations/.
- Catalogs are plain CSV.
- Templates are plain JSON.
- Metadata lives in your files/sidecars as standard IPTC/XMP, readable by Lightroom, digiKam, darktable, or any other tool.
Mirrored on both forges — clone from whichever you prefer:
- Codeberg: https://codeberg.org/YR-Design/imagearc
- GitHub: https://github.com/robouden/imagearc
The concept behind ImageArc lived in my mind for years, discussed at length with fellow photographers like Paul Disario and Michael Goldberg. It was finally woken up and set in motion by Peter Blakely's Mac-only FotoArch/MetaEdit — ImageArc grew out of the wish for a free, open-source, cross-platform take on that idea.
Offline reverse geocoding (GPS → city/country) uses the
GeoNames cities15000 dataset, licensed
CC BY 4.0.
CC0 1.0 Universal — public domain dedication. No rights reserved.