* 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
* 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
### Admin config (non-exhaustive)
* Add ability to configure STUN servers IPs: `webrtc.stun_servers`
* Remove `client.videos.miniature.display_author_avatar` config: author avatars are now always displayed
### Features
* :tada: Global client redesign :tada:
* Introduce a new *Light/Beige* theme that replaces the current one (black/orange)
* Add a *Dark/Brown* theme directly in PeerTube core
* **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,allowinguserstouploadandbroadcasta480presolutionat60FPS
* 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**,pleasefollowv6.0.0IMPORTANTNOTES
* 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 <1300pxviewport([@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))