// engineer ยท builder ยท lifelong learner

I build useful things.

01 About

I'm an engineer who likes problems that live in the gap between software and the physical world โ€” the kind where a clean API meets a stubborn machine, or where an AI model has to do something actually useful.

By training I'm a mechanical engineer (BS); by trade I've spent about 15 years in IT โ€” first as a consultant, then in higher education. Along the way my work has spanned software development, industrial automation, and energy systems.

I'm happiest when I'm prototyping: wiring, welding, writing code, and figuring out why the thing that should work doesn't โ€” yet. Away from the bench it's animals, nature, comedy, surfing, and car drifting โ€” though most hobbies eventually turn into fixing something anyway.

โ†’ Apply engineering thinking to real-world problems
โ†’ Bridge software and physical systems
โ†’ Use AI to amplify human capability
โ†’ Make complex systems understandable
โ†’ Stay technically self-reliant
0years in IT
0domains of practice
0projects & counting
โˆžthings left to learn

02 Projects

Software products, experiments, and long-term builds โ€” where the engineering thinking gets put to work.

// published ยท garmin watch face

Ventura Surf Tide

Garmin Instinct 2 ยท Connect IQ ยท tide & session planning

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.

// published ยท web app

GoodSurf

Surf forecast for 79 Southern California breaks ยท CDIP MOP ยท NOAA tides ยท NWS wind

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.

Watch the walkthrough

ใ€œ 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 โ†’

// published ยท garmin connect iq

GoodSurf Glance

Garmin Connect IQ ยท 100 devices ยท “is it worth paddling out tomorrow, and where?”

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.

// published ยท amazon fire tablet app

Kids Safe Player for YouTube

Amazon Fire tablet ยท Kotlin ยท curated, kid-safe video player

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.

// building ยท freelance assistant

Sixer

Local-first ยท finds freelance jobs & drafts LLM proposals for your review

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.

// experiment ยท social video pipeline

Upslop

Reddit topics โ†’ AI research โ†’ narrated video โ†’ YouTube Shorts / Instagram Reels / TikTok

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 โ†’

// restoration ยท ongoing

1966 Dodge Travco Restoration

Class A motorhome ยท restoration & systems engineering

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

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.

// build ยท custom roadster

1968 Datsun Roadster

Custom roadster build ยท fabrication, upholstery & paint

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

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.

// build ยท drift car

1988 BMW E30 Drift Car

Street-legal RWD drift build ยท hydraulic handbrake, buckets & suspension

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.

// build ยท engine swap

Nissan 240SX SR20DET

S13 ยท SR20DET swap with a big single turbo

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.

03 Contact

Working on something interesting at the intersection of software and the physical world? I'd like to hear about it.