Media Organizer
  • TypeScript 98.9%
  • CSS 0.7%
  • JavaScript 0.2%
  • Dockerfile 0.2%
Find a file
2026-08-06 11:18:13 +02:00
.forgejo/workflows ci: use submodules: true (non-recursive) for checkout 2026-06-18 19:32:04 +02:00
deploy deploy: postgres op een bind-mount i.p.v. een named volume 2026-07-10 13:05:31 +02:00
docs fix: finale-review minors link-only import 2026-08-06 08:55:10 +02:00
exports feat: add MEDIA_THUMBNAIL_HOST_PATH and update metadata in environment configuration 2026-05-23 14:42:17 +02:00
prisma feat: job.copy_files kolom voor link-only library-import 2026-08-06 08:21:15 +02:00
public feat: use media organizer icon set 2026-05-22 20:05:35 +02:00
reviews docs: move media organizer planning docs into repo 2026-05-21 21:35:25 +02:00
scripts feat(db): reconciliatie fase 1 — backfill-script met relationele gates 2026-07-29 21:31:18 +02:00
src fix: finale-review minors link-only import 2026-08-06 08:55:10 +02:00
vendor build: vendor scrum4me-copilot kit + webpack build plumbing 2026-06-18 18:50:48 +02:00
.dockerignore chore: negeer .claude/worktrees in git en .claude in docker-buildcontext 2026-07-31 16:29:53 +02:00
.DS_Store feat: add MEDIA_THUMBNAIL_HOST_PATH and update metadata in environment configuration 2026-05-23 14:42:17 +02:00
.env.example feat: improve thumbnail management workflow 2026-05-23 14:11:55 +02:00
.gitignore chore: negeer .claude/worktrees in git en .claude in docker-buildcontext 2026-07-31 16:29:53 +02:00
.gitmodules build: vendor scrum4me-copilot kit + webpack build plumbing 2026-06-18 18:50:48 +02:00
.sops.yaml secrets: SOPS+age encrypted env for media-organizer 2026-05-21 21:12:37 +02:00
AGENTS.md docs: Scrum4Me-product-binding (methodiek + product_id) 2026-05-29 09:05:44 +02:00
CLAUDE.md docs: Scrum4Me-product-binding (methodiek + product_id) 2026-05-29 09:05:44 +02:00
components.json Rebuild media organizer as library app 2026-06-05 16:40:41 +02:00
Dockerfile Rebuild media organizer as library app 2026-06-05 16:40:41 +02:00
eslint.config.mjs Rebuild media organizer as library app 2026-06-05 16:40:41 +02:00
next-env.d.ts chore: scaffold media organizer app 2026-05-20 19:56:18 +02:00
next.config.ts build: vendor scrum4me-copilot kit + webpack build plumbing 2026-06-18 18:50:48 +02:00
package-lock.json build: vendor scrum4me-copilot kit + webpack build plumbing 2026-06-18 18:50:48 +02:00
package.json package.json bijwerken 2026-07-31 16:12:54 +02:00
postcss.config.mjs chore: scaffold media organizer app 2026-05-20 19:56:18 +02:00
prisma.config.ts Rebuild media organizer as library app 2026-06-05 16:40:41 +02:00
README.md Rebuild media organizer as library app 2026-06-05 16:40:41 +02:00
tsconfig.json build: vendor scrum4me-copilot kit + webpack build plumbing 2026-06-18 18:50:48 +02:00

Media Organizer

Media Organizer is a Next.js media library app for browsing imported media, managing favorites/trash/custom collections, and importing folders into the library database.

The media storage path stays /media/scraper for compatibility with existing database records and external tools such as Immich.

Docker Compose

Create a local environment file from the example:

cp deploy/media-organizer.env.example deploy/media-organizer.env

Set POSTGRES_PASSWORD, DATABASE_URL, and SESSION_SECRET before the first start.

Start PostgreSQL, run Prisma migrations, and start the web UI:

docker compose -f deploy/docker-compose.yml up --build

After the first migration, create an admin user from the web container or a local shell with DATABASE_URL set:

npm run create-admin -- <gebruikersnaam> <wachtwoord>

The Compose stack publishes the web service on 172.18.0.1:3107:3000. Caddy can proxy that to https://media.jp-visser.nl. Health endpoints are available at /health, /api/health, and /api/ready.

Runtime Paths

LIBRARY_MEDIA_ROOT defaults to /media/scraper and should stay there unless the database paths are migrated deliberately. The Docker Compose stack bind-mounts the host /media/scraper directory at the same container path and mounts /mnt/nas/ssd, /mnt/nas/public, and /mnt/nas/multimedia read-only for existing import-source paths.

Secrets (SOPS + age)

On the scrum4me-srv host the runtime env is not hand-edited. The real values live encrypted in deploy/media-organizer.env.sops (SOPS + age), committed to this repo. At deploy time the host decrypts it to deploy/media-organizer.env, so the .sops file is the single source of truth and the plaintext env is a derived, gitignored artifact.

  • Edit or add a secret with npm run secrets:edit, then commit, push, and redeploy.
  • View decrypted values with npm run secrets:view.
  • Rotate the DB password on the live DB first, then update both POSTGRES_PASSWORD and the password inside DATABASE_URL.