Developer Guide

This section is for those who want to contribute to Media Manager or understand its internals.

Source Code directory structure

  • media_manager/: Backend FastAPI application

  • web/: Frontend SvelteKit application

  • Writerside/: Documentation

  • metadata_relay/: Metadata relay service, also FastAPI

Special Dev Configuration

Environment Variables

MediaManager uses various environment variables for configuration. In the Docker development setup (docker-compose.dev.yaml), most of these are automatically configured for you.

Backend Variables

  • BASE_PATH Base path for the app (for subdirectory deployments).

  • PUBLIC_VERSION Version string displayed in /api/v1/health.

  • FRONTEND_FILES_DIR Directory for built frontend files (e.g. /app/web/build in Docker).

  • MEDIAMANAGER_MISC__DEVELOPMENT When set to TRUE, enables FastAPI hot-reloading in Docker.

Frontend Variables

  • PUBLIC_API_URL API URL for backend communication (auto-configured via Vite proxy in Docker).

  • PUBLIC_VERSION Version string displayed in the frontend UI.

  • BASE_PATH Base path for frontend routing (matches backend BASE_PATH).

Docker Development Variables

  • DISABLE_FRONTEND_MOUNT When TRUE, disables mounting built frontend files (allows separate frontend container).

circle-info

This is automatically set in docker-compose.dev.yaml to enable the separate frontend development container

Configuration Files

  • Backend: res/config/config.toml (created from config.dev.toml)

  • Frontend: web/.env (created from .env.example)

Contributing

  • Consider opening an issue to discuss changes before starting work

Setting up the Development Environment

I use IntellijIdea with the Pycharm and Webstorm plugins to develop this, but this guide should also work with VSCode. Normally I'd recommend Intellij, but unfortunately only Intellij Ultimate has support for FastAPI and some other features.

  • Python

  • Svelte for VSCode

  • Python

  • Svelte

  • Pydantic

  • Ruff

  • VirtualKit

  • Writerside (for writing documentation)

The recommended way to develop MediaManager is using the fully Dockerized setup with docker-compose.dev.yaml. This ensures you're working in the same environment as production and makes it easy for new contributors to get started without installing Python, Node.js, or other dependencies locally.

The development environment includes:

  • Backend (FastAPI) with automatic hot-reloading for Python code changes

  • Frontend (SvelteKit/Vite) with Hot Module Replacement (HMR) for instant updates

  • Database (PostgreSQL) pre-configured and ready to use

What supports hot reloading and what does not

  • Python code changes (.py files), Frontend code changes (.svelte, .ts, .css) and configuration changes (config.toml) reload automatically.

  • Changing the backend dependencies (pyproject.toml) requires rebuilding: docker compose -f docker-compose.dev.yaml build mediamanager

  • Changing the frontend dependencies (package.json) requires restarting the frontend container: docker compose -f docker-compose.dev.yaml restart frontend

  • Database migrations: Automatically run on backend container startup

This approach eliminates the need for container restarts during normal development and provides the best developer experience with instant feedback for code changes.

How the Frontend Connects to the Backend

In the Docker development setup, the frontend and backend communicate through Vite's proxy configuration:

  • Frontend runs on: http://localhost:5173 (exposed from Docker)

  • Backend runs on: http://mediamanager:8000 (Docker internal network)

  • Vite proxy: Automatically forwards all /api/* requests from frontend to backend

This means when your browser makes a request to http://localhost:5173/api/v1/tv/shows, Vite automatically proxies it to http://mediamanager:8000/api/v1/tv/shows. The PUBLIC_API_URL environment variable is set to use this proxy, so you don't need to configure anything manually.

This is the easiest and recommended way to get started. Everything runs in Docker with hot-reloading enabled.

1

Prepare config files

Create config directory (only needed on first run) and copy example config files:

2

Start all services

Recommended: Use make commands for easy development

Alternative: Use docker compose directly (if make is not available)

3

Access the application

  • Frontend (with HMR): http://localhost:5173

  • Backend API: http://localhost:8000

  • Database: localhost:5432

The default user email is admin@example.com and password is admin, these are printed out in the logs accessible with make logs.

Now you can edit code and see changes instantly:

  • Edit Python files → Backend auto-reloads

  • Edit Svelte/TypeScript files → Frontend HMR updates in browser

  • Edit config.toml → Changes apply immediately

circle-info

Run make help to see all available development commands including make down, make logs, make app (shell into backend), and more.

Setting up the backend development environment (Local)

Clone & prerequisites

  1. Clone the repository

  2. cd into repo root

  3. Install uv: https://docs.astral.sh/uv/getting-started/installation/

  4. Verify installation:

Install Python with uv

Create virtual environment

Install dependencies

Run database migrations

Run the backend (development mode)

Formatting & linting

  • Format code:

  • Lint code:

Setting up the frontend development environment (Local, Optional)

Using the Docker setup above is recommended. This section is for those who prefer to run the frontend locally outside of Docker.

1

Clone & change dir

  1. Clone the repository

  2. cd into repo root

  3. cd into web directory

2

Install Node.js (example using nvm-windows)

I used nvm-windows:

If using PowerShell you may need:

3

Create .env for frontend

Update PUBLIC_API_URL if your backend is not at http://localhost:8000

4

Install dependencies and run dev server

5

Format & lint

  • Format:

  • Lint:

circle-info

If running frontend locally, make sure to add http://localhost:5173 to the cors_urls in your backend config file.

Troubleshooting

Common Docker Development Issues

chevron-rightPort already in use errorshashtag
  • Check if ports 5173, 8000, or 5432 are already in use:

    • macOS/Linux: lsof -i :5173

    • Windows: netstat -ano | findstr :5173

  • Stop conflicting services or change ports in docker-compose.dev.yaml

chevron-rightContainer not showing code changeshashtag
  • Verify volume mounts are correct in docker-compose.dev.yaml

  • For backend: Ensure ./media_manager:/app/media_manager is mounted

  • For frontend: Ensure ./web:/app is mounted

  • On Windows: Check that file watching is enabled in Docker Desktop settings

chevron-rightFrontend changes not updatinghashtag
  • Check that the frontend container is running: make ps or docker compose -f docker-compose.dev.yaml ps

  • Verify Vite's file watching is working (should see HMR updates in browser console)

  • Try restarting the frontend container:

chevron-rightBackend changes not reloadinghashtag
  • Verify MEDIAMANAGER_MISC__DEVELOPMENT=TRUE is set in docker-compose.dev.yaml

  • Check backend logs:

  • If dependencies changed, rebuild:

chevron-rightDatabase migration issueshashtag
  • Migrations run automatically on container startup

  • To run manually:

  • To create new migration:

chevron-rightViewing logshashtag
  • All services: make logs

  • Follow logs in real-time: make logs ARGS="--follow"

  • Specific service: make logs ARGS="mediamanager --follow"

chevron-rightInteractive debugging (shell into containers)hashtag
  • Shell into backend:

  • Shell into frontend:

  • Once inside, you can run commands like uv run alembic upgrade head, npm install, etc.

chevron-rightVolume permission issues (Linux)hashtag
  • Docker containers may create files as root, causing permission issues, which can make the login page fail to show up.

Solution:

  • Alternatively: Run containers with your user ID or use Docker's user: directive (may fail in some setups).

chevron-rightComplete resethashtag

If all else fails, you can completely reset your development environment:

Tech Stack

Backend

  • Python

  • FastAPI

  • SQLAlchemy

  • Pydantic and Pydantic-Settings

  • Alembic

Frontend

  • TypeScript

  • SvelteKit

  • Tailwind CSS

  • shadcn-svelte

  • openapi-ts

  • openapi-fetch

CI/CD

  • GitHub Actions