Build on an asset graph —
not a file dump.
Get stable identifiers, revision history, lineage edges, and events via SDKs — without standing up your own multi-tenant graph backend.
Quickstart in 2 minutes
Copy, paste, run. That is all.
# Install
$ pip install kumiho
# Authenticate (uses cached credentials or env token)
import kumiho
kumiho.auto_configure_from_discovery()
# Create or resolve a project
project = kumiho.create_project("demo-project", "Demo Project")
# Organize assets by space
space = project.create_space("characters")
# Create an item (asset)
item = space.create_item("hero", kind="image")
# Register a new revision with metadata
revision = item.create_revision(
metadata={
"model": "sdxl",
"prompt": "cinematic portrait, dramatic lighting",
"seed": 18423,
"tool": "ComfyUI"
}
)
# Attach a file without uploading it
revision.create_artifact(
name="output",
location="/mnt/assets/hero_v01.png"
)
# Optionally link lineage
revision.create_edge(
edge_type="CREATED_FROM",
source_kref="kref://demo-project/characters/sketch.image?r=3"
)
print("Revision registered:", revision.kref)
This is the minimum to get lineage
Files remain in your storage
Every write emits events
Pick your pattern
Most developers map themselves to one of these
Plugin integration
Build plugins for DCCs, ComfyUI, or other creative tools. Capture context at generation time.
Pipeline service
Batch ingest from render farms, processing queues, or CI/CD. Register outputs as they complete.
Product backend
Use Kumiho as the asset registry for your own app. Get versioning, lineage, and events out of the box.
Technical details
The stuff you actually want to know
kref: Stable identifiers
Every asset gets a kref — a stable, human-readable URI:
Reference assets across systems without brittle file paths. Krefs resolve to the latest revision by default, or pin to a specific version.
Revision immutability
Once created, revisions are immutable. You can:
- Add metadata or artifacts to an existing revision
- Create edges to/from a revision
- Publish or archive a revision
You cannot modify content or delete history. This enables reproducibility and audit trails.
Edge types (depends_on, derived_from)
Edges express relationships between revisions:
DEPENDS_ONRuntime dependency — if source changes, target may need updateDERIVED_FROMLineage — target was created from sourceREFERENCESSoft link — informational onlyTraverse edges for impact analysis: "What depends on this?" or "What was this derived from?"
Event streaming
Every write operation emits an event:
item.created,revision.created,edge.createdrevision.updated,revision.tagged,revision.deleted
Subscribe via webhooks or poll. Build reactive pipelines, feed AI agents, or trigger downstream automation.
Why not just use S3 + a database?
An honest comparison
| What you need | S3 + DB | Kumiho |
|---|---|---|
| Store bytes | ✓ Yes | — BYO storage |
| Stable identifiers | You build it | ✓ kref built-in |
| Revision history | You build it | ✓ First-class |
| Lineage / dependency graph | You build it | ✓ Native edges |
| Event streaming | You build it | ✓ Every write |
| Multi-tenant isolation | You build it | ✓ Built-in |
Kumiho stores meaning, not bytes. You store the files. We track what they are and how they connect.
SDKs for real integrations
Python
pip install kumiho
C++
vcpkg / CMake
REST API
FastAPI endpoints
Dart
pub add kumiho
Treat assets like objects with history.
Stop rebuilding revision tracking, lineage graphs, and event systems. Build your thing.