Browse, search and manage the images you made with Stable Diffusion WebUI, ComfyUI and InvokeAI, from a web UI or the command line.
Hanaikada ("flower raft": petals drifting on water) reads the generation data each platform writes into its images — the WebUI's infotext, ComfyUI's graph, InvokeAI's metadata, and NovelAI's comment — turns it into one record, indexes it, and lets you:
- Browse your WebUI, ComfyUI and InvokeAI output folders (or any folder) in a fast, virtualised grid with folder covers, sorting, a flattened "everything below here" view, and filters by platform, model and sampler. New images appear as soon as they are written.
- View an image full screen with zoom, pan, a slideshow, a filmstrip, and an information
panel: the prompt and every parameter, what changed from the previous image, every raw
chunk (download a ComfyUI workflow as
.jsonto drop it back into ComfyUI), and EXIF. - Search by prompt text (a full-text trigram index), negative prompt, file name, model, LoRA, seed, steps, CFG, size, orientation, date and tags; the search lives in the URL.
- Tag images with your own tags and a favourite, alongside tags derived from the metadata (prompt words, LoRAs, models, samplers, sizes, InvokeAI boards).
- Manage files: move, copy, rename, delete (to the trash) and upload, with sidecar files following their image and the index following every change. Download a selection as a zip.
- Compare two images with a slider and a prompt diff, and see statistics: a contribution heatmap, images per month, and the models, samplers and LoRAs you use most.
The design, the conventions and the known gaps are in AGENTS.md.
Install
python -m pip install hanaikada
hanaikada --help
Python 3.10 or newer. The web UI is bundled into the package; you do not need Node.
Pydantic v1 and v2 are supported (v1 with Python 3.10–3.13 and fastapi<0.126).
Start
hanaikada root add ~/stable-diffusion-webui # the layout is detected: sd-webui
hanaikada root add ~/ComfyUI # comfyui
hanaikada root add ~/invokeai # invokeai
hanaikada webui # scans in the background and opens the browser
A root can be an installation folder or one of its output folders. Hanaikada reads the WebUI's
config.json for its output folders, uses ComfyUI's output/ (and temp/ if you ask), and
InvokeAI's outputs/images/ together with its thumbnails and, read-only, its boards.
Command line
hanaikada
├── webui start the server and open the web UI (--host --port --no-open --no-scan)
├── version | env
├── config show | get | set | path
├── root list | add <path> [--layout] [--name] [--no-index] | remove <id>
├── scan [--root] [--path] [--full] [--reparse] [--wait]
├── ls [<root:path>] --sort --asc --limit --recursive --all-roots
├── info <file | root:path> [--raw] parse one image; no index needed
├── search [text] --in --regex --platform --model --sampler --seed --tag --any-tag --not-tag ...
├── tag list | add | remove | apply | unapply | show
├── export <paths...> --what infotext|workflow|metadata --to <dir>
├── move | copy <src...> <dst> rename <path> <new-name> delete <paths...> mkdir <path>
└── thumbs generate | clear
A path is <root-id>:<relative path> or a path on disk inside a root. Every listing accepts
--json, which prints the same records the API returns, and --debug works at every level.
While the web UI's server runs, hanaikada scan hands the scan to it.
hanaikada info ~/Downloads/ComfyUI_00042_.png # what made this image?
hanaikada search "cherry blossoms" --platform comfyui --json
hanaikada search --model animagineXL --min-steps 30 --tag favorite
hanaikada export 1a2b3c4d:output/ComfyUI_00042_.png --what workflow --to ./workflows
Settings live in settings.toml in the data directory (hanaikada config path), and any of
them can be pinned by an environment variable such as HANAIKADA_SERVER__PORT=8000.
Embedding
from hanaikada import HanaikadaServer, ImageRoot
server = HanaikadaServer(
data_dir="./hanaikada-data",
image_roots=[ImageRoot("/srv/ComfyUI", name="ComfyUI")],
lock_image_roots=True, # the user cannot add, change or remove folders
port=0, # any free port
api_prefix="/images", # keep clear of the host's own routes
)
url = server.start() # http://127.0.0.1:54123/images
server.stop()
Security
The server listens on 127.0.0.1 by default and checks the Host and Origin of every
request. To listen on another address, set an access token first
(hanaikada config set server.access_token <secret>). Nothing outside the roots you add is
ever read or written, and nothing is overwritten.
Development
pip install -e ".[dev]"
python scripts/dev.py web-install
python scripts/dev.py dev # API and Vite together, with hot reload
python scripts/dev.py check # what CI runs
Licence
GPL-3.0.
Release files for hanaikada 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hanaikada-0.1.5.tar.gz | 492.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hanaikada-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.0 MB
Release files / hanaikada-0.1.5.tar.gz
| Download URL | hanaikada-0.1.5.tar.gz |
|---|---|
| Size | 492.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fb6c41d2b5e4cd516d491454d6cb90fbc08b4aa1c7aea97818521aeb7e343132
|
|
BLAKE2b-256 checksum How to use checksums |
f3a0422af9a57657a2e290fbb4986a47687cc20676e672051e1f13eed2e787c4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / hanaikada-0.1.5-py3-none-any.whl
| Download URL | hanaikada-0.1.5-py3-none-any.whl |
|---|---|
| Size | 528.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
94b2dfb5150f82837b9b67e21bd2b1774a05a6b16f3135b30ada7a13e02425ce
|
|
BLAKE2b-256 checksum How to use checksums |
63497c153579dd990425b1d0c08ecdb210cdf41c5095cd3e91c9461c2cfd20cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|