# NEWS ### 2025-05-05 We’ve added a new feature that lets you send requests **sequentially** to the backends instead of using the default **parallel** mode. This can be especially helpful if you have very large libraries, slow disks, or simply want to avoid overloading the backends with too many concurrent requests. You can enable by enabling `WS_HTTP_SYNC_REQUESTS` environment variable. This mode only applies to `import`, `export`, and `backup` tasks at the moment. Additionally, two command-line flags let you override the mode on the fly `--sync-requests` and `--async-requests`. We’ll be evaluating this feature, and if it proves effective (and the slowdown is acceptable), we may make **sequential** mode the default in a future release. So far from our testing, we’ve seen between 1.5x to 2.0x increase in import time when using the sequential mode. > [!NOTE] > Because we cache many HTTP requests, comparing timings between sequential and parallel runs of `import` can be > misleading. To get an accurate benchmark of `--sync-requests`, either start with a fresh setup (new installation) or > purge your Redis instance before testing. ### 2025-04-06 We have recently re-worked how the `backend:create` command works, and we no longer generate random name for invalid backends names or usernames. We do a normalization step to make sure the name is valid. This should help with the confusion of having random names. This means if you re-run the `backend:create` you most likely will get a different name than before. So, we suggest to re-run the command with `--re-create` flag. This flag will delete the current sub-users, and regenerate updated config files. We have also added new guard for the command, so if you already generated your sub-users, re-running the command will show you a warning message and exit without doing anything. to run the command again either you need to use `--re-create` or `--run` flag. The `--run` flag will run the command without deleting the current sub-users. ### 2025-03-13 We have recently added support for plex webhooks via tautulli which you can use if you don't have PlexPass. This should help close the gap with other media servers. ### 2025-02-19 We have introduced new experimental feature to allow syncing watch progress for played items. This feature is still in early stages, and might not work as expected. and there are probably still many bugs that we need to fix. Please report any issues you might face. The feature is disabled by default, to enable it you need to run add this environment variable `WS_PROGRESS_THRESHOLD` with seconds as value, the minimum value is `180` seconds. `0` seconds means it's disabled. We think reasonable value is `86400` or more this number is about 1day. We are still not keen on this feature, and it might be removed in future releases if we aren't able to deal with the issues we are facing. ### 2025-02-11 We recently have added support to generate accesstoken for external `Plex` users, i.e. `not home users`. so the `backends:create` command now supports generating the needed config files for external users. Beware the support for this is still in early stages, and might not work as expected. report any issues you might face. ### 2025-02-05 We have added initial support to browse the WebUI as sub user, it's still in early stages, only few Endpoints support it. We have also added support to webhooks to allow sub users, you simply have to add new hooks using `user@backend`. Please take look at [this FAQ](FAQ.md#how-to-add-webhooks) to learn how to use it for sub users. ### 2025-02-02 We are happy to announce that we have merged in direct support for multi-user in `state:import` and `state:export` commands and tasks. Therefore, `state:sync` command has been removed. Once you generate the sub users configs. it will start working alongside the main user. ### 2025-02-01 Breaking changes as of version 20250201~, in earlier versions, if you want to sync multi-user play state, you only had to run `state:sync` command, However, due to us extending support for more operation to support multi-user data, we needed a way to generate per user config instead of relying on `state:sync`, thus we have introduced a new command called `backends:create`, the purpose of this command is to generate the needed config files for each user. This change allow us to support more operations in the future. We also have minor breaking change in per user db name, before it was named `user_name.db`, now it's named `user.db` this change shouldn't effect you as we have backward compatibility in place to rename the old db to the new name. for more information about multi-user, Please read the FAQ entry about it at [this link](FAQ.md#is-there-support-for-multi-user-setup). ### 2025-01-24 We are excited to share that multi-user sync is now fully supported! Our first goal was to make sure the feature worked, and since releasing it, we’ve worked hard to improve it based on feedback and testing. We’re now confident that it works as expected and are happy to invite you to start using it. To learn more and get started, please check out the FAQ entry here: [this link](FAQ.md#is-there-support-for-multi-user-setup). ### 2025-01-18 Due to popular demand, we finally have added the ability to sync all users data, however, it's limited to only play state, no progress syncing implemented at this stage. This feature still in alpha expect bugs and issues. However our local tests shows that it's working as expected, but we need more testing to be sure. Please report any issues you encounter. To enable this feature, you will see new task in the `Tasks` page called `Sync`. This task will sync all your users play state, However you need to have the backends added with admin token for plex and API key for jellyfin and emby. Enable the task and let it run, it will sync all users play state. Please read the FAQ entry about it at [this link](FAQ.md#is-there-support-for-multi-user-setup). ### 2024-12-30 We have removed the old environment variables `WS_CRON_PROGRESS` and `WS_CRON_PUSH` in favor of the new ones `WS_SYNC_PROGRESS` and `WS_PUSH_ENABLED`. please update your environment variables accordingly. We have also added new FAQ entry about watch progress syncing via [this link](FAQ.md#sync-watch-progress). ### 2024-10-07 We have added a WebUI page for Custom GUIDs and stabilized on `v1.0` for the `guid.yaml` file spec. We strongly recommend to use the `WebUI` to manage the GUIDs, as it's much easier to use than editing the `guid.yaml` file directly. and both the `WebUI` and `API` have safeguards to prevent you from breaking the parser. For more information please check out the associated FAQ entry about it at [this link](FAQ.md#advanced-how-to-extend-the-guid-parser-to-support-more-guids-or-custom-ones). ### 2024-09-14 We have recently added support for extending WatchState with more GUIDs, as of now, the support for it is done via editing a`/config/guid.yaml` file in the config directory. We plan to hopefully add management via WebUI in near the future. For more information please check out the associated FAQ entry about it at [this link](FAQ.md#advanced-how-to-extend-the-guid-parser-to-support-more-guids-or-custom-ones). The mapping should work for all officially supported clients. If you have a client that is not supported, you have to manually add support for that client, or request the maintainer to add support for it. ### 2024-08-19 We have migrated the `state:push` task into the new events system, as such the old task `state:push` is now gone. To enable the new event handler for push events, use the new environment variable `WS_PUSH_ENABLED` and set it to `true`. Right now, it's disabled by default. However, for people who had the old task enabled, it will reuse that setting. Keep in mind, the new event handler is more efficient and will only push data when there is a change in the play state. And it's much faster than the old task. This event handler will push data within a minute of the change. PS: Please enable the task by setting its new environment variable `WS_PUSH_ENABLED` to `true`. The old `WS_CRON_PUSH` is now gone. and will be removed in the future releases. ### 2024-08-18 We have started migrating the old events system to a new one, so far we have migrated the `progress` and `requests` to it. As such, The old tasks `state:progress` and `state:requests` are now gone. To control if you want to enable the watch progress, there is new environment variable `WS_SYNC_PROGRESS` which you can set to `true` to enable the watch progress. It's disabled by default. We will continue to migrate the rest of the events to the new system, and we will keep you updated. ### 2024-08-10 I have recently added new experimental feature, to play your content directly from the WebUI. This feature is still in alpha, and missing a lot of features. But it's a start. Right now it does auto transcode on the fly to play any content in the browser. The feature requires that you mount your media directories to the `WatchState` container similar to the `File integrity` feature. I have plans to expand the feature to support more controls, however, right now it's only support basic subtitles streams and default audio stream or first audio stream. The transcoder works by converting the media on the fly to `HLS` segments, and the subtitles are selectable via the player ui which are also converted to `vtt` format. Expects bugs and issues, as the feature is still in alpha. But I would love to hear your feedback. You can play the media by visiting the history page of the item you will see red play button on top right corner of the page. If the items has a play button, then you correctly mounted the media directories. otherwise, the button be disabled with tooltip of `Media is inaccessible`. The feature is not meant to replace your backend media player, the purpose of this feature is to quickly check the media without leaving the WebUI. ### 2024-08-01 We recently enabled listening on tls connections via `8443` which can be controlled by `HTTPS_PORT` environment variable. Before today, we simply only exposed the port via the `Dockerfile`, but we weren't listening for connections on it. However, please keep in mind that the certificate is self-signed, and you might get a warning from your browser. You can either accept the warning or add the certificate to your trusted certificates. We strongly recommend using a reverse proxy. instead of relying on self-signed certificates. ### 2024-07-22 We have recently added a new WebUI feature, `File integrity`, this feature will help you to check if your media backends are reporting files that are not available on the disk. This feature is still in alpha, and we are working on improving it. This feature `REQUIRES` that you mount your media directories to the `WatchState` container preferably as readonly. There is plans to add a path replacement feature to allow you change the pathing, but it's not implemented yet. This feature will work on both local and remote cloud storages provided they are mounted into the container. We also may recommend not to use this feature depending on how your cloud storage provider treats file stat calls. As it might lead to unnecessary money spending. and of course it will be slower. For more information about how we cache the stat calls, please refer to the [FAQ](FAQ.md#How-does-the-file-integrity-feature-works). ### 2024-07-06 Recently we have introduced a new feature that allows you to use Jellyfin and Emby OAuth access tokens for syncing your play state. This is especially handy if you're not the server owner and can't create API keys. Please note, this feature is in its experimental phase, so you might encounter some issues as we yet to explorer the full depth of the implementation. We're actively working on making it better, If you have any feedback or suggestions, please let us know. Getting your OAuth token is easy. When prompted, simply enter your `username:password` in place of the API key through the `WebUI` or the `config:add/manage` command. `WatchState` will automatically contact the backend and generate the token for you, as this step is required to get more information like your `User ID` which is sadly inaccessible without us generating the token. Both Emby & Jellyfin doesn't provide an API endpoint to inquiry about the current user. We have also added new `config:test` command to run functional tests on your backends, this will not alter your state, And it's quite useful to know if the tool is able to communicate with your backends. without problems, It will report the following, `OK` which mean the indicated test has passed, `FA` which mean the indicated test has failed. And `SK` which mean the indicated test has been skipped or not yet implemented. ### 2024-06-23 WE are happy to announce that the `WebUI` is ready for wider usage and we are planning to release it in the next few months. We are actively working on it to improve it. If you have any feedback or suggestions, please let us know. We feel it's almost future complete for the things that we want. On another related news, we have added new environment variable `WS_API_AUTO` "disabled by default" which can be used to automatically expose your **API KEY/TOKEN**. This is useful for users who are using the `WebUI` from many different browsers and want to automate the configuration process. While the `WebUI` is included in the main project, it's a standalone feature and requires the API settings to be configured before it can be used. This environment variable can be enabled by setting `WS_API_AUTO=true` in `${WS_DATA_PATH}/config/.env`. > [!IMPORTANT] > This environment variable is **GREAT SECURITY RISK**, and we strongly recommend not to use it if `WatchState` is > exposed to the internet. ### 2024-05-14 We are happy to announce the beta testing of the `WebUI`. To get started on using it you just need to visit the url `http://localhost:8080` We are supposed to enabled it by default tomorrow, but we decided to give you a head start. We are looking forward to your feedback. If you don't use the `WebUI` then you need to add the environment variable `WEBUI_ENABLED=0` in your `compose.yaml` file. and restart the container. ### 2024-05-13 In preparation for the beta testing of `WebUI` in two days, we have made little breaking change, we have changed the environment variable `WS_WEBUI_ENABLED` to just `WEBUI_ENABLED`, We made this change to make sure people don't disable the `WebUI`by mistake via the environment page in the `WebUI`. The `WebUI` will be enabled by default, in two days from now, to disable it from now add `WEBUI_ENABLED=false` to your `compose.yaml` file. As this environment variable is system level, it cannot be set via `.env` file. Note: `WS_WEBUI_ENABLED` will be gone in few weeks, However it will still work for now, if `WEBUI_ENABLED` is not set. ### 2024-05-05 **Edit** - We received requests that people are exposing watchstate externally, and there was concern that having open webhook endpoints might lead to abuse. As such, we have added a new environment variable `WS_SECURE_API_ENDPOINTS`. Simply set the environment variable to `1` to secure the webhook endpoint. This means you have to add `?apikey=yourapikey` to the end of the webhook endpoint. ----- We are deprecating the use of the following environment variables `WS_DISABLE_HTTP`, `WS_DISABLE_CRON`, `WS_DISABLE_CACHE`, and replacing them with `DISABLE_CACHE`, `DISABLE_CRON`, `DISABLE_HTTP`. The old environment variables will be removed in the future versions. It doesn't make sense to mark them as `WS_` since they are global and do not relate to the tool itself. And they must be set from the `compose.yaml` file itself. ### 2024-05-04 The new webhook endpoint no longer requires a key, and it's now open to public you just need to specify the backend name. ### 2024-04-30 - [BREAKING CHANGE] We are going to retire the old webhooks endpoint, please refer to the [FAQ](FAQ.md#how-to-add-webhooks) to know how to update to the new API endpoint. We are going to include `WebUI` for alpha testing after two weeks from today `2024-05-15`. Which most likely means the old webhooks endpoint will be removed. We will try to preserve the old endpoint for a while, but it's not guaranteed we will be able to. ### 2024-03-08 This update include breaking changes to how we process commands, we have streamlined the command interface to accept some consistent flags and options. Notably, we have added `-s, --select-backend` flag to all commands that accept it. commands that were accepting comma separated list of backends now needs to be separate option call for example `--select-backend home_plex --select-backend home_jellyfin` instead of `--select-backend home_plex,home_jellyfin`. All commands that was accepting backend name as argument now accepts `-s, --select-backend` flag. This change is to make the command interface more consistent and easier to use. Another breaking change is the removal of the `-c, --config` flag from all commands that was accepting it. This flag was used to override the default `servers.yaml` file. This was not working as expected as there are more than just the `servers.yaml` to consider like, the state of cache, and the state of the database. As such, we have removed this flag. However, we have added a new environment variable called `WS_BACKENDS_FILE` which can be used to override the default `servers.yaml` file. We strongly recommend not to use it as it might lead to unexpected behavior. We started working on a `Web API` which hopefully will lead to a `web frontend` to manage the tool. This is a long term goal, and it's not expected to be ready soon. However, the `Web API` is expected within 3rd quarter of 2024. ### 2023-11-11 We added new feature `watch progress tracking` YAY which works exclusively via webhooks at the moment to keep tracking of your play progress. As this feature is quite **EXPERIMENTAL** we have separate command and task for it `state:progress` will send back progress to your backends. However, Sadly this feature is not working at the moment with `Jellyfin` once they accept my [PR #10573](https://github.com/jellyfin/jellyfin/pull/10573) i'll add support for it. However, The feature works well with both `Plex` and `Emby`. The support via `webhooks` is excellent, and it's the recommended way to track your progress. However, if you cant use webhooks, the `state:import` command will pull the progress from your backends. however at reduced rate due to the nature of the command. If you want faster progress tracking, you should use `webhooks`. To sync the progress update, You have to use `state:progress` command, it will push the update to all `export` enabled backends. This feature is disabled by default like the other features. To enable it add new environment variable called`WS_CRON_PROGRESS=1`. We push progress update every `45 minutes`, to change it like other features add `WS_CRON_PROGRESS_AT="*/45 * * * *"` This is the default timer. On another point, we have decided to enable backup by default. To disable it simply add new environment variable `WS_CRON_BACKUP=0`. ### 2023-10-31 We added new command called `db:parity` which will check if your backends are reporting the same data.