iArt.ai
AI 모션 그래픽 소프트웨어, 누구나 사용할 수 있는 After Effects 대안, 텍스트 프롬프트로 몇 분 안에 애니메이션·설명 영상 제작
만화·웹툰·코믹스와 이미지 세트를 위한 데스크톱 보관함, 파일은 그대로 보관되고 메타데이터는 사이트에서 시각적으로 캡처됩니다
A desktop vault for manga, manhwa, comics and image sets. Your files stay yours; metadata is captured visually from the sites you already read.
미디어Python · HTMLGitHub @witalic온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Local-first desktop media vault for manga, manhwa, comics and image sets, with an embedded capture browser
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A local-first desktop media vault for manga, manhwa, manhua, comics, image sets and episodes
— with an embedded capture browser. Your library is plain files on disk; metadata is captured
visually: open the source site inside the app, click the elements that hold the title, authors,
tags or cover, and longbox learns a reusable per-site recipe.README 전문 보기 ↗A local-first desktop media vault for manga, manhwa, manhua, comics, image sets and episodes — with an embedded capture browser. Your library is plain files on disk; metadata is captured visually: open the source site inside the app, click the elements that hold the title, authors, tags or cover, and longbox learns a reusable per-site recipe.
F5,
Ctrl+R (Shift bypasses the cache), Ctrl+F, Ctrl+L, Ctrl+T/W/Shift+T, Alt+←/→,
Ctrl+0/±, Ctrl+1…9 — working over the page itself, not only over the app's own chrome.vidhub @kumo Kumo Works as site, handle and creator, a template makes
Kumo Works 2025.1 the work's title, entries are numbered in order, from their names, or not at
all (the file's name is the label), and folders below a work become the sections its entries
are grouped by. Videos become episodes, archives and folders of images become chapters, and the
metadata editor fills in every work at once (or one work on its own). The preview shows exactly
what will be created before anything is written; the run copies or moves, keeps what you typed
by hand, and skips what an earlier run already stored. Profiles keep the answer and travel with
the library.ComicInfo.xml describing its work, so the library
reads correctly in Komga, Kavita and anything else that speaks the format, and outlives this app.
An archive that already describes itself names its own entry on the way in.An episode is a chapter whose media is a video file. Everything a chapter has — the free-form label, the language and group of a translation, its source link, read state — applies unchanged; what differs is how it is stored, previewed and played.
Getting one in. All three lanes accept video:
mp4 · m4v · webm · mkv · mov · avi · ts are
recognised.What is stored beside it. At ingest longbox records the duration, container, codec and
whether the file's index sits before the media; for mp4/m4v it moves the index to the front
when it does not (that is what makes playback start at once instead of fetching the tail first).
The contact sheet — nine frames laid out 3×3, plus the single frame a tile wears — is cut
once, by the window that plays the file (the app ships no decoder), and kept in the vault beside
the media. Nothing re-reads the video to draw a thumbnail again.
Watching. The title page previews the episode as that sheet, with each tile a link to the second it came from, and plays it in place when asked — nothing is streamed before you press Play. Arrow keys scrub it, the player's own controls (including fullscreen) work, and the resume point survives leaving the page: reopening the title, or opening the episode in the full-window player, carries on where you stopped. Reaching the end clears the point, so the next play starts over.
Files a browser cannot open. mkv, avi, mov and ts are stored, listed and catalogued
like any other episode — they simply have no player here, and say so, with the file offered for
saving elsewhere. Nothing is silently dropped or hidden.
Streaming, not copying. An episode is served out of the vault with Range support and read in windows, so seeking does not drag the whole file across a network drive, and a file that is currently playing is never replaced or deleted under the player — the app says which entry to close first.
One section at a time, chosen from the rail the rest of the app already uses, each carrying its own state so you can see what needs you without opening it: Storage (library folders), Health (below), Maintenance (rebuild the index, convert archives, write metadata into them), Fields, Browser, Appearance, Keyboard, About.
Everything that walks the library — a check, a conversion, a sweep, a field retype — takes the same single slot, shows the same progress and can be stopped from where it was started. The sidecar names what is running, so leaving the page does not lose it.
The vault is the source of truth, so the app can be asked to check it — nothing here runs by itself, and nothing changes your files.
Checksums. Every chapter is hashed twice as it is stored: once over the whole file (what integrity means) and once over its ordered page images (what "the same chapter" means). The second survives a repack, a renumbering and the metadata mirror, which is why duplicate detection uses it and corruption detection does not.
One check, three answers (Settings → Health): is anything broken, is anything wasting space, is anything missing. Duplicates and numbering gaps read the index, so they cost nothing on top of the walk and are never a separate thing to ask for. Answers are sentences about files — the file is gone, the file changed since it was stored — and each says what to do about it: a broken row opens its title, where the contents editor can replace or remove it. A quick check compares disk against the record; a full check re-reads every byte; either can be stopped, and a report cut short says so. Content stored before checksums existed can be baselined — reported as exactly that, because a checksum first taken today proves stability from today, not that the bytes are what arrived.
Leftovers — files belonging to no entry at all, and the debris of interrupted writes — are the one thing only this screen can reach, so it is the one place they can be deleted, after listing every one with its size. Duplicate copies are never deleted for you: which one to keep is a judgement, so the report opens each instead.
At scale the report stays a report: one row per title and problem, so forty broken chapters in one title read as one problem with that title, lists are capped with the totals stated in full, and a library that fails all at once is named as what it is — a folder that moved, not three thousand damaged files.
Numbering gaps are deliberately quiet. A vault holds image sets, one-shots and hand-ordered
contents, so a run is only claimed when the entries prove it: a translation of its own, at least
five of them, almost all numbered, densely covering their span, and never a hand-made order.
Fractions (10.5) are entries, not missing ones, and nothing is ever claimed beyond the highest
number held.
What has been done is recorded with the library: every operation over the vault leaves when it ran, how long it took and what came of it, and the last report is kept in full — so a check that took an hour is still there after a restart, and "has this library ever been checked" has an answer.
ComicInfo.xml is a mirror, not a second source of truth. It is written where the archive is being rewritten anyway — at ingest and on every page edit — so a metadata edit never silently rewrites gigabytes; Settings brings the rest in line on demand, rewriting only what differs.
Download a build for your system from the releases page, or read what it does first on the project page. Nothing else is needed — Python and Node are only required to work on the source.
macOS builds are ad-hoc signed, not notarized: the first launch needs right-click → Open to get past the unidentified-developer warning.
Requires Python ≥ 3.11, Node.js and npm. One-time setup — run.py expects the .venv at the
repo root:
python -m venv .venv # then activate it (.venv\Scripts\activate on Windows)
pip install -e "backend[dev]" # the sidecar, its test tools and pyinstaller
cd frontend && npm ci && cd ..
cd shell && npm ci && cd .. # fetches Electron itself
python run.py # build the frontend, launch the Electron shell (spawns the sidecar)
python run.py --no-build # skip the frontend rebuild
python run.py --backend # only the FastAPI sidecar on 127.0.0.1:8787 (dev, no auth token)
Tests and checks:
cd backend && python -m pytest # offline API + vault tests
cd frontend && npx vue-tsc --noEmit # type-check
cd frontend && npm run build # production build (served by the sidecar at /app/)
node --check shell/main.js # after touching shell scripts
python tools/version.py # every copy of the version agrees with app-meta.json
The version has one source: app-meta.json, which the sidecar, the shell and the About page read
directly. The few files that must carry a literal of their own — shell/package.json and its
lockfile (electron-builder names the installers and the release after it), backend/pyproject.toml
and the project page — are written by one command, never by hand:
python tools/version.py 2.3.0 # set the version (and today's date) and write every copy
python tools/version.py # check that nothing disagrees
A release is that bump committed as chore(release): 2.3.0, then the tag v2.3.0 pushed.
Builds run on GitHub Actions (.github/workflows/build.yml) for Windows, macOS (arm64 and x64)
and Linux: push a v* tag naming the version in app-meta.json to publish a release, or run the
workflow by hand for artifacts. CI refuses a tag — or any copy of the version — that disagrees.
Locally:
cd frontend && npm run build # the UI the sidecar serves
pyinstaller packaging/sidecar.spec --noconfirm --distpath dist-sidecar --workpath build-sidecar
cd shell && npm run pack # installers into dist-app/
A packaged app carries the sidecar as a frozen binary (with the built UI inside it) in the app's
resources, so it needs neither Python nor a checkout. rar ingest still needs an unrar/bsdtar
on the machine; every other archive format is handled in-process.
Electron shell → spawns a FastAPI (Python) sidecar → owns the vault (per-title directories +
SQLite index) and serves the built Vue 3 UI at /app/. The embedded browser (<webview>)
hosts source sites; its preload does pick mode, live selector previews, one-shot page snapshots
and page-context cover fetches. See ARCHITECTURE.md for the process shape and
module map, and design/state-model.md for the full capture / edit /
storage model and its invariants.
backend/ FastAPI sidecar: vault (layered title.json), SQLite index, chapter media, recipes, API
frontend/ Vue 3 + Vite + TS UI: library, title page, reader, capture browser, settings
shell/ Electron: sidecar spawn + auth, embedded browser, download interception, preloads
design/ design docs (state-model.md is the canonical architecture) + mockups and the GUI canvas
docs/ the project page published at witalic.github.io/longbox
packaging/ the frozen-sidecar spec and the macOS ad-hoc signing hook
tools/ version.py (the one version, everywhere) · screenshots.py (the project page's images) ·
bench_metadata.py (what a bulk metadata change costs)