{"id":16982500,"url":"https://github.com/stritt/ryot","last_synced_at":"2026-04-11T13:32:36.360Z","repository":{"id":193809723,"uuid":"653446760","full_name":"stritt/ryot","owner":"stritt","description":null,"archived":false,"fork":false,"pushed_at":"2023-06-14T04:30:18.000Z","size":10596,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-26T18:34:47.209Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stritt.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-06-14T04:30:14.000Z","updated_at":"2023-06-14T04:31:07.000Z","dependencies_parsed_at":"2023-09-10T07:10:02.316Z","dependency_job_id":null,"html_url":"https://github.com/stritt/ryot","commit_stats":null,"previous_names":["stritt/ryot"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stritt%2Fryot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stritt%2Fryot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stritt%2Fryot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stritt%2Fryot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stritt","download_url":"https://codeload.github.com/stritt/ryot/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244887226,"owners_count":20526572,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-14T02:08:32.468Z","updated_at":"2025-12-30T23:54:51.825Z","avatar_url":"https://github.com/stritt.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"/apps/frontend/public/ryot-logo.png\" alt=\"Ryot Logo\"\u003e\n\u003c/p\u003e\n\n\u003ch2 align=\"center\"\u003e\n  A self hosted platform for tracking various facets of your life - media, fitness etc.\n\u003c/h2\u003e\n\nRyot (**R**oll **Y**our **O**wn **T**racker), pronounced \"riot\", aims to be the only self\nhosted tracker you will ever need!\n\n## NOTE FOR EXISTING USERS\n\nThe first public release includes huge code changes. If you were running the `v1.0.0-beta.*`\nversions, then please follow the migration notes for the latest release\n[here](https://github.com/IgnisDa/ryot/releases/tag/v1.0.0). Please be warned that\nfailing to do so **WILL** result in data loss.\n\n## 💻 Demo\n\nYou can use the demo instance hosted on [Fly.io](https://ryot.fly.dev). Login and register\nwith the username `demo` and password `demo-password`. This instance is automatically\ndeployed from the latest release.\n\n**NOTE**: The data in this instance can be deleted randomly.\n\n## 📝 ELI5\n\nImagine you have a special notebook where you can write down all the media you have\nconsumed, like books you've read, shows you have watched, video games you have played or\nworkouts you have done. Now, imagine that instead of a physical notebook, you have a\nspecial tool on your computer or phone that lets you keep track of all these digitally.\n\n## 💡 Why?\n\n- Existing solutions do not have very good UI.\n- Pretty graphs and summaries make everyone happy. Ryot aims to have a lot of them.\n- There is a lack of a good selfhosted fitness and health tracking solution.\n- Ryot consumes very little memory (around 8MB idle eyeballing `docker stats`), something\n  that is significantly useful in RAM constrained environments.\n\n## 🚀 Features\n\n- ✅ [Supports](https://github.com/IgnisDa/ryot/discussions/4) tracking media\n  and fitness.\n- ✅ Import data\n  - Goodreads\n  - MediaTracker\n- ✅ Self-hosted\n- ✅ Documented GraphQL API\n- ✅ Easy to understand UI\n- ✅ Lightning fast (written in Rust BTW)\n- ✅ Free and open-source\n\n## 📖 Guides\n\nSome things might not be obvious on how to setup or get working. I have written\na number of guides to make thing easier.\n\n- [Deployment](/docs/guides/deployment.md): Deploy Ryot to various platforms\n- [Exporting](/docs/guides/exporting.md): Export your data from Ryot\n- [Importing](/docs/guides/importing.md): Import data from various sources\n- [Video Games](/docs/guides/video-games.md): Get video games tracking working\n\n## ⌨️ How to use?\n\n**NOTE**: The first user you register is automatically set as admin of the instance.\n\n### 🐳 Option 1: Use Docker\n\nTo get a demo server running, use the docker image:\n\n```bash\n$ docker run \\\n  --detach \\\n  --name ryot \\\n  --pull always \\\n  --publish 8000:8000 \\\n  --volume ./ryot/data:/data \\\n  --env \"WEB_INSECURE_COOKIE=true\" \\\n  ghcr.io/ignisda/ryot:latest\n```\n\n**NOTE**: The `WEB_INSECURE_COOKIE` is only required if you are not running HTTPs.\n\n### 📦 Option 2: Quick-run a release\n\nEach release has an installation script that can be used to install the `ryot`\nbinary. Follow the instructions in the release to use this script.\n\n**Alternatively** using [eget](https://github.com/zyedidia/eget):\n\n```bash\n$ eget ignisda/ryot\n```\n\n### 🧑‍💻Option 3: Compile and run from source\n\n- Install [moonrepo](https://moonrepo.dev/)\n\n```bash\n# Build the frontend\n$ moon run frontend:build\n\n# Run it\n$ cargo run --bin ryot --release\n```\n\n## 🔧 Configuration options\n\nYou can specify configuration options via files (loaded from `config/ryot.json`,\n`config/ryot.toml`, `config/ryot.yaml`) or via environment variables.\n\nTo set the equivalent environment variables, join keys by `_` (underscore) and\n*UPPER_SNAKE_CASE* the characters. For example, the key `audio_books.audible.url`\ncorresponds to the environment variable `AUDIO_BOOKS_AUDIBLE_URL`.\n\nRyot serves the final configuration loaded at the `/config` endpoint as JSON\n([example](https://ryot.fly.dev/config)).\n\n**Note**: You can see the defaults in the [config](/apps/backend/src/config.rs) builder. A\nminimal example configuration is in [`ryot.example.json`](/config/ryot.example.json).\n\n| Key                                   | Description                                                                                                                                                                   |\n| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `audio_books.audible.url`             | The url to make requests for getting metadata from Audible.                                                                                                                   |\n| `books.openlibrary.url`               | The url to make requests for getting metadata from Openlibrary.                                                                                                               |\n| `books.openlibrary.cover_image_url`   | The url for getting images from Openlibrary.                                                                                                                                  |\n| `books.openlibrary.cover_image_size`  | The image sizes to fetch from Openlibrary.                                                                                                                                    |\n| `database.url`                        | The database connection string. Supports SQLite, MySQL and Postgres.                                                                                                          |\n| `database.scdb_url`                   | The path where [SCDB](https://docs.rs/scdb) will persist its storage.                                                                                                         |\n| `file_storage.s3_access_key_id`       | The access key ID for the S3 compatible file storage.                                                                                                                         |\n| `file_storage.s3_bucket_name`         | The name of the S3 compatible bucket.                                                                                                                                         |\n| `file_storage.s3_secret_access_key`   | The secret access key for the S3 compatible file storage.                                                                                                                     |\n| `file_storage.s3_region`              | The region for the S3 compatible file storage.                                                                                                                                |\n| `file_storage.s3_url`                 | The URL for the S3 compatible file storage.                                                                                                                                   |\n| `{movies,shows}.tmdb.url`             | The url to make requests for getting metadata about shows/movies.                                                                                                             |\n| `{movies,shows}.tmdb.access_token`    | The access token for the TMDB API.                                                                                                                                            |\n| `podcasts.listennotes.url`            | The url to make requests for getting metadata about podcasts.                                                                                                                 |\n| `podcasts.listennotes.api_token`      | The access token for the Listennotes API.                                                                                                                                     |\n| `podcasts.listennotes.user_agent`     | The user agent used for the Listennotes API.                                                                                                                                  |\n| `scheduler.database_url`              | The url to the SQLite database where job related data needs to be stored.                                                                                                     |\n| `scheduler.user_cleanup_every`        | Deploy a job every x hours that performs user cleanup and summary calculation.                                                                                                |\n| `scheduler.rate_limit_num`            | The number of jobs to process every 5 seconds when updating metadata in the background.                                                                                       |\n| `video_games.twitch.client_id`        | The client ID issues by Twitch. **Required** to enable video games tracking. [More information](/docs/guides/video-games.md)                                                  |\n| `video_games.twitch.client_secret`    | The client secret issued by Twitch.                                                                                                                                           |\n| `video_games.twitch.access_token_url` | The endpoint that issues access keys for IGDB.                                                                                                                                |\n| `video_games.igdb.url`                | The url to make requests for getting metadata about video games.                                                                                                              |\n| `video_games.igdb.image_url`          | The url for getting images from IGDB.                                                                                                                                         |\n| `video_games.igdb.image_size`         | The image sizes to fetch from IGDB.                                                                                                                                           |\n| `users.allow_changing_username`       | Whether users will be allowed to change their username in their profile settings.                                                                                             |\n| `users.token_valid_for_days`          | The number of days till login auth token is valid.                                                                                                                            |\n| `web.cors_origins`                    | An array of URLs for CORS.                                                                                                                                                    |\n| `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](https://github.com/IgnisDa/ryot/issues/23#) |\n\n## 🤓 Developer notes\n\nIn production, the frontend is a pre-rendered Nextjs app served statically by the Axum\nbackend server.\n\nIn development, both servers are started independently running on `:3000` and `:8000`\nrespectively. To get them running, install [mprocs](https://github.com/pvolok/mprocs), and\nrun `mprocs` in the project root. If you do not want to install `mprocs`, take a look at\n[`mproc.yaml`](/mprocs.yaml) to see what all commands are needed to get it working.\n\nUnless it is a very small change, I prefer creating a separate branch and merging it via an\nMR when it is done. The changelog is generated using\n[git-chglog](https://github.com/git-chglog/git-chglog). Once all changes are done, run the\nfollowing command to update the changelog.\n\n```bash\n$ git-chglog --next-tag \u003ctag-name\u003e -o CHANGELOG.md\n```\n\n## 🙏 Acknowledgements\n\nIt is highly inspired by [MediaTracker](https://github.com/bonukai/MediaTracker). Moreover\nthanks to all those people whose stuff I have used.\n\nThe logo is taken from\n[Flaticon](https://www.flaticon.com/free-icon/mess_4789882?term=chaos\u0026page=1\u0026position=2\u0026origin=tag\u0026related_id=4789882).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstritt%2Fryot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstritt%2Fryot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstritt%2Fryot/lists"}