Hold Your Horses

The streamer's guide

The viewer's guide

The keeper's notes

This guide is for

Getting started

A pixel-art field where everyone who chats gets a tiny horse. No Twitch login, no bot, nothing to install: the page reads your chat anonymously and never posts.

  1. Open the game, press S, type your channel name and click Connect. The pill bottom-left turns green and your horse walks in.
  2. Press F for fullscreen. The UI hides after a few seconds; move the mouse to bring it back.

OBS

Add a Browser Source at your canvas size with this URL:

https://horses.corard.tv/?channel=your_channel&nosplash=1

Settings are saved in the browser, so it reconnects on its own next time. Copy URL in the advanced panel gives you a link with every setting baked in.

Your horse

The streamer has a pixel-art field on screen, and everyone who chats gets a tiny horse in it.

  1. Say anything in chat. Your horse walks in through the gate. If a few people chat at once you queue and enter one at a time.
  2. Keep chatting. If bubbles are on, your messages appear above your horse, emotes included. Chatting always wakes it.
  3. Play. Type single letters to move, dress it up with outfits and coats, and try the chat commands.
Always the same horseCoat, accessories and personality come from your Twitch login, so it is the same horse on every channel. Look it up on What's my horse?
NeighType neigh and your horse whinnies.
RememberedThe field keeps your horse for 12 hours, so a refresh on the streamer's side puts you straight back.
Going homeWhen the field is full the quietest horses head off for a while. Chat again and you are back. !leave walks off whenever you like.
Getting picked upThe streamer can drag horses about with the mouse, and throw them. Yours may complain.

Settings

Quick panel S

Channel and Connect, fullscreen, Clear (sends every horse home), names, chat bubbles, the two volume sliders, the ignore list of bots, and the What's new changelog. The i button beside the cog opens a live stats panel for the stream so far.

Advanced panel Shift+S

Every setting, applied live and saved in this browser. The same names work in the URL and with !set in chat.

GroupSettings
Chat & permissionsSub alerts · raid celebrations · bits rain carrots · ! commands on/off and who can use them · letter controls · who can use !race, !event and !weather · who can pick exclusive coats · the royal look · creator login · ignored users · photo token
PopulationMax horses · seconds between arrivals · idle leave · rotate horses out at this % full · hours remembered · spawn queue bar · demo horses
DisplayAnnounce joins · names · counter · bubbles and their duration · text size · pixel size · splash · UI hide delay · mouse hoofprints · debug overlay
FacecamReserve a 16:9 corner. Horses, names, bubbles and races keep out of it, the pond or campfire moves, and horses wander over to stare at it. Pick the corner and the width; the outline on the field shows the size in pixels for your OBS source
WorldDay length · fixed time of day · weather on/off, types and frequency · critters · sound and the two volumes · minutes between events and which events · activity and night sleepiness multipliers

At the bottom: Export and Import JSON, Copy URL, and Reset (keeps the channel).

Defaults: 150 horses · a new one every 40 s · idle leave after 3 h · remembered 12 h · 8-minute days · an event about every 6 min · bubbles and alerts off · ! commands for mods and the broadcaster.

Keyboard & mouse

Ssettings
Shift+Sadvanced settings
Istats panel
Ffullscreen
Htoggle names
Rstart a race
Ptake a photo
Cclear the field
Escclose panels

Click and drag a horse to carry it. Flick the mouse as you let go and it flies, tumbles, bounces and skids.

The field

JoiningThe streamer's horse is always there. Mods skip the queue. Everyone else queues on their first message and enters one at a time.
BehavioursWander, graze, gallop, look, shake, lie down, doze, roll, rear, jump, dance, nuzzle, drink at the trough, and gather round the campfire at night.
Day & nightDays last 8 minutes by default and start at the streamer's real time. Night brings stars, a moon with real phases, fireflies and a lot more sleeping.
Making roomOver 80% full, the quietest horses walk off one at a time. When it is full and someone is waiting, a group goes off on a trip for 15 to 25 minutes. Chatting brings yours straight back.
BitsA cheer rains one carrot per bit. 1000 or more drops a single giant carrot that cracks the ground and takes the herd a while to eat.
Raids & subsWith alerts on, a raid brings confetti and tricks, and a sub gets a banner and a rear. Off by default.
Reserved looksThe game's maker has an aquamarine horse with a laurel and navy cape. The broadcaster can switch on a royal purple look. Nobody else can pick either.
SceneryA pond with a frog, a windmill that speeds up in wind, a train on the far hills, an owl at night, and a barn being extended by builders with a crane and a lorry.

Events

Something happens every 6 minutes or so. The light on the barn roof blinks a colour while an event runs.

CarrotsCarrots land and everyone trots over to eat them.
ZoomiesThe herd gallops off in one direction.
DiscoA mirror ball drops in and every horse dances.
Wild unicornA mystery horse crosses the field and the herd follows.
Nap timeEveryone lies down. Mostly at night.
RaceLine-up, 3-2-1-GO, and the winner does a lap of honour with second and third behind.
UFOBeams up a horse and drops it back. Mostly at night.
Meteor showerNight only.
Hot air balloonDay only.
TractorDrives along the top of the field.
Rubber duckyA giant duck bobs across the sky, quacking.
DesertA sandstorm turns the field to desert for a while, then another blows it away.
Blood moonRed sky, a huge moon, bats, a howling wolf, glowing eyes. Mostly at night.
Northern lightsCurtains of colour ripple across the sky. Clear nights only. Green when they come on their own; mods can pick a colour.

Mods and the broadcaster can start any of these with !event, !race and !weather.

Weather

RainPuddles form and dry out after. A rainbow by day.
StormHeavy rain, dark sky, lightning. Horses jump and look up.
SnowSettles white, then melts. Horses breathe little puffs.
FogMist rolls in. Exclusive coats glow through it.

Letter controls

Everyone has these. Send one letter, repeated if you like: w w w w walks four steps up, aaaaaa six steps left. Ordinary words never trigger them, and they never show a bubble.

LettersEffect
w a s dStep up, left, down, right. Repeat for further
gGallop the way it is facing. Repeat for further
j r oJump · rear · roll
e l cEat · look around · dance. Repeat e and c for longer
z xSleep · wake up

Switch them off with the letter controls setting.

Chat commands

By default ! commands work for mods and the broadcaster. Open them to everyone with the commands setting. Not case-sensitive.

Out of the box these are for mods and the broadcaster. Many streamers open them to everyone, so try one. If nothing happens, the letters still work.

CommandEffect
!gallop !trot !walkMove about
!sleep !wakeLie down for a good while · get up
!graze !look !shakeIdle things
!roll !rear !jump !danceTricks
!neighA big NEIGH and a rear
!hug @nameWalk over and nuzzle them. Random if no name
!pair @nameAsk to pair up. When they !pair you back, your horses stick together until !unpair or one leaves
!statsYour race placings from the last 12 hours
!leaveWalk off the field
!helpLists the commands

!hug, !pair and !leave work for everyone, whatever the setting.

Mods & broadcaster

CommandEffect
!raceEveryone lines up and races
!eventA random event, or name one: carrots, zoomies, disco, visitor, naptime, race, ufo, meteors, balloon, tractor, duck, desert, bloodmoon, aurora, fireworks, antigravity, kites
!event aurora pinkNorthern lights in a colour: green, pink, blue, purple, gold, red, teal or rainbow
!weatherrain, storm, snow, fog or clear
!party!Confetti and everyone does a trick
!leaderboardRaces run in the last 12 hours and who won them
!count !versionHow many horses are in, away and waiting · the game version
!photoBroadcaster only. A polaroid of the field. With a photo token set it carries a QR code chat can scan; photos last 12 hours
!hat @name cowboyBroadcaster only. Put @name first on any outfit or coat command to dress someone else
!dance @nameBroadcaster only. The same on any action command (!sleep, !gallop, !roll, !leave…) makes someone else's horse do it
!clearBroadcaster only. Send every horse home

Settings from chat broadcaster

!set <name> <value> changes any setting live and confirms with a banner. Send just the name to see the current value. Most settings also work as their own command: !bubbles on, !spawn 30, !hour 22, !eventtypes carrots,ufo. !settings lists the names, which are the same as the URL options.

Outfits & coats

Each slot takes a name, random or none. A name that does not exist makes the horse list the options. Choices are remembered as long as the horse is.

CommandOptions
!hatcowboy, tophat, party, crown, beanie, flower, halo, propeller, wizard, bow, cap
!glassessunglasses, glasses, monocle, eyepatch
!scarfscarf, bandana, bell, bowtie, lei, tie
!saddlesaddle, blanket, wings
!style !nakedReroll the whole outfit · remove everything
!coatbay, chestnut, black, grey, white, palomino, buckskin, dun, cremello, roan, pinto, appaloosa, dapple, liver, pink, blue, mint, lavender, zebra
Exclusive coatsunicorn, golden, rainbow, shadow. Subs, VIPs and mods by default. They sparkle and glow in fog

Common words work too: top → tophat, tiara → crown, shades → sunglasses, brown → bay, purple → lavender, gold → golden, spotted → appaloosa, and so on.

Giveaway race

A separate page for giveaways: race.html, linked from the settings panel. It runs on its own, so use its own OBS scene or tab.

Some streamers run giveaways on a separate racetrack. A sign top-left shows the join command while entries are open.

  1. Open it, press S and connect, or add ?channel=your_channel.
  2. Viewers type !join and line up with the same horse they have on the field.
  3. Move the mouse for the bar at the bottom: Close entries, then Start race (or Space).
  4. The winner gets a crown and goes on the board, with second and third. New race opens entries again; Same horses re-runs the field.

Every horse has the same speed and the winner is pure luck.

Chat commandWhoEffect
!join !enterAnyoneEnter while entries are open
!leaveEntrantsLeave the line-up
!open !closeModsOpen or close entries
!startModsStart the race
!reset !rerunModsNew race · same horses again

Settings: race length (45 s), max entries (100), join command, subs and mods only, demo entrants. Keys: Space start, O open/close, N new race, A same horses. URL: channel=, length=, max=, join=, subs=1.

Your perks

Everything the game does for the login in the creator login setting, corard by default. A streamer can change or blank it, so none of this is guaranteed on a channel that has.

The lookAquamarine coat, laurel wreath, navy cape with gold trim, aquamarine name frame, glow in fog. Applied unless you pick a coat yourself.
Straight inYou skip the spawn queue, like mods and the broadcaster.
Never sent homeSkipped when the field makes room or rotates horses out. !leave and the broadcaster's !clear still apply.
Broadcaster powers! commands always work for you, and so do !set, the shorthand commands, !settings, !photo and dressing other horses with @name. Changes apply to their live overlay, so tread lightly.
Not included!race, !event, !weather and !party! follow the streamer's mod commands setting, so you need to be modded or set !modcmds everyone first. !clear is the broadcaster's alone.

Easter eggs

WhatDetails
The stoneThe login casson is a stone. Five minutes after it joins (or the page loads with it in the field) it drops out of the sky into the middle of the field, thumps, and beds into the soil. It does nothing: no walking, races, naps or commands. It can be picked up and thrown, and !leave sinks it into the ground. Once it has landed, reloads only hold it for three seconds. The other forms wait in SPECIAL_FORMS in js/horse.js: gnome, sausage, mower, mango (with sunglasses), ghost, vampire (says bleh)
Aurora coloursThe palettes live in AURORA_PALETTES in js/world.js. Aliases: magenta, violet, yellow, orange, cyan. Random auroras are always green
Royal lookThe broadcaster's purple coat with golden mane and red cape. royal=1
Wild unicornThe visitor event is an NPC, not a chatter
Barn worksThe barn extension progresses one "week" per release that touches it, in drawScaffold in js/world.js. Next up: roofing the lean-to and knocking through
Hero horseThe horse on this page is your reserved look in a cowboy hat, drawn by the game's own sprite code

Working on it

No build step, no server logic except the photo upload. Serve the folder statically:

python -m http.server 8000 then http://localhost:8000/?demo=1&nosplash=1&debug=1
FileWhat lives there
index.html, css/style.cssPage, panels, what's new, stats panel, polaroid
js/main.jsSettings (the FIELDS table drives the panel, URL options and !set), chat commands, permissions, rotation, persistence, mock helpers
js/world.jsRendering, sky, scenery, weather, events, races, the lorry and crane, mouse pick-up and throws
js/horse.jsHorse state machine, poses, sprite, pairs, and the special forms
js/coats.jsCoats and the accessory catalogue
js/twitch.jsAnonymous Twitch IRC over WebSocket
js/photo.js, functions/The polaroid, and the Pages Function that stores photos in KV for the QR code
js/audio.js, sounds/Web Audio mixing of CC0 recordings
race.html, js/racetrack.js, js/race.jsGiveaway race
horse.htmlWhat's my horse? lookup
guide.html, GUIDE.mdThis page and its markdown twin. Keep them in step
js/version.js, js/changelog.jsVersion and the what's new entries
dev/sprite.htmlSprite lab: every pose, large. ?form=stone or ?login=casson for the special forms
  • ?debug=1 for FPS, timings and state. ?hour=22 for night. ?events=0.2 for an event every few seconds. ?timelapse=1 races through the day.
  • The mock helpers in the console, under Testing.

Shipping a release

  1. Bump VERSION in js/version.js and add a CHANGELOG entry in js/changelog.js for anything players will notice. Quiet updates and easter eggs get neither.
  2. Update this page and GUIDE.md if commands, settings or URL options changed.
  3. Commit to main with the version in the message and push. Cloudflare Pages deploys within a minute or two.
  4. Reload the live site: the what's new panel should show the entry and !version should read the new number.
Other sessions edit this repo too. Pull first and check the version has not already moved.

URL options

Add after ?, joined with &. Booleans take 1 or 0, lists are comma separated. These are also the !set names.

OptionMeaning
channel=nameTwitch channel
nosplash=1Skip the splash screen
max=150 spawn=40Max horses · seconds between arrivals
idle=180 rotate=70 remember=12Idle leave minutes · rotate out at this % full · hours remembered
names=0 bubbles=1 counter=0 announce=0Names · bubbles · counter · join announcements
textscale=1.2 bubbletime=1.5 pix=3Text size · bubble duration · pixel size (0 auto)
daylength=8 hour=22Minutes per day (0 real clock) · fixed time of day
weather=0 weathertypes=rain,fog weatherrate=2Weather on/off · types · frequency
events=6 eventtypes=carrots,ufoMinutes between events (0 off) · types
activity=1.5 sleepiness=0.5Behaviour multipliers
subalerts=1 raidalerts=1 bitcarrots=0Sub alerts · raid celebrations · bits carrots
commands=0 commandsfor=everyone letters=0! commands · who can use them · letter controls
modcmds=everyone exclusivefor=modsWho can use mod commands · who can pick exclusive coats
royal=1 special=login ignore=a,bRoyal look · creator login · ignored users
facecam=1 facecamcorner=top-left facecamwidth=25Facecam corner · which corner · width %
sound=0 volume=0.2 sfx=0.4Sound · ambience volume · horses and events volume
critters=0 spawnbar=0 splash=0 hudhide=5 trail=0Critters · queue bar · splash · UI hide delay · mouse hoofprints
phototoken=…Token for the photo QR code
demo=1 debug=1Fake horses and chat · debug overlay

Testing

Turn on demo horses in the advanced panel, or add ?demo=1. For specific things, open the console (F12) and use mock:

CommandWhat it does
mock.chat("name", "hello!")A chat message. Add {mod: true} for powers (sub, vip, broadcaster too)
mock.horse("name") mock.horses(20)Named horses walk in · 20 fake horses drop in
mock.sub("name") mock.gift("a", "b") mock.bomb("a", 5)Sub · gifted sub · sub bomb
mock.raid("name", 42) mock.bits("name", 100)Raid · cheer (1000+ for the giant carrot)
mock.event("ufo") mock.weather("storm") mock.photo()Start an event, weather, or take a photo
mock.help()Lists everything

The race page has mock.joins(20), mock.join("name"), mock.start() and mock.reset().

Troubleshooting

ProblemFix
Pill stays redCheck the channel name. It reconnects on its own if Twitch drops
Bots getting horsesAdd them to the ignore list
Too crowdedLower max horses, raise the spawn interval, or press C
Text too small or largeText size or pixel size in the advanced panel
Settings boxes missingAn ad blocker. Turn it off for this site
Something looks stuckAdd ?debug=1 and send a screenshot