A personal audio library web app for browsing and playing locally-stored audio works. Scans a folder of RJ-coded releases, fetches metadata from DLsite and HVDB, and exposes a Next.js UI with fuzzy Japanese search, a liked-tracks view, and a persistent player.
Stack: Next.js 16 · React 19 · TypeScript · SQLite (better-sqlite3) + Drizzle ORM · base-ui + shadcn · MiniSearch + kuroshiro
- Node.js 20+
- pnpm
- A directory of audio works named by DLsite RJ code (e.g.
RJ01000380/...)
git clone https://github.com/4890A/mimiuchi.git
cd mimiuchi/web
pnpm install
cp .env.example .env.localEdit web/.env.local and set the variables below.
| Variable | Required | Description |
|---|---|---|
KIKOERU_LIBRARY_ROOT |
yes | Absolute path to the folder containing your RJ-coded work directories |
KIKOERU_PASSWORD |
yes | Shared password used to log in (any non-empty string) |
KIKOERU_SESSION_SECRET |
no | Overrides the session-cookie signing key. If unset, a random 32-byte secret is generated on first run and stored in <KIKOERU_DATA_DIR>/session-secret |
KIKOERU_DATA_DIR |
no | Where the SQLite database lives (defaults to ../data relative to web/) |
KIKOERU_COVERS_DIR |
no | Where cover art is cached (defaults to <project-root>/covers) |
All commands run from the web/ directory.
pnpm dev # start the dev server on http://localhost:3000The SQLite schema is created and migrated automatically on first connection — a fresh checkout provisions an empty database on startup, so there's no manual migration step. (Existing databases from before automatic migrations are detected and left untouched.)
On first visit, log in with KIKOERU_PASSWORD. Then trigger a library scan from the in-app Scan button — it walks KIKOERU_LIBRARY_ROOT, fetches metadata, and streams progress to a panel in the bottom-right. Re-run whenever you add new works.
A
pnpm scanCLI script also exists (web/scripts/scan.ts) if you'd rather run the scan headlessly.
pnpm build/pnpm start— production build & servepnpm lint— ESLintpnpm db:studio— open Drizzle Studio against the SQLite dbpnpm db:generate— after editingschema.ts, generate a migration intoweb/drizzle/and commit it; it's applied automatically on the next startpnpm db:push— push the schema to the db directly without a migration (handy for quick local iteration)
.
├── web/ Next.js app (source, scripts, configs)
├── data/ SQLite database (gitignored)
└── covers/ Cached cover art (gitignored)

