**Please read the [v8.1.8 IMPORTANT NOTES](https://github.com/Chocobozzz/PeerTube/releases/tag/v8.1.8)**, which explain that the vulnerability fixed in v8.1.6 has been actively exploited
* Remove NodeJS 20 support. Please upgrade to NodeJS 22 (>= 22.12) before upgrading PeerTube
* The public access of `/api/v1/accounts` API endpoint is deprecated for privacy reasons and will be behind an admin/moderator auth access in PeerTube v9, planned for the end of 2027
* iOS versions < 15.4 are not supported anymore
### NGINX
* Fix an important NGINX I/O issue when users download a video: https://github.com/Chocobozzz/PeerTube/commit/5fa456e6e76af682d9f03be779d98b0779c4fbd3
Please upgrade your NGINX configuration
### Sysadmin
* [prune-storage script](https://docs.joinpeertube.org/maintain/tools#prune-filesystem-object-storage) can now be run without stopping PeerTube
* Add `download.max_total_bytes_per_second` and `download.max_bytes_per_ip_per_second` configuration keys to throttle video downloads.
These new keys help prevent instability when botnets download the entire PeerTube catalog
* Add ability to provide cookies to `yt-dlp` [#7510](https://github.com/Chocobozzz/PeerTube/pull/7510).
See the documentation for more information: https://docs.joinpeertube.org/maintain/configuration#use-cookies-for-youtube-imports-when-needed
* Increase the default refresh token lifetime `oauth2.token_lifetime.refresh_token` to `4 weeks` (instead of `2 weeks`)
* Allow admins to configure the default state of the *Automatically publish a replay when your live ends* option [#7414](https://github.com/Chocobozzz/PeerTube/pull/7414)
### Docker
* The entire PeerTube configuration can be set using environment variables.
Keep in mind that environment variable configuration keys override web admin configuration
### Plugins/Themes/Embed API
* Add server plugin hooks (https://docs.joinpeertube.org/api/plugins):
* Introduce a new table filter component that is simpler to use
* Default runner job route is the page that lists runner jobs
* Clicking on a type/state tag automatically filters data for local/runner job states and types, follow states, registration states, and user roles
* Add video tag information and filter when listing my videos
* Add ability to bulk accept/reject registration requests
* Add ability to filter users by role in users overview
* Improve comments UI on mobile
* Display subscribe button when subscription state is loaded
* Add `g p` hotkeys to go to *My playlists* page
* Improve videos overview for admins:
* Add ability to filter videos by state
* Add a mute badge if the video owner is muted by the instance
* Add ability to filter out videos from muted accounts
* Improve video blocks overview for admins:
* Add video privacy column
* Add bulk actions to unblock, switch to manual block or delete the selected videos
* Add a mute badge if the video owner is muted by the instance
* Improve abuses overview for admins:
* Add bulk action to update internal note, mark as accepted/rejected, delete report, mute reporter/reportee, block/unblock the video, delete the video/comment
* Add a mute badge if the reporter/reportee is muted by the instance
* Improve comments overview for admins and users:
* Clicking on account name filters comments
* Add a mute badge if the account that commented the video is muted by the instance
* Add ability to filter out comments from muted accounts
* Performance:
* Reduce SQL joins when loading a video from the database
* Faster video SQL query to retrieve my videos
* Faster video comments SQL queries for users that list comments on their videos
* Faster video redundancies SQL queries
* Reduce number of rows returned by video SQL queries
* Reduce number of rows returned by comments SQL queries
* Faster loading of *My channels* page
* Add `/about` endpoint caching in the client to reduce unnecessary API calls
* Process ActivityPub `View` and `Download` activities in parallel
* Forward ActivityPub `View` using parallel broadcast
* Support ActivityPub `indexable` field for actors
* Expose runner and runner job queue OpenTelemetry metrics [#7469](https://github.com/Chocobozzz/PeerTube/pull/7469)
* Prevent stale follows by periodically re-sending `Follow` ActivityPub requests to remote instances
* Improve follows reliability algorithm to reject followers that have been consistently down for ~7 days
* Fix plugin settings to display default values when not configured in the DB [#7484](https://github.com/Chocobozzz/PeerTube/pull/7484)
* Fix actor host link in miniature instance dropdown if search index is disabled
* Fix missing stream error handling in web video object storage proxy [#7535](https://github.com/Chocobozzz/PeerTube/pull/7535)
* Fix caption filename overflow
* Fix setting a thumbnail from a video that is stored in object storage
* Fix instance redundancies pagination
* Filter out non-text languages for captions
* Increase lazy static files cache time (thumbnails, captions, actor avatars/banners, etc.) to 1 year
* Correctly log uncaught exceptions or unhandled promise rejections in file logger
* Prevent page scrolling when applying filters while browsing instance/account/channel videos
* Fix infinite scroll when listing my followers
* Handle errors when updating a video playlist
* Fix download filename if the video contains non-Latin characters
* Fix font colors in emails by only injecting custom admin colors when the default theme is `light-beige` or `dark-brown`, to prevent accessibility issues
* Fix broken audio stream P2P for lives
* Fix broke HLS transcoding on concurrent video privacy change
* Don't unpause the player when clicking on a transcription segment
* Fix table page navigation on registration action
* Fix concurrency issue when writing live sha segments
* Fix concurrency issue when uploading the same torrent filename
* Fix column varchar lengths
## v8.1.8
### IMPORTANT NOTES
We have learned that the SQL injection vulnerability fixed in v8.1.6 has been exploited at scale since at least May 18, 2026 and so before the v8.1.6 release.
According to our investigation, the attacker exploited this SQL injection to generate a token for the `root` user and install the `peertube-plugin-google-analytics-js` plugin. This plugin imports a client script from `hxxps://www.googie-anaiytics.com/jquery.ui.js` that currently only logs a line in the web browser.
Actions taken by this release:
* Automatically remove `peertube-plugin-google-analytics-js` in v8.1.8
* Invalidate OAuth tokens in v8.1.8 (all users must log in again)
* Add a new `user.disable_root_auth` config key to disable `root` token usage
* Remove the plugin from the plugin registry
Actions taken by Framasoft:
* Report `googie-anaiytics.com` to the registrar
* Send a contact-form message to public PeerTube instances
* Release additional versions if we observe other attack vectors
* A CVE is being requested for the SQL injection
Actions admins must take:
* Upgrade to v8.1.8 **as soon as possible**
* Review newly created users and videos
* Review your instance configuration, especially *Configuration* -> *Customization* -> *JavaScript*/*CSS*
* Review installed plugins
* Generate new tokens for your runners
If you cannot upgrade to v8.1.8:
1. Remove actor follows that contain the `20.240.202.159` URL:
* Find them: `SELECT * FROM "actorFollow" WHERE "url" LIKE '%20.240.202.159%'`
* Delete them: `DELETE FROM "actorFollow" WHERE "id" = ...`
2. Remove actors that contain a `'` character in `inboxUrl`:
* Find them: `SELECT * FROM "actor" WHERE "inboxUrl" LIKE '%''%'`
* Delete them: `DELETE FROM "actor" WHERE "id" = ...`
3. Invalidate OAuth tokens: `UPDATE "oAuthToken" SET "accessTokenExpiresAt" = NOW(), "refreshTokenExpiresAt" = NOW() WHERE "accessTokenExpiresAt" > NOW() OR "refreshTokenExpiresAt" > NOW()`
4. Remove `peertube-plugin-google-analytics-js` from instance plugins
5. Disable federation in `production.yaml` by setting `federation.enabled` to `false`
6. Restart PeerTube
## v8.1.7
## Bug fixes
* Fix broken URL import
* Fix user quota check for imports
* Fix removing notifications from muted accounts
## v8.1.6
### IMPORTANT NOTES
* Follow v8.1.0 IMPORTANT NOTES if you upgrade from PeerTube <= v8.0.2
### SECURITY
* Fix SQL injection coming from actor inbox URL when updating actor follow scores. Thanks to **Nagarajan Selvaraj Paulmony** for reporting this vulnerability :pray:
* Reject JSON-LD objects with special properties. Thanks to **Mastodon security team** for reporting this vulnerability :pray:
* Restricts role assignment to administrators only
* You need to manually execute a migration script **after upgrading**, while PeerTube is running and the database migration is complete (`Migrations finished. New migration version schema: 1000` in PeerTube startup logs):
* Running [regenerate-thumbnails](https://docs.joinpeertube.org/maintain/tools#regenerate-video-thumbnails) and [prune-storage](https://docs.joinpeertube.org/maintain/tools#prune-filesystem-object-storage) scripts after the upgrade and migration script is highly recommended
* If you run PostgreSQL or Redis with TLS connection and self signed certificates, you must explicitly set `reject_unauthorized` to `true` or fill `ca`, `cert` and `key` settings in your [production.yaml](https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L84)
* Run `npm explore sharp -- npm run build` in `peertube-latest` directory
* Merge the `previews` directory into the `thumbnails` directory. The migration script will automatically move files
The `previews` directory and configuration are kept for compatibility reasons
* The `cache` directory is no longer deleted at PeerTube startup, to keep files cached from the previous run
### Configuration
*This section is not exhaustive*
* **Important** Generate more thumbnail sizes for videos in `thumbnails.sizes`. We recommend admins apply the same settings
* Update default object storage configuration to use different `prefix` values with the same `bucket_name` for each object type (`web_videos`, `user_exports`, etc.), so it is easier to add more object types in the future
* Use the `lucide` player theme by default
*`import.videos.http.force_ipv4` is now `true` by default to reduce rate limiting on some platforms
* Add *On Primary* color configuration (`theme.customization.on_primary_color`) to choose the foreground color when the background color is *Primary*
### Docker
* Add `va-driver-all` to the PeerTube Docker image [#7346](https://github.com/Chocobozzz/PeerTube/pull/7346)
### Plugins/Themes/Embed/REST APIs
* REST API:
* Deprecate `previewfile` when publishing a video. Use `thumbnailfile` instead
* Deprecate `thumbnailPath` and `previewPath``Video` fields. Use the `thumbnails` array instead
* Deprecate the `thumbnailPath``VideoPlaylist` field. Use the `thumbnails` array instead
* Remove unused `fileUrl` from `UserExport` and `VideoSource`
* Deprecate `/lazy-static/previews/:filename`. Use `/lazy-static/thumbnails/:filename` instead
* Server plugin hooks (https://docs.joinpeertube.org/api/plugins):
* Database migrations of this version can take a long time (up to 30 minutes on an instance with many users/federation actors and a slow database disk)
* You need to manually execute a migration script **after your upgrade** while PeerTube is running and the database migration is complete (`Migrations finished. New migration version schema: 970` in PeerTube startup logs):
*`yarn` NodeJS packages manager has been removed in favor of `pnpm`. Follow the [dependencies guide](https://docs.joinpeertube.org/support/doc/dependencies) to install `pnpm` on your system **before the upgrade**
* Ensure `storage.uploads` directory is set in your [production.yaml](https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L139)
* PeerTube Dockerfile is now based on Debian Trixie. `chocobozzz/peertube:production` can be used instead of `chocobozzz/peertube:production-trixie` (Debian suffix version is deprecated)
* PostgreSQL version has been upgraded in [Docker Compose](https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/docker-compose.yml). Please follow [this guide](https://docs.joinpeertube.org/install/docker#upgrade-postgresql-container) if you want to upgrade PostgreSQL in your Docker Compose
* Redis version has been upgraded in [Docker Compose](https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/docker-compose.yml). No maintenance task is required if you upgrade Redis in your Docker Compose
### Plugins/Themes/Embed/REST APIs
* REST API:
* Remove deprecated `filename` field from `VideoSource` object
* Remove deprecated `commentsEnabled` field from `Video` object
* Remove deprecated `redundancies.files`field from `VideoRedundancy` object
* Channel owners can invite users of their instance to become editors of their channel
* Editors can accept or reject the invitation
* Editors can manage videos, playlists & comments of the channel
* An *Activity* page has been added to list actions performed within a channel
* :tada: Video player redesign :tada:
* Introduce a new clean and modern theme named **Lucide**
* Original theme is still used by default, and has been renamed to **Galaxy**
* The player theme can be changed by the admin for the entire instance or by the channel for all its videos. It can also be changed for individual videos.
* Use vertical audio volume control for **Galaxy** player theme
* Improve video imports UX
* Introduce an *Import failed* state to clearly identify failed imports
* Display import state in video manage page and watch page
* Add server API (https://docs.joinpeertube.org/api/plugins):
* Support `externalRedirectUri` for `registerExternalAuth` so PeerTube redirects users on another URL set by the plugin
* If your plugin uses `filter:email.template-path.result` server hook: emails now use Handlebars template engine instead of Pug template engine
### Features
* :tada: Emails can now be translated :tada: Check the [translation documentation](https://docs.joinpeertube.org/support/doc/translation) to help us translate emails in your language!
* :tada: Introduce a web configuration wizard to help administrators to configure their instance automatically :tada:
* The wizard appears once the administrators have logged in following the installation of the PeerTube instance
* Admins can also run the wizard via a button in the web admin config
* The main instance information (e.g. name, short description, logo, primary colour) can be entered using the wizard.
* It also helps the admin to apply a configuration depending on the instance type (community-based, institutional, private)
* :tada: Redesign the admin config to use a lateral menu for navigating between subsections :tada:
* Add a new *Customization* page to easily change the main colors and shape of the client interface
* Add a new *Logo* page where admins can upload logos/favicon and social media images for their instances
* Add an option to set the default licence, privacy and comments policy when publishing videos
* The email prefix and body can now be changed in the web admin config. These configurations also support the `{{instanceName}}` template variable, which is replaced by the instance name
* Improve admin federation control:
* Add the ability for admins to completely disable remote subscriptions to local channels
* Admins can also set up automatic rejection of video comments from remote instances
* Add 2FA column information in admin users overview table
* Display remote runner version in admin
* Add ability for users to set the planned date of a live. These lives are displayed when browsing videos [#7144](https://github.com/Chocobozzz/PeerTube/pull/7144)
* Improve data tables UX/UI
* Improve account/channel playlists management:
* Use a data table to manage account and channel playlists
* Allow to manually set the order of the public playlists displayed in a channel
* Improve sensitive content warning in embed player
* Improve audio transcoding quality, especially with FLAC input
* Support Creole French languages in video language metadata
* Add ability for users to list and revoke token sessions
* Support *Free of known copyright restrictions* and *Copyrighted - All Rights Reserved* video licence metadata
* Play/pause the video player using `k` key
### Bug fixes
* Fix ActivityPub audience for unlisted videos
* Use an array of URL in `attributedTo` ActivityPub field
* Prefer `og:image` instead of `og:image:url`
* Better thumbnail blur for sensitive content [#7105](https://github.com/Chocobozzz/PeerTube/pull/7105)
* Prefer `allow="fullscreen"` for video embed `iframe` [#7043](https://github.com/Chocobozzz/PeerTube/pull/7043)
* Respect the sensitive content policy, even for videos owned by the user
* Fix the issue of the scroll position not being restored when pages load slowly [#7143](https://github.com/Chocobozzz/PeerTube/pull/7143)
* Fix remote actor follow counter after a local subscription
* Fix reloading videos in *Browser videos* when the link only changes query parameters
* Add stall job check for remote studio and transcription runner jobs
* Prevent metric warning for redundancy gauge
* Fix disabling *Wait transcoding* checkbox
* Correctly import new elements of a playlist in channel synchronization
* Prevent ReDOS from `useragent` package by removing deprecated Do Not Track feature. Thanks to Patrick Bohn Matthiesen and [Leonora](https://github.com/herover) from IT University of Copenhagen for reporting this vulnerability!
### Bug fixes
* Correctly display bulk actions button in "My videos"
* Keep playlist name original casing in "My videos"
* Fix PIP button z-index on Firefox
* More robust S3 upload and ACL error handler
* Fix broken video state on S3 move failure
* Reset filters when loading query params in "Browse videos"
* Fix upload tab title when the file is uploaded
* Fix follow card overflow in about page
* Convert to full UUID request param `id` in `filter:html.embed.video.allowed.result` and `filter:html.embed.video-playlist.allowed.result` plugin hooks
* Fix HLS playback issue on Chrome 138
* Fix selecting frame on Safari
* Fix input search with multiple prefix tokens
* Fix channel sync duplicate after video deletion
* Fix caption raw edition when editing segment
* Fix accessibility issues:
* Fix embed title/avatar accessibility
* Add player P2P up/down info aria label
* Support escape key in the player settings menu
* Support arrow left/right navigation in the settings menu
* Fix entry focus when navigating in the settings menu
* Add aria controls attribute to settings button
* Thanks to [Woebin](https://github.com/Woebin) from [Access Lab](https://axesslab.com/) and [HowlRound Theatre Commons](https://howlround.com/) for conducting the player accessibility audit!
* **Important** You need to manually execute a migration script after your upgrade while PeerTube is running and the database migration is complete (`Migrations finished. New migration version schema: xxx` in PeerTube startup logs):
* If you installed PeerTube using the [official documentation](https://docs.joinpeertube.org/install/any-os#installation), we highly recommend setting the default user shell to `nologin`. For example on GNU/Linux: `chsh -s /usr/sbin/nologin peertube`
* If you installed PeerTube runners using the [official Systemd service documentation](https://docs.joinpeertube.org/maintain/tools#as-a-systemd-service), we highly recommend setting the default user shell to `nologin`. For example on GNU/Linux: `chsh -s /usr/sbin/nologin prunner`
* Prefer to not store lives in object storage by default: `object_storage.streaming_playlists.store_live_streams` is now `false` in the config template
* **Breaking change** Theme CSS must include `--is-dark: 0` or `--is-dark: 1` CSS variable for the `body` so PeerTube understands if it's a dark or a light theme
* Redesign the page to list more videos for a clearer overview
* Add sort, pagination and column display settings
* Add channel buttons to quickly filter videos
* Improve video search & filters
* Add ability to display video comments count [#6635](https://github.com/Chocobozzz/PeerTube/pull/6635)
* :tada: Redesign video management/publication pages :tada:
* Migrate the video update page to a *Manage video* tool, that includes *Studio* and *Stats* features
* Video publication privacy choice is moved in the second step
* Use a lateral menu to navigate between *Manage video* pages
* Add information related to the video state (transcoding, etc.) and clearly display unavailable features
* Add user agent stats to video stats [#6871](https://github.com/Chocobozzz/PeerTube/pull/6871)
* Support drag-and-drop to replace the video file [#6970](https://github.com/Chocobozzz/PeerTube/pull/6970)
* :tada: Improve NSFW/sensitive content system :tada:
* Support content warning so video authors can describe why the video is considered sensitive
* Change the *Blur* sensitive content policy for viewers where the miniature name is not blurred anymore
* Add an additional *Warn* sensitive content policy for viewers where the thumbnail is not blurred
* *Blur* and *Warn* policies add a *Sensitive* icon below the thumbnail. A warning is also displayed in the player
* The player embed now displays the sensitive content warning
* Add ability to set predefined sensitive flags to videos so video authors help to identify specific sensitive content
* If enabled by administrators, users can override their default sensitive content policy for specific flags.
For example, they can hide all sensitive content but display with a warning content flagged as *Violent* by video authors
* Add sensitive content filter in admin videos overview
* Allow users to resend the email verification link when changing their current email
* Inject subtitle links in HLS playlists so it's easier for external video players that use the `master.m3u8` playlist to display subtitles
* Disable log coloration when TTY does not support it [#6988](https://github.com/Chocobozzz/PeerTube/pull/6988)
* Support more embed parameters in custom markup (`<peertube-video-embed>` and `<peertube-playlist-embed>`) [#6989](https://github.com/Chocobozzz/PeerTube/pull/6989)
### Bug fixes
* More robust theme CSS variables injection
* Fix podcast feed URL in subscribe button
* Fix podcast feed download extension when the file is a video
* Fix broken downloaded audio file
* Fix crash on download stream error
* Fix local posts counter in NodeInfo
* Run transcription after file replacement
* Better video chapters parsing from the description
* Correctly handle `generateTranscription` body param on upload/import
This release fixes important vulnerabilities discovered by Ori Hollander of the JFrog Vulnerability Research team. Many thanks to them!
* Fix DoS and blind SSRF on ActivityPub playlist creation [CVE-2025-32948](https://research.jfrog.com/vulnerabilities/peertube-activitypub-playlist-creation-blind-ssrf-dos/)
* Prevent infinite loop DoS when crawling ActivityPub data [CVE-2025-32947](https://research.jfrog.com/vulnerabilities/peertube-activitypub-crawl-dos/)
* Prevent an attacker from adding playlists to a another user's channel using the ActivityPub [CVE-2025-32946](https://research.jfrog.com/vulnerabilities/peertube-arbitrary-playlist-creation-activitypub/)
* Prevent an attacker from adding playlists to a another user's channel using the REST API [CVE-2025-32945](https://research.jfrog.com/vulnerabilities/peertube-arbitrary-playlist-creation-rest/)
* Add protection against [ZIP bomb](https://en.wikipedia.org/wiki/Zip_bomb) on user import [CVE-2025-32949](https://research.jfrog.com/vulnerabilities/peertube-archive-resource-exhaustion/)
* Prevent crash on user import with a ZIP containg an illegal filename [CVE-2025-32944](https://research.jfrog.com/vulnerabilities/peertube-archive-persistent-dos/)
* Do not leak private HLS playlists (`.m3u8` files) [CVE-2025-32943](https://research.jfrog.com/vulnerabilities/peertube-hls-path-traversal/)
* Due to a bug in the remote video thumbnail update, we recommend running the [prune storage](https://docs.joinpeertube.org/maintain/tools#prune-filesystem-object-storage) script to clean up the filesystem
* Let's encrypt is removing [OCSP support in 2025](https://letsencrypt.org/2024/12/05/ending-ocsp/), so remove SSL stapling from your nginx configuration: https://github.com/Chocobozzz/PeerTube/commit/0abaaa8ccbce19deb6fcd09c8bf00d4cf4248505
* Safari desktop versions < 14 are not supported anymore
* If you are using object storage, you will need to create the captions bucket or configure PeerTube to use an existing one [in the configuration file](https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L262) or using environment variables if you use Docker (`PEERTUBE_OBJECT_STORAGE_CAPTIONS_BUCKET_NAME`, `PEERTUBE_OBJECT_STORAGE_CAPTIONS_PREFIX`, `PEERTUBE_OBJECT_STORAGE_CAPTIONS_BASE_URL`)
* Introduce a new client API to run actions (reload the user table, reload video comments, etc.): https://docs.joinpeertube.org/contribute/plugins#run-actions
### Docker
* Add the ability to specify peertube UID and GID via environment variables [#6809](https://github.com/Chocobozzz/PeerTube/pull/6809)
* Support RSS feed gzip compression: https://github.com/Chocobozzz/PeerTube/commit/70dae47f08547f2749afb9ee9dfa805b8a94b028
### Maintenance
* Remove WebTorrent redundancy support (HLS redundancy is still supported). It hasn't been used in the player for several major versions, so there's no point in continuing to store these video files
* Upgrade [p2p-media-loader](https://github.com/novage/p2p-media-loader) to v2
* Reduce logging on object storage request error
* Introduce `npm run install-node-dependencies` to install PeerTube `yarn` dependencies, so we can easily migrate from `yarn` in the future
* Add ability to put video captions in object storage. Use the [CLI](https://docs.joinpeertube.org/maintain/tools#move-video-files-from-filesystem-to-object-storage) after the upgrade to move existing captions to object storage
* **Classic install only** (for Docker admins see [v6.3 IMPORTANT NOTES](https://github.com/Chocobozzz/PeerTube/releases/tag/v6.3.0)) Ensure you have `storage.original_video_files` set in your configuration file: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L159.
If you did not configure this key but have already enabled "Keep a version of the input file" configuration, original files may have been saved in `versions/peertube-v6.x.x/storage/original-video-files/` directories. If this is the case, you must move these files in the new directory location specified by your `storage.original_video_files` configuration
* Safari desktop versions < 13 are not supported anymore
* iOS versions < 14.5 are not supported anymore
* PeerTube instance requires python >= 3.8 for transcription
### Docker
* Fix private IPv6 subnet (we used a subnet reserved for examples)
### Plugins/Themes/Embed API
* Remove client plugin hooks: `filter:api.recently-added-videos.videos.list.{params,result}`, `filter:api.local-videos.videos.list.{params,result}`, `filter:api.trending-videos.videos.list.{params,result}``filter:api.trending-videos.videos.list.result` in favour of `filter:api.browse-videos.videos.list.{params,result}`
* Header logo doesn't have the `.icon` class anymore (it still has the `icon-logo` class)
* All CSS variables have been replaced so it's easier to theme PeerTube:
* PeerTube generates a color palette based on a few main colors (`primary`, `fg`, `bg`, `bg-secondary`...): https://github.com/Chocobozzz/PeerTube/blob/develop/client/src/sass/application.scss#L27
* Some new variables fallback to old variables to limit theme breaks
* Ensure `instance.default_client_route` (in web admin -> `Configuration` -> `Basic` -> `Landing page`) has a correct path: `/videos/trending`, `/videos/local` and `/videos/recently-added` have been removed in favour of `/videos/browse`
* **Important** You need to manually execute a migration script after your upgrade while PeerTube is running and the database migration is complete (`Migrations finished. New migration version schema: 865` in PeerTube startup logs, this migration script may take a while).
* **Important for Docker admins** If you enabled the "Keep a version of the input file" configuration, files may have been stored in the container instead of the host volume. To prevent data loss, you must **copy** the files on the host before upgrading using `docker compose cp peertube:/app/storage/original-video-files docker-volume/data`
* Fix IPV6 configuration. You must update your [`docker-compose.yml` file](https://github.com/Chocobozzz/PeerTube/commit/ccfd57e349c8bed557d6a60007f92f45d40879e3):
* Remove `version:` line
* Add `ipv6_address` to `peertube.networks.default` key
* Removed `access_log: off` for static video requests in the nginx configuration template, now the player doesn't use WebTorrent anymore (which was doing a large amount of small HTTP requests)
* PeerTube introduces a new download API endpoint that remuxes the videos on the fly to merge video and audio streams. A custom rate limit can be configured in the YAML configuration
### Plugins/Themes/Embed API
* Reduce `@peertube/peertube-types` package size
### Features
* :tada: Separate HLS audio and video streams :tada:
* Can be enabled for VODs in the admin configuration for new videos
* Automatically enabled for lives
* If enabled, an "Audio only" resolution is available in the HLS player
* The live can ingest and output an "Audio only" stream
* Reduce video disk space used since we only store one version of the audio stream
* The download modal has a new panel so users can easily select the resolution they want to download
* :tada: Introduce a transcription widget :tada:
* Users can open the transcription widget that appears next to the player
* The transcription is in sync with the video
* Users can search the transcript and click on a specific segment to automatically jump the video to the appropriate timecode
* UI/UX:
* More visible chapter markers in player control bar
* Add a button to copy server logs in admin
* Smoother live autoplay: only the player is reloaded
* Support max FPS configuration: the admin can allow videos with more than 60FPS, which is the current default limit
* Max resolution file preserves input FPS even if < 720p, allowing users to upload and broadcast a 480p resolution at 60FPS
* Add ability for admins to set multiple proxies for youtube-dl that PeerTube will randomly select
* Support youtube-dl executable (for example *Linux standalone x64 binary* that includes additional features like [impersonation](https://github.com/yt-dlp/yt-dlp/?tab=readme-ov-file#impersonation))
* Add a cover to the file if the user only downloads the audio version of the video
* Forward watch page `start` query param to the OEmbed service so that the embed starts at the correct time
* Notify local users on when an *Internal* video is published
* Add ability for admins to disable federation (disabling ActivityPub endpoints)
* Add ability for users to see the error details when the embed player crashed with the message "The player is not compatible with your web browser. Please try latest Firefox version." The web browser also sends a client error log to the server
### Bug fixes
* Fix stuck runner jobs due to DB concurrency issue
* Respect OS orientation settings in PWA
* Fix "No results" not displayed on no video results
* Do not display "Download" option on lives
* Fix invalid current password error when updating user password
* Fix slow hotkeys detection
* Fix hidden runner jobs tab when remote runner is only enabled for transcription
* Fix broken HLS P2P by correctly updating HLS infohash on privacy update
* Fix videos filters pastille labels for categories and languages
* Fix broken youtube-dl import for videos with too long chapter titles
* Display emojis in description preview in video edition form
* Avoid node-datachannel native dependency that prevents some OS to install PeerTube dependencies
* Added `pip3` as required [PeerTube dependency](https://docs.joinpeertube.org/support/doc/dependencies) to support automatic transcription. You must install it on your system
### Maintenance
* Check for latest plugin versions every 4 hours (instead of 12 hours). We recommend admins to update their current configuration to apply this change for faster plugin new version notifications
* Add a configuration to configure video thumbnail/preview sizes [#6423](https://github.com/Chocobozzz/PeerTube/pull/6423)
* Support for removing non-existent objects from object storage in [prune-storage script](https://docs.joinpeertube.org/maintain/tools)
* Support for moving original video files to object storage/filesystem in [create-move-video-storage-job script](https://docs.joinpeertube.org/maintain/tools#move-video-files-from-filesystem-to-object-storage)
* Add [house-keeping script](https://docs.joinpeertube.org/maintain/tools#cleanup-remote-files) to recover disk space by removing remote files (thumbnails, avatars...)
* Add `max_request_attempts` object storage configuration (required by some S3 providers such as Blackblaze) [#6418](https://github.com/Chocobozzz/PeerTube/pull/6418)
### Docker
* Add missing Docker env to configure object storage (user exports and original video files)
### Plugins/Themes/Embed API
* Add ability to register the same setting multiple times to replace the old one [#6357](https://github.com/Chocobozzz/PeerTube/pull/6357) & [1bfb791e0](https://github.com/Chocobozzz/PeerTube/commit/1bfb791e0539df54d1d007683719dcb883870e1d)
* Introduce a new video comment policy that requires comments to be approved first
* Video owners have a dedicated page to list, view and take action on comments made on their videos
* :tada: Implement auto-tagging on comments and videos for admins and on comments for video owners :tada: [#6399](https://github.com/Chocobozzz/PeerTube/pull/6399)
* Comments and videos can be automatically tagged using PeerTube rules ("contains a link" for example) or watched word lists
* These tags can be used to automatically filter videos and comments
* Video owners can select auto tags that require comments to be approved first
* Add the ability to select the thumbnail directly from the video [#6424](https://github.com/Chocobozzz/PeerTube/pull/6424)
* Allow admins to force bulk transcoding
* Faster "Mark as read" user notification REST API endpoint when having many notifications in database
* Improve `Video` ActivityPub compatibility by relaxing PeerTube checks and allowing remote object to not have some fields that were required by PeerTube (missing P2P information for example)
* Highlight current lives on pages that list videos ("Recently Added", "Trending", "Account videos", "Channel videos" etc.)
### Bug fixes
* Fix embed API on iOS
* Fix RTL layout inconsistencies
* Fix big user export file size
* Fix concurrent live streams serialization issue
* Fix instance slowness when geoip download fails [#6402](https://github.com/Chocobozzz/PeerTube/pull/6402)
* Don't count deleted comments in instance stats
* Handle videos with FPS < 1
* Don't display stats button of remote videos
* Fix recommendation loop for anonymous users
* Handle 410 HTTP response code for AP objects
* Fix major plugin version detection when major number has two digits
* Accessibility:
* Fix focus visibility box
* Fix feed popover title state
* Fix video filter pastille accessibility
* Fix radio button focus
* Fix search typeahead information not read by screen readers
* Fix player "Back" button label
* Fix player settings menu keyboard navigation
* Fix "Update your settings" keyboard navigation and improve accessibility
* Fix checkbox description relationship
* Fix green color contrast
* Correctly label the boolean icon in instance features table
* Remove unneeded information in "Policy for sensitive videos" select
* Fix left menu list items list hierarchy
* Fix HLS audio desync on some videos
* Playlist components in custom markup can use a short UUID
* Support `Service` Activity Pub actors that should fix some federation issues with Mastodon
* Rename `views.videos.ip_view_expiration` to `views.videos.view_expiration`
* YAML & web admin configs:
* Add `storyboards.enabled` config to disable storyboard generation
* Remove `services.twitter.whitelisted`: Twitter/X doesn't seem to need this anymore. This means that PeerTube will try to inject the video player in Twitter/X by default instead of using a classic image/description
* YAML config only:
* Add `open_telemetry.metrics.playback_stats_interval` config to customize how often viewers send playback stats to server
* Add `views.videos.watching_interval.{anonymous,users}` configs to change how often the web browser sends "is watching" information to the server
* Add `stats.registration_requests.enabled` and `stats.abuses.enabled` configs to hide instance registration/abuse requests public stats (average response time, total registration/abuse requests etc.)
* Add `stats.total_moderators.enabled` and `stats.total_admins.enabled`configs to hide total admins/moderators public stats
* Add `object_storage.streaming_playlists.store_live_streams` config to not store live stream chunks into object storage (when enabled for streaming playlists)
* Set `open_telemetry.metrics.http_request_duration.enabled` to `false` by default to avoid performance issues on the Prometheus backend due to high metric cardinality
### Maintenance
* Also generate `600x600` and `1500x1500` avatar sizes
* Also generate `600x100` banner size
### Plugins/Themes/Embed API
* Add ability for plugins to create a client custom sub-page in `/my-account` page [#6218](https://github.com/Chocobozzz/PeerTube/pull/6218)
* Add access to `req.rawBody` for [plugin routes](https://docs.joinpeertube.org/contribute/plugins#add-custom-routes) [#6300](https://github.com/Chocobozzz/PeerTube/pull/6300)
* Add server plugin hooks (https://docs.joinpeertube.org/api/plugins):
* :tada: Implement user import/export :tada: [#6215](https://github.com/Chocobozzz/PeerTube/pull/6215)
* This is not a migration tool: data (like channels or videos) is duplicated and not moved from the previous PeerTube instance
* Export:
* A ZIP is generated by PeerTube and an email is sent to the user when the archive is ready
* The archive file contains ActivityPub data for federation compatibility and custom JSON files used by PeerTube import. It also contains video/playlist thumbnail and channel/account avatar/banner files
* User can include video files in the archive
* Archive files can be stored in object storage
* Export can be disabled by the admin. They can also set an expiration time to automatically delete archive files and limit the export file size depending on the user's video quota
* Update user settings (video autoplay policy, notification settings...)
* Create entries in the mute list
* Add watched videos in user's videos history
Add likes/dislikes
* Send a follow request to imported subscriptions
* Create channels, playlists and videos (if the video files are included in the archive)
* Admins can disable user import
* :tada: Add ability to keep the original video file :tada: [#6157](https://github.com/Chocobozzz/PeerTube/pull/6157)
* Can be stored in object storage
* Uploader can download the original file
* The original file is used in the user export archive (instead of the max quality file)
* Add Turkish language support in client
* Add ability for admins to set a banner and an avatar to the instance. The banner is used in *About instance*/*Login*/*Register an account* pages. Both the banner and the avatar can be used on the instance homepage using `<peertube-instance-banner>`/`<peertube-instance-avatar>` tag or on external websites/applications like the [JoinPeerTube website](https://joinpeertube.org/instances)
* Add ability for uploaders to download and add a video to a playlist on the *My videos* page using the dropdown button [#6008](https://github.com/Chocobozzz/PeerTube/pull/6008)
* Video views statistics:
* Count a *view* after 10 seconds and use a web browser session id to identify a viewer (see IMPORTANT CHANGES section)
* Add information about the location of the viewer subdivision/region
* More accurate retention stats where PeerTube doesn't take into account empty views anymore
* UI/UX:
* Automatically filter on *Local videos* in admin
* Add ability to sort videos by file size
* Add total video file size column in admin users list
* Improve admin runner jobs list by using badges with same colors for type/runner and add *processed/finished* columns
* Add *Recommended* tags to recommended PeerTube plugins/themes
* Improve plugins/themes default trending sort
* Trim username on login
* Warn if "Forgot password" email contains uppercase
* Use more precise buttons label to save changes in *My account* settings
* Add icon to owners/moderators only options
* Always use short UUIDs instead of full UUIDs in client to prevent URL confusion
* Add average admins/moderators response time in *Request an account* page
* Add color to registration/abuse state icon
* Player:
* Add an enable/disable subtitle button to the control bar
* Faster auto-resizing of the player when the video has a custom aspect ratio (only for videos uploaded on PeerTube >= 6.1)
* Use video aspect ratio for responsive embeds (only for videos uploaded on PeerTube >= 6.1)
* Reduce `ffprobe` calls when not needed resulting in faster live stream transcoding startup and CPU/IO reduction during video upload/import
* Federation
* Introduce a new way to federate `Views` events in the federation. See [the commit details](https://github.com/Chocobozzz/PeerTube/commit/b4f4432459f22994cb8fa667c862a0edd7af0ebc) for more information
* Implements [FEP-2677](https://codeberg.org/fediverse/fep/src/branch/main/fep/2677/fep-2677.md) to identify the `Application``Actor`
* Add Lemmy `postingRestrictedToMods` information to channels AP objects
* Improve generated video thumbnail quality
* Add notification when a subscribed video channel is live streaming
* Support `itunes:owner` in podcast feed
### Bug fixes
* Add stripes to square video thumbnails too (like we do for portrait videos)
* Prevent channels from being displayed multiple times on the *My channels* page
* Stricter video timestamp "linkification"
* Correctly fix downloading video files from object storage with some video names
* Fix broken RSS feed in some (rare) cases
* Fix local jobs count/pagination with *Waiting* jobs
* Banned users cannot live stream anymore
* Correctly escape HTML entities in meta tags [#6206](https://github.com/Chocobozzz/PeerTube/pull/6206)
* Fix broken account channels page with high `video_channels.max_per_user` config
* Add ability for moderators to approve/reject user registrations
* Do not display empty notification settings group
* Correctly fix WebTorrent video import crash
* Fix video channel synchronization crash on remote channels/playlists that contain hidden videos (unavailable, deleted etc.)
* Ensure the filename doesn't contain `/` character when downloading a video
* Fix Google Search SEO (with `Video is not the main content of the page` error)
* Remove password autocomplete in embed which causes issues when the parent page has a password input and the user uses the web browser's password autofill feature
* Don't submit the login form on forgot my password keyboard click
* Fix storyboard generation with some videos
* Fix ffmpeg encoder after custom plugin transcoding profile deletion
* Fix navigating from one channel related page (playlist, videos...) to another one
* More robust live stream transcoded by a remote runner
* Fix first video in playlist that doesn't start at "starts at"
* Fix embed HTML code for videos/playlists that have passwords
* Display external account/channel playlists if user is allowed to escape the federation
* Fix view endpoint crash on geoip update failure
* Fix setting video subtitle from URL query
* Fix selecting "Display all languages/categories/licences" in videos search resulting in an empty search
* If you upgrade from PeerTube **< v6.0.0**, please follow v6.0.0 IMPORTANT NOTES
* If you upgrade from PeerTube **v6.0.0**, please follow v6.0.1 IMPORTANT NOTES
### SECURITY
* Prevent nginx from serving private/internal/password protected HLS video static files
* You must update your nginx configuration like in [this commit](https://github.com/Chocobozzz/PeerTube/commit/12ea8f0dd11e3fb5fbb8955f5b7d52f27332d619#diff-be9f96b9b1de67284047e610821493f9a5bec86bfcdf81a7d8d6e7904474c186) (line `202` replace `location ~ ^(/static/(webseed|web-videos|streaming-playlists)/private/)|^/download {` by `location ~ ^(/static/(webseed|web-videos|streaming-playlists/hls)/private/)|^/download {`)
### Bug fixes
* Fix HTML meta tags with attributes that contain quotes
* Fix time parsing resulting in broken video start time in some cases
* Fix WebTorrent video import crash
* Reload *Discover* page on logout
* Fix privacy error when updating a live, even if the privacy has not changed
* Fix invalid remote live state change notification that causes the player to reload
* Don't apply big play button skin to settings menu
* Fix downloading video files from object storage with some video names (that include emojis, quotes etc)
* Fix thumbnail generation when ffmpeg cannot seek the input
* Fix theme colors on stats page
* Fix input mask (used for chapters, playlist timecodes...) with 10h+ videos
* Fix chapter *position* width consistency
* Fix player ratio with audio only videos
* Also update video playlist URLs when using `update-host` script
* Fix upload/import/update of videos that contain multiple chapters with the same timecode
* Ensure `location = /api/v1/videos/upload-resumable {` has been replaced by `location ~ ^/api/v1/videos/(upload-resumable|([^/]+/source/replace-resumable))$ {` in your nginx configuration
* Ensure you updated `storage.web_videos` configuration value to use `web-videos/` directory name
* Ensure your directory name on filesystem is the same as `storage.web_videos` configuration value: directory on filesystem must be renamed from `videos/` to `web-videos/` to represent the value of `storage.web_videos`
We have many important notes in this release. We know it's a pain for sysadmin, but consider each one as a major step forward for PeerTube quality!
#### Sysadmins important notes
* Remove NodeJS 16 support (see https://nodejs.org/fr/blog/announcements/nodejs16-eol):
* Please upgrade to NodeJS 18 before upgrading PeerTube
* If you use NodeSource repository, you may have to migrate to their new repository: https://github.com/nodesource/distributions/wiki/How-to-migrate-to-the-new-repository
* Check in `production.yaml` that you use `127.0.0.1` instead of `localhost` for `listen.hostname`, `database.hostname` and `redis.hostname` as Node 18 favours IPv6 for `localhost` resolution
*`storage.videos` must be **renamed** to `storage.web_videos`: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L151
* Configuration value of `storage.web_videos` must have the directory name to be **changed** from `videos/` to `web-videos/`: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L151
* Directory on filesystem must be **renamed** from `videos/` to `web-videos/` to represent the value of `storage.web_videos`
*`transcoding.webtorrent` must be **renamed** to `transcoding.web_videos`: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L532
*`object_storage.videos` must be **renamed** to `object_storage.web_videos`. The value of `object_storage.web_videos.bucket_name` doesn't need to be changed: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L223
*`storage.storyboards` must be **added**: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L157
* PeerTube Docker image now uses `bookworm`. `chocobozzz/peertube:production-bullseye` needs to be replaced by `chocobozzz/peertube:production-bookworm`
* Env configuration that your must update if you use Docker:
*`PEERTUBE_TRANSCODING_WEBTORRENT_ENABLED` must be **renamed** to `PEERTUBE_TRANSCODING_WEB_VIDEOS_ENABLED`
*`PEERTUBE_OBJECT_STORAGE_VIDEOS_BUCKET_NAME` must be **renamed** to `PEERTUBE_OBJECT_STORAGE_WEB_VIDEOS_BUCKET_NAME`
*`PEERTUBE_OBJECT_STORAGE_VIDEOS_PREFIX` must be **renamed** to `PEERTUBE_OBJECT_STORAGE_WEB_VIDEOS_PREFIX`
*`PEERTUBE_OBJECT_STORAGE_VIDEOS_BASE_URL` must be **renamed** to `PEERTUBE_OBJECT_STORAGE_WEB_VIDEOS_BASE_URL`
* You must update nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/nginx/peertube
*`location ~ ^/static/(thumbnails|avatars)/ {` block must be removed
*`location ~ ^(/static/(webseed|streaming-playlists)/private/)|^/download {` must be updated to `location ~ ^(/static/(webseed|web-videos|streaming-playlists)/private/)|^/download {`
*`location ~ ^/static/(webseed|redundancy|streaming-playlists)/ {` must be updated to `location ~ ^/static/(webseed|web-videos|redundancy|streaming-playlists)/ {`
* Support moving video files from object storage to filesystem: https://docs.joinpeertube.org/maintain/tools#move-video-files-from-object-storage-to-filesystem
* The [REST API](https://docs.joinpeertube.org/api-rest-reference.html#tag/Video-Passwords) can store as many passwords as you want, allowing developers to use this feature to easily give or revoke access to a video *on the fly*
* Developers that use PeerTube embeds can set the video password using [the embed API](https://docs.joinpeertube.org/api/embed-player#setvideopassword-promise-void)
* Storyboard of videos uploaded/imported before v6 can be generated by the admin using `npm run create-generate-storyboard-job` command: https://docs.joinpeertube.org/maintain/tools#generate-storyboard
* Don't cache upload response if the video has been deleted
* Fix broken upgrade script when using custom database port
* Prevent duplicate runner names
* Avoid runner job update error
* Notify remote runners there are available jobs when a job is aborted/errored
* Fix updating P2P settings in left menu
* Fix 500 HTTP error on invalid short UUID conversion
* Don't display admin email in `security.txt` well-known endpoint
* Optimize `update-host` script to fix out of memory error
* Fix error log when using an unconventional distribution of FFmpeg with a non-standard version string [#5917](https://github.com/Chocobozzz/PeerTube/pull/5917)
* Fix live replay REST API breaking change: `replaySettings.privacy` is not required anymore
* Fix broken live replay when updating replay privacy
* More robust *About* page when getting category from server
* Fix `ERR_HTTP_HEADERS_SENT` crash
* Avoid illegal characters in torrent filename
* Avoid federation error log with remote `Like` on `Note`
* Fix atom feed with *Science & Technology* category
* Support empty value returned by `filter:api.video.get.result` hook
* Prevent remote subscribe on accounts (not yet supported by PeerTube)
* Fix feed audio file mimetype
* Fix video quality on high video resolution/fps
* Fix disabling Object Storage ACL using Docker env `PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PUBLIC` and `PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PRIVATE` in `.env`
* **Important** You must update your nginx configuration to support remote runners: https://github.com/Chocobozzz/PeerTube/blob/develop/support/nginx/peertube#L101
* Add `storage.tmp_persistent` directory in configuration file. **You must configure it in your production.yaml**: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L148
* Remove `npm run create-transcoding-job` and `npm run print-transcode-command` unmaintained scripts
* Add Redis sentinel support [#5593](https://github.com/Chocobozzz/PeerTube/pull/5593)
* Improve upgrade script (used when you will upgrade from PeerTube 5.2 to its next version) for classic installation:
* Automatically generate a `config/production.yaml.new` file after the upgrade, which is the fusion between the new PeerTube configuration keys and your current `production.yaml`. After a review you can replace your old `config/production.yaml` with this new file so you don't have to add new keys manually
* Add `ls` option compatibility with FreeBSD [#5785](https://github.com/Chocobozzz/PeerTube/pull/5785)
### Docker
* Make database name configurable using env variable [#5734](https://github.com/Chocobozzz/PeerTube/pull/5734)
### Plugins/Themes/Embed API
* Add `filter:html.client.json-ld.result` hook
### Features
* :tada: Implement remote transcoding for VOD videos, Live streams and Studio editions :tada: [#5769](https://github.com/Chocobozzz/PeerTube/pull/5769)
* If enabled, remote PeerTube runners can process these high CPU jobs
* If your instance has signup enabled, user registration approval is automatically enabled by the default configuration of this release. You can change this setting in your `production.yaml` or in the configuration page in the web admin
* Minimum recommended Redis version is 6.2. Version 6.0 should still work: see [this comment](https://github.com/Chocobozzz/PeerTube/issues/5659#issuecomment-1449607001) for more information
* Add *Server code* documentation explaining the database model typing and how to add a new feature in PeerTube server: https://docs.joinpeertube.org/support/doc/development/server
* Add ability to set `playbackRate` in URL (watch page and embed) [#5486](https://github.com/Chocobozzz/PeerTube/pull/5486)
* Auth plugins:
* Can set default `adminFlags`, `videoQuota` and `videoQuotaDaily` user attributes
* Introduce `userUpdater` hook function so external auth plugins can update the user on user login: https://docs.joinpeertube.org/contribute/plugins#add-external-auth-methods
* Automatically redirect to the default external auth on PeerTube refresh token expiration
* Add `action:video-edit.form.updated` fired every time the video upload/import/live/update form values change
* Add `filter:video-watch.video-plugin-metadata.result` to add custom video metadata in watch page
* Existing `action:video-edit.init` hook now contains a `updateForm` attribute in options that you can use to update video upload/import/live/update form values
* Fix 404 HTTP code in watch page when having `;threadId` param in URL
* Correctly re-inject video file token in `.m3u8` resolution playlists to fetch private mp4 video file [#5677](https://github.com/Chocobozzz/PeerTube/pull/5677)
* Don't process live when moving videos to external storage
* **Important** Private and internal video files are now protected. See [#5370](https://github.com/Chocobozzz/PeerTube/pull/5370) for more information, but see below for most important information:
* For private/internal videos on filesystem:
* These videos are now under a `private/` subdirectory in `videos/` and `streaming-playlists/` directories
* Nginx doesn't serve these private files anymore, the requests are forwarded to PeerTube that will check authentication
* For private/internal videos in object storage:
* These videos have now a private ACL
* PeerTube proxifies requests to private object storage (using pre-signed URLs is not possible as explained in [#5370](https://github.com/Chocobozzz/PeerTube/pull/5370))
* Torrent files and magnet URIs of private/internal videos don't contain a webseed URL anymore since they require authentication
* **Important** You need to manually execute a migration script after your upgrade to migrate private/internal video files:
* There is a new `secrets.peertube` configuration:
* Classic install: fill it before running PeerTube v5: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/config/production.yaml.example#L14
* Docker install: fill it using an env variable before running the containers: https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/.env#L27
*`object_storage.upload_acl` is now a parent key that you must update: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/config/production.yaml.example#L153
*`search.disable_local_search` disables local search in client search bar only and doesn't disable it on server side anymore [#5411](https://github.com/Chocobozzz/PeerTube/pull/5411)
* **Important** You need to execute manually a migration script (can be executed after your upgrade, while your PeerTube instance is running) to generate smaller avatar miniatures:
*`PUT /api/v1/videos/{id}/watching` is deprecated, use `POST /api/v1/videos/videos/{id}/views` instead: https://docs.joinpeertube.org/api-rest-reference.html#operation/addView
* Add ability to set RTMP/RTMPS listening hostname using `rtmp.hostname`/`rtmps.hostname` and public RTMP/RTMPS hostname using `rtmp.public_hostname`/`rtmps.public_hostname`
* Support `controlBar=0` to hide player control bar. See [the documentation](https://docs.joinpeertube.org/api/embed-player#url-parameters) for more information
* Add ability for admins to display author avatar in video miniatures [#4639](https://github.com/Chocobozzz/PeerTube/pull/4639) [#4823](https://github.com/Chocobozzz/PeerTube/pull/4823)
* Introduce ability for plugins to create client pages: https://docs.joinpeertube.org/contribute/plugins#create-client-page
* Plugins that register custom video fields can choose in which tab they want to display them and can report errors: https://docs.joinpeertube.org/contribute/plugins#add-custom-fields-to-video-form
* Add `#plugin-selector-about-instance-moderation`, `#plugin-selector-about-instance-other-information`, `#plugin-selector-about-instance-features`, `#plugin-selector-about-instance-statistics`, `#plugin-selector-about-menu-instance`, `#plugin-selector-about-menu-peertube`, `#plugin-selector-about-menu-network` in about page [#4597](https://github.com/Chocobozzz/PeerTube/pull/4597)
* Add `#plugin-selector-menu-user-dropdown-language-item` in menu [#4597](https://github.com/Chocobozzz/PeerTube/pull/4597)
* Add client plugin hooks
*`filter:login.instance-about-plugin-panels.create.result` and `filter:signup.instance-about-plugin-panels.create.result` to add custom instance information in login/signup pages
* Add server plugin hooks
*`filter:api.server.stats.get.result`
*`filter:api.video.upload.video-attribute.result`, `filter:api.video.import-url.video-attribute.result`, `filter:api.video.import-torrent.video-attribute.result`, `filter:api.video.live.video-attribute.result` when creating a video object
*`action:api.video-caption.created` and `action:api.video-caption.deleted` [#4650](https://github.com/Chocobozzz/PeerTube/pull/4650)
* Server helpers
*`videos.getFiles(videoId: number)` to list video files (webtorrent, hls and thumbnail files)
*`videos.ffprobe(path: string)` to get `ffprobe` JSON result
* Publish [@peertube/peertube-type](https://www.npmjs.com/package/@peertube/peertube-types) NPM module that can be used by TypeScript plugins
* Add ability to disable P2P in embed using `p2p` query parameter in embed URL
### Maintenance
* REST API
* Deprecate `webTorrentEnabled` in favour of `p2pEnabled` for user model
* Add ability to pause/resume the job queue
* Also publish stable releases on https://builds.joinpeertube.org/release
* Add ability for admins to specify `youtube-dl`/`yt-dlp` python binary path [#4706](https://github.com/Chocobozzz/PeerTube/pull/4706)
* Check video privacy before listing or accepting captions, comments or rates
* Check video import target URL does not resolve to internal IP. This technique has some limits so if you have private HTTP services on your server/network publicly accessible, we recommend to use a proxy or a dedicated interface for PeerTube
* **Important** You need to execute manually a migration script (can be executed after your upgrade, while your PeerTube instance is running) to migrate HLS files name:
*`filter:api.video-watch.video-playlist-elements.get.params` and `filter:api.video-watch.video-playlist-elements.get.result` [#4387](https://github.com/Chocobozzz/PeerTube/pull/4387)
* Add [create-move-video-storage-jobs](https://docs.joinpeertube.org/maintain/tools#create-move-video-storage-jobjs) script to move local video files in object storage [#4481](https://github.com/Chocobozzz/PeerTube/pull/4481)
* **Debian Bullseye admins:** Debian Bullseye removed `python` binary/link in favour of explicit `python2`/`python3` binaries. But `youtube-dl` used by PeerTube needs it so you'll have to install [python-is-python2](https://packages.debian.org/bullseye/python-is-python2) or [python-is-python3](https://packages.debian.org/bullseye/python-is-python3) **before** upgrading PeerTube
* **Deprecate** `videoLanguageManager.addLanguage` and `videoLanguageManager.deleteLanguage`: use `videoLanguageManager.addConstant` and `videoLanguageManager.deleteConstant` instead
* **Deprecate** `videoCategoryManager.addCategory` and `videoCategoryManager.deleteCategory`: use `videoCategoryManager.addConstant` and `videoCategoryManager.deleteConstant` instead
* **Deprecate** `videoLicenceManager.addLicence` and `videoLicenceManager.deleteLicence`: use `videoLicenceManager.addConstant` and `videoLicenceManager.deleteConstant` instead
* Introduce `.getConstantValue()`, `.getConstants()` and `.resetConstants()` for `videoLanguageManager`, `videoCategoryManager`, `videoLicenceManager`, `videoPrivacyManager` and `playlistPrivacyManager`
* Add server plugin hooks:
*`filter:api.overviews.videos.list.params` and `filter:api.overviews.videos.list.result`
* Or you can apply the changes introduced in this commit: https://github.com/Chocobozzz/PeerTube/commit/86dc0b9cc9374cba7548bb613ff43d92f90570a8 and then use the auto upgrade script
* :tada: Add ability to create a custom homepage using HTML, markdown and [custom HTML tags](https://docs.joinpeertube.org/api/custom-client-markup) [#4007](https://github.com/Chocobozzz/PeerTube/pull/4007)
* :tada: Add ability to search playlists in PeerTube instance and [SepiaSearch](https://sepiasearch.org/)
* :tada: Shorter public URLs (old URLs are still supported):
* Handle short UUID (`8r4jooaQpHp8tw1E1qpSeYq` instead of `3caf7bea-5ceb-4959-81a0-b44d184e897c`) for playlists and videos
* Use `/w/:id` instead of `/videos/watch/:id` and `/w/p/:id` instead of `/videos/watch/playlist/:id`
* Use `/a/:accountName` instead of `/accounts/:accountName` and `/c/:channelName` instead of `/video-channels/:channelName` [#4009](https://github.com/Chocobozzz/PeerTube/pull/4009)
* Provide `/@:username` page that automatically redirect to the account or channel page [#4009](https://github.com/Chocobozzz/PeerTube/pull/4009)
* Or you can apply the changes introduced in this commit: https://github.com/Chocobozzz/PeerTube/commit/86dc0b9cc9374cba7548bb613ff43d92f90570a8 and then use the auto upgrade script
* **Important:** You must update your nginx configuration to add the `upload-resumable` endpoint: https://github.com/Chocobozzz/PeerTube/blob/develop/support/nginx/peertube#L81
To fix old thumbnails quality, run `regenerate-thumbnails` script after your PeerTube upgrade: https://docs.joinpeertube.org/maintain/tools#regenerate-thumbnailsjs
* Support HTML placeholders for plugins. See [the documentation](https://docs.joinpeertube.org/contribute/plugins#html-placeholder-elements) for more information
* Support storing files for plugins in a dedicated directory. See [the documentation](https://docs.joinpeertube.org/contribute/plugins#storage) for more information
* Add channel and playlist stats to stats endpoint [#3747](https://github.com/Chocobozzz/PeerTube/pull/3747)
* Support `playlistPosition=last` and negative index (`playlistPosition=-2`) URL query parameters for playlists [#3974](https://github.com/Chocobozzz/PeerTube/pull/3974)
* My videos:
* Add ability to sort videos (publication date, most viewed...)
* Add ability to only display live videos
* Automatically resume videos for non logged-in users [#3885](https://github.com/Chocobozzz/PeerTube/pull/3885)
* Admin plugins:
* Show a modal when upgrading a plugin to a major version
* Display a setting button after plugin installation
* Add ability to search live videos
* Use bigger thumbnails for feeds
* Parse video description markdown for Opengraph/Twitter/HTML elements
* Open the remote interaction modal when replying to a comment if we are logged-out
* Add script printing command to generate a resolution for a given file [#3507](https://github.com/Chocobozzz/PeerTube/pull/3507)
* Add `--wait-interval <seconds>` option to video-import script to wait between two video imports [#3310](https://github.com/Chocobozzz/PeerTube/pull/3310)
* Fair transcoding jobs priority: give an higher priority to `optimize` jobs and decrease priority of transcoding jobs depending on the amount of videos uploaded by the user during the last 7 days [#3637](https://github.com/Chocobozzz/PeerTube/pull/3637)
* Higher niceness priority for live transcoding compared to vod transcoding [#3577](https://github.com/Chocobozzz/PeerTube/pull/3577)
* Allow admins to choose a transcoding profile. New transcoding profiles can be added by PeerTube plugins that can inject custom ffmpeg encoders/parameters
* Add transcoding support for 1440p (Quad HD/QHD/WQHD) videos [#3518](https://github.com/Chocobozzz/PeerTube/pull/3518)
* Add transcoding progress in admin transcoding jobs list
* Use `veryfast` preset for default transcoding profile (same result size but faster)
* Transcode audio uploads to lower configured resolutions
* Transcode HLS playlists in a `tmp` directory (less bugs/inconsistencies)
* Allow admins to choose the transcoding jobs concurrency
* Async torrent creation on video upload. We hope that it should fix some weird upload errors
* Add `.m4a` audio upload support
* Accessibility/UI:
* Move orange admin buttons on the left side
* Hide title to left menu toggle icon
* Add username information in profile settings
* Improve about page layout
* Add refresh button in jobs list
* Add ability to set a custom user quota
* Rewrite prose for JavaScript disabled message [#3684](https://github.com/Chocobozzz/PeerTube/pull/3684)
* Video import:
* Stricter youtube-dl format selectors for import (don't import HDR videos and cap to the max supported resolution) [#3516](https://github.com/Chocobozzz/PeerTube/pull/3516)
* Don't publish imported videos before the user submitted the second step form
* Allow admins to choose the import jobs concurrency
* Implement *hot* and *best* trending algorithms [#3625](https://github.com/Chocobozzz/PeerTube/pull/3625) & [#3681](https://github.com/Chocobozzz/PeerTube/pull/3681)
* Admin config:
* Add URL fragment support in admin config page to go on the appropriate tab
* Improve submit error message
* Allow admins to disable ping requests logging [#3550](https://github.com/Chocobozzz/PeerTube/pull/3550)
* Add a setting so PeerTube periodically cleans up remote AP interactions
* Add ability for admins to update plugin auth field of a particular user
* Support `webp` avatar upload
* Implement remote comment/subscription
* Register a service worker [#3464](https://github.com/Chocobozzz/PeerTube/pull/3464)
* Add ability to remove one's avatar for account and channels [#3467](https://github.com/Chocobozzz/PeerTube/pull/3467)
* Show first decimal for video views above a thousand [#3564](https://github.com/Chocobozzz/PeerTube/pull/3564)
* Allow user to search through their watch history [#3576](https://github.com/Chocobozzz/PeerTube/pull/3576)
* Allow users/visitors to search through an account's videos [#3589](https://github.com/Chocobozzz/PeerTube/pull/3589)
* Use an HTML link to display feed url
* Allow AP resolution for default account/channel pages (`/accounts/:name/video-channels` and `/video-channels/:name/videos`)
* Redirect to login on 401, display 403 variant [#3632](https://github.com/Chocobozzz/PeerTube/pull/3632)
* Performance:
* Optimize videos list API endpoint
* Optimize videos list views sort SQL query
* Avoid as much as possible to process remote thumbnail
* Proxify remote torrent requests from local clients (like we do for captions and previews)
* Optimize rate POST endpoint
* Tighten hotkeys definitions to not conflict with the web browser hotkeys [#3702](https://github.com/Chocobozzz/PeerTube/pull/3702)
* Add more AP stats to stats endpoint
* Increase jobs request timeout to 7 seconds
* Increase broadcast request concurrency to 30
### Bug fixes
* Fix remote subscribe input alignment
* Fix loading bar for HTTP requests
* Fix table header overflow
* Disable wait transcoding checkbox instead of hiding it when uploading an incompatible video for the web
* Fix sendmail emailer configuration
* Add missing niceness to ffmpeg thumbnail process
* Videos with only HLS files:
* Fix RSS feed
* Correctly wait transcoding before federating
* Fix redundancy
* Correctly remove torrents
* Localize decimal separator in video miniatures [#3643](https://github.com/Chocobozzz/PeerTube/pull/3643)
* Check banned status on external authentication
* Remove all video redundancies when purging the cache
* Fix URI search admin config update
* Fix broken HLS playback with videos that contain an unknown channel layout
* Fix HLS generation after file import script
* Ensure we don't receive things from local actors
* Try to recover from network errors in HLS player
* Fix comments sorting dropdown z-index
* Fix create transcoding job script depending on the transcoding configuration
* Fix NSFW policy in my videos, account videos and channel videos pages
* Fix complete description loading of a previous video
* Fix video comments display with deleted comments
* Don't override preview image on import
* Fix Accept AP messages sending to previously accepted followers
* Fix import script when using the instance uses the search index
* Fix player freeze on Safari with a video that has many subtitles
* Fix anonymous user settings
* Fix preview upload with capitalized ext
* Fix abuses list crash on deleted video
* More robust channel change federation
* Fix emptying video tags
* Fix broken local actors that do not have a public/private key
* Update the default configuration to not federate unlisted videos. We recommend to admins to update [this setting](https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L196)
* Update the default configuration to remove remote video views to reduce DB size and improve performances. We recommend to admins to update [this setting](https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L170)
* Add ability for auth plugins to redirect user on logout [#32](https://framagit.org/framasoft/peertube/PeerTube/-/merge_requests/32) & [#33](https://framagit.org/framasoft/peertube/PeerTube/-/merge_requests/33)
* Add `input-password` setting to plugins [#3375](https://github.com/Chocobozzz/PeerTube/issues/3375)
* Add custom fields in video update/upload form using `registerVideoField` (https://docs.joinpeertube.org/contribute/plugins#add-custom-fields-to-video-form)
* :tada: Add ability to report comments and accounts
* :tada: Add messaging system between local reporter of an abuse and moderators so they can easily communicate
* :tada: Users can now see their abuse reports, and have notifications when an abuse state changed (accepted/rejected) or when moderators added a new message
* Add embed to block list details [@rigelk in #2926](https://github.com/Chocobozzz/PeerTube/pull/2926)
* Video playlists:
* :tada: Add ability to embed playlists
* :tada: Add ability to put a video multiple times in a playlist (with different startAt/stopAt parameters or not)
* Video comments:
* Add uni-code emojis native display in comments [@Kimsible in #3046](https://github.com/Chocobozzz/PeerTube/pull/3046)
* Add delete and re-draft action on a comment that doesn't have replies [@Kimsible in #3046](https://github.com/Chocobozzz/PeerTube/pull/3046)
* Hide deleted comments when there aren't replies [@Kimsible in #3046](https://github.com/Chocobozzz/PeerTube/pull/3046)
* Accessibility/UI:
* Disable vertical scroll instead of hide on desktop browsers [@Kimsible in #2962](https://github.com/Chocobozzz/PeerTube/pull/2962)
* Update my-account sub-menus icons [@Kimsible in #2977](https://github.com/Chocobozzz/PeerTube/pull/2977)
* Improve navigation sub-menu and tabs effects [@Kimsible in #2971](https://github.com/Chocobozzz/PeerTube/pull/2971)
* Hide generic channel display name and avatar on watch view [@Kimsible in #2988](https://github.com/Chocobozzz/PeerTube/pull/2988)
* Display user quota progress bars above upload form [@Kimsible in #2981](https://github.com/Chocobozzz/PeerTube/pull/2981)
* Improve mobile accessibility by moving table action cells on the left [@Kimsible in #2980](https://github.com/Chocobozzz/PeerTube/pull/2980)
* Directly display download button in watch page on logged-out users [@rigelk in #2919](https://github.com/Chocobozzz/PeerTube/pull/2919)
* Improve users list table display in admin (add badge, progress bar) [@rigelk in #2991](https://github.com/Chocobozzz/PeerTube/pull/2991)
* Add dynamic column display for users list table in admin [@rigelk in #2991](https://github.com/Chocobozzz/PeerTube/pull/2991)
* Add anchor links to about/instance [@Kimsible in #3064](https://github.com/Chocobozzz/PeerTube/pull/3064)
* Improve select components [@rigelk in #3035](https://github.com/Chocobozzz/PeerTube/pull/3035)
* Add content overlay for opened menu on touchscreens [@Kimsible in #3088](https://github.com/Chocobozzz/PeerTube/pull/3088)
* Add alert and hide upload view when no upload is possible [@Kimsible in #2966](https://github.com/Chocobozzz/PeerTube/pull/2966)
* Allow sorting notifications by unread/newest **@rigelk**
* Add open-graph and twitter-card metas for accounts, video-channels and playlists urls [@Kimsible in #2996](https://github.com/Chocobozzz/PeerTube/pull/2996)
* Add channel name to create-user admin form [@Kimsible in #2984](https://github.com/Chocobozzz/PeerTube/pull/2984)
A new endpoint to report videos will be created in PeerTube 2.4 and will also allow to report accounts and comments (`/videos/abuse` will be removed in 3.0)
* Renamed videos blacklist feature to videos blocks/blocklist
### Documentation
* Add feeds routes to the openapi spec **@rigelk**
* Add notifications routes to the openapi spec **@rigelk**
* Add redundancy routes to the openapi spec **@rigelk**
* Add plugins routes to the openapi spec **@rigelk**
* Add examples, descriptions and missing filters for abuses routes in the openapi spec **@rigelk**
* Update CentOS insutructions in dependencies.md [@cgarwood82 in 2904](https://github.com/Chocobozzz/PeerTube/pull/2904)
### Maintenance
* Switched image processing library from native dependency `sharp` to pure JS implementation `jimp`. Admins don't have to compile `sharp` anymore and `jimp` is lighter
* Provide specific engine boundaries for NodeJS and Yarn [@rigelk in 0c4bacb](https://github.com/Chocobozzz/PeerTube/commit/0c4bacbff53bc732f5a2677d62a6ead7752e2405)
* Add ability to set `database.name` config option [@gramakri in #2898](https://github.com/Chocobozzz/PeerTube/pull/2898)
### Docker
* Fix `POSTGRES` env variables in docker-compose ([@kimsible in #2538](https://github.com/Chocobozzz/PeerTube/pull/2538/files))
* Fix OpenDKIM permissions in docker-compose setup [@kimsible in #2868](https://github.com/Chocobozzz/PeerTube/pull/2868)
* Add ability to override client assets: logo - favicon - PWA icons - PWA manifest name and description [@kimsible in #2897](https://github.com/Chocobozzz/PeerTube/pull/2897)
* Block IP of infohash spammers [db48de8](https://github.com/Chocobozzz/PeerTube/commit/db48de8597897e5024f8e9ed5acb1a8f40748169)
* Allow limiting video-comments rss feeds to an account or video channel [@rigelk in 00494d6](https://github.com/Chocobozzz/PeerTube/commit/00494d6e2ae915741f47869dcd359d9728a0af91)
* **/!\ VERY IMPORTANT /!\\** We added a unique index on actors usernames to fix some federation bugs.
Please check now if you have conflicts:
* Go inside your database using `sudo -u postgres psql peertube_prod` and run `select "preferredUsername" from actor where "serverId" is null group by "preferredUsername" having count(*) > 1;`
* If you have some results, it seems you have duplicate channels/accounts.
For every entry, you'll have to change the preferredUsername of the entry you want (so they are unique).
The updated actors could have some federations issues
* Changed `auto_follow_index` setting configuration: you now have to use the complete URL in `index_url`.
If you used the default one, you now need to use `https://instances.joinpeertube.org/api/v1/instances/hosts`.
This way, you can also use a direct raw URL (Gitlab, Github, pastebin, etc.) using [a simple text format](https://framagit.org/framasoft/peertube/instances-peertube#peertube-auto-follow) and easily maintain small communities or instance recommendation lists.
* Add nginx configuration to redirect videos to an S3 bucket ([@rigelk](https://github.com/rigelk)) and update of the [corresponding documentation](https://docs.joinpeertube.org/admin/remote-storage).
* Optimize SQL request when broadcasting an activity
* Support infinite scrolling in the discover page
* Add ability for admins to create a user without a password. PeerTube will send a reset password link to the user ([@JohnXLivingston](https://github.com/JohnXLivingston))
* Improve embed title background opacity
* Add origin instance URL in watch page
* Clearer description of advanced search options
* Always copy full actor handle in video channels view ([@rigelk](https://github.com/rigelk))
* Add `sendmail` support ([@immae](https://github.com/immae)) to `smtp` configuration
* Support `rel="me"` links in markdown
* Use `originallyPublishedAt` from body on import if it exists
* Sort outbox by *DESC createdAt* order
* Increase video comment max length limit
### Bug fixes
* Update default user theme to `instance-default` (Jorge Silva)
* Fix user dropdown menu with long texts ([@rigelk](https://github.com/rigelk))
* Fix load more comments on infinite scroll ([@ipbc-dev](https://github.com/ipbc-dev))
* Fix CSP issue on WebFinger service ([@ZanyMonk](https://github.com/ZanyMonk))
* **/!\ VERY IMPORTANT /!\\** You need to execute manually a script (can be executed after your upgrade, while your PeerTube instance is running) to create HLS video torrents:
* **/!\ VERY IMPORTANT /!\\** In the next PeerTube release (v2.2.0), we'll add a unique index on actors usernames to fix some federation bugs.
Please check now if you have conflicts using:
* Go inside your database using `sudo -u postgres psql peertube_prod` and run `select "preferredUsername" from actor where "serverId" is null group by "preferredUsername" having count(*) > 1;`
* If you have some results, it seems you have duplicate channels/accounts.
For every entry, you'll have to change the preferredUsername of the entry you want (so they are unique).
The updated actors could have some federations issues
* We now use Buster for the docker image, so the image name changed:
*`production-stretch` becomes `production-buster`
*`v2.x.x-stretch` becomes `v2.x.x-buster`
* Users cannot create more than 20 channels now to avoid UX and actor name squatting issues
* We added a warning if the `videos` directory is the same than the `redundancy` one in your configuration file: it can create some bugs
* Add ability to generate HLS videos using `create-transcoding-job` script (see [the documentation](https://docs.joinpeertube.org/maintain/tools#create-transcoding-jobjs))
* Update nginx template: (you need to [update manually](https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md#nginx))
* Add streaming playlists endpoint
* Add `client_body_temp_path` hint
* Relax TLS/SSL ciphers hardening to allow Android 4.4.2 to use the PeerTube instance API
* Add `maxFileSize`, `maxFiles` and `anonymizeIP` log options in configuration file
### Features
* :tada: Add *internal* video privacy mode. *Internal* videos are only available to other logged in users of your instance, and are not federated
* :tada: Add hyperlink video timestamps in comments & video descriptions ([@Lesterpig](https://github.com/lesterpig) & [@rigelk](https://github.com/rigelk))
* :tada: Comments improvements:
* Support basic markdown
* Soft delete video comments instead of destroying them ([@alcalyn](https://github.com/alcalyn))
* Add commentator name alongside fid for video comments ([@rigelk](https://github.com/rigelk))
* Add a cancel button in comment form ([@rigelk](https://github.com/rigelk))
* Show number of comments under a video in watch page ([@rigelk](https://github.com/rigelk))
* Add user moderation dropdown ([@rigelk](https://github.com/rigelk))
* Add ability to sort comments by *total replies* or *created date* ([@rigelk](https://github.com/rigelk))
* Add *total replies from video author* indicator ([@rigelk](https://github.com/rigelk))
* Comment name emphasis for video author ([@rigelk](https://github.com/rigelk))
* Add "Watch later" button in video miniature overlay ([@rigelk](https://github.com/rigelk))
* Add ability to transcode videos in an audio only video container ([@Yetangitu](https://github.com/Yetangitu))
* Add playlist search input in *add to playlist* dropdown ([@rigelk](https://github.com/rigelk))
* Add search bars for a user's videos and playlists ([@rigelk](https://github.com/rigelk))
* Support playlists in share modal
* Better UI for a better world:
* Add play/pause bezels to the video player ([@rigelk](https://github.com/rigelk))
* Use icons instead of buttons in watch page (like/dislike, support...) ([@rigelk](https://github.com/rigelk))
* Improve *PeerTube* section in About page and add links to the documentation
* Removed old JSON LD signature implementation. There will be some **federation incompatibilities** with forwarded activities sent
by PeerTube instances < v2.0.0
* Replaced configuration key `email.object` with `email.subject`: https://github.com/Chocobozzz/PeerTube/commit/916937d7daf386e4e2d37b2ca22db07b644b02df
### Plugins/Themes API
* Add plugin hook on registration `filter:api.user.signup.allowed.result`
### Docker
* Fix traefik version docker compose (**you need to update your `docker-compose.yml` file**: https://github.com/Chocobozzz/PeerTube/commit/f1b38883922fd59b36f093e44a5091e090d20862)
* **Important:** Deprecate NodeJS 8 (support ends on [December 2019](https://github.com/nodejs/Release#release-schedule)). Please upgrade to NodeJS 10.
* **Important:** Updated nginx template (you need to [update manually](https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md#nginx))
* Fix long server responses on dual stack servers: https://github.com/Chocobozzz/PeerTube/commit/fd2ddcae8ff4eb10bf7168ac3c8801f06b37627f
* **Important:** With the new theme system, we removed the dark mode button. Your administrator has to install [the dark theme](https://framagit.org/framasoft/peertube/official-plugins/tree/master/peertube-theme-dark)
from their admin panel, and then users can choose this theme in their settings
* Changed the playlist REST API to fix various issues. See https://github.com/Chocobozzz/PeerTube/pull/1998 for more information
* Removed magnet URI support in download modal since most of the BitTorrent clients do not understand the `xs` parameter
* Renamed `Overview` page to `Discover`
### Security
* Moderators can only create and update regular users (thanks GGC-Project)
### Maintenance
* Create a dedicated `package.json` for CLI tools to reduce server dependencies size
* Add ability to set root password by environment at first start ([@darnuria](https://github.com/darnuria))
* Removed unused `uuid` actor field (we already have a unique identifier that is the `preferredUsername`)
* Add ability to disable PeerTube log rotation ([@NassimBounouas](https://github.com/NassimBounouas))
* Speedup font display ([@BO41](https://github.com/BO41))
* Improve static files HTTP cache
* Add `--since` and `--until` parameters to import videos script to easily sync external channels ([@fflorent](https://github.com/fflorent))
* Optimize `/watch/:uuid` endpoint
* Optimize Sequelize (SQL ORM) queries generation (consumes less CPU)
* Prune script is faster and can prune avatar files
* CSP configuration changed: it's now in a [dedicated section](https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L110)
* Add GitPod support ([@jankeromnes](https://github.com/jankeromnes)) that could help people to contribute on PeerTube: https://github.com/Chocobozzz/PeerTube/blob/develop/.github/CONTRIBUTING.md#online-development
* Add reminder to restart PeerTube in upgrade script ([@ldidry](https://github.com/ldidry))
* Add argument to dockerfile to pass options to npm run build ([@NaPs](https://github.com/NaPs))
* Add `NOCLIENT` env support to only install server dependencies. Example: `NOCLIENT=true yarn install --pure-lockfile` ([@rigelk](https://github.com/rigelk))
* **Important:**: Add host network mode to the reverse proxy section (without this, it could break videos views and P2P: https://github.com/Chocobozzz/PeerTube/issues/1643#issuecomment-464789666)
* **Important:**: Add a network section to [docker-compose.yml template](https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/docker-compose.yml)
and update your [.env](https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/.env#L8) to fix IP forwarding issue ([@Nutomic](https://github.com/nutomic))
* Add Japanese & Nederlands & Português (Portugal) support
* Add experimental HLS support
* Better playback
* Better bandwidth management (for both client & server)
* Needs to store another video file per resolution, so enabling this option multiplies the videos storage by 2 (only new uploaded videos, this is not retroactive)
* Requires ffmpeg >= 4
* Better instance's followers management:
* Add ability to remove an instance's follower
* Add ability to forbid all new instance's followers
* Add ability to manually approve new instance's followers
* Add notification on new instance's follower
* Improve UI:
* Increase player default height
* Reduce big play button border width
* Increase thumbnail sizes
* Add hover effect on video miniature
* Add "my library" section in menu
* Add missing icons in some buttons/dropdown
* 2 rows per overview section
* Increase video thumbnail blur ([@Zig-03](https://github.com/Zig-03))
* Improve video miniatures list on mobile
* Add animation when opening user notifications
* Add ability for admins to disable the tracker (and so the P2P aspect of PeerTube, in order to improve users privacy for example)
* Add original publication date attribute to videos, and add ability to filter on it (Andrés Maldonado)
* Add video miniature dropdown
* Add ability for admins to declare their instance as dedicated to NSFW content
* Improve SEO (there is still work to be done)
* Login is now case insensitive (if using official web client)
* Add NSFW policy & users signup policy & auto blacklist strategy in features table in about page
* Improve comment deletion warning
* Restore videos list component on history back
* Add ability to consult server logs in admin
* Allow administrators to change/reset a user's password ([@rigelk](https://github.com/rigelk))
* Add a debug page to help admins to fix IP configuration issues
* Add ability for admins to limit users videos history size
* Add ability for admins to delete old remote videos views (reduce database size)
* Optimize video update page load
* Less refresh jobs
* Cleanup invalid AP rates/comments/shares
* Better videos redundancy config error handling
* Check emails are enabled if the admin requires email verification ([@joshmorel](https://github.com/joshmorel))
* **Docker:** Check you have all the storage fields in your `/config/production.yaml` file: https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/config/production.yaml#L34
* **nginx:** Add redundancy endpoint in static file. **You should add it in your nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md#nginx**
* **nginx:** Add socket io endpoint. **You should add it in your nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md#nginx**
* Add some security directives in the systemd unit configuration file ([@rigelk](https://github.com/rigelk) & [@mkoppmann](https://github.com/mkoppmann))
* Pending video published (after transcoding or a scheduled update)
* My account or one of my channel has a new follower
* Someone (except muted accounts) mentioned me in comments
* A user registered on the instance (for moderators)
* Notification actions:
* Add a web notification
* Send an english email
* Add contact form in about page (**enabled by default**)
* Add ability to unfederate a local video in blacklist modal (**checkbox checked by default**)
* Support additional video extensions if transcoding is enabled (**enabled by default**)
* Redirect to the last url on login
* Add ability to automatically set the video caption in URL. Example: https://peertube2.cpy.re/videos/watch/9c9de5e8-0a1e-484a-b099-e80766180a6d?subtitle=ru
* Explain what features are enabled on the instance in the about page
* Add an error message in the forgot password modal if the instance email system is not configured
* Add sitemap
* Add well known url to change password ([@rigelk](https://github.com/rigelk))
* Remove 8GB video upload limit on client side. There may still be such limit depending on the reverse proxy configuration ([@scanlime](https://github.com/scanlime))
**Important:** Before upgrading run the following commands (no need to stop PeerTube) on your PeerTube database (in this example it's *peertube_prod*):
* Add ability to change the language of the interface (currently available: english, french, basque, catalan, czech and esperanto)
* Subtitles/captions support (.srt and .vtt)
* Add advanced search
* Add ability to click on category/language/licence/tags in watch page
* Improve explanations of P2P & Privacy section in about page
* Avoid design latency when the admin set custom CSS
* Add ability to update video channel avatar
* Limit video resolution depending on the video element size (Nitesh Sawant)
* Show "Other videos" on a <1300px viewport ([@Simounet](https://github.com/simounet))
* Add QR code to share videos URL ([@DeeJayBro](https://github.com/DeeJayBro))
* Add "agree to the terms" checkbox in registration form
* Add tracker rate limiter
* Add author URL in OEmbed response
* Display username instead of email in menu
* Clarifying what extensions are accepted for upload ([@rigelk](https://github.com/rigelk))
* Thumbnail support for RSS feeds ([@rigelk](https://github.com/rigelk))
* Open CORS on API and static resources ([@rezonant](https://github.com/rezonant)
* B-adapt 1 and B-frames 16 on ffmpeg transcoding: ([@Anton-Latukha](https://github.com/Anton-Latukha)). See https://github.com/Chocobozzz/PeerTube/pull/774 for more information
* Support Redis socket ([@rigelk](https://github.com/rigelk))
* Improve video `start` param to support string times (for example: 2m42s))
* Display table next/prev/first/last icons in admin tables
* NodeInfo support ([@rigelk](https://github.com/rigelk))