Media Organizer
  • TypeScript 98.6%
  • CSS 0.9%
  • JavaScript 0.3%
  • Dockerfile 0.2%
Find a file
2026-06-19 15:49:45 +02:00
.forgejo/workflows ci: use submodules: true (non-recursive) for checkout 2026-06-18 19:32:04 +02:00
deploy docs(deploy): copilot URL = tailnet IP, not compose-DNS 2026-06-19 13:50:14 +02:00
docs Merge origin/main into copilot integration 2026-06-18 19:55:26 +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(sessions): Session-model, migratie en sessie-laag 2026-06-18 17:03:55 +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: add Immich person rename and merge actions 2026-06-07 13:49:53 +02:00
src feat(copilot): move the copilot drawer trigger into the app header 2026-06-19 14:13:57 +02:00
vendor build: vendor scrum4me-copilot kit + webpack build plumbing 2026-06-18 18:50:48 +02:00
.dockerignore fix: harden docker deployment startup 2026-05-21 07:22:36 +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 Rebuild media organizer as library app 2026-06-05 16:40:41 +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 fix: scope npm test to host tests, exclude vendored submodule tests 2026-06-18 19:24:31 +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.