Koder Imago — `products/horizontal/imago/`
Role in the stack
| Area | Sector | Consumers |
|---|---|---|
| Horizontal | Asset | Internal: design teams (Hub, Koru, Talk, …). External (Phase 2): designers, devs |
Primary couplings
| Module | Nature |
|---|---|
services/foundation/katalog |
Registry — Imago consumes katalog REST for asset CRUDsearchsigning; now wired to its kdb-next backend (KATALOG_KDB_DSN, #007) |
products/dev/kicon |
Validation + variant generation — invoked by Promote to refresh Hub icon variants |
products/dev/hub |
First promotion target — /preview/<slug> iframes the Hub landing with the candidate |
engines/sdk/go/obs |
Observability SDK — request middleware (log+RED+trace by trace_id, #016) |
services/foundation/id (Koder ID) |
Login — OAuth/OIDC for "my bank" scoping (#019, pending) |
services/foundation/billing (Koder Billing) |
Payments rail for paid licensing (#015, Phase 4, gated) |
products/dev/kode / services/ai/ai (Kode / Koder AI) |
Studio AI assistance — generate/analyze icons by engineering (#026, Phase 3) |
Status
Personal icon bank operational (2026-06-10) — the bank backend is feature- complete and observable; the remaining Phase-1 gap is login (#019) + the web upload UI (#020-web). Product vision: imago#018 (personal bank → studio with Koder AI → marketplace).
Imago = icons AND animations (SVG + LottieRive); not videophotos (that's Koder Play / Koder Media).
Personal bank — Phase 1 (the owner's core use: stop losing good icons)
| Feature | Status |
|---|---|
| Importer (batch-dir + manifest.toml) + bulk seed-import (#020) | ✅ |
Public read API GET /v1/assets[/{slug}] (filters; CORS; #013) |
✅ |
User tags registry CRUD + apply (/v1/tags, /v1/assets/{slug}/tags, #021) |
✅ |
Multi-select bulk-tag POST /v1/assets/tags:bulk (#022) |
✅ |
Filter by tags — private bank listing GET /v1/bank/assets?label=&match=&status= (#023) |
✅ |
| Trash — soft-delete + restore + permanent (#024) | ✅ |
Mural — scratch board GET /mural with hover-delete (#025) |
✅ |
| Animations — LottieRive data-plane (`internalmedia` kind/format, format-agnostic store, format-aware blob, #014) | ✅ data-plane |
| Observability — obs middleware (log+RED+trace, OTLP opt-in, #016) | ✅ |
| Persistence — katalog kdb-next backend wired (#007) | ✅ |
| Login with Koder ID (owner-scoped bank) | ⏳ #019 |
| Web drag-drop upload UI | ⏳ #020-web |
| Animated preview (lottie-web/rive-wasm) | ⏳ frontend follow-up |
Legacy MVP (still present)
| Feature | Status |
|---|---|
Web UI grid + favorites · Preview-on-Hub iframe · Promote-to-Hub (kicon generate) |
✅ |
| Bank UX: reject modal, /bank, filters · bulk-reject ("shortlist favorites") | ✅ |
Deployed to s.forge as dev.imago.koder.dev (promote disabled in prod) |
✅ |
Later phases (backlog)
- Phase 2 — named murals + sharing (icon / by-tag / mural via public links).
- Phase 3 — icon studio with Koder AI (#018 studio; #026 engineering
registry + 3 generation modes: by-engineering / random / from-prompt).
- Phase 4 — license tiers (CC0CC-BYPro) + 90/10 royalty + payments via
Koder Billing / Google Pay / PixZellecrypto (#015, gated: owner-decision).
Seed
128 icon candidates from the 2026-06-10 design session are versioned at products/horizontal/imago/seed/2026-06-10/ (manifest + svg/), ready to seed the bank via imago-import --batch-dir. Adopted from those sessions: Koda=#183, Kodix#186, Koder Play#713.
Quick start
Production (s.forge)
Just open it:
- https://dev.imago.koder.dev — picker UI
- https://dev.imago.koder.dev/bank — bank
- https://dev.imago.koder.dev/preview/<slug> — Hub landing with the candidate icon swapped in
systemd units on s.forge: koder-imago-katalog.service (port 7791) and koder-imago.service (port 7790). Promote endpoint disabled in production (IMAGO_DISABLE_PROMOTE=1).
Local dev
# Terminal 1 — registry
cd services/foundation/katalog
GOWORK=off go build -o /tmp/katalog ./cmd/katalog
KATALOG_SQLITE_PATH=/tmp/imago.db /tmp/katalog &
# Terminal 2 — Imago
cd products/horizontal/imago
GOWORK=off go build -o /tmp/imago ./cmd/imago
GOWORK=off go build -o /tmp/imago-import ./cmd/imago-import
# Import a batch
/tmp/imago-import --batch-dir ../../../meta/brand/icons/candidates/hub-3d-dark-2026-05-01
# Run the picker
/tmp/imago \
--store $PWD/data/assets \
--hub-landing $PWD/../../dev/hub/landing \
--web-kit $PWD/../../../engines/sdk/koder_web_kit &
xdg-open http://localhost:8090/Architecture (MVP)
┌──────────────────────────┐
│ hub-candidates-3d.svg │
└────────────┬─────────────┘
│ imago-import
▼
┌──────────────────────────┐
│ katalog :8080 │
└────────────┬─────────────┘
│ REST
┌────────────▼─────────────┐
│ imago :8090 │ ← html/template + htmx
└────────────┬─────────────┘
│ promote-to-hub
▼
┌──────────────────────────┐
│ products/dev/hub/ │
│ icon.svg + variants │ ← kicon generate
└──────────────────────────┘References
- Vision umbrella:
products/horizontal/imago/backlog/pending/018-…(personal bank → studio w/ Koder AI → marketplace) - Phase 1 (done): #013 API · #020 seed · #021 tags · #022 bulk-tag · #023 filter · #024 trash · #025 mural · #014 animations · #016 obs · #007 kdb persistence
- Phase 1 (pending): #019 login · #020-web upload UI
- Phase 34: #026 engineering registry + studio modes · #015 tiersroyalty (gated) · #017 product icon (gated)
- Scoping:
projects/koder-stack#091 - Product README:
products/horizontal/imago/README.kmd - Engine:
services/foundation/katalog