9162cf23ce6c6199f8e971329aca94a683b6ffc5
When the muxer patched a byte range inside an already-written chunk (the mdat header, for example), the merge trimmed the right side of the old segment but left its full blob on the left, duplicating megabytes and shifting every box offset — the MP4 still reported its duration but had no usable video track (0x0 in the browser, "moov atom not found" in ffprobe). The collector/assembler now lives in its own module and was verified in Node with a real transmux of J-81: the assembled file matches the source (h264 1280x720, 500 frames, AAC, 20.84 s) byte for byte in structure.
J621
Self-hosted media library and e621 archive manager, rebuilt as a React SPA + Django REST API.
Structure
backend/ Django 6 + DRF API (SQLite in dev, MariaDB in production)
frontend/ Vite + React + TypeScript SPA
Development
Backend
cd backend
source venv/bin/activate
python manage.py migrate
python manage.py scan_files # index the watched folder
python manage.py runserver
Copy .env.example to .env and set WATCHED_FOLDER before scanning.
Frontend
cd frontend
npm install
npm run dev # http://localhost:5173, proxies /api to :8000
Production
Not wired up yet — planned: Nginx serving the SPA build, /media and /library media
directly, and proxying /api to Waitress/Django. See frontend/ design docs for the UI
specification.
Licence
Source-available, non-commercial: personal and other non-commercial use is welcome under the Jake Labs Non-Commercial Software Licence, which requires attribution and keeps derivative works under the same licence. Commercial use is not permitted. Third-party dependencies keep their own licences (all permissive: MIT, BSD, Apache-2.0, ISC).
Releases
2
desktop-v0.1.2
Latest
Languages
TypeScript
55.8%
Python
37.7%
Shell
3.3%
PowerShell
2.5%
Rust
0.5%
Other
0.1%