Docs

1. Quick start

WebSocket client (browser)

  1. Connect: wss://<chat host>/mvn
  2. Log in: send MVN AUTH <username> <token> #vl-mark. Guests send MVN AUTH guest.
  3. Wait for the reply that starts with ACK . If you get disconnected instead, the login failed.
  4. Join: JOIN #vl-mark. You get your own JOIN line, then chat history, then MVN HISTORYEND.
  5. Chat: CHAT #vl-mark :Hello everyone
  6. Stay alive: when you receive PING, send PONG.

IRC client

  1. Connect to the chat server port with any IRC client.
  2. Set the server password to your chat token and your nick to your username. This sends PASS and NICK.
  3. Wait for numerics 001 … 376. Only VIP accounts are allowed on IRC. Others are disconnected.
  4. JOIN #vl-mark, then PRIVMSG #vl-mark :Hello.

2. Basics

2.1 Message format

TEXT
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, …

⚠️ MVN CHAT does not exist. CHAT is top-level. Sending MVN 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

TEXT
#<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)
; &semi; &semi;
' &#039; &#039;
" &#034; &quot;
` &#096; &#096;
\ &#092; &#092;
Tab ^ removed
\x0B @ removed
\r \n \0 removed removed
  • &lt&semi; is turned back into &lt;, and &gt&semi; into &gt;.
  • IRC receivers: for IRC clients the server decodes &quot; &#039; &#092; &lt; &gt; 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.

TEXT
GET /mvn HTTP/1.1
 Host: <chat host>
 Upgrade: websocket
 Connection: Upgrade
 Sec-WebSocket-Key: <key>
 Sec-WebSocket-Version: 13
  • Header case: Upgrade: websocket is 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 PASS and NICK (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.

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 ;:

TEXT
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 JOIN or CHAT before ACK arrives, 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

TEXT
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 the irc_name value in Settings.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 :hi doesn'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 :#chan and :<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

TEXT
CHAT #vl-mark :This is my chat message to mark's stream on Vaughn Live

You 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)

TEXT
<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:

TEXT
MissScruffy;blue;1;1;vl;-1;-1;-1;-1;bWVzc2FnZV9pZCw...;0f8e...c2 CHAT #vl-mark :hello

Payload field. Decode the base64. You get key,value; pairs:

  • subscriber,<base64("1;<ISO date>")>; when the sender is a subscriber of the channel
  • message_id,<GUID>;

You don't receive your own messages back. The server confirms them with MVN MSGID (7.3).

7.3 Message IDs

TEXT
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_ID uses.

7.4 JSON format

Coming soon


8. Joining a channel (web and raw TCP)

8.1 What you receive

  1. 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
  2. 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 &lt;purged message&gt;.
    • Superchats look like <id> HISTORY_SC <ISO date> <payload>.
  3. 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)

TEXT
→ 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.)

Search pages and protocol commands.