Coyote time: the jump fix players never notice
To show the difference, we started from our double-jump game with coyote time switched off. Claude Code turned it on and tested it. Play both versions and see what we measured.

Before you start
- The platformer from the double jump tutorial, or any Phaser platformer of your own.
- Claude Code, started in the game's folder.
- The skill at the end of this page, in the folder's .claude/skills/platformer-feel/. Then type the prompt below.
What we asked“Add coyote time to the jump, so I can still jump for a moment after running off a ledge. Test it.”
What happened
- Used the platformer-feel skill
- Read the skill's notes on coyote time and testing
- Read index.html
- Checked that Playwright and headless Chrome work
- Changed COYOTE_TIME from 0 to 100
- Wrote tests/coyote.test.js
- First runs: the test pressed jump before the ledge, then timed out with coyote time off
- Fixed the test twice
- Ran it 3 times with 100 ms and with 0 ms: all checks pass, no console errors
To show the difference, we started from our double-jump game with coyote time switched off.
Coyote time lets you jump for a short moment after you run off a ledge. You press jump when your eyes say you’re at the edge, and the game gives you that jump even though the square has already left the ground.
In the demo below, the tinted strip past the edge is the ground coyote time adds: 0.10 s at the game’s run speed of 260 px/s, or 26 px.
An explainer we built for this page. Press jump a moment after the square leaves the edge, with coyote time on and then off; slow motion makes it easier to see. The two games below are the real ones from the Claude Code session.
The game from the double jump tutorial had coyote time from the start, at 90 ms. We set it to 0 and changed nothing else. Standing jumps still worked, at the same 107 px. Then we asked Claude Code, with the platformer-feel skill, to add coyote time.
To try it, run off the edge of a platform and press jump a moment late.
Before: coyote time off. A late press only gets the weaker air jump, and your double jump is gone.
After: Claude's version. The same press is a full ground jump, and you can still double jump. For both games we only added the start screen and loaded Phaser from this site.
We measured both versions ourselves with Playwright in headless Chrome. The square stands on the lowest platform, runs right off its edge, and we press jump a set time after the last frame it was on the ground. We ran each case three times and got the same result every time.
| Press after leaving the ledge | Before | After |
|---|---|---|
| 0.05 s | Air jump (500 px/s up), double jump used up | Ground jump (560 px/s up), double jump kept |
| 0.20 s | Air jump, double jump used up | Air jump, double jump used up |
Claude picked COYOTE_TIME = 100 ms, the skill’s default of 0.10 s. The skill gives 0.06 to 0.15 s as the good range and says longer feels floaty. Claude kept milliseconds because every other timer in the file uses them, though the skill asks for seconds. The rest of the coyote code was already in the game: the timer runs on real time, every jump clears it, and a coyote jump counts as a ground jump. So the change was one number.
Get the skill. It also covers jump buffering and variable jump height.
Recorded with a clean Claude Code: no personal skills, plugins or MCP servers, just the skill on this page.
The skill that made it work
It tells Claude what coyote time should and shouldn't allow, and to test it with scripted presses, once with it on and once with it off.
- Keep every movement number as a named constant at the top of the player code, in seconds and pixels per second (not frames), so the user can tune them.
- Add the three core helpers unless the user says not to: coyote time (a short moment to still jump after running off a ledge), jump buffering (a jump pressed just before landing still happens on landing) and variable jump height (tap for a small hop, hold for a full jump). Read each helper's reference file before you build it.
- Test with scripted input, not by reading the code. Each helper needs one test that fails without it and passes with it.
- When you finish, list each helper with its number and what the test showed, in plain words.
Save it as .claude/skills/platformer-feel/SKILL.md in your project.
Was this useful?
Thanks, we read every message.

