fuzzyworld

nordic-skating / mistral-medium-35-littlejs / files / PLAN.md

Branch mistral-medium-35-littlejs · default branch · all branches

PLAN.md

20.9 KB · history · blame

Plan

What is left to do on Nordic Skating, in the order it is meant to be picked up, with what has been decided about each item and what is still open. The README says what the app does today; this says what it does not do yet.

Last brought up to date 2026-10-09.

Where things stand

Built: the endless lake, autopilot and steering, the synthesized sound, ice whose thickness can be seen and heard, forks, narrow passes and open sea, the sound button, the About box and the link to the source. Falling through is written and switched off.

Postponed until the items below are ironed out: game controller, then multiplayer (the last step of the original six).

Next

1. Motion — built, waiting to be felt

The problem was that each stride swung the view from side to side and tilted it, the speed never changed, and steering slid the skater sideways at a fixed rate.

What was built (2026-10-09), all four changes proposed:

  1. A speed that breathes with the stride. A push adds about 1 m/s over half a second; drag takes it back through the glide. Around 7 m/s.
  2. Steering that turns the skater. The skater has a place, a direction and a speed. Input sets how fast the direction changes, up to a 16 m circle, with a third of a second to lean into it. Paths are arcs by construction.
  3. An autopilot that carves. It aims 18 m ahead on a line that wanders up to 6 m either side of the middle, and steers with the same limits as a person.
  4. A head that stays level. The side-to-side sway and tilt are gone. What is left is a 3 cm rise on each push and a lean into real turns of at most 3.5°.

Changed on Pavel's report (2026-10-10): the autopilot fought the skater. It had a line fixed in advance, and after any steering it went back to it: steer left out of a right-hand curve, let go, and it turned right again. Now the line is a plan that steering rewrites. Let go, and the line is centred where the skater has got to and its next swing begins the way they are going. Nothing eases back to the middle any more, and where the skater is, not the fork's preference, decides a fork for a skater who does not steer at it.

Decided by Pavel. - The whole lake is safe: falling is suspended, and thickness decides only the sound. - Impossible ice is allowed: thinner than could hold anyone, down to 8 mm, never cracks. - More complex paths are wanted later, so nothing here may rule them out.

Kept open on purpose. The skater is a point with a direction on a flat sheet, not an offset along a one-way line, so turning round is already something the model can do. One rule stops it: the skater may point at most 50° off the line of the channel (MAX_HEADING in src/skater.ts). What would still need doing for a skater going backwards: forks are entered by passing a distance and are not left by passing back over it, and only 100 m of shore is kept behind the skater.

Still to judge, by feel. - Are the push and the glide strong enough to notice, or too strong? - Is the carving too wide, too tight, or about right? Should it stop in a narrow pass? - Is the turning limit right for a finger on a phone? - Should the stride length follow the speed, or thin ice or a pass slow the skater?

2. Screen wake lock — built

Asked for when the page opens, each time it comes back from being hidden, and at the first touch, since some browsers give it only then. Where the browser has no such thing it is silently skipped. Not checked on a phone: leave it on autopilot and see whether the screen stays on.

2a. Settings, times of day, and a different lake every visit — built

Asked for by Pavel on 2026-10-09, with the reason: one of the main things about this is to be reloading the page and finding yourself somewhere slightly different.

What was built. - A settings box, opened from the top left, at the foot of the screen so that what it changes can be seen changing behind it. It is the control panel new options go in. - Impossible ice is a setting, off by default. - Four times of day: day, dusk, night under the Milky Way, and the aurora. The setting starts on "Surprise me", which is whichever the lake comes with. - Every visit is another lake: a number from 1 to 999,999 picked on opening, which decides the water, the ice, the trees and the time of day. ?seed= asks for one by number, so a lake can still be come back to, linked to, photographed, and, later, shared between players. - Randomize, a button beside Settings (and the R key): another lake at once, without a reload, and put in the browser's history so that Back returns to the lake left. A reload still gets a new lake; which lake a page shows is kept with its place in the history, not in the address. - The Source link left the top bar to make room; it is in the About box.

Still to judge. - Are the Milky Way and the aurora right? The aurora moves, slowly; a still picture cannot show whether it moves well. - Is night too dark to read the ice by, on a phone outdoors? - Is "slightly different" different enough? Only the lake and the time vary now.

Ideas for more variety between lakes, none started: a moon and its phase, falling snow, mist that thins and thickens, wind in the sound, dawn, how wooded the banks are, how hilly, the colour of the aurora, how fast it moves.

Ideas for more settings, none started: speed, how far the autopilot carves, how long the strides are, how much the ice cracks, falling through, the haze.

2b. More in the scene — partly built

Pavel, 2026-10-10: more details in the scene are welcome, and named these.

Built, waiting to be looked at. - In the sky: shooting stars at night; a comet over one night lake in three; an aeroplane and its trail over two day or dusk lakes in three. - Weather: clear, snow, or a blizzard, as a setting that starts on "Surprise me". Falling snow that streams past the skater, wind from a direction of the lake's own, the wind's sound, cloud over the sky, and less distance to see through.

Still to judge. Is a blizzard thick enough, and is 200 m too little to see by? Is the wind too loud over the ice? Are shooting stars too frequent? The aeroplane is silent; should it be?

Built since, waiting to be looked at (2026-10-10). - Cracks made by the skater, and skate tracks. The marks are drawn on a picture of the hundred metres square of ice round the skater. Tracks and the scratch of each push are always left; cracks are drawn where they are heard, and a push on cracking ice starts more. Seen working as a drawing; the cracks have not been seen in the app itself, only the tracks. - A long island in the middle of the lake: see "Channels that part and join again".

Improved on Pavel's look at them (2026-10-10), waiting to be looked at again. - The cracks the skater makes were too thick and pixelated. They were drawn into a picture with ten pixels to the metre. They are now lines of their own, a pixel wide at any distance, and a crack runs out from its middle at 28 m/s instead of appearing whole. Tracks and push scratches are drawn the same way. - The cracks the ice already has were not realistic: thirty jagged lines at random. They are now a network made the way ice cracks: a few long, nearly straight runs, and later cracks that leave an earlier one at a wide angle and stop at the next. - Still not done: the picture of the ice's own cracks repeats every 32 m, and they are painted, so close to they are softer than the hairlines the skater makes.

Still to judge. Are the tracks too faint against the ice's own cracks, which are the same colour? Should they fade with time?

Further ideas, none started: a moon and its phase; mist that thins and thickens; dawn; how wooded and how hilly the banks are; the colour of the aurora; birds; a far shore with the lights of a house at night; satellites; a bare rock, as in the film.

Channels that part and join again — built, waiting to be tried

Pavel's question: is this something like a long island of grass in the middle of a lake or river? Yes, and that is what was built (2026-10-10): a low bank of reeds 180 to 480 m long, in the middle of a channel, with water both sides that is one water again beyond it.

It turned out simpler than a fork whose channels rejoin. The island is a thing standing in one channel, like an islet but long: the channel is made wider by the island's width where it stands, and the skater has the water on whichever side of it they are on. No channel is left or joined.

Still to judge. Is one every 5 km right? Do the reeds read as an island from a distance, or as a smudge? Should some islands be wooded, like the ones at forks?

2c. Pace — built, waiting to be felt

Asked for by Pavel on 2026-10-10: a peaceful meander, something faster, and something ridiculously fast, as if training for the Olympics, with whatever between makes sense.

What was built. Five paces: Meander (13 km/h), Cruise (25, as it was), Brisk (36), Racing (45) and Olympic (54). A button at the bottom right steps through them; so do the up and down keys and a controller; and they are in Settings. Strides shorten and quicken with pace, the skater crouches, the view widens, the air rushes, the turning circle grows, and the autopilot looks and steers further ahead.

Still to judge. - The names, which Pavel was not sure of. - Is Olympic fast enough to be ridiculous? It is a real speed skater's pace. There is room above it, though the lake's bends and narrows were made for 25 km/h. - At a racing pace a skater is kept well back from the shores, so in ordinary water there is not much steering to be done. Too restrictive? - Should a pass, a fork or a bed of islets slow a racer down? - Does the wider view at speed feel fast, or only odd?

3. Installable app — built, not yet tried on a phone

A web manifest and a service worker, made by vite-plugin-pwa. Installed, the app has its own icon, opens full screen with no browser bars, and works with no network: the whole of it is kept on the phone, and nothing is fetched after that. A new version is taken up the next time it is opened.

Checked in a desktop browser: with the network off and the server stopped, the app opens, opens a lake by number, and Randomize works. Not checked: installing it on a phone, on either Android or an iPhone.

The icons are supplied by Pavel: a skate for the app and the pace button, and a speaker and a crossed-out speaker for the sound button, all by Icongeek26, from Flaticon, credited in the About box and the README as the licence requires. The Tilt button has a phone in a hand for on and a phone by itself for off, also supplied by Pavel; to confirm: whether those two are by Icongeek26 as well. The artwork is assets/skate-shoes.png, and npm run icons makes the home-screen and tab icons from it, pale on the colour of black ice.

Open. It opens in whichever orientation the phone is held. Should it lock to one?

4. Islets to skate round, and turning right round — built, waiting to be tried

Pavel's idea. In the film the skater does a loop around a patch of grass and then carries on. Add that, as a kind of fork or obstacle. More complex paths are welcome.

What the film shows (looked at 2026-10-09): from 2:12 to 2:35, a skater weaving among small tufted islets of reeds standing in the ice, several to a cluster. Also a bare rock in the lake at 1:52, and at 0:35 ice covered in looping white skate tracks. And at 1:17 the ice is measured on camera: 45 mm. The sound alone gives 41 mm.

What was built. - Islets: reeds on humps of frozen ground, 5 to 15 m across, in beds. The autopilot steers round them; a skater steering at one is turned aside at the last moment, and nobody can get onto one. - Turning right round. The limit on how far off the lake's line the skater could point is gone from open water. Held over, the skater circles, 16 m in radius, and can skate back up the lake; let go and the autopilot turns them down it again. The land, the ice's thickness and the view all follow whichever way the skater faces. - A touch chooses at a fork. With steering now turning, holding it over until the fork would be a circle, so a touch one way within 200 m of a fork is taken as asking for that side.

Still to judge, by feel. - Is circling an islet with a finger possible, and pleasant? The circle is 16 m in radius whatever the islet's size. - Is it too easy to turn round by accident? Holding a steer for seven seconds does it. - Are there too many islets, or too few? Do the reeds look like reeds?

Not done, and wanted or possible. - Forks of three. Channels that part and join again: see the section of that name. - A bare rock, as in the film. A drawing of the skater's own tracks on the ice, as in the film: with loops now possible, they would show them. - Forks cannot be gone back through: a skater who turns back above a fork stays in the channel they chose, which is the right water but would matter if tracks were drawn.

5. Check the chirps against the film — tried, and the film cannot say

Pavel's request. The falling "pew" of a distant crack is the one part of the sound that comes from the model alone.

What was tried (2026-10-09), three ways, the last kept in tools/analyse-video.mjs: 1. Follow the loudest frequency down after each burst and fit it: 3 of 124 fitted. 2. Split each burst into bands from 1 to 7 kHz and time each band's arrival, to test the one thing about a chirp that does not depend on where the crack was: that arrival times fall as frequency to the power -0.6. 3 of 203 bursts had any spread. 3. The same in the band just above the note, where the chirps' sound is: 3 of 122, and those three disagree with each other.

Finding. In nearly every burst every band arrives within 30 ms of every other. The likely reason is that the microphones were close to the skater: a sound from close by has had no distance to spread out over. The film gives the note (740 Hz, so 4.1 cm) and not the chirp. Not looked at: the reassigned spectrogram, which sharpens a ridge but cannot put spread into a sound that has none.

What would settle it, if it matters: a recording made some hundreds of metres from the cracks, with the ice's thickness known. The paper's own data are of that kind.

5a. Tilt to steer — built, not tried on a phone

Asked for by Pavel on 2026-10-10. A setting, off by default, shown only on phones and tablets: lean the phone like a wheel to steer, level to let the skater skate itself. Dragging still works with it on.

Tried by Pavel on a phone, 2026-10-10: it works. Turning it on in Settings was cumbersome, so there is now a Tilt button at the bottom left of the screen, hidden where there is nothing to tilt, and the setting is gone. Tilt, the rotation lock and full screen in a browser tab all confirmed working by Pavel on a phone.

Also asked for: the screen should not turn with the phone while tilt is on. Built with the browser's own rotation lock, which Android gives to an installed app or a page in full screen (so a tab goes full screen while tilt is on) and an iPhone does not give to a web page at all. Not tried on a phone.

Checked in a desktop browser pretending to be a phone, with made-up tilt: the setting shows, is remembered, and leaning turns the skater. Not checked: a real phone, where the things to judge are whether 4° of rest and 28° for full steering are right, whether leaning is the right way round in each orientation, and whether an iPhone's request for leave appears and works. It needs HTTPS, so it can only be tried on the live site.

Open. There is no way to set which lean counts as level: it is level. Someone lying on their side cannot use it.

6. Phone controls

Waiting on Pavel, who is still trying the touch steering and will send feedback. Nothing to do until then. Steering and choosing a fork have only been checked with the keyboard, never with a finger. Item 1 will change how steering feels, so feedback given before it lands may need giving again.

Later

Competitive mode

Decided: low stakes for now. The aim at present is something fun and relaxing: nobody falls through and nothing is scored. Falling is written and switched off (RULES in src/skater.ts), and would be part of this mode. A competitive mode for people who want one is a maybe, as an option beside the relaxed one and never instead of it. Ideas: time spent on singing ice, distance without falling, a set course against the clock.

A figure, and a view from behind them

Asked about by Pavel on 2026-10-10: what would it take to add a figure and make this a third-person game? Not started, and not decided: Pavel is thinking it over. In short: the lake needs nothing, the skater already knows everything a figure would act out, and the work is the figure itself.

What is there already. The skater has a place, a direction, a speed, a rate of turn, and a stride with the moment of each push in it (src/skater.ts): everything a figure's pose is made from. The world is drawn round the skater and would be drawn round a camera a few metres behind them without change.

What it needs. 1. A camera that follows: some metres behind and above, easing after the skater rather than bolted to them, and kept out of the banks, trees and islets, which in a pass 5 m to a side is most of the problem. And a way to choose the view. 2. The figure. There are no models in this project and no way of loading any. Either one is made here of simple shapes, in keeping with trees that are cones, and moved by rule from the stride (push leg out and back, the other gliding, arms swinging, a lean into turns); or a made model with made animations is brought in, which means a loader, a megabyte or more to download and keep offline, a licence to honour, and finding a skating animation, which are rare. The first is the recommendation. 3. What a figure shows up. A shadow under it, or it floats. Tracks from each skate in turn, not one line down the middle. Something to see it by at night. A faint reflection in black ice would be cheap and would look like the film.

The risk is the figure's movement: an awkward skater is worse than none. The view from the eyes should stay, as a choice.

It is also most of multiplayer. Other players have to be drawn as something, and this is the something.

How it would be done, if it is: in four passes, each something to look at. 1. The camera that follows, a stand-in shape for the figure, and the choice of view. 2. The figure, and its stride. 3. Its shadow, its reflection, and tracks from each skate. 4. Tuning, which for the figure's movement will take some going back and forth.

About as much work as the long islands and the tracks on the ice together.

To decide first. - Made here of simple shapes (recommended), or a model brought in? - Which view the app opens in, and how the other is chosen: a button, a setting, both? - One figure, or a choice of them, which multiplayer would want anyway?

Game controller — built, not tried with one

Either stick or the direction buttons steer; Y or triangle goes to another lake; X or square turns the sound on and off (2026-10-10). The stick's mapping is tested; no controller has been connected to it. To judge with one in hand: the 15% rest in the middle of the stick, and whether the buttons are the right ones.

Multiplayer

Postponed. The lake is the same for everyone given the same seed, so players need only share a seed and send each other where they are. ~/code/touch and ~/code/cat-playground do this peer to peer with peerjs, with no server.

Settled

Raised, answered, and needing nothing more.

Item Outcome
Repository was private, so the in-app links led to a sign-in page Made public by Pavel, 2026-10-09
No licence MIT, in LICENSE
The credit for the paper the sound's physics is from was partly from memory Checked against the journal's page on 2026-10-09: authors, title, volume, pages, DOI and CC BY 4.0 licence are all as the README has them
Forks are two-way, not "multiple" Fine as they are for now; more complex forks are part of item 4
Thick ice does not sound "bad"; the bad ice is the thin end Fine as it is
Frame rate on a phone, including at sea Good, by Pavel's testing
Falling through has no cost and nothing is scored Falling is switched off altogether for now (2026-10-09); see Competitive mode
Only the middle 3 m of a channel was guaranteed sound ice, and the autopilot was to wander Gone with falling: the strip of sound ice was removed. Turning falling back on needs a safe line for the autopilot first
Source
1# Plan
2
3What is left to do on Nordic Skating, in the order it is meant to be picked up, with what
4has been decided about each item and what is still open. The README says what the app
5does today; this says what it does not do yet.
6
7Last brought up to date 2026-10-09.
8
9## Where things stand
10
11Built: the endless lake, autopilot and steering, the synthesized sound, ice whose
12thickness can be seen and heard, forks, narrow passes and open sea, the sound button,
13the About box and the link to the source. Falling through is written and switched off.
14
15Postponed until the items below are ironed out: **game controller**, then
16**multiplayer** (the last step of the original six).
17
18## Next
19
20### 1. Motion — built, waiting to be felt
21
22**The problem was** that each stride swung the view from side to side and tilted it, the
23speed never changed, and steering slid the skater sideways at a fixed rate.
24
25**What was built** (2026-10-09), all four changes proposed:
26
271. **A speed that breathes with the stride.** A push adds about 1 m/s over half a
28 second; drag takes it back through the glide. Around 7 m/s.
292. **Steering that turns the skater.** The skater has a place, a direction and a speed.
30 Input sets how fast the direction changes, up to a 16 m circle, with a third of a
31 second to lean into it. Paths are arcs by construction.
323. **An autopilot that carves.** It aims 18 m ahead on a line that wanders up to 6 m
33 either side of the middle, and steers with the same limits as a person.
344. **A head that stays level.** The side-to-side sway and tilt are gone. What is left is
35 a 3 cm rise on each push and a lean into real turns of at most 3.5°.
36
37**Changed on Pavel's report** (2026-10-10): the autopilot fought the skater. It had a
38line fixed in advance, and after any steering it went back to it: steer left out of a
39right-hand curve, let go, and it turned right again. Now the line is a plan that
40steering rewrites. Let go, and the line is centred where the skater has got to and its
41next swing begins the way they are going. Nothing eases back to the middle any more,
42and where the skater is, not the fork's preference, decides a fork for a skater who
43does not steer at it.
44
45**Decided by Pavel.**
46- The whole lake is safe: falling is suspended, and thickness decides only the sound.
47- Impossible ice is allowed: thinner than could hold anyone, down to 8 mm, never cracks.
48- More complex paths are wanted later, so nothing here may rule them out.
49
50**Kept open on purpose.** The skater is a point with a direction on a flat sheet, not an
51offset along a one-way line, so turning round is already something the model can do.
52One rule stops it: the skater may point at most 50° off the line of the channel
53(`MAX_HEADING` in `src/skater.ts`). What would still need doing for a skater going
54backwards: forks are entered by passing a distance and are not left by passing back
55over it, and only 100 m of shore is kept behind the skater.
56
57**Still to judge, by feel.**
58- Are the push and the glide strong enough to notice, or too strong?
59- Is the carving too wide, too tight, or about right? Should it stop in a narrow pass?
60- Is the turning limit right for a finger on a phone?
61- Should the stride length follow the speed, or thin ice or a pass slow the skater?
62
63### 2. Screen wake lock — built
64
65Asked for when the page opens, each time it comes back from being hidden, and at the
66first touch, since some browsers give it only then. Where the browser has no such thing
67it is silently skipped. Not checked on a phone: leave it on autopilot and see whether
68the screen stays on.
69
70### 2a. Settings, times of day, and a different lake every visit — built
71
72Asked for by Pavel on 2026-10-09, with the reason: one of the main things about this is
73to be reloading the page and finding yourself somewhere slightly different.
74
75**What was built.**
76- **A settings box**, opened from the top left, at the foot of the screen so that what
77 it changes can be seen changing behind it. It is the control panel new options go in.
78- **Impossible ice is a setting, off by default.**
79- **Four times of day**: day, dusk, night under the Milky Way, and the aurora. The
80 setting starts on "Surprise me", which is whichever the lake comes with.
81- **Every visit is another lake**: a number from 1 to 999,999 picked on opening, which
82 decides the water, the ice, the trees and the time of day. `?seed=` asks for one by
83 number, so a lake can still be come back to, linked to, photographed, and, later,
84 shared between players.
85- **Randomize**, a button beside Settings (and the R key): another lake at once,
86 without a reload, and put in the browser's history so that Back returns to the lake
87 left. A reload still gets a new lake; which lake a page shows is kept with its place
88 in the history, not in the address.
89- The Source link left the top bar to make room; it is in the About box.
90
91**Still to judge.**
92- Are the Milky Way and the aurora right? The aurora moves, slowly; a still picture
93 cannot show whether it moves well.
94- Is night too dark to read the ice by, on a phone outdoors?
95- Is "slightly different" different enough? Only the lake and the time vary now.
96
97**Ideas for more variety between lakes**, none started: a moon and its phase, falling
98snow, mist that thins and thickens, wind in the sound, dawn, how wooded the banks are,
99how hilly, the colour of the aurora, how fast it moves.
100
101**Ideas for more settings**, none started: speed, how far the autopilot carves, how long
102the strides are, how much the ice cracks, falling through, the haze.
103
104### 2b. More in the scene — partly built
105
106Pavel, 2026-10-10: more details in the scene are welcome, and named these.
107
108**Built, waiting to be looked at.**
109- **In the sky**: shooting stars at night; a comet over one night lake in three; an
110 aeroplane and its trail over two day or dusk lakes in three.
111- **Weather**: clear, snow, or a blizzard, as a setting that starts on "Surprise me".
112 Falling snow that streams past the skater, wind from a direction of the lake's own,
113 the wind's sound, cloud over the sky, and less distance to see through.
114
115**Still to judge.** Is a blizzard thick enough, and is 200 m too little to see by? Is
116the wind too loud over the ice? Are shooting stars too frequent? The aeroplane is
117silent; should it be?
118
119**Built since, waiting to be looked at** (2026-10-10).
120- **Cracks made by the skater, and skate tracks.** The marks are drawn on a picture of
121 the hundred metres square of ice round the skater. Tracks and the scratch of each
122 push are always left; cracks are drawn where they are heard, and a push on cracking
123 ice starts more. Seen working as a drawing; the cracks have not been seen in the app
124 itself, only the tracks.
125- **A long island in the middle of the lake**: see "Channels that part and join again".
126
127**Improved on Pavel's look at them** (2026-10-10), waiting to be looked at again.
128- **The cracks the skater makes were too thick and pixelated.** They were drawn into a
129 picture with ten pixels to the metre. They are now lines of their own, a pixel wide at
130 any distance, and a crack runs out from its middle at 28 m/s instead of appearing whole.
131 Tracks and push scratches are drawn the same way.
132- **The cracks the ice already has were not realistic**: thirty jagged lines at random.
133 They are now a network made the way ice cracks: a few long, nearly straight runs, and
134 later cracks that leave an earlier one at a wide angle and stop at the next.
135- Still not done: the picture of the ice's own cracks repeats every 32 m, and they are
136 painted, so close to they are softer than the hairlines the skater makes.
137
138**Still to judge.** Are the tracks too faint against the ice's own cracks, which are the
139same colour? Should they fade with time?
140
141- **Snow drifts** (2026-10-10): snow lying on the ice in streaks down the lake's wind,
142 under falling snow and more in a blizzard. A drift slows the skater to about half
143 speed and takes the ring out of the ice: the "bad ice" of the first description of
144 this app. Still to judge: is half speed too much of a penalty for a relaxing skate,
145 and are there too many drifts in a blizzard to find a way between?
146
147**Further ideas, none started**: a moon and its phase; mist that thins and thickens;
148dawn; how wooded and how hilly the banks are; the colour of the aurora; birds; a far
149shore with the lights of a house at night; satellites; a bare rock, as in the film.
150
151### Channels that part and join again — built, waiting to be tried
152
153**Pavel's question**: is this something like a long island of grass in the middle of a
154lake or river? **Yes**, and that is what was built (2026-10-10): a low bank of reeds
155180 to 480 m long, in the middle of a channel, with water both sides that is one water
156again beyond it.
157
158It turned out simpler than a fork whose channels rejoin. The island is a thing standing
159in one channel, like an islet but long: the channel is made wider by the island's width
160where it stands, and the skater has the water on whichever side of it they are on. No
161channel is left or joined.
162
163**Still to judge.** Is one every 5 km right? Do the reeds read as an island from a
164distance, or as a smudge? Should some islands be wooded, like the ones at forks?
165
166### 2c. Pace — built, waiting to be felt
167
168Asked for by Pavel on 2026-10-10: a peaceful meander, something faster, and something
169ridiculously fast, as if training for the Olympics, with whatever between makes sense.
170
171**What was built.** Five paces: Meander (13 km/h), Cruise (25, as it was), Brisk (36),
172Racing (45) and Olympic (54). A button at the bottom right steps through them; so do
173the up and down keys and a controller; and they are in Settings. Strides shorten and
174quicken with pace, the skater crouches, the view widens, the air rushes, the turning
175circle grows, and the autopilot looks and steers further ahead.
176
177**Still to judge.**
178- The names, which Pavel was not sure of.
179- Is Olympic fast enough to be ridiculous? It is a real speed skater's pace. There is
180 room above it, though the lake's bends and narrows were made for 25 km/h.
181- At a racing pace a skater is kept well back from the shores, so in ordinary water
182 there is not much steering to be done. Too restrictive?
183- Should a pass, a fork or a bed of islets slow a racer down?
184- Does the wider view at speed feel fast, or only odd?
185
186### 3. Installable app — built, not yet tried on a phone
187
188A web manifest and a service worker, made by `vite-plugin-pwa`. Installed, the app has
189its own icon, opens full screen with no browser bars, and works with no network: the
190whole of it is kept on the phone, and nothing is fetched after that. A new version is
191taken up the next time it is opened.
192
193Checked in a desktop browser: with the network off and the server stopped, the app
194opens, opens a lake by number, and Randomize works. Not checked: installing it on a
195phone, on either Android or an iPhone.
196
197**The icons** are supplied by Pavel: a skate for the app and the pace button, and a
198speaker and a crossed-out speaker for the sound button, all by Icongeek26, from
199Flaticon, credited in the About box and the README as the licence requires. The Tilt
200button has a phone in a hand for on and a phone by itself for off, also supplied by
201Pavel; **to confirm: whether those two are by Icongeek26 as well**. The artwork is
202`assets/skate-shoes.png`, and `npm run icons` makes the home-screen and tab icons from
203it, pale on the colour of black ice.
204
205**Open.** It opens in whichever orientation the phone is held. Should it lock to one?
206
207### 4. Islets to skate round, and turning right round — built, waiting to be tried
208
209**Pavel's idea.** In the film the skater does a loop around a patch of grass and then
210carries on. Add that, as a kind of fork or obstacle. More complex paths are welcome.
211
212**What the film shows** (looked at 2026-10-09): from 2:12 to 2:35, a skater weaving
213among small tufted islets of reeds standing in the ice, several to a cluster. Also a
214bare rock in the lake at 1:52, and at 0:35 ice covered in looping white skate tracks.
215And at 1:17 the ice is measured on camera: 45 mm. The sound alone gives 41 mm.
216
217**What was built.**
218- **Islets**: reeds on humps of frozen ground, 5 to 15 m across, in beds. The autopilot
219 steers round them; a skater steering at one is turned aside at the last moment, and
220 nobody can get onto one.
221- **Turning right round.** The limit on how far off the lake's line the skater could
222 point is gone from open water. Held over, the skater circles, 16 m in radius, and can
223 skate back up the lake; let go and the autopilot turns them down it again. The land,
224 the ice's thickness and the view all follow whichever way the skater faces.
225- **A touch chooses at a fork.** With steering now turning, holding it over until the
226 fork would be a circle, so a touch one way within 200 m of a fork is taken as asking
227 for that side.
228
229**Still to judge, by feel.**
230- Is circling an islet with a finger possible, and pleasant? The circle is 16 m in
231 radius whatever the islet's size.
232- Is it too easy to turn round by accident? Holding a steer for seven seconds does it.
233- Are there too many islets, or too few? Do the reeds look like reeds?
234
235**Not done, and wanted or possible.**
236- Forks of three. Channels that part and join again: see the section of that name.
237- A bare rock, as in the film. A drawing of the skater's own tracks on the ice, as in
238 the film: with loops now possible, they would show them.
239- Forks cannot be gone back through: a skater who turns back above a fork stays in the
240 channel they chose, which is the right water but would matter if tracks were drawn.
241
242### 5. Check the chirps against the film — tried, and the film cannot say
243
244**Pavel's request.** The falling "pew" of a distant crack is the one part of the sound
245that comes from the model alone.
246
247**What was tried** (2026-10-09), three ways, the last kept in `tools/analyse-video.mjs`:
2481. Follow the loudest frequency down after each burst and fit it: 3 of 124 fitted.
2492. Split each burst into bands from 1 to 7 kHz and time each band's arrival, to test
250 the one thing about a chirp that does not depend on where the crack was: that
251 arrival times fall as frequency to the power -0.6. 3 of 203 bursts had any spread.
2523. The same in the band just above the note, where the chirps' sound is: 3 of 122, and
253 those three disagree with each other.
254
255**Finding.** In nearly every burst every band arrives within 30 ms of every other. The
256likely reason is that the microphones were close to the skater: a sound from close by
257has had no distance to spread out over. The film gives the note (740 Hz, so 4.1 cm) and
258not the chirp. Not looked at: the reassigned spectrogram, which sharpens a ridge but
259cannot put spread into a sound that has none.
260
261**What would settle it**, if it matters: a recording made some hundreds of metres from
262the cracks, with the ice's thickness known. The paper's own data are of that kind.
263
264### 5a. Tilt to steer — built, not tried on a phone
265
266Asked for by Pavel on 2026-10-10. A setting, off by default, shown only on phones and
267tablets: lean the phone like a wheel to steer, level to let the skater skate itself.
268Dragging still works with it on.
269
270Tried by Pavel on a phone, 2026-10-10: it works. Turning it on in Settings was
271cumbersome, so there is now a Tilt button at the bottom left of the screen, hidden
272where there is nothing to tilt, and the setting is gone. Tilt, the rotation lock and
273full screen in a browser tab all confirmed working by Pavel on a phone.
274
275Also asked for: the screen should not turn with the phone while tilt is on. Built with
276the browser's own rotation lock, which Android gives to an installed app or a page in
277full screen (so a tab goes full screen while tilt is on) and an iPhone does not give to
278a web page at all. Not tried on a phone.
279
280Checked in a desktop browser pretending to be a phone, with made-up tilt: the setting
281shows, is remembered, and leaning turns the skater. Not checked: a real phone, where
282the things to judge are whether 4° of rest and 28° for full steering are right, whether
283leaning is the right way round in each orientation, and whether an iPhone's request for
284leave appears and works. It needs HTTPS, so it can only be tried on the live site.
285
286**Open.** There is no way to set which lean counts as level: it is level. Someone lying
287on their side cannot use it.
288
289### 6. Phone controls
290
291**Waiting on Pavel**, who is still trying the touch steering and will send feedback.
292Nothing to do until then. Steering and choosing a fork have only been checked with the
293keyboard, never with a finger. Item 1 will change how steering feels, so feedback given
294before it lands may need giving again.
295
296## Later
297
298### Competitive mode
299
300**Decided: low stakes for now.** The aim at present is something fun and relaxing: nobody
301falls through and nothing is scored. Falling is written and switched off (`RULES` in
302`src/skater.ts`), and would be part of this mode. A competitive mode for people who want
303one is a maybe, as an option beside the relaxed one and never instead of it. Ideas: time
304spent on singing ice, distance without falling, a set course against the clock.
305
306### A figure, and a view from behind them
307
308Asked about by Pavel on 2026-10-10: what would it take to add a figure and make this a
309third-person game? **Not started, and not decided: Pavel is thinking it over.** In short: the lake needs nothing, the skater already
310knows everything a figure would act out, and the work is the figure itself.
311
312**What is there already.** The skater has a place, a direction, a speed, a rate of turn,
313and a stride with the moment of each push in it (`src/skater.ts`): everything a figure's
314pose is made from. The world is drawn round the skater and would be drawn round a camera
315a few metres behind them without change.
316
317**What it needs.**
3181. **A camera that follows**: some metres behind and above, easing after the skater
319 rather than bolted to them, and kept out of the banks, trees and islets, which in a
320 pass 5 m to a side is most of the problem. And a way to choose the view.
3212. **The figure.** There are no models in this project and no way of loading any. Either
322 one is made here of simple shapes, in keeping with trees that are cones, and moved by
323 rule from the stride (push leg out and back, the other gliding, arms swinging, a lean
324 into turns); or a made model with made animations is brought in, which means a loader,
325 a megabyte or more to download and keep offline, a licence to honour, and finding a
326 skating animation, which are rare. The first is the recommendation.
3273. **What a figure shows up.** A shadow under it, or it floats. Tracks from each skate in
328 turn, not one line down the middle. Something to see it by at night. A faint
329 reflection in black ice would be cheap and would look like the film.
330
331**The risk** is the figure's movement: an awkward skater is worse than none. The view
332from the eyes should stay, as a choice.
333
334**It is also most of multiplayer.** Other players have to be drawn as something, and
335this is the something.
336
337**How it would be done, if it is**: in four passes, each something to look at.
3381. The camera that follows, a stand-in shape for the figure, and the choice of view.
3392. The figure, and its stride.
3403. Its shadow, its reflection, and tracks from each skate.
3414. Tuning, which for the figure's movement will take some going back and forth.
342
343About as much work as the long islands and the tracks on the ice together.
344
345**To decide first.**
346- Made here of simple shapes (recommended), or a model brought in?
347- Which view the app opens in, and how the other is chosen: a button, a setting, both?
348- One figure, or a choice of them, which multiplayer would want anyway?
349
350### Game controller — built, not tried with one
351
352Either stick or the direction buttons steer; Y or triangle goes to another lake; X or
353square turns the sound on and off (2026-10-10). The stick's mapping is tested; no
354controller has been connected to it. To judge with one in hand: the 15% rest in the
355middle of the stick, and whether the buttons are the right ones.
356
357### Multiplayer
358
359Postponed. The lake is the same for everyone given the same seed, so players need only
360share a seed and send each other where they are. `~/code/touch` and
361`~/code/cat-playground` do this peer to peer with peerjs, with no server.
362
363## Settled
364
365Raised, answered, and needing nothing more.
366
367| Item | Outcome |
368|---|---|
369| Repository was private, so the in-app links led to a sign-in page | Made public by Pavel, 2026-10-09 |
370| No licence | MIT, in `LICENSE` |
371| The credit for the paper the sound's physics is from was partly from memory | Checked against the journal's page on 2026-10-09: authors, title, volume, pages, DOI and CC BY 4.0 licence are all as the README has them |
372| Forks are two-way, not "multiple" | Fine as they are for now; more complex forks are part of item 4 |
373| Thick ice does not sound "bad"; the bad ice is the thin end | Fine as it is |
374| Frame rate on a phone, including at sea | Good, by Pavel's testing |
375| Falling through has no cost and nothing is scored | Falling is switched off altogether for now (2026-10-09); see Competitive mode |
376| Only the middle 3 m of a channel was guaranteed sound ice, and the autopilot was to wander | Gone with falling: the strip of sound ice was removed. Turning falling back on needs a safe line for the autopilot first |