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 3icon 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:

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