Ryot
A self hosted platform for tracking various facets of your life - media, fitness etc.
Ryot (Roll Your Own Tracker), pronounced "riot", aims to be the only self hosted tracker you will ever need!
💻 Demo
You can use the demo instance hosted on Fly.io. Login and register
with the username demo
and password demo-password
. This instance is automatically
deployed from the latest release.
NOTE: The data in this instance can be deleted randomly.
📝 ELI5
Imagine you have a special notebook where you can write down all the media you have consumed, like books you've read, shows you have watched, video games you have played or workouts you have done. Now, imagine that instead of a physical notebook, you have a special tool on your computer or phone that lets you keep track of all these digitally.
💡 Why?
- Existing solutions do not have very good UI.
- Pretty graphs and summaries make everyone happy. Ryot aims to have a lot of them.
- There is a lack of a good self-hosted fitness and health tracking solution.
- Ryot consumes very little memory (around 10MB idle eyeballing
docker stats
)
🚀 Features
✅ Supports tracking media and fitness.✅ Import data from- Goodreads
- MediaTracker
✅ Integration with- Kodi
- Audiobookshelf
✅ Self-hosted✅ PWA enabled✅ Documented GraphQL API✅ Easy to understand UI✅ Lightning fast (written in Rust BTW)✅ Free and open-source
📖 Guides
Some things might not be obvious on how to setup or get working. I have written a number of guides to make thing easier.
- Deployment: Deploy Ryot to various platforms
- Exporting: Export your data from Ryot
- Fitness: Fitness tracking with Ryot
- Importing: Import data from various sources
- Integrations: Integrations with various platforms
- Video Games: Get video games tracking working
⌨️ How to use?
NOTE: The first user you register is automatically set as admin of the instance.
👀 Production
You will have to mount a directory to /data
, giving it 1001:1001
permissions.
It is also recommended to use PostgreSQL or MySQL in production.
🐳 Option 1: Use Docker
To get a demo server running, use the docker image:
$ docker run \
--detach \
--name ryot \
--pull always \
--publish 8000:8000 \
--env "WEB_INSECURE_COOKIE=true" \
ghcr.io/ignisda/ryot:latest
docker-compose
with PostgreSQL
version: '3.9'
services:
postgres:
image: postgres:15-alpine
restart: unless-stopped
volumes:
- postgres_storage:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: postgres
ryot:
image: 'ghcr.io/ignisda/ryot:latest'
environment:
- WEB_INSECURE_COOKIE=true
- DATABASE_URL=postgres://postgres:postgres@postgres:5432/postgres
ports:
- '8000:8000'
pull_policy: always
container_name: ryot
volumes:
postgres_storage:
NOTE: The WEB_INSECURE_COOKIE
is only required if you are not running HTTPs.
In addition to the latest
tag, we also publish an unstable
tag from the latest
pre-release (or release, whichever is newer).
📦 Option 2: Quick-run a release
Each release has an installation script that can be used to install the ryot
binary. Follow the instructions in the release to use this script.
Alternatively using eget:
$ eget ignisda/ryot
🧑💻 Option 3: Compile and run from source
- Install moonrepo
# Build the frontend
$ moon run frontend:build
# Run it
$ cargo run --bin ryot --release
🔧 Configuration options
You can specify configuration options via files (loaded from config/ryot.json
,
config/ryot.toml
, config/ryot.yaml
) or via environment variables.
To set the equivalent environment variables, join keys by _
(underscore) and
UPPER_SNAKE_CASE the characters.
Ryot serves the final configuration loaded at the /config
endpoint as JSON
(example). This can also be treated as a health
endpoint.
Note: You can see all possible configuration parameters in the generated schema. The defaults can be inspected in the config builder. Here are some important ones:
Key / Environment variable | Description |
---|---|
- / PORT |
The port to listen on. |
database.url / DATABASE_URL |
The database connection string. Supports SQLite, MySQL and Postgres. |
video_games.twitch.client_id / VIDEO_GAMES_TWITCH_CLIENT_ID |
The client ID issues by Twitch. Required to enable video games tracking. More information |
video_games.twitch.client_secret / VIDEO_GAMES_TWITCH_CLIENT_SECRET |
The client secret issued by Twitch. Required to enable video games tracking. |
file_storage.s3_access_key_id / FILE_STORAGE_S3_ACCESS_KEY_ID |
The access key ID for the S3 compatible file storage. Required to enable file storage. More information |
file_storage.s3_bucket_name / FILE_STORAGE_S3_BUCKET_NAME |
The name of the S3 compatible bucket. Required to enable file storage. |
file_storage.s3_secret_access_key / FILE_STORAGE_S3_SECRET_ACCESS_KEY |
The secret access key for the S3 compatible file storage. Required to enable file storage. |
file_storage.s3_url / FILE_STORAGE_S3_URL |
The URL for the S3 compatible file storage. |
web.insecure_cookie / WEB_INSECURE_COOKIE |
This will make auth cookies insecure and should be set to true if you are running the server on localhost . More information |
🤓 Developer notes
In production, the frontend is a pre-rendered Nextjs app served statically by the Axum backend server.
In development, both servers are started independently running on :3000
and :8000
respectively. To get them running, install mprocs, and
run mprocs
in the project root. If you do not want to install mprocs
, take a look at
mproc.yaml
to see what all commands are needed to get it working.
Unless it is a very small change, I prefer creating a separate branch and merging it via an MR when it is done. The changelog is generated using git-chglog. Once all changes are done, run the following command to update the changelog.
$ git-chglog --next-tag <tag-name> -o CHANGELOG.md
🙏 Acknowledgements
It is highly inspired by MediaTracker. Moreover thanks to all those people whose stuff I have used.
The logo is taken from Flaticon.