1. Quick start#
WebSocket client (browser)#
- Connect:
wss://<chat host>/mvn(through nginx). - Log in: send
MVN AUTH <username> <token> #vl-mark. Guests sendMVN AUTH guest. - Wait for the reply that starts with
ACK. If you get disconnected instead, the login failed. - Join:
JOIN #vl-mark. You get your own JOIN line, then chat history, thenMVN HISTORYEND. - Chat:
CHAT #vl-mark :Hello everyone - Stay alive: when you receive
PING, sendPONG.
IRC client#
- Connect to the chat server port with any IRC client.
- Set the server password to your chat token and your nick to your username. This sends
PASSandNICK. - Wait for numerics
001…376. Only VIP accounts are allowed on IRC. Others are disconnected. JOIN #vl-mark, thenPRIVMSG #vl-mark :Hello.
2. Basics#
2.1 Message format#
COMMAND arg1 arg2 :free text until end of message- Separator: fields are separated by single spaces.
- Free text: starts after
:(space, colon) and runs to the end. - Case: commands are UPPERCASE and case-sensitive.
- One command per message:
- WebSocket: one command per text frame.
- Raw TCP and IRC: one command per line, ending with
\n.
- Two command families:
- Top-level commands:
CHAT,JOIN,PART,PONG,PRIVMSG, … - Server commands, which start with
MVN:MVN AUTH,MVN BAN, …
- Top-level commands:
⚠️
MVN CHATdoes not exist.CHATis top-level. SendingMVN CHAT …is an unknown MVN command, and the server disconnects you.
2.2 Unknown commands disconnect you#
| You send | Result |
|---|---|
| A top-level command not in section 4 | Disconnected |
MVN <something> not in section 5 |
Disconnected (logged as UNHANDLED_ACTION2) |
IRC CAP, USER, USERHOST, LIST, WHO, WHOIS, NOTICE, EXIT, MODE, QUIT |
Ignored |
Any other IRC command (TOPIC, AWAY, ISON, …) |
Disconnected |
2.3 Channel names#
#<site>-<streamer>| Site prefix | Platform |
|---|---|
vl |
Vaughn Live |
btv |
Breakers.TV |
igb |
Instagib.TV |
vtv, pt, vc |
Older sites (still mapped to databases) |
- Lookup: channel names are matched in lowercase.
#is optional:JOIN vl-markandJOIN #vl-markare the same channel.- Stream owner: the user whose name matches the part after
-is the streamer (caster) of that channel.
2.4 Text the server changes in your messages#
Before handling a message, the server replaces these characters. Clients receive the replaced form and must decode it for display.
| Character | Becomes (WebSocket) | Becomes (raw TCP / IRC) |
|---|---|---|
; |
; |
; |
' |
' |
' |
" |
" |
" |
` |
` |
` |
\ |
\ |
\ |
| Tab | ^ |
removed |
\x0B |
@ |
removed |
\r \n \0 |
removed | removed |
 , <#VN>, </#VN>, ⠀ (U+2800) |
removed | removed |
<;is turned back into<, and>;into>.- The server does NOT escape
<,>or&. The web client escapes them before sending. Any client that displays chat as HTML must escape incoming text itself. - IRC receivers: for IRC clients the server decodes
"'\<>back to plain characters.
2.5 Limits#
| Limit | Value |
|---|---|
| One unfinished incoming message (frame, line or handshake) | 16 KB. Larger means you are disconnected. |
| Guest chat message | 70 characters (cut off). Links are removed. |
Idle before the server sends PING |
About 10 to 25 seconds |
| Idle before disconnect | 300 seconds |
MVN INVITE cooldown |
6 minutes per connection |
| Mute length | 6 minutes (automatic unmute) |
Channel IP ban after BAN |
24 hours |
Idle means nothing has been received from the client. Any message resets the timer, not only PONG.
3. Connecting#
3.1 WebSocket#
Standard RFC 6455 handshake.
GET /mvn HTTP/1.1
Host: <chat host>
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: <key>
Sec-WebSocket-Version: 13- Path: the server does not check the path.
/mvnis the convention. - Header case:
Upgrade: websocketis accepted in any letter case. - Real IP: through nginx, the client IP comes from
CF-Connecting-IP. That header is only trusted when the connection comes from an IP listed intrusted_proxiesinSettings.mvn. - Text frames: client frames must be masked (standard). Each server frame is one message, and its payload ends with
\0, which you should strip. - Control frames:
- Close (opcode 8) disconnects you.
- Ping (opcode 9) is answered with pong (opcode 10).
- No fragmented frames: continuation frames are not supported. Send each command as one complete frame.
3.2 Raw TCP (Android app)#
- Plain text lines ending with
\n, using the same commands as WebSocket. - Log in with
MVN AUTH_ANDROID …(section 5.1). - Server lines end with
\n.
3.3 IRC#
- Plain IRC lines ending with
\n. - Log in with
PASSandNICK(section 6).
4. Top-level commands (client → server)#
| Command | Who | What it does |
|---|---|---|
CHAT #chan :text |
Logged in and joined | Send a chat message (section 7) |
CHAT #chan,<uuid> :text |
Same | Same, with your own message ID. The server answers MVN MSGID (section 7.3). |
CHAT_GIF #chan :text |
VIP only (others are disconnected) | Same as CHAT |
CHAT_IMGUR #chan :text |
VIP only | Same as CHAT |
PRIVMSG #chan :text |
Same as CHAT |
IRC form of CHAT |
JOIN #chan |
Logged in | Join a channel. Several at once: JOIN #a,#b |
PART #chan |
In the channel | Leave a channel |
PONG |
Anyone | Answer to the server's PING |
PING <token> |
IRC | Server answers PONG <token> |
NAMES #chan |
IRC | List the users in a channel (section 6.4) |
QUIT, MODE … |
Anyone | Ignored |
<policy-file-request/> |
Anyone | Disconnected (old Flash request) |
4.1 Chat "dot commands"#
A CHAT message starting with . is treated as a command. These need the same permissions as the matching MVN command (section 5).
| Message | Same as |
|---|---|
.clear |
MVN CLEAR |
.mods |
MVN MODS |
.bans |
MVN BANS |
.unbanall |
MVN UNBANALL |
.unmodall |
MVN UNMODALL |
.gueston / .guestoff |
MVN GUESTON / MVN GUESTOFF |
.random |
MVN RANDOM |
.ban <user> / .unban <user> |
MVN BAN / MVN UNBAN |
.kick <user> |
MVN KICK |
.mute <user> / .unmute <user> |
MVN MUTE / MVN UNMUTE |
.purge <user> |
MVN PURGE |
.mod <user> / .unmod <user> |
MVN MOD / MVN UNMOD |
.regular <user> or .reg <user> |
MVN REGULAR |
.unregular <user> or .unreg <user> |
MVN UNREGULAR |
Any other text starting with . is sent as normal chat.
5. MVN commands (client → server)#
Format: MVN <ACTION> <arg1> <arg2> …
5.1 Login#
| Command | Output format | Connection type |
|---|---|---|
MVN AUTH <user> <token> <#chan> |
Text | WebSocket |
MVN AUTH guest |
Text | WebSocket, logs in as a guest |
MVN AUTHGM <user> <token> <#chan> |
Text | Ghost mode: a VIP appears as a guest. Guests are refused. |
MVN AUTH2 … / MVN AUTH2GM … |
JSON chat (section 7.4) | Same as AUTH / AUTHGM |
MVN AUTH_ANDROID <user> <token> <#chan> |
Text | Raw TCP |
MVN AUTH2_ANDROID … |
JSON | Raw TCP |
MVN SYNC <#chan> <token> |
Re-reads your settings and follow/sub status for a channel. Answer: MVN SYNCD |
The arguments:
<token>is the account's chat token. The server checks it with the auth API (chatAuth2_dapi.php) and does not check it itself.<#chan>is the channel you are logging in from.- Its site prefix (
vl-,btv-) sets your site tag. - Your follow/subscriber status for that channel is loaded at login.
- Its site prefix (
Possible results:
| Result | Meaning |
|---|---|
ACK … line |
Logged in (format below) |
MVN VPN <ip>, then disconnect |
VPN detected |
| Disconnect, no message | Bad token, banned (PBAN/GBAN), or the API failed |
ACK format. All fields after the first space are joined with ;:
ACK <name>;<color>;<level>;<username_font>;<username_color>;<chat_font>;<chat_color>;<chatclearing>;<secondary_timestamp>;<fontsize>;<theme>;<theme_color>;<confirmed 0/1>;<following 0/1>;<following_epoch>The server then also sends MVN IMSTATUS <vn:name>1</vn> (or …>0</vn>).
User levels:
| Level | Role |
|---|---|
| 0 | Guest |
| 1 | User |
| 2 | Moderator (in this channel) |
| 3 | Streamer (in their own channel) |
| 4 | Tech |
| 5 | Crew (helper) |
| 9 | Staff |
| 10 | Owner |
Quirk: login replies come in the background. If you send
JOINorCHATbeforeACKarrives, you are not logged in yet and get disconnected.
5.2 Channel info#
| Command | Who | Answer |
|---|---|---|
MVN CHATTERS #chan |
Anyone | MVN CHATTERS #chan <list>, repeated in chunks of about 21 users, then MVN CHATTERSEND #chan. Each list entry is name;color;level;vip, separated by ,. Guests are not listed. |
MVN MODS #chan |
Staff, streamer | MVN NOTICE Mods: a,b,c or MVN NOTICE No Moderators for this channel |
MVN BANS #chan |
Staff, streamer, mod | MVN NOTICE Bans: a,b,c or MVN NOTICE No Bans for this channel |
MVN RANDOM #chan |
Staff, streamer, mod | Channel gets MVN NOTICE <you> requested a random chatter..., then MVN NOTICE The random chatter is: <name> |
Important: a web or Android client only receives other users'
JOINandPARTlines for a channel after it has sentMVN CHATTERS #chanfor that channel. IRC clients always receive them.
5.3 Moderation#
Permissions:
- "Mod rights" means: staff, the streamer, a moderator of the channel, the bot account, or a chat relay. Tech accounts also have them in a few house channels.
- Protected targets: staff, crew, tech and the streamer can't be targeted.
- Mods vs mods: a moderator can't act on another moderator. The streamer or staff can, and doing so removes the target's mod status first.
| Command | Who | Effect | Broadcast to channel |
|---|---|---|---|
MVN BAN #chan <user> |
Mod rights | Channel ban (saved), 24 h channel IP ban, history purged, user disconnected | MVN BAN #chan <user> <by> |
MVN UNBAN #chan <user> |
Mod rights | Removes ban | MVN UNBAN #chan <user> <by> |
MVN KICK #chan <user> |
Mod rights | Disconnects the user if they are in the channel, purges their history | MVN KICK #chan <user> <by> |
MVN MUTE #chan <user> |
Mod rights | Mutes for 6 minutes | MVN MUTE #chan <user> <by>. At expiry, the user gets MVN UNMUTE #chan <user>. |
MVN UNMUTE #chan <user> |
Mod rights | Unmutes | MVN UNMUTE #chan <user> <by> |
MVN PURGE #chan <user> |
Mod rights | Hides the user's messages in history | MVN PURGE #chan <user> <by> |
MVN PURGE_ID #chan <user> <message_id> |
Mod rights | Hides one message | MVN PURGE #chan <user> <by> <message_id> |
MVN PURGEALL #chan <user> |
Mod rights | Same as PURGE |
Same |
MVN CLEAR #chan |
Mod rights | Clears chat history | MVN CLEAR #chan <by> |
MVN MOD #chan <user> |
Staff, streamer, bot, relay | Makes the user a moderator | MVN MOD #chan <user> <by> |
MVN UNMOD #chan <user> |
Staff, streamer, bot, relay | Removes moderator | MVN UNMOD #chan <user> <by> |
MVN REGULAR #chan <user> |
Staff, streamer, bot, relay | Makes the user a regular (exempt from slow mode) | MVN REGULAR #chan <user> <by> |
MVN UNREGULAR #chan <user> |
Staff, streamer, mod | Removes regular | MVN UNREGULAR #chan <user> <by> |
MVN UNBANALL #chan |
Staff, streamer, mod | Removes all bans | You get two MVN NOTICE lines |
MVN UNMUTEALL #chan |
Staff, streamer, mod | Removes all mutes | You get two MVN NOTICE lines |
MVN UNMODALL #chan |
Staff, streamer | Removes all moderators | You get two MVN NOTICE lines |
Staff-only (global):
| Command | Effect | Answer to you |
|---|---|---|
MVN DROP <user> |
Disconnects every connection of the user | none |
MVN GBAN <user> / MVN DELGBAN <user> |
Global ban: refused at login and join | MVN NOTICE …, then MVN GBAN <you> <user> / MVN DELGBAN <you> <user> |
MVN GMUTE <user> / MVN DELGMUTE <user> |
Global mute: disconnected when they chat | MVN NOTICE …, then MVN GMUTE … / MVN DELGMUTE … |
MVN PBAN <user> / MVN DELPBAN <user> |
Permanent ban plus IP ban | MVN NOTICE …, then MVN PBAN … / MVN DELPBAN … |
MVN GLOBAL <text> |
Sends the whole line to every channel | MVN NOTICE Sending Global Message... |
MVN GLOBALVL / GLOBALBTV / GLOBALIGB <text> |
Same, but only #vl- / #btv- / #igb- channels |
Same |
Quirk: for
GLOBAL*, channels receive the whole original line with/allremoved, for exampleMVN GLOBAL Server restart in 5 minutes.
5.4 Channel modes#
Who: staff, the streamer or a moderator, unless noted. <seconds> is optional.
| Command | Effect | Broadcast |
|---|---|---|
MVN SLOWON #chan <seconds> |
Slow mode. Default 10; 1 or less becomes 10; maximum 300. | MVN SLOWON #chan <seconds> |
MVN SLOWOFF #chan |
MVN SLOWOFF #chan |
|
MVN SLOWVIP_ON #chan / SLOWVIP_OFF |
VIPs skip slow mode | MVN SLOWVIP_ON #chan / MVN SLOWVIP_OFF #chan (OFF goes to the sender only) |
MVN FOLLOWERS_ON #chan <seconds> |
Followers-only (must have followed at least <seconds>) |
MVN FOLLOWERS_ON #chan <seconds> |
MVN FOLLOWERS_OFF #chan |
MVN FOLLOWERS_OFF #chan |
|
MVN FOLLOWERSON_VPNON / FOLLOWERSON_VPNOFF / FOLLOWERSOFF_VPNON / FOLLOWERSOFF_VPNOFF #chan <seconds> |
Followers mode plus its VPN filter in one command | The two matching broadcasts |
MVN FOLLOWERSVPN_ON / FOLLOWERSVPN_OFF #chan |
VPN filter for followers-only | MVN FOLLOWERSVPN_ON #chan / …_OFF |
MVN SUBSCRIBERS_ON #chan <seconds> |
Subscribers-only | MVN SUBSCRIBERS_ON #chan <seconds> |
MVN SUBSCRIBERS_OFF #chan |
MVN SUBSCRIBERS_OFF #chan |
|
MVN SUBSCRIBERSON_VPNON / …_VPNOFF |
Same as SUBSCRIBERS_ON (the VPN part does nothing) |
|
MVN SUBSCRIBERSOFF_VPNON / …_VPNOFF |
Same as SUBSCRIBERS_OFF |
|
MVN GUESTON #chan / GUESTOFF |
Guest chat. Needs a VIP account, and the sender must be staff or the streamer. Non-VIPs get MVN GUEST_NOVIP #chan. |
MVN GUESTON #chan / MVN GUESTOFF #chan |
MVN MODON #chan / MODOFF |
Mods-only chat (staff, or the streamer when not overridden) | MVN MODON #chan / MVN MODOFF #chan |
MVN ACTVPN_ON / ACTVPN_OFF #chan (also ACTON_VPNON / ACTON_VPNOFF) |
VPN filter for confirmed-only chat | MVN ACTVPN_ON #chan / …_OFF |
MVN VPNFILTER_ON / VPNFILTER_OFF #chan |
VPN filter for everyone | MVN VPNFILTER_ON #chan / …_OFF |
MVN ACTON, ACTOFF, ACTOFF_VPNON, ACTOFF_VPNOFF, SYNC_FOLLOWER, SYNC_SUBSCRIBER, SC_REMOVE, CHAT_REMOVE, IMFRIENDS |
Accepted and ignored |
5.5 Messaging and other#
| Command | Answer / effect |
|---|---|
MVN IM <vn:target>text</vn> |
Target gets MVN IM <vn:you>text</vn>. Your other connections get MVN IM_SYNC target;you <vn>text</vn>. Needs a confirmed (non-guest) account. |
Errors: MVN IMERROR <vn:IMOFF>target</vn> (target has IMs off), MVN IMERROR <vn:IMACTSEND>you</vn> (your account isn't confirmed) |
|
MVN IMSTATUS <vn:yourname>0</vn> (or 1) |
Turns your own IMs off or on. No spaces. Ignored for other names. |
MVN COLOR <color> |
Answer MVN COLOR <color>. Allowed: firebrick blue orangered midnightblue deeppink cadetblue purple royalblue olive tomato black goldenrod green dodgerblue. Not for guests. |
MVN INVITE #chan |
Friends get MVN INVITE <you> invited you to watch https://vaughnlive.tv/<name> (the link uses the matching site). You get MVN NOTICE Invites Sent To Friends, or MVN NOTICE Another invite?! Slow down there buddy! within 6 minutes. |
MVN COHOST #vl-<yourname> <user> |
Your own channel only. Target gets MVN COHOST <yourname> <32-char key>. You get MVN COHOSTSENT <user>. |
MVN VAUGHN <anything> |
Passed as-is to the bot account (user vaughn) |
MVN VAUGHNRESP <vn:user>text</vn> |
Bot only. The user gets MVN VAUGHN <vn:user>text</vn>. |
MVN FHSUB #chan / MVN FHUNSUB #chan |
Firehose subscribe/unsubscribe. Answer MVN FHSUB #chan / MVN FHUNSUB #chan. |
6. IRC#
6.1 Login#
PASS <chat token>
NICK <username>Order: either order works. Login starts once both have been received.
Nick prefixes: tags like
[vip]and[ Mod ]are stripped from the nick.VIP only: non-VIP accounts are disconnected after the auth API replies.
On success:
TEXT:<irc_name> 001 <tagged nick> :Connected to VaughnSoft IRC :<irc_name> 002 <tagged nick> :Welcome to the VaughnSoft IRC Network :<irc_name> 003 <tagged nick> :This server was created on <date> :<irc_name> 004 <tagged nick> VaughnSoft IRC by VaughnSoft Media Corporation :<irc_name> 005 <tagged nick> PREFIX=(aqhgov)~&%^@+ : :<irc_name> 376 <tagged nick> END OF MOTD<irc_name>is theirc_namevalue inSettings.mvn.
6.2 Name tags#
User names sent to IRC clients carry role tags in front:
| Tag | Meaning |
|---|---|
[vip] |
VIP |
[ sub ] |
Subscriber of this channel |
[ mvn ] |
Owner (level 10) |
[ Staff ] |
Staff |
[ Tech ] |
Tech |
[ Streamer ] |
Streamer |
[ Mod ] |
Moderator |
Quirk: tags contain spaces, so a source like
:[vip] [ Mod ] Bob PRIVMSG #vl-mark :hidoesn't follow strict IRC syntax. Most IRC clients show it, but parsers may split it.
6.3 Joining and chatting#
| You send | You receive |
|---|---|
JOIN #vl-mark |
:<tag>you JOIN :#vl-mark, then history lines like :vn PRIVMSG #vl-mark :[ HISTORY ] alice: hello, then a role line if you have one, for example :vn PRIVMSG #vl-mark :You are a Mod in #vl-mark |
PRIVMSG #vl-mark :hi |
Others get :<tag>you PRIVMSG #vl-mark :hi. You don't get an echo. |
PART #vl-mark |
:<tag>you PART #vl-mark |
What IRC clients receive from others:
- Chat:
:<tag>name PRIVMSG #chan :text - Joins and parts:
:<tag>name JOIN :#chanand:<tag>name PART #chan
Quirk: channel events like bans and mode changes reach IRC clients as raw MVN lines, for example
MVN BAN #vl-mark bob alice, not as IRC messages.
When you run a moderation command, you get a readable line instead, for example :vn PRIVMSG #vl-mark :alice banned bob.
6.4 Names and keep-alive#
| You send | You receive |
|---|---|
NAMES #vl-mark |
:<irc_name> 353 <you> #vl-mark :<tag>alice,<tag>bob,… in chunks of about 21 (comma-separated), then :<irc_name> 366 <you> #vl-mark End of /NAMES list. |
PING :abc |
PONG :abc |
(server) PING :VaughnSoft |
Reply with PONG :VaughnSoft. Any line resets the idle timer. |
7. Chat messages#
7.1 Sending#
CHAT #vl-mark :This is my chat message to mark's stream on Vaughn LiveYou must be logged in and have joined the channel. The bot and relay accounts don't need to join.
When the message is not sent:
| Reason | What you get |
|---|---|
| Followers-only, not following | MVN ERROR #chan not_following |
| Followers-only, followed too recently | MVN ERROR #chan following_duration <required>;<your seconds> |
| Subscribers-only, not subscribed | MVN ERROR #chan not_subscribed |
| Subscribers-only, subscribed too recently | MVN ERROR #chan subscriber_duration <required>;<your seconds> |
| Slow mode (VIPs exempt if SLOWVIP is on) | MVN SLOWNOTICE #chan |
| Guest cooldown | MVN SLOWNOTICE #chan |
| VPN detected | MVN VPN <ip>, then disconnect |
| Globally muted | Disconnect |
| Muted in channel | Nothing (silently dropped) |
| Mods-only, staff mode, guest chat off, or confirmed-only | Nothing (silently dropped) |
Who skips slow mode: bots, relays, the streamer, mods, staff, crew, tech and regulars.
7.2 Receiving (text format)#
<user info> CHAT #chan :<text><user info> is 11 fields joined with ;:
| # | Field | Values |
|---|---|---|
| 1 | name | Display name |
| 2 | color | Name color, or -2 |
| 3 | level | See 5.1. 3 = streamer and 2 = mod are set per channel |
| 4 | vip | 0 / 1 |
| 5 | site | vl, btv, irc or null |
| 6 | username_font | Number, -1 = default |
| 7 | username_color | Number, -1 = default |
| 8 | chat_font | Number, -1 = default |
| 9 | chat_color | Number, -1 = default |
| 10 | payload | Base64 (see below) |
| 11 | message_id | GUID |
Example:
Alice;blue;1;1;vl;-1;-1;-1;-1;bWVzc2FnZV9pZCw...;0f8e...c2 CHAT #vl-mark :helloPayload field. Decode the base64. You get key,value; pairs:
subscriber,<base64("1;<ISO date>")>;when the sender is a subscriber of the channelmessage_id,<GUID>;
You don't receive your own messages back. The server confirms them with MVN MSGID (7.3).
7.3 Message IDs#
CHAT #vl-mark,<your uuid> :hello- The server answers
MVN MSGID <your uuid> <server GUID>. - If you don't send a UUID, the server makes one up and still sends
MVN MSGID. - The server GUID is the ID other users see and the one
MVN PURGE_IDuses.
7.4 JSON format#
When the sender logged in with MVN AUTH2…, their messages go out as JSON. This happens for every recipient, not just JSON clients.
{"id":"abc-123456789","type":"chat","site":"vl","platform":"vaughnlive","channel":"mark",
"username":"Alice","user_level":1,"user_vip":true,"username_font":-1,"username_color":-1,
"chat_font":-1,"chat_color":-1,"message":"hello",
"channel_subscribed":false,"channel_subscribed_level":0,"channel_subscribed_months":0,
"channel_subscribed_dt":0,"channel_subscribed_dt_iso":"",
"channel_followed":false,"channel_followed_months":0,"channel_followed_dt":0,"channel_followed_dt_iso":"",
"dt_epoch":1793500000,"dt_iso":"2026-11-01T12:00:00.000Z"}Quirks:
- The format follows the sender's login, not the receiver's.
- The
channel_subscribed*andchannel_followed*fields are always defaults.messageis not JSON-escaped beyond the character replacements in 2.4.
8. Joining a channel (web and raw TCP)#
8.1 What you receive#
Your JOIN line:
TEXT<name>;<color>;<level>;<vip>;<site>;<gold badge>;<payload> JOIN #chan <channel settings><channel settings>is 17 fields joined with;:| # | Field | |---|---| | 1 | guest chat on | | 2 | slow on | | 3 | slow seconds | | 4 | confirmed-only on | | 5 | username_font | | 6 | username_color | | 7 | chat_font | | 8 | chat_color | | 9 | VPN filter | | 10 | guest VPN filter | | 11 | confirmed VPN filter | | 12 | followers-only on | | 13 | followers seconds | | 14 | followers VPN filter | | 15 | you follow | | 16 | follow date ISO | | 17 | seconds followed |
History, up to 64 lines:
TEXT<user info>;<message_id> HISTORY <ISO date> #chan :<text>- The user info has the same 11 fields as 7.2, followed by the message ID again.
- Purged messages read
<purged message>. - Superchats look like
<id> HISTORY_SC <ISO date> <payload>.
End of history:
MVN HISTORYEND. WebSocket only. Web and raw TCP clients get all history in one message separated by\n.
8.2 What can stop the join#
| Reason | What you get |
|---|---|
| Channel banned | MVN BANNED #chan |
| Channel IP ban (24 h) | MVN BANNED #chan |
| Global ban | Disconnect |
| VPN filter | MVN VPN <ip>, then disconnect |
| Channel still loading after about 5 s | Disconnect |
8.3 Other users joining and leaving#
You only see these after you have sent MVN CHATTERS #chan (5.2).
- Joins:
<name>;<color>;<level>;<vip>;<site>;<gold badge>;<payload> JOIN #chan <guest>;<slow>;<confirmed-only> - Leaves:
<name>;<color>;<level> PART #chan - Not shown: guests, and users who already have another connection in the channel.
9. Messages the server sends on its own#
9.1 Keep-alive and errors#
| Message | Meaning |
|---|---|
PING (PING :VaughnSoft on IRC) |
Keep-alive. Answer PONG. |
MVN NOTICE <text> |
Informational text |
MVN IPBAN |
You were IP-banned (sent before disconnect) |
9.2 Channel events from the website#
These are pushed through the HTTP API.
| Message | Meaning |
|---|---|
MVN FOLLOW #chan <user> |
New follower |
MVN SUB #chan <user> |
New subscriber |
MVN SUB_RECV #chan <user> <payload> |
Sent to the new subscriber only |
MVN SUB_GIFTED #chan <gifter> <ISO date> |
Gifted subscriptions |
MVN SUB_GIFTED_RECV #chan <user> <payload> |
Sent to each user who received a gifted sub |
MVN SUPERCHAT #chan <id> <payload> |
Superchat |
MVN SUPERCHAT_REPLAY #chan <id> <payload> |
Superchat replayed |
MVN SUPERCHAT_SKIP #chan <id> |
Superchat skipped |
MVN SUPERCHAT_REMOVE #chan <id> |
Superchat removed |
MVN DONATE <data> |
Donation |
MVN COMMERCIAL <data> |
Commercial break |
MVN CLOSE |
Channel closed |
MVN DMCA |
DMCA takedown |
MVN GLOBAL … |
Global message (see 5.3) |
10. Example session (WebSocket)#
→ MVN AUTH alice 3f9c…|vn| #vl-mark
← MVN IMSTATUS <vn:Alice>1</vn>
← ACK Alice;blue;1;-1;-1;-1;-1;-1;-1;-4;-4;-4;1;1;1790000000
→ JOIN #vl-mark
← Alice;blue;1;1;vl;0;… JOIN #vl-mark 0;1;10;1;-1;-1;-1;-1;0;0;0;0;10;0;1;2026-01-01T00:00:00.000Z;26000000
← Bob;purple;1;0;vl;…;9a1e… HISTORY 2026-11-01T11:59:00.000Z #vl-mark :hi all
← MVN HISTORYEND
→ MVN CHATTERS #vl-mark
← MVN CHATTERS #vl-mark Bob;purple;1;0,Alice;blue;1;1
← MVN CHATTERSEND #vl-mark
→ CHAT #vl-mark,7d0c2c1e-0000-4000-8000-000000000001 :hello!
← MVN MSGID 7d0c2c1e-0000-4000-8000-000000000001 5b6f…
← PING
→ PONG(→ is client to server, ← is server to client. Each ← WebSocket frame payload ends with \0.)