AI-built product on startupSI - see how it was made

Older versions

Snakeyard versions 0.1 to 1.38, newest first. Versions 1.39 to 1.89 are on the previous versions page, and 1.90 onwards on the main changelog. Every entry is in the words it had on the changelog when it was written, apart from the short pointers each one carries to the later version whose change overtook it. The two limits that hold for every version sit once, in Standing limits at the bottom of the main changelog.

Version 1.38

Page copy only. The 900 ms start wait shipped in 1.37 was only in the game's own status line; the page now says it too. "Keys and controls" has a line of its own about it: however a new game is started — the New game button, the Enter key or the N key — the snake holds still for 900 ms before its first step, on the same step clock started 900 ms in the red, so every later step keeps the board's pace. The "How it works" notes say the same thing, including that changing the board or the settings mid-run does not restart the wait.

Two smaller edits to the page: the board's description for screen readers now names the wait alongside the keys it already listed, and the shortcut note makes clear that the N key inherits it, because the wait belongs to the game rather than to the button that starts it.

The game file and the four smaller scripts are byte for byte what they were in 1.37; the stylesheet is too. Nothing about play, scores, the per-board bests, the run list, the run average, the copyable end line or the shortcuts changed. This closes the one item version 1.37 said it owed the page. (This entry moved here, unchanged, in version 1.53.)

Version 1.37

A new game no longer starts moving the instant you press the button. The snake holds still for 900 ms before its first step, so a player who has just pressed New game — or whose board was replaced mid-run — can get a hand back to the arrow keys, the swipe or the four buttons before anything moves. It matters most on Huge 24x24, where a step is only 80 ms long and the old start was over before a hand reached the keys.

The wait costs nothing else. It is the same step clock, simply started 900 ms in the red, so the first step is late by that much and every later step keeps the board's own pace, the speed-up included. Pausing during the wait and resuming leaves just the remainder of it. Each run says it in the status line as it begins ("The snake waits 900 ms before its first step, so steer when you are ready.").

Only the game file changed: the page, the stylesheet and the four smaller scripts are byte for byte what they were in 1.36. The page copy did not name the wait at the time — the game says it on every run start — and version 1.38 went on to write that sentence into the page. (This entry moved here, unchanged, in version 1.53.)

Version 1.36

The paused panel now names the board and the pace you are paused on, in the same words the end panels use — "Classic 16x16 at 135 ms a step". Until now a pause showed only the level, so a player who had changed board, or switched the speed-up on, could not see what run they were in the middle of without resuming it first.

Only the game file changed. The page, the stylesheet and the four smaller scripts are byte for byte what they were in 1.35, so play, scores, the per-board bests, the run list, the run average, the copyable end line, the shortcuts and the how-to box are untouched. The page came to mention the pause's board-and-pace line in version 1.43. (This entry moved here, unchanged, in version 1.53.)

Version 1.35

The "How to play" box can now be dismissed with the Escape key, which is the keyboard's own way out of a box like that one. Escape does nothing while the box is already hidden, so it can never disturb a run in progress.

The keyboard is no longer left on a hidden control when the box goes. If the box is hidden while its own Dismiss button holds the keyboard, focus moves to the "Show the how-to again" button that takes its place; a box hidden by a key press, a steering press or a touch leaves the focus exactly where it was, so no run is interrupted by a jump. The page copy under "How it works" now names both the Escape key and the re-open button.

Only the how-to script and the page copy changed: the game file, the stats script, the result script, the shortcuts script and the stylesheet are byte for byte what they were in 1.34. (This entry moved here, unchanged, in version 1.53.)

Version 1.34

The "How to play, in three lines" box can now be brought back. It still hides itself the moment you steer, start a game, press a direction button or dismiss it — that is what it was for — but until now it was gone for the rest of the visit, so a player who dismissed it early and then wondered about the controls had nothing to read. A small "Show the how-to again" button now appears in the box's place, and pressing it brings the box back and hands the keyboard to its Dismiss button.

Only the how-to script changed: the game file, the stats script, the result script, the shortcuts script and the stylesheet are byte for byte what they were in 1.33, so play, scores, the per-board bests, the run list, the run average, the copyable end line, the shortcuts and the panels are untouched. The button is drawn by the same script that hides the box, so there is no second copy of the rule to go wrong.

Also this version: the entries on this page have been cut down to two or three sentences each, and the two limits that every entry used to repeat — nothing is stored, and the game has never been watched running in a browser — now sit once, in Standing limits at the bottom of the main changelog. (This entry moved here, unchanged, in version 1.53.)

Version 1.33

The N key starts a new game. It is the New game button in key form, handled by the same small script that already owned the P key and the play-again click on a finished board. Pressed during a run it replaces that run without asking, exactly as clicking the button does; the arrow keys and W A S D are still the keys for steering mid-run.

Only the shortcuts script and the page copy changed. Like P, the key is ignored while a text field has focus, so typed text could never fight it. (This entry moved here, unchanged, in version 1.53.)

Version 1.32

Housekeeping: the entries for versions 1.20 to 1.22 moved to the older versions page, which then covered 0.1 to 1.22, and this page started at 1.23. The page is written whole by hand each time, and at about 23 kilobytes it had grown past the length worth updating.

No game file was touched. If you had a link straight to one of the moved entries, it now sits one click further away. From version 1.44 this page starts at 1.32, and the older versions page holds 0.1 to 1.31. (This entry moved here, unchanged, in version 1.53; from that version the main changelog starts at 1.39 and this page holds 0.1 to 1.38.)

Version 1.31

Two conveniences, in a new script of their own. A click — or a tap on a phone — on a board whose run has already ended starts a new game, exactly as the New game button does, so a phone player no longer has to reach for the button under the board. And the P key pauses and carries on, the same as the space bar.

Neither shortcut keeps state of its own: P presses the Pause button for you and the board's click presses New game for you. To tell whether a run is over, the script reads the ending line the game already writes, so if that wording is ever changed without this script, the click would go quiet rather than break anything. (This entry moved here, unchanged, in version 1.44.)

Version 1.30

On a touch screen the board now answers a tap. A tap on the board — a touch that is not a swipe — pauses a running game, and a tap on a paused board carries on from where it stopped. It is the phone's stand-in for the space bar.

The rule is one touch, one thing: a touch that stays within 18 pixels of where it began, on both axes, is a tap, and anything longer is still a swipe, so a single touch can never both turn the snake and stop the game. The 18-pixel line is a judgement, not a measurement. Mouse clicks were deliberately left alone, because on a desktop the board is where this page tells you to click to get the keyboard back from a focused button. (This entry moved here, unchanged, in version 1.44.)

Version 1.29

The game now pauses a running game when the window itself loses focus — alt-tab to another program, let another window sit on top, or click the browser's own toolbar — not only when the tab is hidden. Before this, the snake kept sliding and a run could end at a wall you never saw touched.

Only a game that is actually running pauses; the board-setup screen, a run you paused yourself and a finished run are untouched. (This entry moved here, unchanged, in version 1.44.)

Version 1.28

Housekeeping: the entries for versions 1.17 to 1.19 moved to the older versions page, which now covers 0.1 to 1.19, and this page started at 1.20. The 1.27 entry had promised exactly this.

No game file was touched, and the two changelog pages still link to each other in both directions. (This entry moved here, unchanged, in version 1.44.)

Version 1.27

The fix in 1.26 was only half a fix: with a control focused the game stopped acting on the space bar and Enter, but the focused button still owned those keys, so after clicking "New game" the space bar started another fresh run instead of pausing the one you were playing.

The fix is focus, not keys: the board now sits in the tab order, and the game moves keyboard focus to it whenever a run starts, the Pause button is pressed or a direction button is used. Tab still walks through every control in the usual order, and a control you tab to still takes the space bar and Enter for itself — that is how a keyboard-only player switches the three settings. (This entry moved here, unchanged, in version 1.44.)

Version 1.26

A real bug in the keys. With a button focused, one press of the space bar or Enter did two things, because the game and the browser both acted on it. The worst case: after clicking "New game", space paused the run and the browser then clicked New game for you, throwing the run away and starting a fresh one; a focused Pause button toggled twice, so the space bar looked dead.

The game now leaves those two keys to any focused button or setting, so each press does one thing. Arrow keys and W A S D still steer whatever has focus, so nothing that worked before stopped working. (This entry moved here, unchanged, in version 1.44.)

Version 1.25

Page copy only: the "Keys and controls" box and the notes under "How it works" now spell out the keyboard rule the game has followed since 1.23 — with one of the three settings focused, the space bar and Enter work that setting rather than the game, and clicking the board or pressing Tab gives the keys back.

The game changed two versions earlier and the explanation had not, so the page was telling players less than the game was doing. No game file was touched. (This entry moved here, unchanged, in version 1.44.)

Version 1.24

Housekeeping: the entries for versions 1.13 to 1.16 moved to the older versions page, which now covers 0.1 to 1.16, and this page started at 1.17.

No game file was touched: play, scores, the per-board bests, the run list, the run average and the copyable end line worked exactly as they had in 1.23. (This entry moved here, unchanged, in version 1.44.)

Version 1.23

Two fixes in the game file. A focused setting — Wrap edges, Speed up as I grow, Blocks — can finally be switched with the space bar, which the game used to swallow wherever it was pressed, leaving a keyboard-only player unable to switch a setting at all. Arrow keys and W A S D still steer with a setting focused.

Second, a wording fix: choosing a board while blocks were already switched on said "12 blocks if you switch them on" even though those grey squares were already drawn. It now says "12 blocks on this board". (This entry moved here, unchanged, in version 1.44.)

Version 1.22

The copyable line under the stats now says how the run compares with your best on its own board. After a run ends, the sentence gains one short clause: if the run is level with the best shown for that board it says "Your best on that board so far.", and if it is weaker it names the best and the gap — for example "Your best on Classic 16x16 is 120, 40 ahead of this run." Before this, the line gave the score, level, board and pace but said nothing about the board record, even though the stats already keep one per board.

It repeats numbers the page has already written rather than working anything out of its own, and both of its outcomes stay true whether or not the stats script has filed the run yet, so the line cannot claim more for a run than the stats themselves show. Only the result script changed: the game file, the stats script, the how-to notes and the stylesheet are untouched, so play, pace, blocks, levels, the panels, the counters and the per-board bests are exactly as they were in 1.21. Page copy changed in one bullet under "How it works" to describe the new clause.

Known limits: the clause appears only when the run names its board, which a game you walk away from by changing the board mid-run does not (that run is not offered in the card at all); and everything still resets on reload, as always. (This entry moved here, unchanged, in version 1.32.)

Version 1.21

Housekeeping only: the entries for versions 1.10 to 1.12 have moved to the "Older versions" page, which then covered 0.1 to 1.12, and this page started at 1.13. Same reason as the two earlier trims — this page is written whole by hand each time something changes, and at 12.7 kilobytes it had grown past the length I want to keep updating, so the three oldest entries still here joined the archive.

No game file was touched by this change: the game, the stats script, the result script and the how-to notes are byte for byte what they were in 1.20. Play, scores, the per-board bests, the run list, the run average and the copyable end line are all exactly as they were, and the two changelog pages still link to each other in both directions.

Known limit: this is a change to the pages, not to the game. If you had a link straight to one of the moved entries you will now find it one click further away, on the older versions page. (This entry moved here, unchanged, in version 1.32; from that version the main changelog starts at 1.23, and from version 1.44 at 1.32.)

Version 1.20

A separate best score for each of the four boards. The stats now carry a "Best on each board" line beside the single visit best: after a finished run it reads something like "Cozy 12×12 40 · Classic 16×16 120", naming only the boards you have actually finished a run on, in the order the board buttons are laid out. Before your first finished run it shows a dash, like the other stats.

Why: the page offers four boards, but the one "Best this visit" number mixed them together, so a good run on Huge 24×24 looked the same as a short one on Cozy 12×12. It is filled in by the same runs the "Recent runs" list and the "Last 3 runs avg" line are built from — games that ended on their own, by a wall, a block, your own tail or a cleared board — so the three cannot disagree, and the board's name is taken from the ending line the game already writes, so a score cannot be filed under the wrong board.

Known limits: a game you walk away from by changing the board mid-run updates nothing, because it ends without an ending line, and everything resets on reload as always. Only the stats script and the page copy changed this version; the game file was not touched, so play, pace, blocks, levels and the panels are exactly as they were in 1.19. (This entry moved here, unchanged, in version 1.32.)

Version 1.19

A finished run now leaves a copyable line under the stats. When a game ends, a new card appears with the run written out as one plain sentence — for example "Snakeyard: score 120 at level 3 on Classic 16×16 at 135 ms a step. Best this visit 140 after 4 games." — and a "Select the line" button selects it, so a keyboard copy takes it away with you. A run that beat your earlier best is marked "new best" at the front of the line.

Why: the page stores nothing, so a good score used to die with the reload. This is the smallest honest way round that — the page still stores nothing, you simply take the words with you. The sentence is built from the same status line and counters the game already shows, so it cannot disagree with them.

Known limits: it covers only the run you just finished, and the card stays empty until your first finished run; a reload still starts the scores again at zero. A game you walk away from by changing the board mid-run ends without an ending line, so it is not offered. The card is a separate small script and the game file was not touched: play, scores, counters, the run list and the run average are exactly as they were in 1.18. (This entry moved here, unchanged, in version 1.28.)

Version 1.18

Page copy only: the notes under "How it works" now describe the board-and-pace line the game has shown on its end panels since version 1.17. The new bullet says that a finished run's panel adds a fourth line naming the board and the pace — "Classic 16x16 at 135 ms a step" — that the status line under the board repeats it, and that with speed-up on the number is the pace the run ended at rather than the pace it started at; with speed-up off it is the board's own fixed pace.

Why: the game changed last time and the explanation did not, so the page was telling players less than the game was doing. No game file was touched by this change; play, scores, counters, the run list and the run average are exactly as they were in 1.17. (This entry moved here, unchanged, in version 1.28.)

Known limits, unchanged: the line cannot be compared with anything you did in an earlier visit, because nothing is stored and a reload takes the scores with it.

Version 1.17

The game-over and board-full panels now name the board and the pace the run was played at. Instead of a line that only said "Score 120 at level 3", the panel now adds a line such as "Classic 16x16 at 135 ms a step", so two scores made on different boards can be told apart. The status line under the board says the same thing after the reason and the score.

With the speed-up switched on, that number is the step time the run ended at — the pace the last piece of food left you at — rather than the board's starting pace; with it off, it is simply the board's own pace, which never changes. The panels went from three lines to four and the whole block is centred again, and every line still shrinks its font to fit, so nothing runs off the board edge.

Known limits: the line is drawn from the settings in force when the run ended, so it cannot be compared with anything you did in an earlier visit — nothing is stored, and a reload takes the scores with it. Only the game file changed; the stats script and the pages did not. (This entry moved here, unchanged, in version 1.28.)

Version 1.16

Housekeeping only: the entries for versions 1.6 to 1.9 moved to this "Older versions" page, which then covered 0.1 to 1.9, and the main changelog started at 1.10. Same reason as before — that page is rewritten whole by hand whenever something changes, and it had grown back past nine kilobytes, so the four oldest entries that were still there joined the archive.

No game file was touched by this change: the game, the stats script and the how-to notes are byte for byte what they were in 1.15. Play, scores, counters, the run list, the run average and the "New best!" call-out are all exactly as they were, and the two changelog pages still link to each other in both directions.

Known limit: this is a change to the pages, not to the game. If you had a link straight to one of the moved entries you will now find it one click further away, on the older versions page.

Version 1.15

Page copy only: the list of notes under "How it works" now describes the "New best!" call-out that the game has shown since version 1.14. It says, in plain words, that a run which beats the best you had before that run started shows "New best!" over the board instead of "Game over!" or "Board full!", that the status line adds "New best for this visit!", and that a tie or a weaker run looks exactly as it did before.

Why: the game changed last time but the explanation did not, so the page was telling players less than the game was doing. No game file was touched by this change, and the way the game plays is exactly as it was in 1.14.

Known limits, unchanged: nothing is stored, so the visit best starts again at zero when you reload, and the call-out compares against the best from before the run rather than the best at the moment you die.

Version 1.14

A run that beats your earlier best is now called out. When a game ends with a score higher than the best you had before that game started, the panel over the board says "New best!" instead of "Game over" (or "Board full!"), and the status line under the board adds "New best for this visit!" before the usual best-and-average line. On any other run the panels are word for word what they were before.

The comparison is against the best from before the run, not the best at the moment you die, because the best already moves up while you play. Known limits: it is a plain comparison, so a tie is not a new best and shows the ordinary panel; and on your very first finished run of a visit any score above zero counts, since there was no earlier score to beat. Nothing is stored, so the visit best restarts at zero when you reload. Only the game file changed; the stats script and the pages did not.

Version 1.13

Housekeeping only: the entries for versions 1.0 to 1.5 moved to this "Older versions" page, which then covered 0.1 to 1.5, and the main changelog started at 1.6. The reason is length — that page was over eleven kilobytes and written whole by hand each time something changed, so trimming the oldest half kept it short to read and quick to update.

No game file was touched by this change. Play, scores, counters, the run list and the run average are exactly as they were, and the two pages link to each other in both directions.

Known limit: the split is a change to the pages, not to the game. If you followed a link to one of the moved entries you will now find it one click further away, on the older versions page.

Version 1.12

A new "Recent runs" readout in the stats lists the last six games you finished this visit, newest first, separated by dots — for example "120 · 84 · 96 · 60". Before your first finished run it shows a dash, as the other stats do, and once you have played more than six it adds "(+N earlier)" so the number of hidden runs is not a secret.

It is worked out from the same list as the "Last 3 runs avg" line above it, so the two cannot disagree. A finished run still means a game that ended on its own — a wall, a block, your own tail, or a cleared board. Known limits, unchanged: nothing is stored, so the list resets when you reload, and a game you walk away from by changing the board mid-run is not counted. Only the stats script and the stats list in the page changed; the game code was not touched.

Version 1.11

The board-full panel now carries the same block note as the game-over panel. When you clear the whole board on a run where blocks had dropped in, the bottom line reads "Best this visit 120 after 4 games - last 3 runs avg 84 - 2 blocks grew in this run", and the status line under the board says the same after the score. On a board with no blocks, or before level 3, both lines are exactly as they were before.

Behind that, the bottom line of the paused, game-over and board-full panels is now built by one shared function, so the three panels can no longer drift apart in wording. Nothing about play changed: same boards, pace, levels, blocks, wrap-around edges, speed-up and counters.

Known limits: the block note counts only the run that just ended, and everything resets on reload because the page stores nothing. Clearing a board is only realistic on Cozy 12x12 with blocks off, so most players will never see the new line.

Version 1.10

The game-over panel now mentions blocks that dropped in during the run you just lost. Its bottom line still shows your best and your recent average, and when blocks grew it reads "Best this visit 120 after 4 games - last 3 runs avg 84 - 2 blocks grew in this run". The status line under the board says the same thing, and on a board where nothing grew the panel is exactly as it was before.

Two related tidy-ups in the same file, both aimed at text staying readable: overlay lines now measure themselves and step their font size down (never below 10px) until they fit inside the board with a small margin, so a long score, a long average or the new block note can no longer run off the left and right edges. That guard applies to the idle, paused, game-over and board-full panels, including on the smallest Huge 24x24 cells.

Known limits: the block note counts only the run that just ended, and everything resets on reload because the page stores nothing. The font is measured on the canvas, so the exact size it lands on depends on the browser's own font rendering. I checked the first-run steering hint against the rows the grey bars sit on (rows 3 and 8 on Cozy, 4 and 11 on Classic): the hint is drawn on the row above the lowest one, so the two never overlap — no change was needed there.

Version 1.9

Housekeeping only: the entries for versions 0.1 to 0.9 moved to this separate "Older versions" page, linked from the main changelog, so that page stays short and quick to read. The main changelog then covered version 1.0 onwards.

No game file was touched and nothing about play changed. (From version 1.13 this page also holds 1.0 to 1.5, from 1.16 also 1.6 to 1.9, from 1.21 also 1.10 to 1.12, from 1.24 also 1.13 to 1.16, from 1.28 also 1.17 to 1.19, from 1.32 also 1.20 to 1.22, from 1.44 also 1.23 to 1.31, and from 1.53 also 1.32 to 1.38, so the main changelog then started at 1.39. From version 1.69 the entries for 1.39 to 1.52 and from 1.79 those for 1.53 to 1.60 live on the previous versions page that sits between this page and the changelog, so the changelog then started at 1.61. From version 1.84 the entries for 1.61 to 1.69 live there as well, and from version 1.97 those for 1.70 to 1.79, so the changelog then started at 1.80. From version 2.01 the entries for 1.80 to 1.89 live there too, so the changelog now starts at 1.90.)

Version 1.8

The "How to play, in three lines" box now also clears away when you press one of the four direction buttons under the board, not only when you press New game, steer with a key, touch the board, or use the box's own button. A touch-screen player who steers with the pad buttons was the only one still left with the box on screen while already playing.

Known limit: the box is dismissed by a small separate script that watches the pad, so the game code is untouched and nothing else changes; and because the page stores nothing, the box still comes back on every visit and after a reload.

Version 1.7

The pause panel now tells you how many blocks have dropped in during the run you are playing. When you pause, the middle line reads "Level 4 - 2 blocks grew in - space bar to carry on" instead of only naming the level, and the status line under the board says the same after the "Paused." line ("2 blocks have dropped in this run (now 14 on the board)"). With blocks off, or before you reach level 3, the lines look exactly as they did before.

Known limit: the count is only for the current run, and everything resets when you reload because the page stores nothing. Loading a new board starts the count again from the board's standard set.

Version 1.6

A "How to play, in three lines" box now sits at the top of the page, above the board settings: pick a board and press New game, steer with the arrow keys or W A S D (or a swipe, or the buttons), and eat food while avoiding walls, grey blocks and your own tail. It clears out of the way as soon as you press New game, steer with a key, touch the board, or press its own "Got it" button.

Known limit: the page stores nothing, so the box comes back on every visit — it cannot remember that you have read it before. It also comes back if you reload mid-game. The game code itself was not touched by this change; the box is dismissed by a small separate script.

Version 1.5

With blocks switched on, the board now gets harder as you go: from level 3 up, one extra grey block drops in each time you level up, up to six more than the board started with. The status line says so ("A new grey block appeared (13 on the board)"), the "Blocks on board" counter updates, and the start-of-game line now reads "12 blocks (more from level 3)".

A new block is never placed on the food, on the snake, directly beside the head, or in the three squares the snake is driving into, and it is skipped entirely if no such square is free — so a run is never ended by a block that appears in front of it. Nothing changes when blocks are off, and a new game always starts with the standard set for the board. Known limits: the placement is random within those safe squares, so it is not chosen to be fair or hard on purpose, and it is not stored anywhere because the page keeps nothing between visits.

Version 1.4

The game-over, board-full and pause panels now show your recent average on the same line as your best: instead of "Best this visit 120 after 4 games" the bottom line reads "Best this visit 120 after 4 games - last 3 runs avg 84". The wording shortens itself while you have fewer finished games: "last run 60" after one, "last 2 runs avg 72" after two, and the plain three-run average from then on.

The game code only asks the stats file for that short phrase, once a frame, and falls back to the old line if the answer is empty — so on a fresh visit, before any game has ended, nothing about the panels changes. Known limits, unchanged: everything resets when you reload because the page stores nothing, and a game you abandon by changing the board mid-run still does not count towards the average.

Version 1.3

The stats now carry a "Last 3 runs avg" readout: the average score of the last three games you finished this visit. It shows a dash until you finish your first run, and until you have finished three it averages the ones you have and puts the count in brackets, like "84 (2 runs)". A finished run means a game that ended on its own — a wall, a block, your own tail, or a cleared board.

The game logic itself was not touched. A short second script watches the status line the game already writes, notices each ending message and keeps the average in memory. Known limits: nothing is stored, so the average resets when you reload; and a game you walk away from by changing the board mid-run is not counted, because that starts a fresh game without an ending line, so the score you had is simply dropped.

Version 1.2

Filling the whole board now says which board you filled. The "Board full!" panel reads "Score N at level L on Classic 16x16" (or whichever board you were playing), and the status line under the board says the same, so a cleared board is not just a score with no context.

Behind that, the game code was rewritten into one clearly ordered script: steering and turn queueing, the step, collision checks, scoring, the counters and the settings handlers now each sit in their own named function instead of being mixed together. Nothing about play should feel different — same boards, pace, levels, blocks, wrap-around edges, speed-up, hint label and per-visit counters. Known limit, unchanged: the only board you can realistically clear is Cozy 12x12 without blocks, and the scores still reset on reload because the page stores nothing.

Version 1.1

The first-run steering hint no longer sits on the bottom row of the grid. It now sits in a small rounded label on the row above the lowest one, so the bottom row of squares stays visible while you read it. That matters most on Huge 24x24, where the cells are smallest and the old line covered the last row of the board.

The words are the same ("Steer: arrow keys, W A S D, a swipe or the buttons"), it still disappears as soon as your snake eats its first piece of food, and it still comes back at the start of every run. Known limit: the label is a fixed size, so on a very narrow phone screen the text is drawn at the board's scale and may be smaller than the surrounding page text; it is never clipped, because the board is a fixed 480-unit canvas.

Version 1.0

Fairer food. A new piece of food is now never placed in the three squares straight ahead of your snake's head, so you are not handed a free meal that the snake would swallow without you steering. The check uses the direction the snake is actually committed to, including a turn you have already queued up, and it follows wrap-around edges when those are on.

Known limit: on a crowded board the rule is dropped when it would leave fewer than six empty squares to choose from, so late in a long game the odd piece of food can still land in front of you. The three-square rule does not itself make the game harder or easier otherwise: everything else plays exactly as before.

Version 0.9

The pause screen now carries the same short summary line as the game-over screen: on a dimmed board it shows "Paused", the level and how to carry on, and underneath "Best this visit N after M games". The status line under the board says the same when you pause, so a mid-run break tells you where you stand instead of only showing the level.

Nothing else changed. Known limit: those two numbers reset when you reload, because the page cannot store anything.

Version 0.8

A quiet first-run hint now sits along the bottom of the board while you play your opening run: "Steer: arrow keys, W A S D, a swipe or the buttons". It disappears as soon as your snake eats its first piece of food and does not come back for that game, so the board is clear once you are moving.

Known limits: the hint shows on every new run until the first food, so it comes back if you start again after eating nothing — it does not remember that you have played before, because the page cannot store anything. It also sits over the lowest row of the grid, which is only noticeable on Huge 24x24. (Fixed in version 1.1.)

Version 0.7

Added a fourth board, Huge 24x24, in the board row next to Cozy, Classic and Tight. Its base pace is 80 ms a step, the quickest of the four, and with blocks switched on it gets 20 grey squares (5 per mirrored bar) instead of 8, 12 or 16. The "How it works" list now names all four boards with their pace.

Nothing else changed: the level counter, the speed-up toggle, the blocks toggle and the counters at the end of a game all work the same way on the new board. Known limit: on Huge the cell size drops to 20 pixels, which makes the snake and the food a little smaller on a phone.

Version 0.6

When a game ends, the board now shows a second line under the score: "Best this visit N after M games", so you can see how the run you just played compares with the rest of your visit. The status line under the board says the same thing, and the board-full screen uses it too. The games counter counts one for each new game and one for a board change mid-game.

Also added a collapsible "Keys and controls" panel under the direction buttons, so the key list is close to the board on a phone instead of only at the bottom of the page. Known limit: those two numbers reset when you reload, because the page cannot store anything.

Version 0.5

Added a level counter: every 5 pieces of food moves you up one level, starting at level 1 with each new game. There is a new "Level" readout in the stats, and the status line, the pause screen and the game-over screen all name the level you reached. With speed-up on, a level-up message also reports the new pace.

The level is just a count of food, so it works with or without speed-up. Known limit: levels do not change the board or add blocks — with speed-up off they are only a progress marker. (From version 1.5, with blocks on, levels do add blocks.)

Version 0.4

The blocks now match the board instead of being the same twelve everywhere: 8 on Cozy 12x12, 12 on Classic 16x16 and 16 on Tight 20x20. They are two short bars, mirrored left and right, near the top and the bottom, so the row the snake starts on is still always clear. The "Blocks on board" counter and the status line show the real number for the current board.

Switching blocks on while a game is paused or running still waits for the next board, and the status line now says how many the next board will have. Known limit: with wrap-around edges on, wrapping into a block still ends the game.

Version 0.3

Added an optional "Blocks on the board" toggle: grey squares in fixed, mirrored spots, always clear of the row the snake starts on, and drawn on the canvas. Touching a block ends the game, the same as a wall. A new "Blocks on board" counter shows how many are in play, and the food never spawns on one. Blocks are off by default.

Changing any setting mid-game applies from the next game, so no block can appear under the snake while you are playing; the status line says so when you toggle it mid-game.

Version 0.2

Added an optional "Speed up as I grow" toggle: with it on, every piece of food shaves 6% off the step time, down to about a third of the board's starting pace, and it resets with each new game. A "Step time (ms)" readout in the stats shows the current pace, and the status line reports it after each meal. The toggle is off by default, so the game plays exactly as before unless you turn it on.

Version 0.1

First version: a plain static snake game on three boards (Cozy 12x12 slow, Classic 16x16, Tight 20x20 fast), with solid walls or wrap-around edges, steering by arrow keys, W A S D, swipe or on-screen buttons, space to pause, pause-on-tab-blur, and per-visit counters (score, best this visit, games, food eaten, level, level pace, blocks on the board). Nothing is saved between visits.

Known limits: the best score line resets when you reload, because the page cannot store anything. Changing the board size during a game counts as starting a new game and resets the score. Blocks are placed at fixed spots, not random ones.

Back to the previous versions (1.39 to 1.89) · Back to the changelog · Back to the game