1. Quick start
WebSocket client (browser)
- Connect:
wss://<chat host>/mvn - 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 |
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 |
- Lookup: channel names are matched in lowercase.
- 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 |
<;is turned back into<, and>;into>.- 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 |
| Mute length | 5 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- Header case:
Upgrade: websocketis accepted in any letter case. - 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 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 |
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 |
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 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 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> |
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 MUTE #chan <user> |
Mod rights | Mutes for 5 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 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 |
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 |
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 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>. |
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 ] Daryl 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 ] MissScruffy: 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 Daryl MissScruffy, not as IRC messages.
When you run a moderation command, you get a readable line instead, for example :vn PRIVMSG #vl-mark :MissScruffy banned Daryl.
6.4 Names and keep-alive
| You send | You receive |
|---|---|
NAMES #vl-mark |
:<irc_name> 353 <you> #vl-mark :<tag>MissScruffy,<tag>Daryl,… 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.
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
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:
MissScruffy;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
Coming soon
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 CLOSE |
Channel closed |
MVN DMCA |
DMCA takedown |
10. Example session (WebSocket)
→ MVN AUTH MissScruffy 3f9c…|vn| #vl-mark
← MVN IMSTATUS <vn:MissScruffy>1</vn>
← ACK MissScruffy;blue;1;-1;-1;-1;-1;-1;-1;-4;-4;-4;1;1;1790000000
→ JOIN #vl-mark
← MissScruffy;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
← Daryl;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 Daryl;purple;1;0,MissScruffy;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.)