02 Projects
Software products, experiments, and long-term builds โ where the engineering thinking gets put to work.
Everything you need for a fun surf session at a glance. A tide
graph, current weather, body battery, and sunrise/sunset times โ
all on your wrist. I built it because I wanted it on my own wrist:
inspired by the surf edition of the Instinct 2, for surfers who'd
rather watch the horizon than their phone.
ใ Calculated Tides
- Tides are computed from harmonic constants โ not pulled from a remote cache
- Set your spot once; the watch face keeps working forever with no network required
- Phone connection only needed when switching to a new location
- Expanding coverage: select any supported city in the watch face settings
โท Watch Display
- Tide graph spanning the day โ next tide time and height shown prominently
- Graph shaded during nighttime hours for easy dawn patrol planning
- Current time, date, weather conditions, and temperature
- Body Battery level and sunrise/sunset times at a glance
โ Free Forever
- No ads, no subscription, no data fees โ ever
- Published on the Garmin Connect IQ Store for Instinct 2
- Working to support more surf spots around the world
- If you enjoy it, you can buy me a beer at buymeacoffee.com/freethebikes
Design principles
Calculated tides, not cached data
Offline-first after initial setup
Night-shaded graph for session timing
No paywall, no ads
Status:
live on the Garmin Connect IQ Store โ free for all Instinct 2 users,
with worldwide location support actively in development.
Checking the surf meant reading five different charts and still
guessing, so I built the page I actually wanted: waves, tide and
wind for one break, on one timeline. It covers 79 spots from
Imperial Beach to Point Conception, and the wave forecast is
modelled at the break itself rather than at a regional buoy โ which
matters on a coast where Santa Barbara sits in the lee of the
Channel Islands while Jalama, a few miles up, takes the swell full
on.
ใ Waves, Tide & Wind
- Ten days of wave height, period and swell direction from CDIP's MOP nearshore model โ refraction and island shadowing included
- A continuous NOAA tide curve at six-minute resolution
- NWS wind classified offshore / cross-shore / onshore against each break's own orientation
- Measured numbers kept separate from modelled ones: buoy waves, water temp, and what an anemometer actually read
โท One Timeline
- A single scrubber drives every chart โ drag it and the wave, tide and wind readouts all move to that moment
- A session strip scores every forecast hour on size, wind, period, tide and daylight, so "when should I go" is one glance
- Zoom from six hours to the full ten days; a Dawn tomorrow button jumps to 20 minutes before sunrise
- Full 28-band spectrum split into swell trains, so a south groundswell under local windswell reads as two lines, not one misleading average
โ Learns From What You Saw
- Log what a session was really like and the app captures what the model predicted at that moment
- Two things are fitted separately โ the break's height conversion and the forecast's own bias โ so one blown forecast can't permanently skew a spot
- Estimates are shrunk toward a physical prior, converging only as real evidence accumulates
- Reports live in your browser by default; optional Supabase sync shares them across devices
Design principles
Forecast the break, not the region
Never blur measured data into modelled
One scrubber for every chart
Static HTML/CSS/JS โ no build, no backend, no API keys
Companion:
GoodSurf now runs on Garmin watches too โ a glance that answers
“is it worth paddling out tomorrow, and where?” for the
six breaks nearest you, off the same scoring code as the site.
See the Garmin glance โ
Status:
live at
goodsurf.info
โ free, no login, no ads. Pure static files served from Cloudflare
Workers, pulling straight from Scripps, NOAA and the National
Weather Service.
Check the surf โ
The site already answered whether tomorrow is worth it โ but you
read that at the kitchen table, not in the dark at six in the
morning with a wetsuit in one hand. So GoodSurf got a Connect IQ
glance: scroll past it on the watch and you get a shaka, a shrug or
a thumbs down for the best of the six breaks nearest you, before
you have opened anything.
๐ค The Verdict First
- The glance line is one row: the go / no-go hand, the band word, the size, and which break it means
- Open it for all six nearest breaks, one screen each, in order of how close they are
- Every screen shows the next dawn โ the hour it peaks, face height, swell period, wind, and tide with an arrow for rising or falling
- Press through for what is behind the verdict: water temperature, swell direction, the gust the average wind is hiding, the next high or low, and the four factor scores the band is the product of
โก The Same Model as the Site
- The endpoint imports GoodSurf's own scoring and calibration code unchanged, so the watch and the website cannot drift apart
- Four icons mirror the bands the site already shows โ shaka, shrug, thumbs down, and a question mark
- “No data” is deliberately not a hand: a thumbs down when nothing is known is worse than saying nothing
- One request of about 1.3 kB, four times a day, through your phone โ nothing wakes the GPS, and nothing is fetched while you scroll past the glance
โฃ One Layout, Twenty Geometries
- 100 Garmin devices, from a 163 px Instinct to a 480ร800 Edge โ and no view knows what device it is on
- On a round screen the usable width of a row is a chord, not the screen width, so rows are measured rather than placed at fixed offsets
- On an Instinct the verdict icon is drawn into the subscreen circle โ it buys back the column it would have cost and lands where the eye already goes
- The icons are thresholded from colour emoji as opaque and bright, so the artwork's own outlines stay black and a thumb still reads as a thumb at one bit
Design principles
One request, four times a day
Never wake the GPS
Same scoring code as the site
“No data” is never a verdict
Status:
live on the Garmin Connect IQ Store โ free, across 100 Garmin
watches and Edge computers. It covers the same 79 Southern
California breaks as
goodsurf.info;
more of the coast if enough people want it.
The Amazon Fire tablet store inexplicably has no YouTube or YouTube
Kids app โ just a pile of third-party players, most of them
ad-riddled or locked behind an account. I wanted something for my
own kids: no account to sign into, no ads baked into the app, and
real control over what they can watch. So I built a curated player
where children only ever see videos a grown-up has approved โ no
search, no "related videos," no comments, no rabbit holes. A native
Fire tablet app (Fire OS is Android-based) written in Kotlin, with
playback through the YouTube IFrame Player in a WebView โ the
approach that works on Fire tablets, which have no Google Play
Services.
โถ Calm, Curated Content
- Hand-picked, kid-safe videos โ Alphablocks, Numberblocks, Sesame Street, Bluey, Ms Rachel & more
- Organized into learning shelves: Letters, Numbers, Feelings, Science
- Slow-paced and educational โ none of the hyper-stimulating, fast-cut stuff
- Parents can add their own approved videos by pasting a link or ID
โฟ Parental Controls
- No search, no related-video sidebar, no comments โ kids can't wander off
- "Ask a grown-up" math gate plus an optional PIN before Settings
- Daily screen-time limit that counts only while a video is playing
- PIN stored only as a salted SHA-256 hash, never in plain text
โ Privacy & Pricing
- No accounts, no subscriptions โ the app collects no personal data
- Free to try with 100 videos; unlock the full library and parental controls for $3.99
- Built for toddlers and preschoolers (ages 2โ7) on Amazon Fire tablets
- Any ads YouTube shows are non-personalized โ no tracking-based targeting of your child
Design principles
Curated, not free-roaming
Calm & low-stimulation by design
Montessori-friendly content philosophy
Privacy-first, no data collection
Status:
live on the Amazon Appstore โ free to try, with a $3.99 unlock
for the full library and parental controls.
Sixer finds paid freelance tasks on Freelancer.com and Upwork and
drafts proposals with an LLM โ for your review, never
auto-submission. It drafts; you decide. Drafting runs on a local
LLM via Ollama by default, so your profile and proposals never
leave your machine, and every bid is an explicit, one-at-a-time
action you confirm.
Design principles
Local-first LLM โ private, no API key
Drafts proposals, never auto-bids
You confirm every submission
CLI + local web UI over one SQLite file
Status:
a working local-first tool โ a small CLI plus a hardened local web
UI for reviewing jobs and drafting bids. Interested in using it?
Get in touch.
A tongue-in-cheek experiment in how far a hands-off content
pipeline can go. A local LLM researches a Reddit topic and writes a
grounded narration script, text-to-speech reads it over stock
b-roll, and the finished short queues itself up for YouTube Shorts,
Instagram Reels, and TikTok โ you just approve it before it goes
live. The name is a wink at the age of AI "slop."
Design principles
Local-first LLM โ no cloud inference costs
Human approval before anything goes live
Grounded research, not invented facts
One pipeline, every short-form platform
Status:
an ongoing experiment โ actively auto-publishing short-form video
across three platforms. Curious about running it for your own
channels? Get in touch, or read the
full details, privacy policy & terms โ
A long-term mechanical restoration treated not as a traditional
resto, but as a full-scale systems problem: mechanical, electrical,
and thermal subsystems interacting under real-world load
conditions.
โ Engine & Drivetrain
- Evaluated the Chrysler 318 Poly V8 with dry and wet compression testing across cylinders
- Replaced the timing chain and front-end engine components; tuned timing for drivability under load
- Rebuilt the three-speed A727 Torqueflite automatic in the backyard over ~2 months, including torque converter service
โก Electrical System
- Traced charging instability to grounding issues in the engine and chassis system
- Restored stable charging by correcting a faulty ground strap connection
- Replaced the alternator and validated voltage stability under operating conditions
โฝ Fuel & Engine Tuning
- Investigated carburetor configurations and tuning behavior under RV load conditions
- Worked through air/fuel mixture, idle stability, and vacuum-related drivability issues
- Iteratively tested configurations for reliability rather than peak-performance tuning
Engineering approach
Root-cause failure analysis over part swapping
Validate assumptions with measurement
Treat the vehicle as an integrated system
Reliability over restoration purity
Transmission rebuild โ A727 Torqueflite
Goal:
return a complex vintage platform to dependable, road-usable
condition โ and build a deeper understanding of how legacy
mechanical and electrical systems behave under modern usage
expectations.
A 1968 Datsun roadster bought as a tired, flat-black project and
rebuilt into a one-off custom. Custom front fenders were
fabricated by hand and a pair of NRG fiberglass bucket seats
reworked to sit low and fit the tight cockpit.
It was finished first in matte black and driven hard, then later
stripped back and repainted white. Restored in every way, then
pushed well past stock.
โ Bodywork & Custom Fenders
- Bought as a weathered flat-black roadster and stripped down to a bare shell
- Fabricated custom front fenders by hand and reworked the bodywork
- Custom front end with quad round headlights and a rear diffuser
โ Custom-Fit Seats
- Started with NRG fiberglass bucket seats โ the trick is finding shells small and low enough to fit this car
- Lotus Elise seats are the usual answer but expensive, so I did all the fiberglass myself for a perfect fit
- Reshaped, laid up, and upholstered to sit low and clean alongside the wood wheel
โ Paint & Finish
- Full teardown, metalwork, and block-sanding before any paint went on
- Finished first in matte black/charcoal, then later stripped and repainted white
- Sitting low on staggered wheels for an aggressive, planted stance
Build approach
Fabricate what you can't buy
Bodywork done properly, from bare metal
Build the car you actually want to drive
Restore, then keep improving
Custom-fit seats โ reworked NRG fiberglass
Goal:
a road-going, one-of-a-kind roadster โ proof that with enough
patience you can fabricate the parts you can't buy and finish a
car to your own spec, end to end.
A red E30 built into a street-legal drift car. The interior was
stripped out, Corbeau bucket seats and a hydraulic handbrake
fitted, and the suspension modified for angle โ then driven to and
from events under its own power to go sideways.
Build approach
Strip it and send it
Hydraulic handbrake
Suspension for angle
Street legal, driven hard
Status:
a street-legal E30 that ran three grassroots drift events โ
including Drift Day 43 in Shawano, Wisconsin โ and spent a full
night going sideways with the Risky Devils crew.
A black S13 240SX built around an SR20DET running a large single
turbo โ the classic rear-wheel-drive drift platform set up for
boost and big power.
Build approach
Proven RWD platform
SR20DET power
Big single turbo
Built for boost
Status:
a turbocharged, rear-wheel-drive S13 โ the quintessential
drift-scene build.