Browse Source

Merge remote-tracking branch 'refs/remotes/origin/staging' into staging

Kristian Vos 2 years ago
parent
commit
20236f9bf0
12 changed files with 554 additions and 352 deletions
  1. 7 0
      .markdownlint.json
  2. 7 2
      .wiki/Backend_Commands.md
  3. 125 116
      .wiki/Configuration.md
  4. 74 35
      .wiki/Installation.md
  5. 10 4
      .wiki/Technical_Overview.md
  6. 30 13
      .wiki/Upgrading.md
  7. 13 3
      .wiki/Utility_Script.md
  8. 62 55
      .wiki/Value_Formats.md
  9. 156 65
      CHANGELOG.md
  10. 62 55
      README.md
  11. 7 3
      SECURITY.md
  12. 1 1
      frontend/src/main.js

+ 7 - 0
.markdownlint.json

@@ -0,0 +1,7 @@
+{
+    "MD013": {
+        "tables": false
+    },
+    "MD024": false,
+    "MD041": false 
+}

+ 7 - 2
.wiki/Backend_Commands.md

@@ -1,7 +1,10 @@
 # Backend Commands
-Backend commands are inputted via STDIN or if using the Utility Script by using `./musare.sh attach backend`.
+
+Backend commands are inputted via STDIN or if using the Utility Script by using
+`./musare.sh attach backend`.
 
 ## Commands
+
 | Command | Parameters | Description |
 | --- | --- | --- |
 | `rs` | | Restart backend. |
@@ -17,7 +20,9 @@ Backend commands are inputted via STDIN or if using the Utility Script by using
 | `stats` | `module` | Returns job statistics for a specified module. |
 
 ## Modules
-When specifying a module please use all lowercase. The available modules are as follows:
+
+When specifying a module please use all lowercase.
+The available modules are as follows:
 
 - Cache
 - DB

+ 125 - 116
.wiki/Configuration.md

@@ -4,94 +4,94 @@
 
 Location: `backend/config/default.json`
 
-| Property                                           | Description                                                                                                                                                                                                          |
-| -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `mode`                                             | Should be either `development` or `production`.                                                                                                                                                                      |
-| `migration`                                        | Should be set to `true` if you need to update MongoDB documents to a newer version after an update. Should be false at all other times.                                                                              |
-| `secret`                                           | Set to something unique and secure - used by express's session module.                                                                                                                                               |
-| `domain`                                           | Should be the url where the site will be accessible from, usually `http://localhost` for non-Docker.                                                                                                                 |
-| `serverDomain`                                     | Should be the url where the backend will be accessible from, usually `http://localhost/backend` for docker or `http://localhost:8080` for non-Docker.                                                                |
-| `serverPort`                                       | Should be the port where the backend will listen on, should always be `8080` for Docker, and is recommended for non-Docker.                                                                                          |
-| `registrationDisabled`                             | If set to true, users can't register accounts.                                                                                                                                                                       |
-| `sendDataRequestEmails`                            | If `true` all admin users will be sent an email if a data request is received.                                                                                                                                       |
-| `apis.youtube.key`                                 | YouTube Data API v3 key, obtained from [here](https://developers.google.com/youtube/v3/getting-started).                                                                                                             |
-| `apis.youtube.rateLimit`                           | Minimum interval between YouTube API requests in milliseconds.                                                                                                                                                       |
-| `apis.youtube.requestTimeout`                      | YouTube API requests timeout in milliseconds.                                                                                                                                                                        |
-| `apis.youtube.retryAmount`                         | The amount of retries to perform of a failed YouTube API request.                                                                                                                                                    |
-| `apis.youtube.quotas`                              | Array of YouTube API quotas.                                                                                                                                                                                         |
-| `apis.youtube.quotas.type`                         | YouTube API quota type, should be one of `QUERIES_PER_DAY`, `QUERIES_PER_MINUTE` or `QUERIES_PER_100_SECONDS`.                                                                                                       |
-| `apis.youtube.quotas.title`                        | YouTube API quota title.                                                                                                                                                                                             |
-| `apis.youtube.quotas.limit`                        | YouTube API quota limit.                                                                                                                                                                                             |
-| `apis.recaptcha.secret`                            | ReCaptcha Site v3 secret, obtained from [here](https://www.google.com/recaptcha/admin).                                                                                                                              |
-| `apis.recaptcha.enabled`                           | Whether to enable ReCaptcha at email registration.                                                                                                                                                                   |
-| `apis.github.client`                               | GitHub OAuth Application client, obtained from [here](https://github.com/settings/developers).                                                                                                                       |
-| `apis.github.secret`                               | GitHub OAuth Application secret, obtained with client.                                                                                                                                                               |
-| `apis.github.redirect_uri`                         | The authorization callback url is the backend url with `/auth/github/authorize/callback` appended, for example `http://localhost/backend/auth/github/authorize/callback`.                                            |
-| `apis.discogs.client`                              | Discogs Application client, obtained from [here](https://www.discogs.com/settings/developers).                                                                                                                       |
-| `apis.discogs.secret`                              | Discogs Application secret, obtained with client.                                                                                                                                                                    |
-| `apis.discogs.enabled`                             | Whether to enable Discogs API usage.                                                                                                                                                                                 |
-| `cors.origin`                                      | Array of allowed request origin urls, for example `http://localhost`.                                                                                                                                                |
-| `smtp.host`                                        | SMTP Host                                                                                                                                                                                                            |
-| `smtp.port`                                        | SMTP Port                                                                                                                                                                                                            |
-| `smtp.auth.user`                                   | SMTP Username                                                                                                                                                                                                        |
-| `smtp.auth.pass`                                   | SMTP Password                                                                                                                                                                                                        |
-| `smtp.secure`                                      | Whether SMTP is secured.                                                                                                                                                                                             |
-| `smtp.enabled`                                     | Whether SMTP and sending emails is enabled.                                                                                                                                                                          |
-| `mail.from`                                        | The from field for mails sent from backend.                                                                                                                                                                          |
-| `redis.url`                                        | Should be left as default for Docker installations, else changed to `redis://localhost:6379/0`.                                                                                                                      |
-| `redis.password`                                   | Redis password.                                                                                                                                                                                                      |
-| `mongo.url`                                        | For Docker replace temporary MongoDB musare user password with one specified in `.env`, and for non-Docker replace `@musare:27017` with `@localhost:27017`.                                                          |
-| `cookie.domain`                                    | The ip or address you use to access the site, without protocols (http/https), so for example `localhost`.                                                                                                            |
-| `cookie.secure`                                    | Should be `true` for SSL connections, and `false` for normal http connections.                                                                                                                                       |
-| `cookie.SIDname`                                   | Name of the cookie stored for sessions.                                                                                                                                                                              |
-| `blacklistedCommunityStationNames `                | Array of blacklisted community station names.                                                                                                                                                                        |
-| `featuredPlaylists `                               | Array of featured playlist id's. Playlist privacy must be public.                                                                                                                                                    |
-| `skipConfigVersionCheck`                           | Skips checking if the config version is outdated or not. Should almost always be set to false.                                                                                                                       |
-| `skipDbDocumentsVersionCheck`                      | Skips checking if there are any DB documents outdated or not. Should almost always be set to false.                                                                                                                  |
-| `debug.stationIssue`                               | If set to `true` it will enable the `/debug_station` API endpoint on the backend, which provides information useful to debugging stations not skipping, as well as capure all jobs specified in `debug.captureJobs`. |
-| `debug.traceUnhandledPromises`                     | Enables the trace-unhandled package, which provides detailed information when a promise is unhandled.                                                                                                                |
-| `debug.captureJobs`                                | Array of jobs to capture for `debug.stationIssue`.                                                                                                                                                                   |
-| `defaultLogging.hideType`                          | Filters out specified message types from log, for example `INFO`, `SUCCESS`, `ERROR` and `STATION_ISSUE`.                                                                                                            |
-| `defaultLogging.blacklistedTerms`                  | Filters out messages containing specified terms from log, for example `success`.                                                                                                                                     |
-| `customLoggingPerModule.[module].hideType`         | Where `[module]` is a module name specify hideType as you would `defaultLogging.hideType` to overwrite default.                                                                                                      |
-| `customLoggingPerModule.[module].blacklistedTerms` | Where `[module]` is a module name specify blacklistedTerms as you would `defaultLogging.blacklistedTerms` to overwrite default.                                                                                      |
-| `configVersion`                                    | Version of the config. Every time the template changes, you should change your config accordingly and update the configVersion.                                                                                      |
+| Property | Description |
+| --- | --- |
+| `mode` | Should be either `development` or `production`. |
+| `migration` | Should be set to `true` if you need to update MongoDB documents to a newer version after an update. Should be false at all other times. |
+| `secret` | Set to something unique and secure - used by express's session module. |
+| `domain` | Should be the url where the site will be accessible from, usually `http://localhost` for non-Docker. |
+| `serverDomain` | Should be the url where the backend will be accessible from, usually `http://localhost/backend` for docker or `http://localhost:8080` for non-Docker. |
+| `serverPort` | Should be the port where the backend will listen on, should always be `8080` for Docker, and is recommended for non-Docker. |
+| `registrationDisabled` | If set to true, users can't register accounts. |
+| `sendDataRequestEmails` | If `true` all admin users will be sent an email if a data request is received. |
+| `apis.youtube.key` | YouTube Data API v3 key, obtained from [here](https://developers.google.com/youtube/v3/getting-started). |
+| `apis.youtube.rateLimit` | Minimum interval between YouTube API requests in milliseconds. |
+| `apis.youtube.requestTimeout` | YouTube API requests timeout in milliseconds. |
+| `apis.youtube.retryAmount` | The amount of retries to perform of a failed YouTube API request. |
+| `apis.youtube.quotas` | Array of YouTube API quotas. |
+| `apis.youtube.quotas.type` | YouTube API quota type, should be one of `QUERIES_PER_DAY`, `QUERIES_PER_MINUTE` or `QUERIES_PER_100_SECONDS`. |
+| `apis.youtube.quotas.title` | YouTube API quota title. |
+| `apis.youtube.quotas.limit` | YouTube API quota limit. |
+| `apis.recaptcha.secret` | ReCaptcha Site v3 secret, obtained from [here](https://www.google.com/recaptcha/admin). |
+| `apis.recaptcha.enabled` | Whether to enable ReCaptcha at email registration. |
+| `apis.github.client` | GitHub OAuth Application client, obtained from [here](https://github.com/settings/developers). |
+| `apis.github.secret` | GitHub OAuth Application secret, obtained with client. |
+| `apis.github.redirect_uri` | The authorization callback url is the backend url with `/auth/github/authorize/callback` appended, for example `http://localhost/backend/auth/github/authorize/callback`. |
+| `apis.discogs.client` | Discogs Application client, obtained from [here](https://www.discogs.com/settings/developers). |
+| `apis.discogs.secret` | Discogs Application secret, obtained with client. |
+| `apis.discogs.enabled` | Whether to enable Discogs API usage. |
+| `cors.origin` | Array of allowed request origin urls, for example `http://localhost`. |
+| `smtp.host` | SMTP Host |
+| `smtp.port` | SMTP Port |
+| `smtp.auth.user` | SMTP Username |
+| `smtp.auth.pass` | SMTP Password |
+| `smtp.secure` | Whether SMTP is secured. |
+| `smtp.enabled` | Whether SMTP and sending emails is enabled. |
+| `mail.from` | The from field for mails sent from backend. |
+| `redis.url` | Should be left as default for Docker installations, else changed to `redis://localhost:6379/0`. |
+| `redis.password` | Redis password. |
+| `mongo.url` | For Docker replace temporary MongoDB musare user password with one specified in `.env`, and for non-Docker replace `@musare:27017` with `@localhost:27017`. |
+| `cookie.domain` | The ip or address you use to access the site, without protocols (http/https), so for example `localhost`. |
+| `cookie.secure` | Should be `true` for SSL connections, and `false` for normal http connections. |
+| `cookie.SIDname` | Name of the cookie stored for sessions. |
+| `blacklistedCommunityStationNames` | Array of blacklisted community station names. |
+| `featuredPlaylists` | Array of featured playlist id's. Playlist privacy must be public. |
+| `skipConfigVersionCheck` | Skips checking if the config version is outdated or not. Should almost always be set to false. |
+| `skipDbDocumentsVersionCheck` | Skips checking if there are any DB documents outdated or not. Should almost always be set to false. |
+| `debug.stationIssue` | If set to `true` it will enable the `/debug_station` API endpoint on the backend, which provides information useful to debugging stations not skipping, as well as capure all jobs specified in `debug.captureJobs`.
+| `debug.traceUnhandledPromises` | Enables the trace-unhandled package, which provides detailed information when a promise is unhandled. |
+| `debug.captureJobs` | Array of jobs to capture for `debug.stationIssue`. |
+| `defaultLogging.hideType` | Filters out specified message types from log, for example `INFO`, `SUCCESS`, `ERROR` and `STATION_ISSUE`. |
+| `defaultLogging.blacklistedTerms` | Filters out messages containing specified terms from log, for example `success`. |
+| `customLoggingPerModule.[module].hideType` | Where `[module]` is a module name specify hideType as you would `defaultLogging.hideType` to overwrite default. |
+| `customLoggingPerModule.[module].blacklistedTerms` | Where `[module]` is a module name specify blacklistedTerms as you would `defaultLogging.blacklistedTerms` to overwrite default. |
+| `configVersion` | Version of the config. Every time the template changes, you should change your config accordingly and update the configVersion. |
 
 ## Frontend
 
 Location: `frontend/dist/config/default.json`
 
-| Property                            | Description                                                                                                                                                                                                                                |
-| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `mode`                              | Should be either `development` or `production`.                                                                                                                                                                                            |
-| `backend.apiDomain`                 | Should be the url where the backend will be accessible from, usually `http://localhost/backend` for docker or `http://localhost:8080` for non-Docker.                                                                                      |
-| `backend.websocketsDomain`          | Should be the same as the `apiDomain`, except using the `ws://` protocol instead of `http://` and with `/ws` at the end.                                                                                                                   |
-| `devServer.hmrClientPort`           | Should be the port on which the frontend will be accessible from, usually port `80`, or `443` if using SSL. Only used when running in dev mode.                                                                                            |
-| `devServer.port`                    | Should be the port where Vite's dev server will be accessible from, should always be port `81` for Docker since nginx listens on port 80, and is recommended to be port `80` for non-Docker. Only used when running in dev mode.           |
-| `frontendDomain`                    | Should be the url where the frontend will be accessible from, usually `http://localhost` for docker or `http://localhost:80` for non-Docker.                                                                                               |
-| `recaptcha.key`                     | ReCaptcha Site v3 key, obtained from [here](https://www.google.com/recaptcha/admin).                                                                                                                                                       |
-| `recaptcha.enabled`                 | Whether to enable ReCaptcha at email registration.                                                                                                                                                                                         |
-| `cookie.domain`                     | Should be the ip or address you use to access the site, without protocols (http/https), so for example `localhost`.                                                                                                                        |
-| `cookie.secure`                     | Should be `true` for SSL connections, and `false` for normal http connections.                                                                                                                                                             |
-| `cookie.SIDname`                    | Name of the cookie stored for sessions.                                                                                                                                                                                                    |
-| `siteSettings.logo_white`           | Path to the white logo image, by default it is `/assets/white_wordmark.png`.                                                                                                                                                               |
-| `siteSettings.logo_blue`            | Path to the blue logo image, by default it is `/assets/blue_wordmark.png`.                                                                                                                                                                 |
-| `siteSettings.logo_small`           | Path to the small white logo image, by default it is `/assets/favicon/mstile-144x144.png`.                                                                                                                                                 |
-| `siteSettings.sitename`             | Should be the name of the site.                                                                                                                                                                                                            |
-| `siteSettings.footerLinks`          | Add custom links to footer by specifying `"title": "url"`, e.g. `"GitHub": "https://github.com/Musare/Musare"`. You can disable about, team and news links (but not the pages themselves) by setting them to false, e.g. `"about": false`. |
-| `siteSettings.mediasession`         | Whether to enable mediasession functionality.                                                                                                                                                                                              |
-| `siteSettings.christmas`            | Whether to enable christmas theming.                                                                                                                                                                                                       |
-| `siteSettings.registrationDisabled` | If set to true, users can't register accounts.                                                                                                                                                                                             |
-| `messages.accountRemoval`           | Message to return to users on account removal.                                                                                                                                                                                             |
-| `shortcutOverrides`                 | Overwrite keyboard shortcuts, for example `"editSong.useAllDiscogs": { "keyCode": 68, "ctrl": true, "alt": true, "shift": false, "preventDefault": true }`.                                                                                |
-| `debug.git.remote`                  | Allow the website/users to view the current Git repository's remote. [^1]                                                                                                                                                                  |
-| `debug.git.remoteUrl`               | Allow the website/users to view the current Git repository's remote URL. [^1]                                                                                                                                                              |
-| `debug.git.branch`                  | Allow the website/users to view the current Git repository's branch. [^1]                                                                                                                                                                  |
-| `debug.git.latestCommit`            | Allow the website/users to view the current Git repository's latest commit hash. [^1]                                                                                                                                                      |
-| `debug.git.latestCommitShort`       | Allow the website/users to view the current Git repository's latest commit hash (short). [^1]                                                                                                                                              |
-| `debug.version`                     | Allow the website/users to view the current package.json version. [^1]                                                                                                                                                                     |
-| `skipConfigVersionCheck`            | Skips checking if the config version is outdated or not. Should almost always be set to false.                                                                                                                                             |
-| `configVersion`                     | Version of the config. Every time the template changes, you should change your config accordingly and update the configVersion.                                                                                                            |
+| Property | Description |
+| --- | --- |
+| `mode` | Should be either `development` or `production`. |
+| `backend.apiDomain` | Should be the url where the backend will be accessible from, usually `http://localhost/backend` for docker or `http://localhost:8080` for non-Docker. |
+| `backend.websocketsDomain` | Should be the same as the `apiDomain`, except using the `ws://` protocol instead of `http://` and with `/ws` at the end. |
+| `devServer.hmrClientPort` | Should be the port on which the frontend will be accessible from, usually port `80`, or `443` if using SSL. Only used when running in dev mode. |
+| `devServer.port` | Should be the port where Vite's dev server will be accessible from, should always be port `81` for Docker since nginx listens on port 80, and is recommended to be port `80` for non-Docker. Only used when running in dev mode. |
+| `frontendDomain` | Should be the url where the frontend will be accessible from, usually `http://localhost` for docker or `http://localhost:80` for non-Docker. |
+| `recaptcha.key` | ReCaptcha Site v3 key, obtained from [here](https://www.google.com/recaptcha/admin). |
+| `recaptcha.enabled` | Whether to enable ReCaptcha at email registration. |
+| `cookie.domain` | Should be the ip or address you use to access the site, without protocols (http/https), so for example `localhost`. |
+| `cookie.secure` | Should be `true` for SSL connections, and `false` for normal http connections. |
+| `cookie.SIDname` | Name of the cookie stored for sessions. |
+| `siteSettings.logo_white` | Path to the white logo image, by default it is `/assets/white_wordmark.png`. |
+| `siteSettings.logo_blue` | Path to the blue logo image, by default it is `/assets/blue_wordmark.png`. |
+| `siteSettings.logo_small` | Path to the small white logo image, by default it is `/assets/favicon/mstile-144x144.png`. |
+| `siteSettings.sitename` | Should be the name of the site. |
+| `siteSettings.footerLinks` | Add custom links to footer by specifying `"title": "url"`, e.g. `"GitHub": "https://github.com/Musare/Musare"`. You can disable about, team and news links (but not the pages themselves) by setting them to false, e.g. `"about": false`. |
+| `siteSettings.mediasession` | Whether to enable mediasession functionality. |
+| `siteSettings.christmas` | Whether to enable christmas theming. |
+| `siteSettings.registrationDisabled` | If set to true, users can't register accounts. |
+| `messages.accountRemoval` | Message to return to users on account removal. |
+| `shortcutOverrides` | Overwrite keyboard shortcuts, for example `"editSong.useAllDiscogs": { "keyCode": 68, "ctrl": true, "alt": true, "shift": false, "preventDefault": true }`. |
+| `debug.git.remote` | Allow the website/users to view the current Git repository's remote. [^1] |
+| `debug.git.remoteUrl` | Allow the website/users to view the current Git repository's remote URL. [^1] |
+| `debug.git.branch` | Allow the website/users to view the current Git repository's branch. [^1] |
+| `debug.git.latestCommit` | Allow the website/users to view the current Git repository's latest commit hash. [^1] |
+| `debug.git.latestCommitShort` | Allow the website/users to view the current Git repository's latest commit hash (short). [^1] |
+| `debug.version` | Allow the website/users to view the current package.json version. [^1] |
+| `skipConfigVersionCheck` | Skips checking if the config version is outdated or not. Should almost always be set to false. |
+| `configVersion` | Version of the config. Every time the template changes, you should change your config accordingly and update the configVersion. |
 
 [^1]: Requires a frontend restart to update. The data will be available from the frontend console and by the frontend code.
 
@@ -99,48 +99,57 @@ Location: `frontend/dist/config/default.json`
 
 Location: `.env`
 
-In the table below the container host refers to the IP address that the docker container listens on, setting this to `127.0.0.1` for example will only expose the configured port to localhost, whereas setting to `0.0.0.0` will expose the port on all interfaces.
-
-The container port refers to the external docker container port, used to access services within the container. Changing this does not require any changes to configuration within container. For example setting the `MONGO_PORT` to `21018` will allow you to access the mongo service through that port, even though the application within the container is listening on `21017`.
-
-| Property               | Description                                                                                                                                   |
-| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| `COMPOSE_PROJECT_NAME` | Should be a unique name for this installation, especially if you have multiple instances of Musare on the same machine.                       |
-| `RESTART_POLICY`       | Restart policy for docker containers, values can be found [here](https://docs.docker.com/config/containers/start-containers-automatically/).  |
-| `CONTAINER_MODE`       | Should be either `prod` or `dev`.                                                                                                             |
-| `DOCKER_COMMAND`       | Should be either `docker` or `podman`.                                                                                                        |
-| `BACKEND_HOST`         | Backend container host.                                                                                                                       |
-| `BACKEND_PORT`         | Backend container port.                                                                                                                       |
-| `FRONTEND_HOST`        | Frontend container host.                                                                                                                      |
-| `FRONTEND_PORT`        | Frontend container port.                                                                                                                      |
-| `FRONTEND_MODE`        | Should be either `prod` or `dev`.                                                                                                             |
-| `MONGO_HOST`           | Mongo container host.                                                                                                                         |
-| `MONGO_PORT`           | Mongo container port.                                                                                                                         |
-| `MONGO_ROOT_PASSWORD`  | Password of the root/admin user for MongoDB.                                                                                                  |
-| `MONGO_USER_USERNAME`  | Application username for MongoDB.                                                                                                             |
-| `MONGO_USER_PASSWORD`  | Application password for MongoDB.                                                                                                             |
-| `MONGO_DATA_LOCATION`  | The location where MongoDB stores its data. Usually the `.db` folder inside the `Musare` folder.                                              |
-| `MONGO_VERSION`        | The MongoDB version to use for scripts and docker-compose. Must be numerical. Currently supported MongoDB versions are 4.0, 4.2, 4.4 and 5.0. |
-| `REDIS_HOST`           | Redis container host.                                                                                                                         |
-| `REDIS_PORT`           | Redis container port.                                                                                                                         |
-| `REDIS_PASSWORD`       | Redis password.                                                                                                                               |
-| `REDIS_DATA_LOCATION`  | The location where Redis stores its data. Usually the `.redis` folder inside the `Musare` folder.                                             |
-| `BACKUP_LOCATION`      | Directory to store musare.sh backups. Defaults to `/backups` in script location.                                                              |
-| `BACKUP_NAME`          | Name of musare.sh backup files. Defaults to `musare-$(date +"%Y-%m-%d-%s").dump`.                                                             |
+In the table below the container host refers to the IP address that the docker
+container listens on, setting this to `127.0.0.1` for example will only expose
+the configured port to localhost, whereas setting to `0.0.0.0` will expose the
+port on all interfaces.
+
+The container port refers to the external docker container port, used to access
+services within the container. Changing this does not require any changes to
+configuration within container. For example setting the `MONGO_PORT` to `21018`
+will allow you to access the mongo service through that port, even though the
+application within the container is listening on `21017`.
+
+| Property | Description |
+| --- | --- |
+| `COMPOSE_PROJECT_NAME` | Should be a unique name for this installation, especially if you have multiple instances of Musare on the same machine. |
+| `RESTART_POLICY` | Restart policy for docker containers, values can be found [here](https://docs.docker.com/config/containers/start-containers-automatically/). |
+| `CONTAINER_MODE` | Should be either `prod` or `dev`.  |
+| `DOCKER_COMMAND` | Should be either `docker` or `podman`.  |
+| `BACKEND_HOST` | Backend container host. |
+| `BACKEND_PORT` | Backend container port. |
+| `FRONTEND_HOST` | Frontend container host. |
+| `FRONTEND_PORT` | Frontend container port. |
+| `FRONTEND_MODE` | Should be either `prod` or `dev`. |
+| `MONGO_HOST` | Mongo container host. |
+| `MONGO_PORT` | Mongo container port. |
+| `MONGO_ROOT_PASSWORD` | Password of the root/admin user for MongoDB. |
+| `MONGO_USER_USERNAME` | Application username for MongoDB. |
+| `MONGO_USER_PASSWORD` | Application password for MongoDB. |
+| `MONGO_DATA_LOCATION` | The location where MongoDB stores its data. Usually the `.db` folder inside the `Musare` folder. |
+| `MONGO_VERSION` | The MongoDB version to use for scripts and docker-compose. Must be numerical. Currently supported MongoDB versions are 4.0, 4.2, 4.4 and 5.0. |
+| `REDIS_HOST` | Redis container host. |
+| `REDIS_PORT` | Redis container port. |
+| `REDIS_PASSWORD` | Redis password. |
+| `REDIS_DATA_LOCATION` | The location where Redis stores its data. Usually the `.redis` folder inside the `Musare` folder. |
+| `BACKUP_LOCATION` | Directory to store musare.sh backups. Defaults to `/backups` in script location. |
+| `BACKUP_NAME` | Name of musare.sh backup files. Defaults to `musare-$(date +"%Y-%m-%d-%s").dump`. |
 
 ## Docker-compose override
 
-You may want to override the docker-compose files in some specific cases. For this, you can create a `docker-compose.override.yml` file.
+You may want to override the docker-compose files in some specific cases.
+For this, you can create a `docker-compose.override.yml` file.  
 
 ### Run backend on its own domain
 
-One example usecase for the override is to expose the backend port so you can run it separately from the frontend. An example file for this is as follows:
+One example usecase for the override is to expose the backend port so you can
+run it separately from the frontend. An example file for this is as follows:
 
 ```yml
 services:
-    backend:
-        ports:
-            - "${BACKEND_HOST}:${BACKEND_PORT}:8080"
+  backend:
+    ports:
+      - "${BACKEND_HOST}:${BACKEND_PORT}:8080"
 ```
 
 This assumes that you have also set `BACKEND_PORT` inside your `.env` file.

+ 74 - 35
.wiki/Installation.md

@@ -1,6 +1,7 @@
 # Installation
 
-Musare can be installed with Docker (recommended) or without, guides for both installations can be found below.
+Musare can be installed with Docker (recommended) or without, guides for both
+installations can be found below.
 
 To update an existing installation please see [Upgrading](./Upgrading.md).
 
@@ -8,30 +9,36 @@ To update an existing installation please see [Upgrading](./Upgrading.md).
 
 ### Dependencies
 
--   [Git](https://github.com/git-guides/install-git)
--   [Docker](https://docs.docker.com/get-docker/)
--   [docker-compose](https://docs.docker.com/compose/install/)
+- [Git](https://github.com/git-guides/install-git)
+- [Docker](https://docs.docker.com/get-docker/)
+- [docker-compose](https://docs.docker.com/compose/install/)
 
 ### Instructions
 
 1. `git clone https://github.com/Musare/Musare.git`
 2. `cd Musare`
-3. `cp backend/config/template.json backend/config/default.json` and configure as per [Configuration](./Configuration.md#Backend)
-4. `cp frontend/dist/config/template.json frontend/dist/config/default.json` and configure as per [Configuration](./Configuration.md#Frontend)
-5. `cp .env.example .env` and configure as per [Configuration](./Configuration.md#Docker-Environment).
+3. `cp backend/config/template.json backend/config/default.json` and configure
+as per [Configuration](./Configuration.md#Backend)
+4. `cp frontend/dist/config/template.json frontend/dist/config/default.json`
+and configure as per [Configuration](./Configuration.md#Frontend)
+5. `cp .env.example .env` and configure as per
+[Configuration](./Configuration.md#Docker-Environment).
 6. `./musare.sh build`
 7. `./musare.sh start`
-8. **(optional)** Register a new user on the website and grant the admin role by running `./musare.sh admin add USERNAME`.
+8. **(optional)** Register a new user on the website and grant the admin role
+by running `./musare.sh admin add USERNAME`.
 
 ### Fixing the "couldn't connect to docker daemon" error
 
-**Windows Only**
+- **Windows Only**
 
-Some people have had issues while trying to execute the `docker-compose` command.
-To fix this, you will have to run `docker-machine env default`.
-This command will print various variables.
-At the bottom, it will say something similar to `@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i`.
-Run this command in your shell. You will have to do this command for every shell you want to run `docker-compose` in (every session).
+    Some people have had issues while trying to execute the `docker-compose` command.
+    To fix this, you will have to run `docker-machine env default`.
+    This command will print various variables.
+    At the bottom, it will say something similar to
+    `@FOR /f "tokens=*" %i IN ('docker-machine env default') DO @%i`.
+    Run this command in your shell. You will have to do this command for every
+    shell you want to run `docker-compose` in (every session).
 
 ---
 
@@ -39,12 +46,12 @@ Run this command in your shell. You will have to do this command for every shell
 
 ### Dependencies
 
--   [Git](https://github.com/git-guides/install-git)
--   [Redis](http://redis.io/download)
--   [MongoDB](https://www.mongodb.com/try/download/community)
--   [NodeJS](https://nodejs.org/en/download/)
-    -   [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
-    -   [nodemon](https://github.com/remy/nodemon#installation)
+- [Git](https://github.com/git-guides/install-git)
+- [Redis](http://redis.io/download)
+- [MongoDB](https://www.mongodb.com/try/download/community)
+- [NodeJS](https://nodejs.org/en/download/)
+  - [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
+  - [nodemon](https://github.com/remy/nodemon#installation)
 
 ### Instructions
 
@@ -52,20 +59,27 @@ Run this command in your shell. You will have to do this command for every shell
 2. `cd Musare`
 3. [Setup MongoDB](#Setting-up-MongoDB)
 4. [Setup Redis](#Setting-up-Redis)
-5. `cp backend/config/template.json backend/config/default.json` and configure as per [Configuration](./Configuration.md#Backend)
-6. `cp frontend/dist/config/template.json frontend/dist/config/default.json` and configure as per [Configuration](./Configuration.md#Frontend)
+5. `cp backend/config/template.json backend/config/default.json` and configure
+as per [Configuration](./Configuration.md#Backend)
+6. `cp frontend/dist/config/template.json frontend/dist/config/default.json`
+and configure as per [Configuration](./Configuration.md#Frontend)
 7. `cd frontend && npm install && cd ..`
 8. `cd backend && npm install && cd ..`
 9. Start services
     - **Linux**
         1. Execute `systemctl start redis mongod`
-        2. Execute `cd frontend && npm run dev` and `cd backend && npm run dev` separately.
+        2. Execute `cd frontend && npm run dev` and
+        `cd backend && npm run dev` separately.
     - **Windows**
-        - **Automatic** Run `windows-start.cmd` or just double click the `windows-start.cmd` file and all servers will automatically start up.
+        - **Automatic** Run `windows-start.cmd` or just double click the
+        `windows-start.cmd` file and all servers will automatically start up.
         - **Manual**
             1. Run `startRedis.cmd` and `startMongo.cmd` to start Redis and Mongo.
-            2. Execute `cd frontend && npm run dev` and `cd backend && npm run dev` separately.
-10. **(optional)** Register a new user on the website and grant the admin role by running the following in the mongodb shell.
+            2. Execute `cd frontend && npm run dev` and
+            `cd backend && npm run dev` separately.
+10. **(optional)** Register a new user on the website and grant the admin role
+by running the following in the mongodb shell.
+
     ```bash
     use musare
     db.auth("MUSAREDBUSER","MUSAREDBPASSWORD")
@@ -74,7 +88,7 @@ Run this command in your shell. You will have to do this command for every shell
 
 ### Setting up MongoDB
 
--   **Windows Only**
+- **Windows Only**
 
     1. In the root directory, create a folder called `.database`
     2. Create a file called `startMongo.cmd` in the root directory with the contents:
@@ -85,7 +99,7 @@ Run this command in your shell. You will have to do this command for every shell
 
     3. Start the database by executing the script `startMongo.cmd` you just made
 
--   Set up the MongoDB database itself
+- Set up the MongoDB database itself
 
     1. Start MongoDB
         - **Linux** Execute `systemctl start mongod`
@@ -96,7 +110,18 @@ Run this command in your shell. You will have to do this command for every shell
 
     3. Create an admin user
 
-        `db.createUser({user: 'admin', pwd: 'PASSWORD_HERE', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]})`
+        ```javascript
+        db.createUser({
+            user: "admin",
+            pwd: "PASSWORD_HERE",
+            roles: [
+                {
+                    role: "userAdminAnyDatabase",
+                    db: "admin"
+                }
+            ]
+        })
+        ```
 
     4. Connect to the Musare database
 
@@ -104,7 +129,18 @@ Run this command in your shell. You will have to do this command for every shell
 
     5. Create the "musare" user
 
-        `db.createUser({user: 'musare', pwd: 'OTHER_PASSWORD_HERE', roles: [{role: 'readWrite', db: 'musare'}]})`
+        ```javascript
+        db.createUser({
+            user: "musare",
+            pwd: "OTHER_PASSWORD_HERE",
+            roles: [
+                {
+                    role: "readWrite",
+                    db: "musare"
+                }
+            ]
+        })
+        ```
 
     6. Exit
 
@@ -120,7 +156,7 @@ Run this command in your shell. You will have to do this command for every shell
 
 ### Setting up Redis
 
--   **Windows**
+- **Windows**
 
     1. In the folder where you installed Redis, edit the `redis.windows.conf` file
 
@@ -131,12 +167,15 @@ Run this command in your shell. You will have to do this command for every shell
 
     2. Create a file called `startRedis.cmd` in the main folder with the contents:
 
-        `"C:\Path\To\Redis\redis-server.exe" "C:\Path\To\Redis\redis.windows.conf" "--requirepass" "PASSWORD"`
+        `"C:\Path\To\Redis\redis-server.exe" "C:\Path\To\Redis\redis.windows.conf"
+        "--requirepass" "PASSWORD"`
 
-        And again, make sure that the paths lead to the proper config and executable. Replace `PASSWORD` with your Redis password.
+        And again, make sure that the paths lead to the proper config and
+        executable. Replace `PASSWORD` with your Redis password.
 
--   **Linux**
+- **Linux**
     1. In `/etc/redis/redis.conf`
         1. Uncomment `notify-keyspace-events` and set its value to `Ex`.
-        2. Uncomment `requirepass foobared` and replace foobared with your Redis password.
+        2. Uncomment `requirepass foobared` and replace foobared with your
+        Redis password.
     2. Restart Redis `systemctl restart redis`

+ 10 - 4
.wiki/Technical_Overview.md

@@ -10,11 +10,17 @@
 
 ### Frontend
 
-The frontend is a [vue-cli](https://github.com/vuejs/vue-cli) generated, [vue-loader](https://github.com/vuejs/vue-loader) single page app, that's served over Nginx or Express. The Nginx server not only serves the frontend, but can also serve as a load balancer for requests going to the backend.
+The frontend is a [vue-cli](https://github.com/vuejs/vue-cli) generated,
+[vue-loader](https://github.com/vuejs/vue-loader) single page app, that's
+served over Nginx or Express. The Nginx server not only serves the frontend,
+but can also serve as a load balancer for requests going to the backend.
 
 ### Backend
 
-The backend is a scalable NodeJS / Redis / MongoDB app. User sessions are stored in a central Redis server. All data is stored in a central MongoDB server. The Redis and MongoDB servers are replicated to several secondary nodes, which can become the primary node if the current primary node goes down.
-
-We currently only utilize 1 backend, 1 MongoDB server and 1 Redis server running for production, though it is relatively easy to expand.
+The backend is a scalable NodeJS / Redis / MongoDB app. User sessions are stored
+in a central Redis server. All data is stored in a central MongoDB server.
+TheRedis and MongoDB servers are replicated to several secondary nodes, which
+can become the primary node if the current primary node goes down.
 
+We currently only utilize 1 backend, 1 MongoDB server and 1 Redis server running
+for production, though it is relatively easy to expand.

+ 30 - 13
.wiki/Upgrading.md

@@ -1,4 +1,5 @@
 # Upgrading
+
 Musare upgrade process.
 
 To install a new instance please see [Installation](./Installation.md).
@@ -6,17 +7,25 @@ To install a new instance please see [Installation](./Installation.md).
 ## Docker
 
 ### Instructions
+
 1. Make a backup! `./musare.sh backup`
-2. Execute `./musare.sh update`. If an update requires any configuration changes or database migrations, you will be notified.
-    - To update configuration compare example configs against your own and add/update/remove any properties as needed. For more information on properties see [Configuration](./Configuration.md). Frontend and backend configuration updates always update the `configVersion` property.
-        - Backend, compare `backend/config/template.json` against `backend/config/default.json`.
-        - Frontend, compare `frontend/dist/config/template.json` against `frontend/dist/config/default.json`.
+2. Execute `./musare.sh update`. If an update requires any configuration changes
+or database migrations, you will be notified.
+    - To update configuration compare example configs against your own and
+    add/update/remove any properties as needed. For more information on
+    properties see [Configuration](./Configuration.md). Frontend and backend
+    configuration updates always update the `configVersion` property.
+        - Backend, compare `backend/config/template.json` against
+        `backend/config/default.json`.
+        - Frontend, compare `frontend/dist/config/template.json` against
+        `frontend/dist/config/default.json`.
         - Environment, compare `.env.example` against `.env`.
     - To migrate database;
         - `./musare.sh stop backend`
         - Set `migration` to `true` in  `backend/config/default.json`
         - `./musare.sh start backend`.
-        - Follow backend logs and await migration completion notice `./musare.sh attach backend`.
+        - Follow backend logs and await migration completion notice
+        `./musare.sh attach backend`.
         - `./musare.sh stop backend`
         - Set `migration` to `false` in  `backend/config/default.json`
         - `./musare.sh start backend`.
@@ -26,12 +35,15 @@ To install a new instance please see [Installation](./Installation.md).
 ## Non-Docker
 
 ### Instructions
+
 1. Make a backup!
 2. Stop all services
 3. `git pull`
 4. `cd frontend && npm install`
 5. `cd ../backend && npm install`
-6. Compare example configs against your own and add/update/remove any properties as needed. For more information on properties see [Configuration](./Configuration.md). Frontend and backend configuration updates always update the `configVersion` property.
+6. Compare example configs against your own and add/update/remove any properties
+as needed. For more information on properties see [Configuration](./Configuration.md).
+Frontend and backend configuration updates always update the `configVersion` property.
     - Backend, compare `backend/config/template.json` against `backend/config/default.json`.
     - Frontend, compare `frontend/dist/config/template.json` against `frontend/dist/config/default.json`.
 7. Start MongoDB and Redis services.
@@ -43,25 +55,30 @@ To install a new instance please see [Installation](./Installation.md).
     - Set `migration` to `false` in  `backend/config/default.json`
 9. Start backend and frontend services.
 
-# Upgrade/downgrade MongoDB
+## Upgrade/downgrade MongoDB
 
-Make sure to always look at the upgrade/downgrade instructions in the [MongoDB release notes](https://docs.mongodb.com/manual/release-notes) before, and always make a full backup of your data before proceeding.
+Make sure to always look at the upgrade/downgrade instructions in the
+[MongoDB release notes](https://docs.mongodb.com/manual/release-notes) before,
+and always make a full backup of your data before proceeding.
 
-## Docker
+### Docker
+
+#### Instructions
 
-### Instructions
 1. Stop the backend (`./musare.sh stop backend`)
 2. Make a backup of MongoDB (`./musare.sh backup`)
-3. Stop and reset the mongo container and delete the database folder (`./musare.sh reset mongo`)
+3. Stop and reset the mongo container and delete the database folder
+(`./musare.sh reset mongo`)
 4. Change the MongoDB version inside your .env file.
 5. Start the mongo container (`./musare.sh start mongo`)
 6. Import your backup of MongoDB (`./musare.sh restore`)
     - Note: backups are stored inside the backups folder by default.
 7. Start the backend (`./musare.sh start backend`)
 
-## Non-Docker
+### Non-Docker
+
+#### Instructions
 
-### Instructions
 1. Stop your backend
 2. Make a backup of MongoDB
 3. Stop and reset MongoDB

+ 13 - 3
.wiki/Utility_Script.md

@@ -1,15 +1,21 @@
 # Utility Script
-The utility script is a tool that allows for the simple management of a Musare Docker instance.
 
-Please follow the [Docker Installation Guide](./Installation.md#Docker) before using this script.
+The utility script is a tool that allows for the simple management of a Musare
+Docker instance.
+
+Please follow the [Docker Installation Guide](./Installation.md#Docker) before
+using this script.
 
 ## Usage
+
 Linux (Bash):
+
 ```bash
 ./musare.sh command [parameters]
 ```
 
 ## Commands
+
 | Command | Parameters | Description |
 | --- | --- | --- |
 | `start` | `[frontend backend redis mongo]` | Start service(s). |
@@ -27,4 +33,8 @@ Linux (Bash):
 | `admin` | `<add,remove> [username]` | Assign/unassign admin role to/from user. If the username is not specified you will be prompted. |
 
 ### Services
-There are currently 4 services; frontend, backend, redis and mongo. Where services is a parameter you can specify any of these, or multiple seperated by spaces, for example `./musare.sh restart frontend backend` to restart the frontend and backend. If no services are specified all will be selected.
+
+There are currently 4 services; frontend, backend, redis and mongo. Where
+services is a parameter you can specify any of these, or multiple seperated by
+spaces, for example `./musare.sh restart frontend backend` to restart the
+frontend and backend. If no services are specified all will be selected.

+ 62 - 55
.wiki/Value_Formats.md

@@ -3,61 +3,68 @@
 Every input needs validation, below is the required formatting of each value.
 
 - **User**
-    - Username
-        - Description: Any letter from a-z in any case, numbers, underscores and dashes. Must contain at least 1 letter or number.
-        - Length: From 2 to 32 characters.
-        - Regex: ```/^[A-Za-z0-9_]+$/```
-    - Name
-        - Description: Any letter from any language in any case, numbers, underscores, dashes, periods, apostrophes and spaces. Must contain at least 1 letter or number.
-        - Length: From 2 to 64 characters.
-        - Regex: ```/^[\p{L}0-9 .'_-]+$/u```
-    - Email
-        - Description: Standard email address.
-        - Length: From 3 to 254 characters.
-        - Regex: ```/^[\x00-\x7F]+@[a-z0-9]+\.[a-z0-9]+(\.[a-z0-9]+)?$/```
-    - Password
-        - Description: Must include at least one lowercase letter, one uppercase letter, one number and one special character.
-        - Length: From 6 to 200 characters.
-        - Regex: ```/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~])[A-Za-z\d!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/```
-    - Ban Reason
-        - Description: Any ASCII character.
-        - Length: From 1 to 64 characters.
-        - Regex: ```/^[\x00-\x7F]+$/```
+  - Username
+    - Description: Any letter from a-z in any case, numbers, underscores and
+    dashes. Must contain at least 1 letter or number.
+    - Length: From 2 to 32 characters.
+    - Regex: ```/^[A-Za-z0-9_]+$/```
+  - Name
+    - Description: Any letter from any language in any case, numbers, underscores,
+    dashes, periods, apostrophes and spaces. Must contain at least 1 letter or number.
+    - Length: From 2 to 64 characters.
+    - Regex: ```/^[\p{L}0-9 .'_-]+$/u```
+  - Email
+    - Description: Standard email address.
+    - Length: From 3 to 254 characters.
+    - Regex: ```/^[\x00-\x7F]+@[a-z0-9]+\.[a-z0-9]+(\.[a-z0-9]+)?$/```
+  - Password
+    - Description: Must include at least one lowercase letter, one uppercase
+    letter, one number and one special character.
+    - Length: From 6 to 200 characters.
+    - Regex: ```/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~])[A-Za-z\d!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/```
+  - Ban Reason
+    - Description: Any ASCII character.
+    - Length: From 1 to 64 characters.
+    - Regex: ```/^[\x00-\x7F]+$/```
 - **Station**
-    - Name
-        - Description: Any letter from a-z lowercase, numbers and underscores.
-        - Length: From 2 to 16 characters.
-        - Regex: ```/^[a-z0-9_]+$/```
-    - Display Name
-        - Description: Any ASCII character.
-        - Length: From 2 to 32 characters.
-        - Regex: ```/^[\x00-\x7F]+$/```
-    - Description
-        - Description: Any character.
-        - Length: From 2 to 200 characters.
+  - Name
+    - Description: Any letter from a-z lowercase, numbers and underscores.
+    - Length: From 2 to 16 characters.
+    - Regex: ```/^[a-z0-9_]+$/```
+  - Display Name
+    - Description: Any ASCII character.
+    - Length: From 2 to 32 characters.
+    - Regex: ```/^[\x00-\x7F]+$/```
+  - Description
+    - Description: Any character.
+    - Length: From 2 to 200 characters.
 - **Playlist**
-    - Display Name
-        - Description: Any ASCII character.
-        - Length: From 1 to 32 characters.
-        - Regex: ```/^[\x00-\x7F]+$/```
+  - Display Name
+    - Description: Any ASCII character.
+    - Length: From 1 to 32 characters.
+    - Regex: ```/^[\x00-\x7F]+$/```
 - **Song**
-    - Title
-        - Description: Any ASCII character.
-        - Length: From 1 to 32 characters.
-        - Regex: ```/^[\x00-\x7F]+$/```
-    - Artists
-        - Description: Any character and not NONE.
-        - Length: From 1 to 64 characters.
-        - Quantity: Min 1, max 10.
-    - Genres
-        - Description: Any ASCII character.
-        - Length: From 1 to 32 characters.
-        - Quantity: Min 1, max 16.
-        - Regex: ```/^[\x00-\x7F]+$/```
-    - Tags
-        - Description: Any letter, numbers and underscores. Can be with out without data in square brackets. The base tag and data between brackets follow the same styling. If there's no data in between square brackets, there are no square brackets.
-        - Length: From 1 to 64 characters for the base part, 1 to 64 characters for data in square brackets.
-        - Regex: ```/^[a-zA-Z0-9_]{1,64}$|^[a-zA-Z0-9_]{1,64}\[[a-zA-Z0-9_]{1,64}\]$/```
-    - Thumbnail
-        - Description: Valid url. If site is secure only https prepended urls are valid.
-        - Length: From 1 to 256 characters.
+  - Title
+    - Description: Any ASCII character.
+    - Length: From 1 to 32 characters.
+    - Regex: ```/^[\x00-\x7F]+$/```
+  - Artists
+    - Description: Any character and not NONE.
+    - Length: From 1 to 64 characters.
+    - Quantity: Min 1, max 10.
+  - Genres
+    - Description: Any ASCII character.
+    - Length: From 1 to 32 characters.
+    - Quantity: Min 1, max 16.
+    - Regex: ```/^[\x00-\x7F]+$/```
+  - Tags
+    - Description: Any letter, numbers and underscores. Can be with out without
+    data in square brackets. The base tag and data between brackets follow the
+    same styling. If there's no data in between square brackets, there are no
+    square brackets.
+    - Length: From 1 to 64 characters for the base part, 1 to 64 characters for
+    data in square brackets.
+    - Regex: ```/^[a-zA-Z0-9_]{1,64}$|^[a-zA-Z0-9_]{1,64}\[[a-zA-Z0-9_]{1,64}\]$/```
+  - Thumbnail
+    - Description: Valid url. If site is secure only https prepended urls are valid.
+    - Length: From 1 to 256 characters.

+ 156 - 65
CHANGELOG.md

@@ -2,9 +2,11 @@
 
 ## [v3.6.0] - 2022-06-12
 
-This release includes all changes from v3.6.0-rc1, in addition to the following. Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
+This release includes all changes from v3.6.0-rc1, in addition to the following.
+Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 
 ### Fixed
+
 - fix: Removed tag="transition-group" from draggable components
 
 ## [v3.6.0-rc1] - 2022-06-05
@@ -12,6 +14,7 @@ This release includes all changes from v3.6.0-rc1, in addition to the following.
 Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 
 ### Added
+
 - feat: Added tab-completion to backend commands
 - feat: Added YouTube quota usage tracking
 - feat: Added YouTube API requests tracking, caching and management
@@ -26,24 +29,33 @@ Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 - feat: Added long jobs handling and monitoring
 
 ### Changed
-- refactor: Display user display names instead of usernames in links and station user list
+
+- refactor: Display user display names instead of usernames in links and station
+user list
 - refactor: Use YouTube thumbnail as a fallback to song thumbnails
-- refactor: Use song thumbnail component in Edit Song modal, with fallback disabled
+- refactor: Use song thumbnail component in Edit Song modal, with fallback
+disabled
 - refactor: Edit Song positioning and styling tweaks
 - refactor: Moved vote skip processing to dedicated job
 - refactor: Prevent auto vote to skip if locally paused
 - refactor: Added info header card to admin pages
-- refactor: Allowed for song style usage of YouTube videos in playlists and station queues
-- refactor: Moved ratings to dedicated model within media module, with YouTube video support
-- refactor: Replace songs with YouTube videos in playlists, station queues and ratings on removal
+- refactor: Allowed for song style usage of YouTube videos in playlists and
+station queues
+- refactor: Moved ratings to dedicated model within media module, with YouTube
+video support
+- refactor: Replace songs with YouTube videos in playlists, station queues and
+ratings on removal
 - refactor: Moved drag box handling to mixin
 - refactor: Floating box logic and styling improvements
-- refactor: Added support for creation of songs from YouTube videos in Edit Song(s) modals
+- refactor: Added support for creation of songs from YouTube videos in
+Edit Song(s) modals
 - refactor: Compile production frontend as part of docker image build
 - refactor: Changed default frontend docker mode to prod
-- refactor: Import Album can now use a selection of songs or YouTube videos in addition to YouTube playlist importing.
+- refactor: Import Album can now use a selection of songs or YouTube videos in
+addition to YouTube playlist importing.
 
 ### Fixed
+
 - fix: musare.sh attach not working with podman-compose
 - fix: Station autofill not run after removal from queue
 - fix: AdvancedTable multi-row select with left ctrl/shift doesnt work
@@ -54,6 +66,7 @@ Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 
 ### Fixed
+
 - fix: Assert package.json import as json
 - fix: Limited NodeJS version to v16.15
 - fix: Temporarily disabled eslint for moduleManager import
@@ -63,6 +76,7 @@ Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 
 ### Fixed
+
 - fix: Songs requestSet could return null songs
 - fix: Prevent adding duplicate items with bulk actions
 - fix: Throw error if unknown job is called
@@ -78,12 +92,15 @@ Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 
 ## [v3.5.0] - 2022-04-28
 
-This release includes all changes from v3.5.0-rc1 and v3.5.0-rc2, in addition to the following. Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
+This release includes all changes from v3.5.0-rc1 and v3.5.0-rc2, in addition to
+the following. Upgrade instructions can be found at [.wiki/Upgrading](.wiki/Upgrading.md).
 
 ### Changed
+
 - refactor: close all modals upon route change
 
 ### Fixed
+
 - fix: Autofilling station queue would reset requestedAt
 - fix: Station time elapsed would show false if 0
 
@@ -92,9 +109,11 @@ This release includes all changes from v3.5.0-rc1 and v3.5.0-rc2, in addition to
 This release includes all changes from v3.5.0-rc1, in addition to the following.
 
 ### Added
+
 - chore: Added docker-compose.override.yml documentation
 
 ### Fixed
+
 - fix: Unable to compile frontend in production mode
 - fix: Homepage admin filter keyboard shortcut not always registering
 - fix: Docker will create folders if default.json files do not exist
@@ -107,6 +126,7 @@ This release includes all changes from v3.5.0-rc1, in addition to the following.
 ## [v3.5.0-rc1] - 2022-04-14
 
 ### Added
+
 - feat: Station autofill configurable limit
 - feat: Station requests configurable access level
 - feat: Station requests configurable per user request limit
@@ -116,18 +136,24 @@ This release includes all changes from v3.5.0-rc1, in addition to the following.
 - feat: Added info icon component
 
 ### Changed
-- refactor: No longer showing unlisted stations on homepage if not owned by user unless toggled by admin
+
+- refactor: No longer showing unlisted stations on homepage if not owned by user
+unless toggled by admin
 - refactor: Renamed station excludedPlaylists to blacklist
 - refactor: Unified station update functions and events
 - refactor: Replaced Manage Station settings dropdowns with select elements
 - refactor: Use a local object to edit stations before saving
-- refactor: Replace station modes with 2 modules which are independently toggleable and configurable on every station
-    - Requests: Replaces party mode, users can request songs or auto request from playlists
-    - Autofill: Replaces playlist mode, owners select songs to autofill queue. Also includes old playMode and includedPlaylist functionality
+- refactor: Replace station modes with 2 modules which are independently
+toggleable and configurable on every station
+  - Requests: Replaces party mode, users can request songs or auto request from
+  playlists
+  - Autofill: Replaces playlist mode, owners select songs to autofill queue.
+  Also includes old playMode and includedPlaylist functionality
 - refactor: Update active team
 - refactor: Separate docker container modes
 - refactor: Improve musare.sh exit code usage and other tweaks
-- refactor: Made Main Header/Footer, Modal, QuickConfirm and UserIdToUsername global components
+- refactor: Made Main Header/Footer, Modal, QuickConfirm and UserIdToUsername
+global components
 - refactor: Use crypto random values instead of math.random to create UUID
 - refactor: Added trailing slash to URL startsWith check
 - chore: Updated frontend package-lock.json version from 1 to 2
@@ -137,21 +163,29 @@ This release includes all changes from v3.5.0-rc1, in addition to the following.
 - refactor: Made station info box a component for Station and Manage Station
 
 ### Fixed
+
 - fix: Changing station privacy does not kick out newly-unauthorized users
 
 ### Removed
+
 - refactor: Removed station queue lock
 
 ## [v3.4.0] - 2022-03-27
 
 ### **Breaking Changes**
-This release makes the MongoDB version configurable in the .env file. Prior to this release, the MongoDB version was 4.0. We recommend upgrading to 5.0 or 4.4. Upgrade instructions can be found in [.wiki/Upgrading](.wiki/Upgrading.md#Upgrade/downgradeMongoDB).
 
-Please run the Update All Songs job after upgrading to ensure playlist and station song data accuracy.
+This release makes the MongoDB version configurable in the .env file. Prior to
+this release, the MongoDB version was 4.0. We recommend upgrading to 5.0 or 4.4.
+Upgrade instructions can be found in [.wiki/Upgrading](.wiki/Upgrading.md#Upgrade/downgradeMongoDB).
+
+Please run the Update All Songs job after upgrading to ensure playlist and
+station song data accuracy.
 
 ### Added
+
 - feat: Scroll to next song item in Edit Songs queue
-- feat: Reset Advanced Table bulk actions popup position on screen resize if in initial position
+- feat: Reset Advanced Table bulk actions popup position on screen resize if in
+initial position
 - feat: Global LESS variables
 - refactor: Configurable Main Footer links
 - feat: Configurable Docker container restart policy
@@ -174,11 +208,15 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - feat: Configurable MongoDB container image version
 
 ### Changed
+
 - refactor: Replaced night mode toggle slider in Main Header with day/night icons
 - refactor: Replaced SASS/SCCS with LESS
-- refactor: Hide registration buttons and prevent opening register modal if registration is disabled
-- refactor: Trim certain user modifiable strings in playlists, songs, reports and stations
-- refactor: Allow title to wrap to a 2nd line if no there are no artists in Song Item
+- refactor: Hide registration buttons and prevent opening register modal if
+registration is disabled
+- refactor: Trim certain user modifiable strings in playlists, songs, reports
+and stations
+- refactor: Allow title to wrap to a 2nd line if no there are no artists in
+Song Item
 - refactor: Consistent border-radius
 - refactor: Consistent box-shadow
 - refactor: Replace deprecated /deep/ selector with :deep()
@@ -197,14 +235,18 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - refactor: Delete user sessions when account is deleted
 
 ### Fixed
-- fix: Relative homepage header height causing overlay of content on non-standard resolutions
+
+- fix: Relative homepage header height causing overlay of content on
+non-standard resolutions
 - fix: Unable to toggle nightmode on mobile logged out on homepage
 - fix: Station card top row should not wrap
 - fix: Advanced Table CTRL/SHIFT select rows does not work
-- fix: Station not automatically removed from favorite stations on homepage on deletion
+- fix: Station not automatically removed from favorite stations on homepage on
+deletion
 - fix: Playlist songs do not contain verified attribute
 - fix: Newest news should only fetch published items
-- fix: Deleting a song as an admin adds activity item that you deleted a song from genre playlists
+- fix: Deleting a song as an admin adds activity item that you deleted a song
+from genre playlists
 - fix: News item divider has no top/bottom margin
 - fix: Edit Song failing to fetch song reports
 - fix: Station refill can include current song
@@ -219,7 +261,8 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - fix: Playlists could sometimes not be created due to restrictive MongoDB index
 - fix: Add tags to songs doesn't give any feedback to the user
 - fix: AdvancedTable checkboxes overlay mobile navbar dropdown
-- fix: Nightmode -> EditSong -> Discogs API Result release on hover style is messed up
+- fix: Nightmode -> EditSong -> Discogs API Result release on hover style is
+messed up
 - fix: Station creation validation always failing
 - fix: Station info display name and description overflow horizontally
 - fix: Volume slider incorrect sensitivity
@@ -231,18 +274,22 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - fix: Add To Playlist Dropdown create playlist button not full width
 
 ### Removed
+
 - refactor: Removed skip to last 10s button from Edit Song player
 - refactor: Removed Request Song modal
 
 ## [v3.4.0-rc2] - 2022-03-19
 
 ### Added
+
 - feat: Re-added ability to hard stop player in Edit Song
 
 ### Changed
+
 - refactor: Delete user sessions when account is deleted
 
 ### Fixed
+
 - fix: Changing password in Settings does not create success toast
 - fix: Invalid user sessions could sometimes break actions
 - fix: Add To Playlist Dropdown create playlist button not full width
@@ -250,13 +297,19 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 ## [v3.4.0-rc1] - 2022-03-06
 
 ### **Breaking Changes**
-This release makes the MongoDB version configurable in the .env file. Prior to this release, the MongoDB version was 4.0. We recommend upgrading to 5.0 or 4.4. Upgrade instructions can be found in [.wiki/Upgrading](.wiki/Upgrading.md#Upgrade/downgradeMongoDB).
 
-Please run the Update All Songs job after upgrading to ensure playlist and station song data accuracy.
+This release makes the MongoDB version configurable in the .env file. Prior to
+this release, the MongoDB version was 4.0. We recommend upgrading to 5.0 or 4.4.
+Upgrade instructions can be found in [.wiki/Upgrading](.wiki/Upgrading.md#Upgrade/downgradeMongoDB).
+
+Please run the Update All Songs job after upgrading to ensure playlist and
+station song data accuracy.
 
 ### Added
+
 - feat: Scroll to next song item in Edit Songs queue
-- feat: Reset Advanced Table bulk actions popup position on screen resize if in initial position
+- feat: Reset Advanced Table bulk actions popup position on screen resize if in
+initial position
 - feat: Global LESS variables
 - refactor: Configurable Main Footer links
 - feat: Configurable Docker container restart policy
@@ -279,11 +332,15 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - feat: Configurable MongoDB container image version
 
 ### Changed
+
 - refactor: Replaced night mode toggle slider in Main Header with day/night icons
 - refactor: Replaced SASS/SCCS with LESS
-- refactor: Hide registration buttons and prevent opening register modal if registration is disabled
-- refactor: Trim certain user modifiable strings in playlists, songs, reports and stations
-- refactor: Allow title to wrap to a 2nd line if no there are no artists in Song Item
+- refactor: Hide registration buttons and prevent opening register modal if
+registration is disabled
+- refactor: Trim certain user modifiable strings in playlists, songs, reports
+and stations
+- refactor: Allow title to wrap to a 2nd line if no there are no artists in
+Song Item
 - refactor: Consistent border-radius
 - refactor: Consistent box-shadow
 - refactor: Replace deprecated /deep/ selector with :deep()
@@ -301,14 +358,18 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - refactor: Pull images in musare.sh build command
 
 ### Fixed
-- fix: Relative homepage header height causing overlay of content on non-standard resolutions
+
+- fix: Relative homepage header height causing overlay of content on
+non-standard resolutions
 - fix: Unable to toggle nightmode on mobile logged out on homepage
 - fix: Station card top row should not wrap
 - fix: Advanced Table CTRL/SHIFT select rows does not work
-- fix: Station not automatically removed from favorite stations on homepage on deletion
+- fix: Station not automatically removed from favorite stations on homepage on
+deletion
 - fix: Playlist songs do not contain verified attribute
 - fix: Newest news should only fetch published items
-- fix: Deleting a song as an admin adds activity item that you deleted a song from genre playlists
+- fix: Deleting a song as an admin adds activity item that you deleted a song
+from genre playlists
 - fix: News item divider has no top/bottom margin
 - fix: Edit Song failing to fetch song reports
 - fix: Station refill can include current song
@@ -323,7 +384,8 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - fix: Playlists could sometimes not be created due to restrictive MongoDB index
 - fix: Add tags to songs doesn't give any feedback to the user
 - fix: AdvancedTable checkboxes overlay mobile navbar dropdown
-- fix: Nightmode -> EditSong -> Discogs API Result release on hover style is messed up
+- fix: Nightmode -> EditSong -> Discogs API Result release on hover style is
+messed up
 - fix: Station creation validation always failing
 - fix: Station info display name and description overflow horizontally
 - fix: Volume slider incorrect sensitivity
@@ -332,19 +394,23 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - fix: Edit Song seekTo does not apply if video is stopped
 
 ### Removed
+
 - refactor: Removed skip to last 10s button from Edit Song player
 - refactor: Removed Request Song modal
 
 ## [v3.3.1] - 2022-02-03
 
 ### Fixes
+
 - fix: migration18 doesnt migrate playlist and queue songs
 
 ## [v3.3.0] - 2022-01-22
 
 ### Added
+
 - feat: Admin ability to edit another users playlist
-- feat: Admin/Users ability to delete user, resend verify email and resend reset password email
+- feat: Admin/Users ability to delete user, resend verify email and resend reset
+password email
 - feat: Bulk Actions modal for admin/songs bulk editing tags, genres and artists.
 - feat: Button and job to recalculate all song likes and dislikes
 - feat: Confirm modal, for more detailed confirmation of actions
@@ -354,48 +420,58 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 - feat: Import Album styling improvements and prefill Discogs data option
 - feat: MediaSession controls (experimental)
 - feat: New admin area advanced table
-    - Advanced filter/search functionality with autocomplete for certain attributes
-    - Bulk update actions popup for songs. Ability to bulk edit, verify, unverify, delete, update tags, genres and artists.
-    - Hide columns
-    - Keyboard shortcuts
-    - Local and query storage of table configuration
-    - Manage columns dropdown
-    - Pagination and configurable page size
-    - Reorder columns
-    - Resize columns
-    - Row update and removed event handling
-    - Select rows with checkboxes
-    - Sort by column
+  - Advanced filter/search functionality with autocomplete for certain attributes
+  - Bulk update actions popup for songs. Ability to bulk edit, verify, unverify,
+  delete, update tags, genres and artists.
+  - Hide columns
+  - Keyboard shortcuts
+  - Local and query storage of table configuration
+  - Manage columns dropdown
+  - Pagination and configurable page size
+  - Reorder columns
+  - Resize columns
+  - Row update and removed event handling
+  - Select rows with checkboxes
+  - Sort by column
 - feat: Open Manage Station from homepage
 - feat: Open Station Queue from homepage
 - feat: Redirect /admin to tab route
 - feat: Run jobs dropdown in admin area pages to replace buttons
 - feat: Song tagging
-- feat: Store the latest admin tab in localStorage and reopen that tab next time you go to admin
+- feat: Store the latest admin tab in localStorage and reopen that tab next time
+you go to admin
 - feat: View Musare version and Git info from backend/frontend
 - chore: Security.md file
 
 ### Changed
+
 - refactor: Auto suggest component
 - refactor: Renamed confirm component to quick confirm
-- refactor: Song status is now a verified boolean, with hidden songs migrated to unverified with a hidden tag
-- refactor: Treat liked/disliked playlists more like normal user playlists, except the ability to rename and delete
+- refactor: Song status is now a verified boolean, with hidden songs migrated to
+unverified with a hidden tag
+- refactor: Treat liked/disliked playlists more like normal user playlists,
+except the ability to rename and delete
 - refactor: Unify song update socket events
 - refactor: web-kit scrollbars and support Firefox scrollbar styling
 - chore: Update material icons font
 - chore: Use npm for can-autoplay and lofig packages
 
 ### Fixed
+
 - fix: Any logged in user can perform certain actions on any playlist
 - fix: Changing your username does not update your username stored locally
-- fix: Clicking outside of the edit song modal whilst its loading, or attempt to close in any other way, will prevent you from closing the modal
+- fix: Clicking outside of the edit song modal whilst its loading, or attempt to
+close in any other way, will prevent you from closing the modal
 - fix: Data request emails are always sent from musare.com
-- fix: Frontend ws.js, when onConnect is called right after the socket connects (within 150ms), the onConnect callback is called twice
+- fix: Frontend ws.js, when onConnect is called right after the socket connects
+(within 150ms), the onConnect callback is called twice
 - fix: Header logo and modal close icon does not have user-select: none;
 - fix: Home header min-height not set
 - fix: Importing YouTube playlist has errors
 - fix: Indexing reports prints "string" in backend logs
-- fix: Memory leak on the frontend, where every time the backend restarts the homepage tries to index the stations X times the server has restarted whilst the homepage has been active
+- fix: Memory leak on the frontend, where every time the backend restarts the
+homepage tries to index the stations X times the server has restarted whilst the
+homepage has been active
 - fix: Modal footer overflow cropped
 - fix: Move song to bottom of queue does not work on occasion
 - fix: News items on news page overflow horizontally on mobile
@@ -409,51 +485,66 @@ Please run the Update All Songs job after upgrading to ensure playlist and stati
 ## [v3.2.2] - 2021-12-11
 
 ### Changed
+
 - refactor: Self host santa seeker icon
 
 ## [v3.2.1] - 2021-12-01
 
 ### Fixed
+
 - fix: Jumpy candy cane seeker bar
-- fix: Christmas lights on home header when logged out and on mobile aren't on bottom of element
+- fix: Christmas lights on home header when logged out and on mobile aren't on
+bottom of element
 - fix: Christmas lights hover just below main header
 - fix: Christmas lights box shadow cropped
 
 ## [v3.2.0] - 2021-11-20
 
 ### Added
+
 - feat: Added christmas theme
-    - Enable with frontend config option
-    - Red primary color
-    - Candycane station seekerbar
-    - Santa on sleigh seeker icon
-    - Christmas lights below main and modal header
-    - Snow falling in the background
-- feat: Added new featured playlist feature to manage station, specify with backend config option
+  - Enable with frontend config option
+  - Red primary color
+  - Candycane station seekerbar
+  - Santa on sleigh seeker icon
+  - Christmas lights below main and modal header
+  - Snow falling in the background
+- feat: Added new featured playlist feature to manage station, specify with
+backend config option
 - feat: Added red station theme
 
 ### Changed
-- refactor: Replaced standard red with darker red, except for christmas and red station themes.
+
+- refactor: Replaced standard red with darker red, except for christmas and red
+station themes.
 
 ## [v3.1.1] - 2021-11-15
 
 ### Fixed
+
 - fix: Not logging in other open tabs automatically
 - fix: blacklistedCommunityStationNames issues
 
 ## [v3.1.0] - 2021-11-14
 
 ### Added
+
 - feat: New config option for blacklisted station names
 
 ### Changed
+
 - refactor: Removed bulma dependency
 - refactor: Patched missing styling after removing bulma
-- refactor: Refactored createStation modal to allow for official station creation from admin area
-- refactor: Refactored login and register modals to open on top of homepage from route
+- refactor: Refactored createStation modal to allow for official station
+creation from admin area
+- refactor: Refactored login and register modals to open on top of homepage from
+route
 
 ### Fixed
+
 - Various bug fixes
 
 ## [v3.0.0] - 2021-10-31
-Major update including feature changes, improvements and bug fixes. Changelog not completed for this release.
+
+Major update including feature changes, improvements and bug fixes.
+Changelog not completed for this release.

+ 62 - 55
README.md

@@ -2,13 +2,15 @@
 
 # Musare
 
-Musare is an open-source collaborative music listening and catalogue curation application. Currently supporting YouTube based content.
+Musare is an open-source collaborative music listening and catalogue curation
+application. Currently supporting YouTube based content.
 
 A production demonstration instance of Musare can be found at [demo.musare.com](https://demo.musare.com).
 
 ---
 
 ## Documentation
+
 - [Installation](./.wiki/Installation.md)
 - [Upgrading](./.wiki/Upgrading.md)
 - [Configuration](./.wiki/Configuration.md)
@@ -20,69 +22,74 @@ A production demonstration instance of Musare can be found at [demo.musare.com](
 ---
 
 ## Features
+
 - **Playlists**
-    - User created playlists
-    - Automatically generated playlists for genres
-    - Privacy configuration
-    - Liked and Disliked songs playlists per user
-    - Bulk import videos from YouTube playlist
-    - Add songs from verified catalogue or YouTube videos
-    - Ability to download in JSON format
+  - User created playlists
+  - Automatically generated playlists for genres
+  - Privacy configuration
+  - Liked and Disliked songs playlists per user
+  - Bulk import videos from YouTube playlist
+  - Add songs from verified catalogue or YouTube videos
+  - Ability to download in JSON format
 - **Stations**
-    - Requests - Toggleable module to allow users to add songs to the queue
-        - Configurable access level and per user request limit
-        - Automatically request songs from selected playlists
-        - Ability to search for songs from verified catalogue or YouTube videos
-    - Autofill - Toggleable module to allow owners to configure automatic filling of the queue from selected playlists
-        - Configurable song limit
-        - Play mode option to randomly play many playlists, or sequentially play one playlist
-        - Ability to search for playlists on Musare
-    - Ability to blacklist playlists to prevent songs within from playing
-    - Themes
-    - Privacy configuration
-    - Favoriting
-    - Official stations controlled by admins
-    - User created and controlled stations
-    - Pause playback just in local session
-    - Station-wide pausing by admins or owners
-    - Vote to skip songs
-    - Force skipping song by admins or owners
+  - Requests - Toggleable module to allow users to add songs to the queue
+    - Configurable access level and per user request limit
+    - Automatically request songs from selected playlists
+    - Ability to search for songs from verified catalogue or YouTube videos
+  - Autofill - Toggleable module to allow owners to configure automatic filling
+  of the queue from selected playlists
+    - Configurable song limit
+    - Play mode option to randomly play many playlists, or sequentially play one
+    playlist
+    - Ability to search for playlists on Musare
+  - Ability to blacklist playlists to prevent songs within from playing
+  - Themes
+  - Privacy configuration
+  - Favoriting
+  - Official stations controlled by admins
+  - User created and controlled stations
+  - Pause playback just in local session
+  - Station-wide pausing by admins or owners
+  - Vote to skip songs
+  - Force skipping song by admins or owners
 - **Song Management**
-    - Verify songs to allow them to be searched for and added to automatically generated genre playlists
-    - Discogs integration to import metadata
-    - Ability for users to report issues with songs and admins to resolve
-    - Configurable skip duration and song duration to cut intros and outros
-    - Import YouTube playlists or channels from admin area
-    - Import Album to associate Discogs album data with media in bulk
-    - Bulk admin management of songs
-    - Create songs from scratch or from YouTube videos
+  - Verify songs to allow them to be searched for and added to automatically
+  generated genre playlists
+  - Discogs integration to import metadata
+  - Ability for users to report issues with songs and admins to resolve
+  - Configurable skip duration and song duration to cut intros and outros
+  - Import YouTube playlists or channels from admin area
+  - Import Album to associate Discogs album data with media in bulk
+  - Bulk admin management of songs
+  - Create songs from scratch or from YouTube videos
 - **YouTube**
-    - Monitor and manage API requests and quota usage
-    - Configure API quota limits
-    - YouTube video management
+  - Monitor and manage API requests and quota usage
+  - Configure API quota limits
+  - YouTube video management
 - **Users**
-    - Activity logs
-    - Profile page showing public playlists and activity logs
-    - Text or gravatar profile pictures
-    - Email or Github login/registration
-    - Preferences to tailor site usage
-    - Password reset
-    - Data deletion management
-    - ActivityWatch integration
+  - Activity logs
+  - Profile page showing public playlists and activity logs
+  - Text or gravatar profile pictures
+  - Email or Github login/registration
+  - Preferences to tailor site usage
+  - Password reset
+  - Data deletion management
+  - ActivityWatch integration
 - **Punishments**
-    - Ban users
-    - Ban IPs
+  - Ban users
+  - Ban IPs
 - **News**
-    - Admins can add/edit/remove news items
-    - Markdown editor
+  - Admins can add/edit/remove news items
+  - Markdown editor
 - **Night Mode**
 - **Administration**
-    - Admin area to manage instance
-    - Configurable data tables
-        - Reorder, resize, sort by and toggle visibilty of columns
-        - Advanced queries
-    - Bulk management
-    - View backend statistics
+  - Admin area to manage instance
+  - Configurable data tables
+    - Reorder, resize, sort by and toggle visibilty of columns
+    - Advanced queries
+  - Bulk management
+  - View backend statistics
+
 ---
 
 ## Contact

+ 7 - 3
SECURITY.md

@@ -6,8 +6,12 @@ Only the latest published production version is supported.
 
 ## Reporting a Vulnerability
 
-To report a vulnerability with a supported version please get in touch with us via email at [core@musare.com](mailto:core@musare.com).
+To report a vulnerability with a supported version please get in touch with us
+via email at [core@musare.com](mailto:core@musare.com).
 
-We endeavour to respond to reports as soon as possible, this may however take a few days. Please refrain from reporting security issues in public forums such as GitHub issues.
+We endeavour to respond to reports as soon as possible, this may however take a
+few days. Please refrain from reporting security issues in public forums such as
+GitHub issues.
 
-Reports will be disclosed via a security advisory once fixes are included in a production release.
+Reports will be disclosed via a security advisory once fixes are included in a
+production release.

+ 1 - 1
frontend/src/main.js

@@ -12,7 +12,7 @@ import store from "./store";
 import AppComponent from "./App.vue";
 
 const defaultConfigURL = new URL(
-	"config/default.json",
+	"/config/default.json",
 	import.meta.url
 ).toString();