David Davis e6765fa636 Migrate to uv (#1434)
* 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>
2026-05-17 14:58:53 +02:00
2026-05-17 14:58:53 +02:00
2026-05-10 17:16:36 +02:00
2026-05-17 14:58:53 +02:00
2026-05-17 14:58:53 +02:00
2026-05-17 14:58:53 +02:00
2026-05-17 14:58:53 +02:00
2026-05-17 14:58:53 +02:00
2026-05-17 14:58:53 +02:00
2024-02-11 22:38:29 +01:00
2026-05-17 14:58:53 +02:00
2025-05-24 13:03:34 +02:00
2026-05-17 14:04:54 +02:00
2026-05-17 14:58:53 +02:00
2026-05-17 14:04:54 +02:00

Yamtrack

App Tests Docker Image CodeFactor Codecov GitHub

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
Homepage calendar
Media List Grid Media List Table
List Grid List Table
Media Details Tracking
Media Details Tracking
Season Details Tracking Episodes
Season Details Tracking Episodes
Lists Statistics
Lists Statistics
Create Manual Entries Import Data
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:

ko-fi

Languages
Python 77.6%
HTML 15.9%
CSS 4.7%
JavaScript 1.7%