Use my Skapi project "<Project ID>".

Build "Stillwater Lake": a quiet, shared 3D lake that anyone can walk into from a phone or a computer, with no sign-up. Everyone at the lake sees everyone else in real time. Show me the game as a playable preview here in the chat after each step, test it at phone and desktop sizes before you tell me it's done, and when I say so, register the subdomain "<your-subdomain>" on my Skapi project and host it there.

## Ground rules
- The whole game is ONE self-contained index.html: markup, CSS and JavaScript inline. No build step, no bundler, no other files.
- Load three.js 0.152.2 from cdnjs and the skapi-js library from jsDelivr, pinned to an exact version. Fonts from Google Fonts: "Young Serif" for display, "Atkinson Hyperlegible" for everything else.
- Works on iPhone Safari, Android Chrome, desktop Chrome/Safari/Firefox, and inside in-app browsers (Threads, Instagram, Facebook, X, LINE, KakaoTalk).
- Low-poly, flat-shaded, calm. No violence, no score pressure, no typed chat.
- Remember the player on this device with localStorage: name, outfit, a random "look seed", catch tally, inventory, and banked dances.

## The world
- A round lake (radius about 24) in a basin, with a sandy shore, grassy rolling hills, rocky mountains with snow on the peaks, and the sky behind.
- The world tiles: the land repeats every 340 units in x and z, so walking over the ridge in any direction brings you back down to the same lake. Render the 8 neighbouring tiles so the horizon never ends, and wrap the player's coordinates seamlessly (camera and walk target carried along).
- Scatter about 260 instanced trees (layered cone pines and round leafy trees in green and autumn orange), rocks, and reeds along the waterline. Keep a clear path to the dock and a clearing at the arrival spot.
- A wooden dock reaching about 13 units into the lake, with posts, rail posts at the end, a glowing lantern on a pole, a bait bucket and a crate.
- A base camp near the dock: a stone-ringed campfire with logs, a flickering flame and point light, and three log benches around it.
- Drifting light motes above the water, and a fish that jumps out of the lake now and then.
- Water: a custom shader with gentle waves, fresnel sky reflection, a sun glint, deep-to-shallow colour, and expanding ripple rings (from casts, bites, catches, jumping fish and wading). The water turns a little clearer around a player who is in it.
- Daylight follows the viewer's own clock: sunrise around 06:00, noon overhead, sunset around 18:00, a moon and stars at night. Blend sky, fog, light and water colours through night, twilight, horizon, low sun and high sun.

## The angler
- A blocky, friendly character: legs, hips, a tapered torso, sleeves that taper into the shoulders, forearms that bend at the elbow, a head with eyes, hair under a cap with a short brim. Same silhouette for everyone.
- Skin and hair colour come from the device's look seed. The player chooses colours in a customization panel, 8 options each, shown as 4x4 swatch grids:
  - Shirt: red, yellow, green, pale sky blue, blue, purple, pink, black
  - Pants: navy, brown, forest, grey, black, khaki, pink, strong blue
  - Cap: olive, tan, navy, rust, cream, red, pink, black
  - Shoes: brown, black, taupe, white, red, blue, pink, green
- A name label floats over every head; speech bubbles appear above it.
- Poses: idle breathing, walk, run, cast (rod back, then forward), fishing, reeling, swimming, sitting, eating, dancing.

## Moving around
- Desktop: W/S walk forward and back, A/D turn (arrows too), Shift to run, click the ground to walk there (show a pulsing ring), drag to look around, mouse wheel to zoom.
- Phone: swipe to look, tap the ground to walk there, pinch to zoom.
- The camera rides behind the player. Dragging or swiping turns only the view, never the character. While the player stands still the view stays where it was put; as soon as they walk, it eases back behind them.
- Water: in the shallows the player wades along the bottom (slower). Where it's deeper they swim at the surface with only the head above water, paddling, and can never dive. Walking and swimming in water leave ripples. Campfires, the dock and the water never block movement.

## Fishing
- Near the water, Space (or a big round "Cast" button on phones) casts toward the middle of the lake, or the way you face when standing in the water or on the dock end.
- The bobber flies in an arc and lands with a ripple. After 4 to 13 seconds it bites: it dips and shakes for about 1.3 seconds, and the prompt turns amber and shakes "Bite! Press Space to reel". Reel in time to land the fish; miss three bites and the prompt suggests reeling in. Walking away cancels the cast.
- Fish table with weights in kg and rarity: Bluegill, Crucian carp, Yellow perch (common); Rainbow trout, Largemouth bass, Common carp (uncommon); Channel catfish, Northern pike (rare); Golden koi (epic); Stillwater sturgeon (legendary, 12 to 48 kg); and an Old leather boot as junk.
- A catch shows a card ("Nice one", "A rare catch", "Legend of the lake"...) coloured by rarity, adds to the tally (count, heaviest) and puts the fish in the bag (up to 12).

## Camp life
- Branches lie in the woods and stones along the shore. Walk up and press E (or tap the button that appears) to pick them up. They respawn after 90 seconds.
- With 3 branches and 2 stones, B builds a campfire just in front of you, anywhere on land, snowy peaks included. Not in the lake, not on the dock, not too close to another fire, and not while standing inside a fire ring. A fire burns for as long as its builder is at the lake; each player keeps at most 3.
- Near any campfire, G grills the first fish in your bag: a skewered fish leans over the fire with a label "Fish · Owner". Anyone at the lake can eat it.
- Near a grilled fish, E eats it: the player sits down on the ground, holds the skewer across both hands at the mouth, and takes bites with the head dipping in and chewing, for about 7 seconds. Afterwards they stay sitting, hands resting on their thighs, looking slowly around the lake, until they walk, cast or dance. The cook gets an "Appreciation" card when someone eats their fish.
- Every grilled fish you eat banks one appreciation dance, saved across visits. T (or the button) performs one: a cha-cha after the 1996 "Dancing Baby", with two slow steps and three quick ones, the weight rolling from foot to foot, hips swinging out, shoulders twisting, and bent arms pumping. Make the timing smooth, never glitchy.

## Kind words
- No typed chat. Enter (or a round "Kind word" button on phones) makes your angler say one of about 200 short, gentle, encouraging sentences, such as "Still water, steady heart." or "You are doing better than you think." It appears only as a speech bubble over your head for everyone, never in the log.

## Photos
- A round camera button under the title card (P on desktop) takes a photo of the 3D scene right after a frame renders. The HUD is not in the photo; a small caption "<name> at Stillwater Lake" goes in the corner. Flash the screen like a shutter.
- A sheet shows the photo with Share (the system share sheet with the JPEG file, only where the browser can share files), Save (download stillwater-lake-YYYYMMDD-HHMMSS.jpg) and Close. On phones add "You can also press and hold the photo to save it."
- In in-app browsers, which can neither save nor share files, the camera button instead opens an "Open in your browser" sheet.

## Screens and HUD
- Palette from a lake at golden hour: dusk water #0e2f3a, ink #0b1a20, amber sun #f2b35a, driftwood #c9b89a, paper #fbf5ea. HUD panels are dark frosted glass with a thin light border.
- Top left: a title card "Stillwater Lake" with a connection dot (green "Shared lake", amber "On your own", grey pulsing "Connecting") and a head count "· 3 at the lake". The camera button sits under it.
- Top right: a name box exactly as tall as the title card, holding the name and a round shirt button. Tapping anywhere on the box opens the customization panel (name field plus the four swatch grids); a tap outside closes it. On phones a round bag button of the same size sits under it, with a count badge, and opens the tally (caught, heaviest, fish to cook, branches, stones).
- Bottom: a short fading log of events (catches, campfires, grills, dances), a one-line prompt for the current context, and action buttons for what you can do right now. Keep the phone layout uncluttered and every button easy to tap.
- Welcome card over the live lake: a greeting by the time of day ("Evening at Stillwater Lake"), a short warm introduction, a name field, the controls for desktop or touch, and "Walk to the lake". Add links "GitHub Open Source" and "Built on skapi.com".
- In-app browsers: before the welcome card, show a notice that the lake works better in the normal browser, with "Open in browser" (Android: an intent:// link to Chrome; iOS 17+: x-safari-https://), "Copy link", menu instructions, and "Continue here anyway".
- Keep in-app browsers from treating swipes as pull-to-refresh or drag-to-close: make the document twice the viewport tall and keep it scrolled to the middle, with all visible UI position: fixed.

## Multiplayer with Skapi
- Create one Skapi instance with autoLogin. On load, restore the visitor's anonymous session with verifyAnonymousSession(), or create one with anonymousLogin(). No sign-up, ever.
- Everyone joins one realtime group, "stillwater-lake". Each player posts a compact snapshot a few times a second while moving (every 120 ms) or idle (every 400 ms), with a full refresh every 2.5 s: name, position, heading, look seed, state, outfit indexes, sitting/eating/dancing flags, bobber position, their campfires and their grills.
- One-off events (catch, kind word, campfire lit, fish grilled, fish eaten, dance) ride along with unique ids; handle each once, and don't replay events older than 20 seconds to someone who just arrived.
- Each player's campfires and grills are theirs: others draw exactly what the owner lists, and remove them when the owner leaves. Eating someone's grilled fish sends an event so the owner removes it and gets thanked.
- Draw other players smoothly interpolated, at whichever repeat of the tiled world is nearest. Drop a player after 12 seconds of silence or when the group says they left.
- If the connection fails, play solo ("On your own") and retry quietly every 20 seconds.
- Anonymous accounts expire about 30 minutes after the last keep-alive, and phones freeze background tabs. When the account is gone (the SDK signs out, a forced token refresh fails after the tab was hidden for more than 4 minutes, or a watchdog sees no user), close realtime, sign out, and return to the welcome card with a note "You were away for a while, so your spot at the lake was let go." Walking back in makes a fresh account and reconnects.
- Inside the claude.ai preview, where the Skapi connection isn't available, use the artifact viewer's shared room for presence instead, so the preview is multiplayer too.

## Performance and polish
- Cap the pixel ratio at 2 (1 in in-app browsers), use instanced meshes, soft shadows from one sun, and render only a third of the frames while the welcome card is up.
- Respect prefers-reduced-motion (no motes, no jumping fish, calmer animations).
- Add SEO and Open Graph tags (title, description, og:image at /og.jpg, 1200x630) and a theme colour.

When it's ready, show me the preview. After I approve, register the subdomain, upload index.html and an og.jpg screenshot of the lake at golden hour, refresh the CDN, and give me the link.
