{"id":49561501,"url":"https://github.com/chipi/chemigram","last_synced_at":"2026-05-24T07:04:41.951Z","repository":{"id":354153399,"uuid":"1222375508","full_name":"chipi/chemigram","owner":"chipi","description":"Chemigram is to photos what Claude Code is to code. Agent-driven photo editing on darktable, via MCP.","archived":false,"fork":false,"pushed_at":"2026-04-27T10:19:37.000Z","size":85,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-27T12:18:22.712Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chipi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-27T09:56:28.000Z","updated_at":"2026-04-27T10:19:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chipi/chemigram","commit_stats":null,"previous_names":["chipi/chemigram"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/chipi/chemigram","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipi%2Fchemigram","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipi%2Fchemigram/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipi%2Fchemigram/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipi%2Fchemigram/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chipi","download_url":"https://codeload.github.com/chipi/chemigram/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipi%2Fchemigram/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32563624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-03T09:09:56.717Z","updated_at":"2026-05-24T07:04:41.943Z","avatar_url":"https://github.com/chipi.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Chemigram\n\n[![CI](https://github.com/chipi/chemigram/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/chipi/chemigram/actions/workflows/ci.yml)\n[![docs](https://github.com/chipi/chemigram/actions/workflows/docs.yml/badge.svg?branch=main)](https://chipi.github.io/chemigram/)\n[![release](https://img.shields.io/github/v/release/chipi/chemigram?display_name=tag\u0026sort=semver\u0026color=blue)](https://github.com/chipi/chemigram/releases)\n[![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](docs/LICENSING.md)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org)\n[![Code style: ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff)\n\n\u003e Chemigram is to photos what Claude Code is to code.\n\nA craft-research project for agent-driven photo editing. The agent reads\nyour taste, you describe intent, the agent edits via a vocabulary of\nnamed moves on top of darktable. Sessions accumulate; the project gets\nricher over time.\n\n**Status:** Phase 1 closed at v1.0.0 (minimum viable loop). v1.10.0\nshipped May 2026; **v1.11.0 in flight** — RFC-039 makes the vocabulary\nport across camera bodies (raw-aware WB / denoise / filmic / lens via\nper-raw EXIF substitution). **114 vocabulary entries** (3 starter +\n111 expressive-baseline); 2200+ tests; real-darktable e2e suite; full\nrelease history in [`CHANGELOG.md`](CHANGELOG.md).\n\nNot a Lightroom replacement. Not a digital asset manager. A probe into\nwhere photographic taste lives and how it transmits through language\nand feedback.\n\n## What this is\n\nA photo is a project, structured the way a code project is. The agent\nreads your context (`taste.md`, the brief, accumulated notes), drives\ndarktable headlessly through composable vocabulary primitives, manages\nmasks and snapshots, and learns across sessions. Two modes:\n\n- **Mode A (the journey)** — collaborative editing where you and the\n  agent work through one photo together, conversationally. Ships\n  today.\n- **Mode B (autonomous fine-tuning)** — agent runs alone, branching to\n  explore variants, self-evaluating against criteria you provide.\n  Drafted (RFC-038); not yet shipped.\n\n## Built on darktable\n\nEvery pixel decision in chemigram is made by [**darktable**](https://www.darktable.org/) —\nthe open-source raw photography workflow that has quietly become one\nof the best photo processing engines in the world. Scene-referred\npipeline, perceptually accurate color science, sigmoid + filmic tone\nmapping, the colorequal HSL panel, lens correction via lensfun,\ndenoising profiles per-camera, drawn-form masks with feathered blendif,\nparametric range masks, retouch heal/clone — all of it ships in\ndarktable, written by a community of brilliant photographers and\nengineers over more than a decade. The work is uncompromising. The\noutput, in our experience, exceeds what most commercial alternatives\nproduce.\n\n**chemigram does no photography.** It contributes orchestration:\nvocabulary, an agent loop, versioning, session capture, and the\ndiscipline that wraps darktable into something an LLM can drive with\nintent. Strip chemigram away and darktable still produces the same\nbeautiful renders; strip darktable away and chemigram is a pile of\nJSON. The architectural commitment is explicit and load-bearing — see\n[AGENTS.md § \"darktable does the photography, Chemigram does the loop\"](AGENTS.md).\n\nIf you're new to darktable: **try it**. It's free, it's MIT-spirited\n(GPLv3), it runs natively on macOS / Linux / Windows, and the\n[user manual](https://docs.darktable.org/usermanual/) is one of the\nmost thorough pieces of open-source documentation we've ever read.\nThe [darktable GitHub repository](https://github.com/darktable-org/darktable)\nis where the work happens. If you ship raw work, this is the engine\nyou want; chemigram or no chemigram, the darktable team has earned\nyour attention.\n\n## What makes it different\n\n- **Vocabulary, not sliders.** The agent's action space is a finite\n  set of named moves you (or the community) author as `.dtstyle`\n  files. Articulating the vocabulary is part of the experiment.\n- **Three foundational disciplines** in the architecture:\n  - *darktable does the photography, Chemigram does the loop*\n  - *Bring Your Own AI* — maskers, evaluators, the photo agent itself\n    are all configurable via MCP\n  - *Agent is the only writer* — full library isolation, replace\n    semantics, predictable action space\n- **Mini git for photos.** Content-addressed DAG of edit snapshots\n  per image. Branches, tags, the works.\n- **Compounding context.** Each session reads your `taste.md` and\n  per-image notes; agent proposes additions; you confirm. Future\n  sessions are faster and more aligned because context accumulates.\n\n## Status and roadmap\n\n| Phase | What | Status |\n|-|-|-|\n| 0 | Hands-on validation of darktable composition story | ✅ Closed green |\n| Doc system | Concept package + PRDs/RFCs/ADRs | ✅ Complete |\n| 1 | Core engine + MCP server + starter vocabulary | ✅ Closed (v1.0.0) — Slices 1–6 shipped (ADR-050..061). |\n| 1.1 | Comprehensive validation — capability matrix + real-darktable e2e | ✅ Closed (v1.1.0) — 3 engine bugs fixed (ADR-062). |\n| 1.2 | Engine unblock + reference-image validation infrastructure | ✅ Closed (v1.2.0) — Path B synthesizer + assertion library + Mode A v3 (ADR-063..068). |\n| 1.3 | Command-line interface | ✅ Closed (v1.3.0) — 22 verbs mirroring MCP; ADR-069..072 closed RFC-020. |\n| 1.4 | `expressive-baseline` vocabulary authoring | ✅ Closed (v1.4.0) — 35 entries authored programmatically (Path C) + 4 drawn-mask-bound entries. |\n| 1.5 | Mask architecture cleanup (drawn-only) | ✅ Closed (v1.5.0) — ADR-076 retired the PNG-based mask infrastructure that turned out to be a silent no-op. |\n| 1.6 | Parameterized vocabulary (Path C as default) | ✅ Closed (v1.6.0) — RFC-021 / ADR-077..080. 18 parameterized entries across 11 modules. |\n| 1.7 | Tier 2 expansion + Lightroom-parity Bucket A | ✅ Closed (v1.7.0) — RFC-022 / ADR-081 tiering policy; A.1–A.7 buckets shipped. |\n| 1.8 | HSL via colorequal + denoise + lens + filmic v6 | ✅ Closed (v1.8.0) — RFC-023 / ADR-083; #95–#97 visual proofs verified. Lightroom daily-use parity 51/52 (98%). |\n| 1.9 | Mask + retouch architecture trilogy | ✅ Closed (v1.9.0) — RFC-024/025/026/029 → ADR-084..087. RFC-030 deferred (deployed sibling-provider precision tier). |\n| 1.10 | Photographer-workflow vocabulary expansion + workflow primitives | ✅ Closed (v1.10.0) — RFC-035/036/037 → ADR-088/089/090. 29 new L2 looks across 6 genres + bw_convert v2. |\n| 1.11 | Raw-derived parameters in L2 composition + visual-proof trust closure | In flight (v1.11.0) — RFC-039 → ADR-091/092/093 + sibling ADR-094/095/096. Camera-aware WB / denoise / filmic / lens; cross-camera verification (#142); formal audit (#141). |\n| 2 | Vocabulary maturation — grow vocab from session evidence | In progress (use-driven; intermittent). 114 entries shipped (3 starter + 111 expressive-baseline). |\n| 3+ | Multi-photographer review / pack management / AI provider scaffolding | Conditional / future — RFC-027, RFC-028, RFC-030. |\n\nFor the canonical phase plan and current status, see `docs/IMPLEMENTATION.md`.\n\n## Quickstart — conversational (MCP)\n\nFor interactive editing through Claude Desktop, Claude Code, and other MCP clients.\n\n```bash\n# 1. install\npip install chemigram\n\n# 2. set up your taste (cross-image preferences)\nmkdir -p ~/.chemigram/tastes\n$EDITOR ~/.chemigram/tastes/_default.md   # what you generally like\n\n# 3. point your AI client at chemigram-mcp.  e.g. for Claude Code, drop this\n#    into .mcp.json (project) or ~/.claude/mcp.json (global):\n#\n#    {\"mcpServers\": {\"chemigram\": {\"command\": \"chemigram-mcp\"}}}\n\n# 4. start a conversation in your client:\n#    \"Ingest /path/to/photo.NEF.  Read context.  Render a preview.\"\n```\n\nFor the full flow — darktable setup, MCP-client matrix (Claude Code / Desktop, Cursor, Continue, Cline, Zed, OpenAI), 10-turn worked session, troubleshooting — read **[`docs/getting-started.md`](docs/getting-started.md)**.\n\n## Quickstart — scripts and agent loops (CLI, v1.3.0+)\n\nFor batch processing, shell scripts, and agent loops where MCP's session model is the wrong shape. The CLI mirrors the MCP tool surface verb-for-verb (`chemigram apply-primitive` ↔ MCP `apply_primitive`) — 28 verbs total; see PRD-005 / RFC-020 for the design.\n\n```bash\n# 1. install — same as above\npip install chemigram   # also lands `chemigram` on $PATH\n\n# 2. inspect the runtime\nchemigram status\n\n# 3. ingest a raw + apply a vocabulary entry\nexport CHEMIGRAM_DT_CONFIGDIR=~/chemigram-phase0/dt-config   # see getting-started for setup\nchemigram ingest ~/Pictures/raw/iguana.NEF\nchemigram apply-primitive iguana --entry exposure --value 0.5 --pack expressive-baseline\nchemigram render-preview iguana --size 1024\nchemigram export-final iguana --format jpeg\n\n# 4. machine-readable output for scripts and agents (NDJSON)\nchemigram --json apply-primitive iguana --entry wb_warm_subtle\n# {\"event\":\"result\",\"status\":\"ok\",\"image_id\":\"iguana\", ...}\n```\n\nThe CLI is stateless per invocation — parallel calls against different images are safe. The image_id derives from the raw filename's stem (case-preserving): `iguana.NEF` → `iguana`, `IMG_2041.ARW` → `IMG_2041`. **Concurrent calls against the same image are not tested**; the engine writes refs without an explicit fcntl lock, so serialize at the caller level if a single image is touched by multiple subprocesses simultaneously. For the full verb surface, see [`docs/guides/cli-reference.md`](docs/guides/cli-reference.md). For driving Chemigram from a custom agent loop, see the \"Agent loops\" section of [`docs/getting-started.md`](docs/getting-started.md).\n\n## How it works\n\n```mermaid\nflowchart LR\n    subgraph CLIENT[\"AI client\"]\n        CC[Claude Code / Desktop /\u003cbr/\u003eCursor / Continue / ...]\n    end\n    subgraph ADAPTERS[\"adapters\"]\n        MCP[chemigram-mcp\u003cbr/\u003e28 tools]\n        CLI[chemigram CLI\u003cbr/\u003e28 verbs]\n    end\n    subgraph CORE[\"chemigram.core\"]\n        ENGINE[vocab / versioning /\u003cbr/\u003emasking / context /\u003cbr/\u003epipeline / session]\n    end\n    DT[darktable-cli]\n    FS[\"~/Pictures/Chemigram/\u0026lt;image_id\u0026gt;/\u003cbr/\u003esnapshots/ exports/ sessions/ previews/\"]\n    TASTES[\"~/.chemigram/\u003cbr/\u003etastes/ vocabulary/personal/\"]\n\n    CC -.stdio.-\u003e MCP\n    CLI --\u003e CORE\n    MCP --\u003e CORE\n    CORE --\u003e ENGINE\n    ENGINE -- spawns --\u003e DT\n    ENGINE -- writes --\u003e FS\n    ENGINE -- reads / proposes --\u003e TASTES\n```\n\nFor the full architecture (subsystem breakdown, mask trilogy, vocabulary\nlayers, release timeline) see [`docs/diagrams/`](docs/diagrams/index.md).\n\nThe agent reads your context and the brief, drives darktable through a vocabulary of named moves, manages snapshots, binds drawn-form masks where the vocabulary calls for them, and proposes updates to your taste files at session end. Every tool call is recorded to a JSONL transcript so sessions are auditable and replayable.\n\nA typical 6-turn opening:\n\n```\nYou:    Ingest /tmp/manta.NEF.  Read context.\n\nAgent:  Ingested as image_id \"manta\".  Tastes loaded:\n        natural tone curves, lifted shadows, restrained colors.\n        EOS R5, no L1 templates yet.  Notes empty.\n\nYou:    Render preview.  The water feels too cyan and the top\n        of the frame is blown by sun glare.\n\nAgent:  [render → wb_warm_subtle → render]  Slate-blue now.\n        For the glare, I'd reach for gradient_top_dampen_highlights —\n        binds a -0.5 EV exposure through a top-bright drawn gradient.\n        Try it?\n\nYou:    Yes.  And lift the foreground where the manta sits.\n\nAgent:  [apply gradient_top_dampen_highlights →\n         apply gradient_bottom_lift_shadows → render]  Top dampened,\n        foreground lifted +0.4 EV.  Manta reads with more presence.\n\nYou:    Tag v1-export and run a full-res JPEG.\n\nAgent:  [tag → export_final]  Done.  Two propose-and-confirms before\n        we wrap?\n```\n\nSee **[`docs/getting-started.md`](docs/getting-started.md#your-first-session)** for a full 10-turn walkthrough.\n\n## Growing your vocabulary\n\nThe starter vocabulary that ships with `chemigram` is deliberately small — three entries (a parametric WB primitive, a warm-WB sugar, an L2 neutral look). The companion `expressive-baseline` pack adds 111 entries: parameterized L3 primitives across the major darktable modules (Path C; RFC-021), L2 looks across 6 genres (cinematic / portrait / landscape / wildlife / food / product + B\u0026W variants), and mask-bound primitives. Plus the **`apply_spot` MCP tool** (RFC-025 / ADR-087) for blemish removal / cloning. Phase 2 grows the vocabulary from real session evidence: the agent logs gaps when it reaches for moves you don't have; you open darktable periodically, capture the missing primitives as `.dtstyle` files, and drop them into `~/.chemigram/vocabulary/personal/`. The personal pack grows at whatever cadence the photographer's actual work demands — there's no target. The vocabulary becomes an articulation of *your* craft.\n\nFull procedure in **[`docs/getting-started.md`](docs/getting-started.md#growing-your-vocabulary)** and **[`vocabulary/starter/README.md`](vocabulary/starter/README.md)**.\n\n## Documentation\n\n### Three doors in\n\nThe doc tree is dense; these three docs are the right entry points depending on your intent:\n\n| If you want to... | Start here | Time |\n|-|-|-|\n| **Run chemigram on a real photo** | [`docs/getting-started.md`](docs/getting-started.md) — install, MCP-client config, first session | 30–60 min |\n| **Know \"I want X look — how?\"** | [`docs/guides/cookbook.md`](docs/guides/cookbook.md) — ~60 intent-driven recipes grouped by genre | browse as needed |\n| **Understand chemigram deeply** | [`docs/onboarding.md`](docs/onboarding.md) — opinionated reading order through the doc tree | 2.5–3 hours |\n\nVisual companion: [`docs/diagrams/`](docs/diagrams/index.md) — four Mermaid one-pagers (stack / mask trilogy / vocabulary layers / Phase 1 timeline) that render inline on GitHub and MkDocs.\n\n### Full doc tree\n\nFor users (everyday):\n\n- **[`docs/guides/cookbook.md`](docs/guides/cookbook.md)** — \"I want X look → here's the recipe.\" ~60 worked examples (cinematic / portrait / landscape / B\u0026W / wildlife / food / mask-driven / workflow primitives). First stop for \"how do I do X.\"\n- **[`docs/guides/tastes-quickstart.md`](docs/guides/tastes-quickstart.md)** — your first taste file in 5 minutes\n- **[`docs/guides/vocabulary-patterns.md`](docs/guides/vocabulary-patterns.md)** — recipes for combining primitives (\"for *X* intent, reach for *Y* composition\")\n- **[`docs/guides/recipes.md`](docs/guides/recipes.md)** — common \"how do I\" patterns at the verb layer: reset to baseline, find by tag, export multiple sizes, replay a session\n- **[`docs/guides/visual-proofs.md`](docs/guides/visual-proofs.md)** — auto-generated before/after gallery for every vocabulary entry against the synthetic chart fixture\n- **[`docs/guides/lightroom-to-chemigram.md`](docs/guides/lightroom-to-chemigram.md)** — \"where do I find X\" mapping for Lightroom users\n- **[`docs/guides/mask-shapes-from-words.md`](docs/guides/mask-shapes-from-words.md)** — spatial English → `mask_spec` (\"bottom third\" → gradient)\n- **[`docs/guides/llm-vision-for-masks.md`](docs/guides/llm-vision-for-masks.md)** — vision-constructed precision masks (RFC-026 / ADR-086 Pattern 7)\n- **[`docs/guides/cli-reference.md`](docs/guides/cli-reference.md)** — every verb, every flag, every exit code (auto-generated; CI-checked)\n- **[`docs/guides/cli-output-schema.md`](docs/guides/cli-output-schema.md)** — NDJSON event format for `--json` output\n- **[`docs/guides/cli-env-vars.md`](docs/guides/cli-env-vars.md)** — env var reference\n- **[`docs/guides/config-toml.md`](docs/guides/config-toml.md)** — `~/.chemigram/config.toml` schema\n- **[`vocabulary/starter/README.md`](vocabulary/starter/README.md)** + **[`vocabulary/packs/expressive-baseline/README.md`](vocabulary/packs/expressive-baseline/README.md)** — what ships in each pack\n- **[`examples/iguana-galapagos.md`](examples/iguana-galapagos.md)** — a worked Mode A session, prose form\n- **[`examples/cli-agent-loop.py`](examples/cli-agent-loop.py)** + **[`examples/cli-batch-watch.sh`](examples/cli-batch-watch.sh)** — runnable CLI examples\n\nFor contributors (project-deep):\n\n- **[`docs/onboarding.md`](docs/onboarding.md)** — opinionated 2.5–3h reading order through concept package, mask architecture, cookbook\n- **[`docs/diagrams/`](docs/diagrams/index.md)** — four Mermaid one-pagers (stack / mask trilogy / vocabulary layers / Phase 1 timeline)\n- **[`docs/guides/authoring-vocabulary-entries.md`](docs/guides/authoring-vocabulary-entries.md)** — Phase 2 daily-use authoring flow\n- **[`docs/guides/expressive-baseline-authoring.md`](docs/guides/expressive-baseline-authoring.md)** — programmatic struct-RE methodology (Path C)\n- **`docs/concept/`** — six numbered concept documents (read end-to-end, ~2h):\n  `00-introduction.md`, `01-vision.md`, `02-project-concept.md`,\n  `03-data-catalog.md`, `04-architecture.md`, `05-design-system.md`\n- **`docs/prd/`**, **`docs/rfc/`**, **`docs/adr/`** — definition documents (PRDs argue user-value; RFCs argue open technical questions; ADRs commit to settled decisions). Anchored by `docs/prd/PA.md` and `docs/adr/TA.md`.\n- **`docs/IMPLEMENTATION.md`** — canonical phase plan\n- **`docs/CONTRIBUTING.md`** — code + vocabulary contribution flows\n- **`docs/LICENSING.md`** — what's MIT, what's separate (incl. darktable's GPLv3 boundary at the subprocess)\n- **`docs/TODO.md`** — research backlog, deferred items\n- **[`docs/guides/index.md`](docs/guides/index.md)** — full guides index, organized by audience\n\n## Requirements\n\n- darktable 5.x (Apple Silicon native build recommended)\n- Python 3.11+\n- An MCP-capable AI client — Claude Code, Claude Desktop, Cursor, Continue, Cline, Zed, or anything that supports MCP stdio servers\n- macOS Apple Silicon for v1; Linux best-effort\n\n## Contributing\n\nIf you want to work on the engine itself (not just use it):\n\n```bash\ngit clone https://github.com/chipi/chemigram.git\ncd chemigram\n./scripts/setup.sh\n```\n\nThat checks prerequisites, creates a venv, and installs everything.\n\n**New contributor?** Start with [`docs/onboarding.md`](docs/onboarding.md) — opinionated reading order through the concept package, the operational handbook, the mask architecture, and the cookbook. ~2.5–3 hours end-to-end. Path through the doc tree without guessing.\n\nFor the contribution flow itself (code review vs vocabulary review — they're meaningfully different): see [`docs/CONTRIBUTING.md`](docs/CONTRIBUTING.md). For what's being worked on now: see [`docs/IMPLEMENTATION.md`](docs/IMPLEMENTATION.md).\n\nIf you want to contribute vocabulary entries (Phase 2 path), see [`docs/CONTRIBUTING.md`](docs/CONTRIBUTING.md) § Vocabulary contributions and [`docs/guides/authoring-vocabulary-entries.md`](docs/guides/authoring-vocabulary-entries.md).\n\n## License\n\nMIT. Engine, MCP server, docs, starter vocabulary, and borrowed community\npacks are all permissively licensed. Personal vocabularies are kept in\nseparate private repos by photographers' choice. See `docs/LICENSING.md`\nfor the full picture.\n\n## Why \"Chemigram\"?\n\nA chemigram is a cameraless photographic process where an image emerges\nfrom a chemical reaction on light-sensitive paper — guided by the\nartist, but not fully controlled. The name fits: each edit here emerges\nfrom a loop between a photographer's intent, an agent's moves, and a\ntool that responds. Authorship is shared and the result is one-of-a-kind.\n\n## Acknowledgments\n\n[**darktable**](https://www.darktable.org/) is the foundation chemigram\nstands on. The darktable team — maintainers, contributors, translators,\ndocumentation writers — has built an open-source raw photography engine\nthat competes with and frequently exceeds proprietary alternatives. If\nthis project is useful, [donate to darktable](https://www.darktable.org/contact/),\nfile good bug reports, contribute translations, or just tell other\nphotographers to try it. The work the darktable community has shipped\nmakes everything chemigram does possible.\n\nOther open-source foundations chemigram leans on with gratitude:\n[Python](https://www.python.org/), [Anthropic's MCP](https://modelcontextprotocol.io/),\n[ruff](https://github.com/astral-sh/ruff), [pytest](https://pytest.org/),\n[uv](https://github.com/astral-sh/uv), [defusedxml](https://github.com/tiran/defusedxml),\n[lensfun](https://lensfun.github.io/) (via darktable). And the photo\nagent on the conversational side is whichever frontier LLM the\nphotographer chooses — chemigram is built so that piece is yours\nto swap.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchipi%2Fchemigram","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchipi%2Fchemigram","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchipi%2Fchemigram/lists"}