Skip to main content

Hanaikada 花筏

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 .json to 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.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hanaikada 0.1.3
File Size Uploaded
hanaikada-0.1.3.tar.gz 490.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for hanaikada 0.1.3
File Interpreter ABI Platform
hanaikada-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 1.0 MB

Release files / hanaikada-0.1.3.tar.gz

Download URL hanaikada-0.1.3.tar.gz
Size 490.7 kB
Tags Source
SHA-256 checksum
How to use checksums
728bff7e4060db20154562f361b00a4d63cbd267776af052d88d9660c102004b
BLAKE2b-256 checksum
How to use checksums
b0c00796419da747ca80ae9c75da5dbeaa20ec4c9d35377f6b8333e250d90705
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.3-py3-none-any.whl

Download URL hanaikada-0.1.3-py3-none-any.whl
Size 527.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ff6e89c58501cd37c85a9c69a8a4c2ac832dffbbab64e5e46e7158a07ccab495
BLAKE2b-256 checksum
How to use checksums
02e4f44b76ef84f9522049fffed7180fabd390d5da4349182359f929cbcf63dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release history Release notifications | RSS feed

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page