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.
- Open the game, press S, type your channel name and click Connect. The pill bottom-left turns green and your horse walks in.
- 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=1Settings 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.
- 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.
- Keep chatting. If bubbles are on, your messages appear above your horse, emotes included. Chatting always wakes it.
- Play. Type single letters to move, dress it up with outfits and coats, and try the chat commands.
neigh and your horse whinnies.!leave walks off whenever you like.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.
| Group | Settings |
|---|---|
| Chat & permissions | Sub 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 |
| Population | Max horses · seconds between arrivals · idle leave · rotate horses out at this % full · hours remembered · spawn queue bar · demo horses |
| Display | Announce joins · names · counter · bubbles and their duration · text size · pixel size · splash · UI hide delay · mouse hoofprints · debug overlay |
| Facecam | Reserve 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 |
| World | Day 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).
! commands for mods and the broadcaster.Keyboard & mouse
Click and drag a horse to carry it. Flick the mouse as you let go and it flies, tumbles, bounces and skids.
The field
Events
Something happens every 6 minutes or so. The light on the barn roof blinks a colour while an event runs.
Mods and the broadcaster can start any of these with !event, !race and !weather.
Weather
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.
| Letters | Effect |
|---|---|
w a s d | Step up, left, down, right. Repeat for further |
g | Gallop the way it is facing. Repeat for further |
j r o | Jump · rear · roll |
e l c | Eat · look around · dance. Repeat e and c for longer |
z x | Sleep · 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.
| Command | Effect |
|---|---|
!gallop !trot !walk | Move about |
!sleep !wake | Lie down for a good while · get up |
!graze !look !shake | Idle things |
!roll !rear !jump !dance | Tricks |
!neigh | A big NEIGH and a rear |
!hug @name | Walk over and nuzzle them. Random if no name |
!pair @name | Ask to pair up. When they !pair you back, your horses stick together until !unpair or one leaves |
!stats | Your race placings from the last 12 hours |
!leave | Walk off the field |
!help | Lists the commands |
!hug, !pair and !leave work for everyone, whatever the setting.
Mods & broadcaster
| Command | Effect |
|---|---|
!race | Everyone lines up and races |
!event | A random event, or name one: carrots, zoomies, disco, visitor, naptime, race, ufo, meteors, balloon, tractor, duck, desert, bloodmoon, aurora, fireworks, antigravity, kites |
!event aurora pink | Northern lights in a colour: green, pink, blue, purple, gold, red, teal or rainbow |
!weather | rain, storm, snow, fog or clear |
!party! | Confetti and everyone does a trick |
!leaderboard | Races run in the last 12 hours and who won them |
!count !version | How many horses are in, away and waiting · the game version |
!photo | Broadcaster 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 cowboy | Broadcaster only. Put @name first on any outfit or coat command to dress someone else |
!dance @name | Broadcaster only. The same on any action command (!sleep, !gallop, !roll, !leave…) makes someone else's horse do it |
!clear | Broadcaster 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.
| Command | Options |
|---|---|
!hat | cowboy, tophat, party, crown, beanie, flower, halo, propeller, wizard, bow, cap |
!glasses | sunglasses, glasses, monocle, eyepatch |
!scarf | scarf, bandana, bell, bowtie, lei, tie |
!saddle | saddle, blanket, wings |
!style !naked | Reroll the whole outfit · remove everything |
!coat | bay, chestnut, black, grey, white, palomino, buckskin, dun, cremello, roan, pinto, appaloosa, dapple, liver, pink, blue, mint, lavender, zebra |
| Exclusive coats | unicorn, 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.
- Open it, press S and connect, or add
?channel=your_channel. - Viewers type
!joinand line up with the same horse they have on the field. - Move the mouse for the bar at the bottom: Close entries, then Start race (or Space).
- 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 command | Who | Effect |
|---|---|---|
!join !enter | Anyone | Enter while entries are open |
!leave | Entrants | Leave the line-up |
!open !close | Mods | Open or close entries |
!start | Mods | Start the race |
!reset !rerun | Mods | New 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.
!leave and the broadcaster's !clear still apply.! 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.!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
| What | Details |
|---|---|
| The stone | The 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 colours | The palettes live in AURORA_PALETTES in js/world.js. Aliases: magenta, violet, yellow, orange, cyan. Random auroras are always green |
| Royal look | The broadcaster's purple coat with golden mane and red cape. royal=1 |
| Wild unicorn | The visitor event is an NPC, not a chatter |
| Barn works | The 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 horse | The 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| File | What lives there |
|---|---|
index.html, css/style.css | Page, panels, what's new, stats panel, polaroid |
js/main.js | Settings (the FIELDS table drives the panel, URL options and !set), chat commands, permissions, rotation, persistence, mock helpers |
js/world.js | Rendering, sky, scenery, weather, events, races, the lorry and crane, mouse pick-up and throws |
js/horse.js | Horse state machine, poses, sprite, pairs, and the special forms |
js/coats.js | Coats and the accessory catalogue |
js/twitch.js | Anonymous 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.js | Giveaway race |
horse.html | What's my horse? lookup |
guide.html, GUIDE.md | This page and its markdown twin. Keep them in step |
js/version.js, js/changelog.js | Version and the what's new entries |
dev/sprite.html | Sprite lab: every pose, large. ?form=stone or ?login=casson for the special forms |
?debug=1for FPS, timings and state.?hour=22for night.?events=0.2for an event every few seconds.?timelapse=1races through the day.- The
mockhelpers in the console, under Testing.
Shipping a release
- Bump
VERSIONinjs/version.jsand add aCHANGELOGentry injs/changelog.jsfor anything players will notice. Quiet updates and easter eggs get neither. - Update this page and
GUIDE.mdif commands, settings or URL options changed. - Commit to
mainwith the version in the message and push. Cloudflare Pages deploys within a minute or two. - Reload the live site: the what's new panel should show the entry and
!versionshould read the new number.
URL options
Add after ?, joined with &. Booleans take 1 or 0, lists are comma separated. These are also the !set names.
| Option | Meaning |
|---|---|
channel=name | Twitch channel |
nosplash=1 | Skip the splash screen |
max=150 spawn=40 | Max horses · seconds between arrivals |
idle=180 rotate=70 remember=12 | Idle leave minutes · rotate out at this % full · hours remembered |
names=0 bubbles=1 counter=0 announce=0 | Names · bubbles · counter · join announcements |
textscale=1.2 bubbletime=1.5 pix=3 | Text size · bubble duration · pixel size (0 auto) |
daylength=8 hour=22 | Minutes per day (0 real clock) · fixed time of day |
weather=0 weathertypes=rain,fog weatherrate=2 | Weather on/off · types · frequency |
events=6 eventtypes=carrots,ufo | Minutes between events (0 off) · types |
activity=1.5 sleepiness=0.5 | Behaviour multipliers |
subalerts=1 raidalerts=1 bitcarrots=0 | Sub alerts · raid celebrations · bits carrots |
commands=0 commandsfor=everyone letters=0 | ! commands · who can use them · letter controls |
modcmds=everyone exclusivefor=mods | Who can use mod commands · who can pick exclusive coats |
royal=1 special=login ignore=a,b | Royal look · creator login · ignored users |
facecam=1 facecamcorner=top-left facecamwidth=25 | Facecam corner · which corner · width % |
sound=0 volume=0.2 sfx=0.4 | Sound · ambience volume · horses and events volume |
critters=0 spawnbar=0 splash=0 hudhide=5 trail=0 | Critters · queue bar · splash · UI hide delay · mouse hoofprints |
phototoken=… | Token for the photo QR code |
demo=1 debug=1 | Fake 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:
| Command | What 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
| Problem | Fix |
|---|---|
| Pill stays red | Check the channel name. It reconnects on its own if Twitch drops |
| Bots getting horses | Add them to the ignore list |
| Too crowded | Lower max horses, raise the spawn interval, or press C |
| Text too small or large | Text size or pixel size in the advanced panel |
| Settings boxes missing | An ad blocker. Turn it off for this site |
| Something looks stuck | Add ?debug=1 and send a screenshot |