
Future-proof virtual cinema platform
Overview β Install β Customize β Contribute
Like this project? Please give a star β
The SkyChat lets you:
- πΊ Play medias in a shared synchronized player (Youtube, Twitch, self-hosted)
- π Organize self-hosted medias in folders to easily search & play them.
- β½ Have fun with live cursor visualization, casino roulette, cursor-based football, etc..
- π Feel safe. OP double auth, log fuzzing, shadow ban, TOR network detection/ban, etc..
- π» Install and set it up in 2 minutes.
You only need docker.
# 1. Use the autoinstall script (Clones the repository then executes app/script/setup.sh)
sh <(wget -q https://raw.githubusercontent.com/skychatorg/skychat/master/app/script/autoinstall.sh -O -) && cd skychat
# 2. Run the setup script and complete .env files as you wish (see sections below for tips)
npm run setup
cat .env
# 3. Run the app
docker compose upBy default, the application will be listening to localhost:8081 and assume it is accessed from http://localhost:8081. In order to customize the domain name of your SkyChat application, edit the .env file.
Refer to the guide to use the YouTube plugin to watch videos.
Plugins are grouped in so-called PluginGroup instances. It is possible to disable specific features of the application by removing the plugin group name from the env.json file. By default, these plugin groups are included:
| name | removable | description |
|---|---|---|
| CorePluginGroup | β | Basic features for the SkyChat to run properly |
| PlayerPluginGroup | β | Shared player functionnality |
| GamesPluginGroup | β | All the fun features, live cursor visualization and mini games |
| ExtraSecurityPluginGroup | β | Log fuzzer, TOR auto-ban, IP history tracker, user usurp command |
| GalleryPluginGroup | β | Gallery for self-hosted medias |
| UserDefinedPluginGroup | β | Custom plugins. By default, this plugin group contains no plugin, but any user-created plugin will be held by this instance |
In private rooms, only core plugins are loaded.
Trusted users can encrypt individual messages directly from the composer. The browser derives a key from the provided passphrase, encrypts the plaintext with AES-GCM, and uploads only ciphertext plus metadata (salt, iv, and a non-secret label). Configure who can send encrypted messages via minRightForEncryptedMessages.
The config/preferences.json file specifies application preferences. The available fields are detailed below.
| field | type | default | description |
|---|---|---|---|
| minRightForPublicMessages | number | -1 | Min. right to send public messages |
| minRightForPrivateMessages | number | -1 | Min. right to send private messages |
| minRightForMessageQuoting | number | -1 | Min. right to quote messages |
| minRightForUserMention | number | -1 | Min. right to mention users |
| minRightForShortTermMessageHistory | number | -1 | Min. right to access short term room message history |
| minRightForMessageHistory | number | -1 | Min. right to access full room message history |
| minRightForEncryptedMessages | number | 0 | Min. right to send end-to-end encrypted messages |
| minRightForUserModeration | number | 'op' | Min. right to ban, kick and access user ips |
| minRightForSetRight | number | 'op' | Min. right to set user right |
| minRightForAudioRecording | number | -1 | Min. right to share and play audio recordings |
| minRightForConnectedList | number | -1 | Min. right to access the list of currently active users |
| minRightForPolls | number | -1 | Min. right to create polls |
| minRightForStickerManagement | number | 'op' | 'op' | Min. right to add or delete stickers |
|
| minRightForGalleryRead | number | 'op' | 0 | Min. right to access the gallery | | minRightForGalleryWrite | number | 'op' | 'op' | Min. right to add and remove gallery documents | | minRightForPlayerAddMedia | number | 'op' | 0 | Min. right to add medias to the player | | minRightForPlayerManageSchedule | number | 'op' | 'op' | Min. right to manage the player schedules | | maxReplacedImagesPerMessage | number | 50 | Max. number of replaced images per message | | maxReplacedStickersPerMessage | number | 50 | Max. number of replaced stickers per message | | maxReplacedRisiBankStickersPerMessage | number | 50 | Max. number of replaced RisiBank stickers per message | | maxNewlinesPerMessage | number | 20 | Max. number of newlines per message | | maxConsecutiveMessages | number | 1 | Max. number of consecutive messages in a room | | maxMessageMergeDelayMin | number | 10 | Max. minutes before not merging consecutive messages | | daysBeforeMessageFuzz | number | 7 | Number of days before messages are fuzzed, if ExtraSecurityPluginGroup is enabled | | invertedBlacklist | boolean | false | Whether blacklisted users can not see messages from users who blacklisted them | | messagesCooldown | ([number, number])[] | [ [ -1, 1] ] | (Rate limit) Number of points a message costs to be sent per right level. There is 100 pts / 10-sec time window. |
config/fakemessages.txt contains the fake messages shown to users whose right level is less than minRightForShortTermMessageHistory defined in preferences.json. If minRightForShortTermMessageHistory is set to -1, you do not need to modify the fake messages since not one will see them.
minRightForMessageHistory defines who can quote old messages and navigate room old history.
By default, guests are welcomes with a welcome message that you can change in config/welcome.txt. If you remove this file, there won't be a welcome message anymore.
There is a file browser which allows managing uploads and gallery files. Enable it in your .env by setting:
ADMIN_FILEBROWSER_ENABLED=trueADMIN_FILEBROWSER_AUTH="xxxxxxxxx" # Basic auth (htpasswd -nb user password)
It is crucial to set up ADMIN_FILEBROWSER_AUTH, otherwise all gallery and uploads would be exposed.
Display the online presence of your Discord server in the connected users list. Set the following in your .env:
DISCORD_GUILD_ID=your_guild_id
To find your Guild ID, enable Developer Mode in Discord (User Settings β Advanced β Developer Mode), then right-click your server and select "Copy Server ID".
You must also enable the Server Widget in your Discord server: Server Settings β Widget β Enable Server Widget.
Users can link their Discord account to their SkyChat account to show a Discord icon next to their name in the connected users list when they're online on Discord.
To enable Discord account linking, you need to create a Discord application:
- Go to Discord Developer Portal
- Create a new application
- Go to OAuth2 settings and add redirect URI:
{YOUR_PUBLIC_URL}/api/plugin/discord/callback - Copy the Client ID and Client Secret to your
.env:DISCORD_OAUTH_CLIENT_ID=your_client_idDISCORD_OAUTH_CLIENT_SECRET=your_client_secret
Users can then use these commands:
/discord- Show current linked Discord account/discord link- Get an OAuth link to verify your Discord account/discord unlink- Unlink your Discord account
config/guestnames.txt is the pool of non-logged usernames.
When a guest logs in, a random name is associated to its session. These names are randomly used from this file. If you want to change these names, keep in mind that they should not contain whitespace characters (anything matched by \s so newline, tab, space, ..). Default random names are animal names.
The SkyChat is easily extensible through plugins. You can define custom plugins in app/server/skychat/plugins/user_defined/. It will be automatically loaded during the next application startup.
Refer to the Wiki guides to contribute:
Please use only one of the following to suggest new features (or bug fixes):
- Create a pull request
- Open an issue with your proposal
