Random experiments
- Aquarelle - Watercolour painting on a fluid simulation, for Apple Pencil, stylus, finger or mouse: WebGL2 shallow-water flow (virtual pipes) with contact-line pinning, capillary creep and rim evaporation, so washes bloom wet-in-wet, darken at the edges and backrun; Curtis et al. pigment deposition with per-pigment granulation and staining; Kubelka-Munk optics, so brush mixes, glazes and layers are subtractive. Soft pastel and pastel pencil (dry, opaque, catch the paper grain), infinite pages that pan forever (tiled storage). Pen mode for notes in multi-page notebooks (ballpoint, fineliner, brush pen, highlighter on lined / grid / dotted pages), zoom buttons, two-finger pan that never rotates, e-paper theme for colour e-ink tablets like the Bigme B7 Pro. Gallery, brush library + studio, smudge, layers, colour disc, 19 artist pigments, QuickShape, finger-tap undo that rewinds the water too, hair dryer, tilt the board, time-lapse video, autosave, offline PWA
- SailNav - Browser chart plotter for Puget Sound: official NOAA ENC charts (S-52 day/night), charted depth + tide under the boat from GPS, automatic draft-aware water routing between two points, XTE/BRG/TTG navigation, MOB, GPX, offline mode that parses NOAA S-57 cells in the browser, installable PWA. Navigation math ported from OpenCPN
- Committee Boat - Race committee without the paperwork: fleet list (name, sail number, type, PHRF rating) sorted A–Z or by sail number, rolling starts with a spoken 5-4-1-0 sequence that names the boats clear to cross at each gun, Crossed / OCS / returned / DNS / DNC on the line, finishes by partial sail number or name on deck and a big FINISH button or the horn (microphone detection), editable h:m:s, unknown times to name later, DNF / RET, PHRF time-on-distance / time-on-time results with CSV. GPS or manual clock offset, voice and camera (OCR) boat lookup, undo, offline PWA
- Sail Trim - Trimming simulator for a 30 ft sloop: mainsheet, traveler, vang, halyards, cunningham, outhaul, backstay, jib sheet and jib car each change the sail shape (twist, depth, draft position, mast bend, forestay sag, luff wrinkles), which sets the flow at three heights of each sail (luffing / attached / stalled, shown on telltales and draft stripes), the forces, and the boat’s speed, heel, leeway and helm. Wind gradient, gusts and shifts, tacking and gybing, auto-trim, trim coach. Calibrated against a Catalina 30’s ORC polar (2.6% RMS), polar view against ORC, timed windward-leeward races with starts, OCS, penalty turns and an ORC target time
- West Point Buoy - Fast, rich dashboard for NOAA NDBC station WPOW1 (and other Puget Sound stations): 10-min wind + gusts, forecast overlay, wind rose, pressure, tide, marine forecast
- Estate AR - Camera-passthrough AR that labels the buildings you point at with the county’s assessed value, use, zoning and recent sales. Parcel polygons from King County, Snohomish County, Los Angeles County (comps-based market estimate where Prop 13 makes assessed values meaningless) and the WA statewide parcel layer (public ArcGIS, CORS, no keys, no backend); per-unit values and rent estimates for apartment buildings from assessor unit records and Zillow ZIP indices, GPS + compass + tilt for placement, terrain elevation and fused GPS altitude so hillsides and high-rise floors project correctly, labels on rooftops via OSM or value-density height estimates, ground-plane parcel outlines, radar mini-map, installable PWA with offline parcel cache
- Marine AR - Camera-passthrough AR for the water: charted traffic separation lanes, zones and precautionary areas drawn on the sea surface with direction arrows (NOAA ENC Direct, CORS), AIS vessels pinned in AR with name/type/speed/course/size, hull outlines, 6-min vectors, CPA/TCPA. Live AIS worldwide from OpenSeaFeed (keyless WebSocket) or Digitraffic (Finland), no backend; optional aisstream.io proxy; simulated traffic as fallback. Radar mini-map, true horizon for eye height
- StaffInk - Handwritten music notation: write notes, chords, accidentals, rests, clefs, time signatures, triplets, dynamics and hairpins on the staff with a stylus, finger or mouse and they become engraved SMuFL notation (Bravura/Petaluma). Tiny MLP trained on the HOMUS dataset (94% writer-independent, 99% top-3), structural note parsing for pitch/chords, gestures for beams, ties, slurs and scribble-erase, alternatives strip that learns your handwriting ($P templates), grand staff, playback, MusicXML/MIDI/PNG export, offline installable PWA
- ScoreShift - Photograph a page of sheet music and get the same page back transposed for B♭ clarinet, alto sax, horn or 15 other instruments, edited in place: notes slide to their new lines and spaces in the page’s own ink, key signatures and accidentals are rewritten, ledger lines regenerated, layout untouched. Classical OMR in plain JS in a worker (staff detection and removal, heads, stems, accidentals, keys, clefs), Interpreted view to check and correct every note, 99% pitch accuracy on clean engravings and ~95% on simulated photos across 5 music fonts. Also reads the rhythm (beams, flags, dots, rests, time signatures, triplets, ties) into measures checked and repaired against the time signature, so a page plays back with a playhead and exports as MusicXML or MIDI, as written or transposed. Offline PWA
- notation-ir - Music notation as a timeline instead of a bar grid, shared by StaffInk and ScoreShift: events with exact rational onsets and durations, no measures in the content; bars, bar-crossing ties, rests, tuplets and accidentals are derived by an interpretation layer you can change (any meter, free time, printed bars winning, accidental scope), with misfits reported, never repaired. Anchored / engraved / proportional layout, anchors that follow edits (a note, a printed bar, a point on the page), and authored non-linear playback: clips, jumps, loops, canons and phasing on parallel cursors. Shared pitch, duration and Web Audio player for both apps; ScoreShift’s Edit in StaffInk hands a photographed page to the pen editor
- Koi - A quiet koi pond in three.js to leave open for hours, seen from above and made for phones. Water through a refracting, rippling surface onto a pebble bottom: Beer-Lambert water colour, photon-traced caustics, sunlight through a swaying maple canopy, fish and lily-pad shadows, and canopy reflections with sun glints. A dozen koi of 12 varieties (kohaku, sanke, showa, ogon, butterfly platinum…) on shader-bent spines, with path-following bodies, beat-and-glide swimming and fins that tuck, paddle and flow. Lily pads with water lilies, and cherry petals or maple and ginkgo leaves by season. Touch modes Ripple / Feed / Call, tilt for parallax, a moving glint and drifting leaves, shake to slosh and scatter. Animated watercolour mode, synthesised pond sounds, adaptive render scale, offline PWA
- Sorairo - Anime / Makoto Shinkai-style hillside in three.js: a lone procedural tree (branch tubes + sphere-normal leaf-cluster billboards, summer / sakura / autumn) dropping leaves or petals, 170k wind-blown grass blades with rolling gust sheen and wildflowers, towering painted cumulus, cloud shadows, utility poles with sagging wires, five times of day from noon to a magic-hour sunset and a firefly night, played as a day-cycle time-lapse or a four-seasons year (snow melt, cherry blossom, summer, the autumn turn, shedding, snowfall). Post chain: light shafts through the canopy, bloom, lens flare, saturation-preserving tone map, and an anisotropic Kuwahara filter for a gouache / oil-paint look with canvas texture
- Line Rider 3D - Line Rider in 3D: draw on a sketch plane you can turn (or turn while drawing) and every stroke becomes a ribbon track, 2D Line Rider per plane with corkscrews, banked top-down turns, line-end snapping and 3D bridges between ends. Verlet sledder with breakable bindings (bosh), one-sided ribbons, runner grip, accelerate and scenery lines, 2.5D side view by default (2D Line Rider with depth, camera swings around corners while riding) or free 3D, recorded timeline, demo track ridden crash-free in tests
- Squash Court - Finds a squash court in a photo, video or live camera from its painted lines and recovers the camera: position in metres, view direction, focal length, lens distortion. Thin-line detector for any line colour on wood, dark floors or glass, a seeded search over where squash cameras stand, Gauss-Newton ICP against the WSF court model, frame-to-frame tracking for video. Click to measure points on the floor or walls in metres, rectified floor and front wall, 3D view with the camera frustum, camera JSON export (K, R, P, homographies). Plain JS in a worker, no deps
- CarPlay Gravity - A CarPlay-style car screen that falls apart like mrdoob’s Google Gravity: Home grid, Dashboard (live navigation map, Now Playing, calendar, weather) and an instrument Cluster with rolling gauges, every piece a rigid body you can drag and throw while it keeps working. Gravity down / any direction, device tilt, Drive (the simulated car’s turns and potholes throw things around) or Zero-G; pull one tile out of the still layout to knock others loose, Restore springs it all back. Own small box + circle physics engine, no deps
- Night Sky AR - AR camera overlay that identifies stars, planets, and the Moon by pointing your phone at the sky
- BrainWave - Neural Audio Engine - Brainwave entrainment app with binaural beats, study/focus modes, and procedural ambient music
- CPU/Numa Affinity planner / visualizer
- moon fraction - Visualization of moon in it’s different phases
- sun path ar 2d - Heads up display using AR passthrough style
- sun charts - JS based sunrise and sunset tables and visualizations
- tide predictor - Harmonic tide prediction in the browser (Schureman / NOS method) from NOAA constituents, with tide clock, hi/lo table, spring/neap envelope, constituent decomposition and phasor view. Engine in tides.js, validated against NOAA in test_tides.js
- compass - Web based implementation of IOS compass app
- protrait_effect - experiments to render the bokeh (aka Protrait on ios) effect with tensorflow.js and three.js
- fishy-sketches - drawing fishes with bezier curves in 2d
Nodejs experiments
History / Notes
See Changelog