* init uv project * fix workflow for uv * updated docs * update dependabot to use uv * lock python version * fix python version * update uv deps * Address PR review feedback - Match dependency versions to dev branch (Django 5.2.13, allauth 65.15.1, health-check 4.2.2 with [celery,redis] extras, ruff 0.15.10, fakeredis[lua]) - Remove unused django-decorator-include - Restore single-line ruff ignore array (unrelated whitespace) - Drop description/readme; mark as non-package via [tool.uv] - Install supervisor via apk in Dockerfile - Fix CI: use 'uv run playwright install'; drop unused --all-extras - README: set `dynamic = ["version"]` to avoid declaring version Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Fix container startup after switch to uv base image - Dockerfile: prepend /.venv/bin to PATH so python/gunicorn/celery resolve directly (entrypoint.sh and supervisord.conf invoke them by name). - entrypoint.sh: drop hardcoded /usr/local/bin/ prefix for supervisord; apk installs it to /usr/bin/supervisord, so let PATH resolve it. - uv.lock: regenerated after pyproject.toml switched to dynamic version. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Add mkdocs and supervisor as uv deps; lint pyproject.toml - Add a 'docs' dependency group with mkdocs and its plugins; switch build-docs.yml to use uv and remove docs/requirements.txt. - Add supervisor to project deps so it ships in /.venv/bin instead of via apk in the Docker image. - Add validate-pyproject and pyproject-fmt as dev deps and pre-commit hooks; reformat pyproject.toml accordingly. - Drop unused dynamic version metadata (app version comes from the VERSION env var, not package metadata). Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Move uv virtualenv into /yamtrack workdir Set WORKDIR before copying pyproject.toml and uv.lock so the uv-managed virtualenv is created at /yamtrack/.venv. Update PATH accordingly and ignore .venv in .dockerignore. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Pin Python version to 3.12 Add .python-version so uv (and pyenv) consistently select the same interpreter when creating the virtualenv. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Enable uv bytecode compilation in Docker image Set UV_COMPILE_BYTECODE=1 so uv precompiles .pyc files during 'uv sync'. This trades a small build-time cost for faster container/worker startup since Python doesn't have to compile modules on first import. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Use multi-stage Docker build to slim the runtime image Build the virtualenv with uv in a builder stage based on ghcr.io/astral-sh/uv:python3.12-alpine, then copy /yamtrack/.venv into a clean python:3.12-alpine final stage. The final image no longer carries the uv binary or its build cache, and collectstatic runs via 'python manage.py' since the venv is on PATH. Set UV_LINK_MODE=copy in the builder so packages are copied (not symlinked from a cache that the final stage will not see). Reduces image size by roughly 150 MB in local testing. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Drop validate-pyproject and pyproject-fmt; revert pyproject formatting Remove the validate-pyproject and pyproject-fmt pre-commit hooks and dev dependencies, and revert the cosmetic pyproject.toml formatting that pyproject-fmt had applied (e.g. nested [tool.ruff.lint.*] tables and tight list spacing) to match the dev branch style. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Pin Alpine version and preserve bytecode in Docker build - Pin both builder and final stages to alpine3.21 for reproducibility and binary compatibility between the virtualenv and runtime image. - Stop deleting __pycache__ after uv sync so the bytecode compiled via UV_COMPILE_BYTECODE=1 is actually shipped, giving faster startup and avoiding runtime compilation on read-only filesystems. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Add django-tailwind-cli for Tailwind integration Replaces the standalone tailwindcss CLI workflow with django-tailwind-cli, which downloads and manages the standalone Tailwind binary itself. The output path (static/css/main.css) is preserved so base.html and the production build are unchanged. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Split dev dependency group into lint and test The dev group now includes both via include-group, preserving the existing 'uv sync' behavior while allowing lint-only or test-only installs. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Revert "Add django-tailwind-cli for Tailwind integration" This reverts commit 3796e53e347b81784e69fa0328c4e3d35be90d55. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> * Add back pinning version to `0.0.0` Using `dynamic`, uv tries to build an egg every time dependencies are added/removed. * Switch docs group from mkdocs to zensical Upstream migrated documentation tooling from mkdocs to zensical. Replace the mkdocs-* plugins in the docs dependency group with zensical and the squidfunk fork of mike that zensical expects. Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> --------- Co-authored-by: Eddi <75438446+minerop5000@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: David Davis <86290+daviddavis@users.noreply.github.com>
Yamtrack
Yamtrack is a self hosted media tracker for movies, tv shows, anime, manga, video games, books, comics, and board games.
📚 Documentation
The full documentation is available at fuzzygrim.github.io/Yamtrack.
🚀 Demo
You can try the app at yamtrack.fuzzygrim.com using the username demo and password demo.
✨ Features
- 🎬 Track movies, tv shows, anime, manga, games, books, comics, and board games.
- 📺 Track each season of a tv show individually and episodes watched.
- ⭐ Save score, status, progress, repeats (rewatches, rereads...), start and end dates, or write a note.
- 📈 Keep a tracking history with each action with a media, such as when you added it, when you started it, when you started watching it again, etc.
- ✏️ Create custom media entries, for niche media that cannot be found by the supported APIs.
- 📂 Create personal lists to organize your media for any purpose, add other members to collaborate on your lists.
- 📅 Keep up with your upcoming media with a calendar, which can be subscribed to in external applications using a iCalendar (.ics) URL.
- 🔔 Receive notifications of upcoming releases via Apprise (supports Discord, Telegram, ntfy, Slack, email, and many more).
- 🐳 Easy deployment with Docker via docker-compose with SQLite or PostgreSQL.
- 👥 Multi-users functionality allowing individual accounts with personalized tracking.
- 🔑 Flexible authentication options including OIDC and 100+ social providers (Google, GitHub, Discord, etc.) via django-allauth.
- 🦀 Integration with Jellyfin, Plex and Emby to automatically track new media watched.
- 📥 Import from Trakt, Simkl, MyAnimeList, AniList and Kitsu with support for periodic automatic imports.
- 📊 Export all your tracked media to a CSV file and import it back.
📱 Screenshots
| Homepage | Calendar |
|---|---|
![]() |
![]() |
| Media List Grid | Media List Table |
|---|---|
![]() |
![]() |
| Media Details | Tracking |
|---|---|
![]() |
| Season Details | Tracking Episodes |
|---|---|
![]() |
| Lists | Statistics |
|---|---|
![]() |
![]() |
| Create Manual Entries | Import Data |
|---|---|
![]() |
![]() |
🐳 Installing with Docker
Download the default docker-compose.yml file from the repository, update the environment values, and start Yamtrack:
docker compose up -d
The default Compose file uses SQLite, which is enough for most personal installs. For full SQLite, PostgreSQL, and reverse proxy setup instructions, see the Setup documentation.
💻 Development
Development instructions are available in the Development documentation.
💪 Support the Project
There are many ways you can support Yamtrack's development:
⭐ Star the Project
The simplest way to show your support is to star the repository on GitHub. It helps increase visibility and shows appreciation for the work.
🐛 Bug Reports
Found a bug? Open an issue on GitHub with detailed steps to reproduce it. Quality bug reports are incredibly valuable for improving stability.
💡 Feature Suggestions
Have ideas for new features? Share them through GitHub issues. Your feedback helps shape the future of Yamtrack.
🧪 Contributing
Pull requests are welcome! Whether it's fixing typos, improving documentation, or adding new features, your contributions help make Yamtrack better for everyone.
☕ Donate
If you'd like to support the project financially:









