Files in the top-level directory from the latest check-in
- 产品需求文档.md
- dist
- src
- ARCHITECTURE.md
- bun.lock
- bunfig.toml
- package.json
- README.md
- tsconfig.json
MAILUO
A private, dark-net-aesthetic technician information management & query TUI — Bun + TypeScript + OpenTUI + SQLite, with application-level AES-256-GCM encryption of sensitive fields and an encrypted video vault.
See ARCHITECTURE.md for the full design (directory tree,
DB schema, state machine, crypto/media-release workflow).
Requirements
- Bun ≥ 1.3
- macOS / Linux / WSL (a Unix
open/xdg-openplayer for video playback)
Install
bun install
Run
bun start # launches the TUI (first run asks for a passphrase)
bun run dev # watch mode
Data lives in a mailuo/ folder next to the program:
- Compiled binary (
bun build --compile): next to the executable (<binary_dir>/mailuo/), regardless of the current working directory. If the executable itself is namedmailuo(so the paths would collide), the data folder is namedmailuo-data/instead. - Dev mode (
bun start/bun run …): next to the current working directory ($cwd/mailuo/). Override withMAILUO_DATA=/path bun start.
Scripts
bun run typecheck # tsc --noEmit
bun run src/scripts/smoke-test.ts # headless end-to-end verification
bun run src/scripts/init-db.ts # create/verify DB without launching TUI
bun run src/scripts/reset-db.ts --yes # DESTRUCTIVE wipe
Usage
- First run: create a passphrase (≥6 chars). This derives the AES-256 master key via scrypt; the key is held in memory only and never persisted.
- Press
/to enter command mode, then type a command andEnter:/update— add a technician (browser form)/city <city>— search by city/price <tag>— search by price tag (1P 2P 1h 1D BY)/find <name>— search by name (substring)/all— clear the active filter/edit— edit the currently open technician/help— command reference/lock— wipe the master key, return to the passphrase screen/quit— exit
- In the list:
↑ ↓select,Enteropen. - In a detail view:
Mmedia ·Radd rating ·Eedit ·Cview selected rating's note ·Escback. - In the media viewer:
← →switch ·Enterdecrypt + play video in the system player (temp file wiped on exit) ·Escback. - In forms:
Tabnext field ·Ctrl+Ssave ·Esccancel. - In the web form (opened by
/updateor/edit), the province/city/district comboboxes support pinyin-initial search: typejsto find 江苏,wxfor 无锡,eedsfor 鄂尔多斯,pyfor 番禺. Multi-tone names like 重庆 (cq) and 番禺 (py) are handled correctly. - In the web form, the 标签 (tags) field above 备注 lets you type
#tagthen press Enter to add a tag chip; repeat for multiple tags. Tags are encrypted at rest and shown in the TUI detail view. Ctrl+Calways exits.
Version control
Fossil. Stage with fossil addremove, commit with fossil commit -m "…".
Do not push to a remote.