16 · Saltglass: a sauna and cold-plunge bathhouse seen through water and glass

Saltglass Bathhouse is a made-up wood-fired sauna at the end of a stone pier in Port Wren, and the footer says so. The page opens on a live water shader moving over a pool floor whose tiles spell SALTGLASS, with refracting glass panels floating on top. What makes people stop is that the water is real motion, the glass bends it, and the page also works as a booking tool: it ends in a glass token you can print.

Inspiration

The brief was the Glass theme from the kit, the favourite from the lab pages. The tools come from the 20 Oct lab pages: Paper Shaders for the living water and the hot-to-cold background, SVG-refraction glass from Lab 05, GSAP (SplitText, ScrollTrigger, DrawSVG, Flip) for motion, and two Uiverse CSS patterns as still backdrops. The Flip card-to-page idea comes from Lab 02.

What was added on top: the pool floor is drawn in code, and the water shader refracts it. A 5 by 7 block font spells the name in lit tiles, like depth markings on a pool wall. A pier at dusk is also drawn in code, and a mirrored copy runs through the water shader as a live reflection. The numbers are honest: sea temperature, sauna state, tide and sunset are computed from the real date, and the sunset uses a real solar formula for 44 degrees north.

Visual direction

Theme, kit and licenses

Source License
Paper Shaders 0.0.81 (water, warp) Apache-2.0
GSAP 3.15.0 with SplitText, ScrollTrigger, DrawSVG, Flip GSAP standard no-charge license
Uiverse ripple, marcelodolza/kind-panther-75 MIT (not a known repost)
Uiverse rings, themrsami/dull-moose-46 MIT (not a known repost)
Fraunces, IBM Plex Mono SIL Open Font License
Glass, pool tiles, pier, lanterns, icons Our own code

Credits are in CREDITS.md and in the page footer.

References

Why these choices

A bathhouse sells a feeling of heat, cold and quiet, so slow motion and real water fit. The line chart explains the hot, cold, rest cycle better than a paragraph would, and scrolling through it feels like doing a round.

The trade-offs are visible in the code. Glass over moving content costs frames, so only the hero nav, the conditions panel and the cycle panel sit over motion, and the cycle panel is in a different screen from the hero. Cards and the token sit over CSS patterns that never change. Every picture has a fallback: if the shader fails, the pool and dusk images show as plain backgrounds. With reduced motion, the pinned scene turns off, the three steps stack, and the line sits fully drawn. The unit toggle (°C/°F) is remembered in localStorage inside try/catch. When a card opens full screen, focus is trapped, Escape closes it, and the page behind stops scrolling. The booking form is real enough to test: closed Tuesdays, lantern swims on Thursdays only, with gate time worked out from sunset.

Who this kind of site is for

It wins for spas, saunas, swim clubs, cold-plunge studios, coastal hotels and any place that sells calm and wants to look premium. It also suits businesses where booking is the point, because the wow sits beside a working form.

It is the wrong call for a site people open in a hurry on a weak phone, or for a business whose pictures should be real photos. Pool lettering reads fully only on wide screens.

When showing it, start with the conditions panel and the token first, since they prove it is a working tool and not just a pretty page. For reuse, swap the rituals array, the tile word and the open hours, and the rest carries over.

How to make it

Stack and key techniques

The prompt

Build a single-file website, no build step, for "Saltglass Bathhouse", a made-up wood-fired sauna and cold-plunge bathhouse at the end of a stone pier in the made-up town of Port Wren. The footer must say the business and town are fictional.

Theme: glass over living water. Use these pinned tools: Paper Shaders 0.0.81 (water, warp), GSAP 3.15.0 (SplitText, ScrollTrigger, DrawSVG, Flip), SVG-refraction glass with a frost fallback for non-Chromium browsers, and two still CSS patterns as backdrops. No other libraries. Draw all pictures in code.

Palette: ink #0b1d24, sea glass #7fd1c7, brass #c9a46a, foam #eef6f3; ember #c4502a and ice #c8f3ff for the cycle. Fonts: Fraunces (soft axis up) and IBM Plex Mono. Motion is slow and heavy, nothing bounces.

Sections and signature moments:
1. Hero: a Paper water shader refracting a pool floor you draw on a canvas in tiles, with SALTGLASS spelled in lit tiles using a 5 by 7 block font (stack SALT / GLASS on portrait screens). A glass nav and a glass conditions panel with sea temperature, sauna state, next tide and sunset, computed from the real date (solar-formula sunset for 44 degrees north). Numbers count up. A C/F toggle changes every temperature on the page and is remembered.
2. The cycle: a pinned scroll scene. A temperature line (hot, cold, rest) draws itself with DrawSVG while a Paper warp background shifts ember to ice to sea glass, and a glass panel changes between three steps.
3. Rituals: five glass cards over a still pattern. Each grows into a full plan with Flip; Escape closes it, focus stays inside, the glass turns solid while open.
4. Booking: choose ritual, a day from the next 14 real days (Tuesdays closed; the lantern swim only on Thursdays, gate time from sunset), a time slot (some full or past), party size capped by spaces left. End in a glass token with a booking code and a stamp, a Print button that prints only the token, and an .ics calendar download.
5. Dusk band: a pier at dusk drawn in code with flickering lanterns; a mirrored copy runs through the water shader as a live reflection under one glass panel listing the next four Thursdays.
6. FAQ, a ?fps frame-rate chip, a link back to the gallery.

Rules: at most two glass pieces over moving content; glass elsewhere only over still backgrounds; no glass or blur on sticky elements. Respect prefers-reduced-motion (no pin, steps stacked, line fully drawn). Wrap localStorage in try/catch. Every shader needs a still fallback. Text on glass sits on a darker tint. No em dashes.

Verify: screenshot at five scroll stops at 1440 wide and four at phone width, run with reduced motion, click through every control, check the console is clean and nothing overflows at 1440, 390 and 360. Fix and repeat.

Build notes

Stepping down: what you would likely lose

This is an informed estimate, not a measurement. No public benchmark compares these exact models on one-shot frontend work, and the evidence is the spec table, Anthropic's own pages and extrapolation from model tier. The point here is how much the tested kit carries for a smaller model.

Feature Sonnet 5.5 with this kit Sonnet 5.5 from a blank page
Water over a tile floor with a live shader Does fine: the kit's paper.js handles uniforms and loading Attempts it with likely bugs: shader throws because images were not loaded first, or the water is simplified to a gradient
Glass nav and panels Does fine: the kit supplies it, the main risk is overusing it Attempts it with likely bugs: blur over moving content tanks frame rates, no non-Chromium fallback
Pinned cycle scene with the drawing line Attempts it with likely bugs: step switching or color mixing may be off at the edges Attempts it with likely bugs: pin and scrub fight with layout, reduced-motion path likely missing
Card grows into a full plan (Flip) Attempts it with likely bugs: focus trap or scroll lock may slip Likely simplified to a plain modal
Booking flow with real dates, full slots, Thursday rule, print and .ics Attempts it with likely bugs: edge cases in resetting state after a change Attempts it with likely bugs: more of them, and print likely shows the whole page
Dusk pier and live reflection Attempts it with likely bugs: the mirrored image alignment Likely simplified to a static picture without the reflection
Computed sunset, tide, sea temperature Does fine on the idea, formula details may be off Likely a hard-coded set of numbers

Overall, as a judgment call: Sonnet 5.5 with the kit keeps roughly 70 to 85 percent of the visual impact in one pass. From a blank page, roughly 40 to 60 percent, mostly lost in the shader, glass and Flip details. Opus 5.5 built this one, and the gap to Fable 5.1 is probably small here because the kit did the hard shader and glass work. Screenshot feedback loops and splitting the build into sections would close most of the gap for Sonnet.

← Previous reportNext report →