Caleb Wallin, software developer

I like building software all the way through, until it actually runs.

I'm a developer who works across the stack, from C++ systems code to full-stack web apps, mobile and AI-powered features, with a focus on reliability, security and clean, tested code.

About

I'd rather finish something small than leave something big half-built. I'm comfortable working at every layer, from low-level, real-time systems code to polished web and mobile front ends, and I like taking a piece of software from idea to something people can actually use.

The parts I care about most are the ones users only notice when they're missing: failing gracefully, protecting their data, and testing the code that has to be right.

Full-stack web
TypeScript, React, Next.js, Vite, Tailwind CSS, Node.js, Express, REST APIs
Data & auth
SQLite, Postgres / Supabase, JWT & sessions, bcrypt, File uploads, Email (SMTP)
Systems & audio
C++, JUCE, Real-time DSP, Multi-process architecture, VST3 / AU hosting, CMake
AI integration
Claude API, Vercel AI SDK, Schema-validated output (Zod), Grounded generation, Human-in-the-loop design
Mobile & product
Capacitor (iOS / Android), PWA, Local notifications, Gamification, Accessibility-minded UX
Quality & shipping
Vitest, Playwright, JUCE unit tests, SSRF-safe fetching, Railway deployment, Git

Projects

Desktop, web and mobile.

01 Desktop · C++ · JUCE

MiniDAW

A digital audio workstation written from scratch in C++ and JUCE. It records, sequences, mixes and masters audio, MIDI and drum tracks, and hosts third-party VST3/AU plugins in a separate process so a crashing plugin can't take the project down with it.

  • Multi-track audio, MIDI and drum-machine tracks with multi-clip timelines, comping, trim, fades and split
  • Piano roll with velocity, pitch-bend and CC lanes, plus a step-grid drum sequencer and a sampled-piano instrument
  • Per-track EQ, send/return buses, sidechain compression, and a master EQ, compressor and limiter with peak, RMS, true-peak and LUFS metering
  • Breakpoint automation for gain, pan, EQ and hosted plugin parameters, with MIDI-learn for hardware controllers
  • Out-of-process plugin hosting with crash recovery, plus tempo-following time-stretch, audio-to-MIDI and scale-snap pitch correction
  • Stem and mixdown export (WAV, AIFF, FLAC, Ogg, MP3), project save/load with undo/redo, and a JUCE unit-test suite
MiniDAW showing a drum step sequencer, a MIDI track, a per-track mixer with EQ, and the master compressor, limiter and meters
02 Web · React · Express

Overdue

A Letterboxd-style social reading tracker. Readers log and review books, keep a dated reading diary, a to-read shelf and live progress, and build lists to share, over a catalog of 557 books with real covers from Open Library.

  • Reviews and ratings that other readers can like and comment on
  • To-read, currently-reading and finished shelves, a reading diary, per-user stats and reading challenges
  • Custom lists, follows, an activity feed and a threaded discussion board
  • Browse, search, author pages, similar-book recommendations and a "Surprise me" pick
  • JWT auth with bcrypt; React, Vite, Tailwind and an Express + SQLite API in TypeScript
Overdue home page with a Popular Right Now row of book covers
03 Web · Next.js · Claude API

Lab Result Explainer

Turns a lab report PDF into a plain-language page a patient can actually read. AI does the transcribing and drafting, but two human gates sit in front of everything a patient sees, and it never diagnoses or gives treatment advice. Runs on synthetic data only.

  • A provider uploads a PDF, Claude extracts the values, and the provider verifies them before any are used
  • Deterministic code, not AI, classifies every result against the report's own printed ranges, backed by golden test fixtures
  • The explanation is grounded in MedlinePlus content and must be approved by the provider before it is sent
  • Critical results are held for a human call instead of being explained
  • Patient page is a date-of-birth-gated link with range markers, text-size toggle, print and an ask-a-question form, with no AI at view time
  • Next.js, TypeScript, Supabase, Vitest and Playwright
Patient results page explaining a cholesterol result in plain language
04 Mobile · React · Capacitor

Motivation

A gentle task app for people with ADHD or depression. Finishing small tasks earns XP, coins and streaks that grow a pixel-art companion you collect, dress up and build a room for. There is no guilt or punishment anywhere in the design.

  • Streak-freeze tokens and welcome-back bonuses instead of penalties, plus a "Just one thing" focus mode and a low-pressure Someday list
  • Eight companion species with color variants, outfits, treats and toys; a new companion unlocks every five levels
  • Decor shop on a separate coin currency so spending never lowers your level, plus a catch minigame and about 40 achievements
  • Activity heatmap, weekly recap and honest "this is your record, not a score" reflections
  • Streak-aware reminders, multiple profiles on one device and JSON backup; all data stays on the device
  • React, TypeScript, Vite and Capacitor for iOS and Android
Motivation app room view with a pixel-art fox companion and a 12-day streakMotivation app task list with daily routine and tags
05 Web · Node · Express

Fieldsheet

A trades directory built around real work instead of claims. Electricians, plumbers, roofers and other pros build a photo portfolio profile, get found through search, and receive booking requests they manage from their own dashboard.

  • Searchable directory with filters for ten trades
  • Pro profiles with bio, license number, avatar and a portfolio of up to 12 captioned photos
  • Booking requests tracked as new, contacted, booked or declined, with an email notification to the pro
  • Account signup and login with bcrypt and SQLite-backed sessions, and a dark/light theme
  • Express, better-sqlite3 and multer with a framework-free front end
Fieldsheet directory home page with trade filters and job cards
06 Web · Next.js

Kept Recipes

Strips the life story and ads out of recipe sites. Paste any recipe link and get a clean card with the photo, times, servings, a tick-off ingredient list and numbered steps, with no AI and no API keys.

  • Deterministic extraction from the page's schema.org recipe data via cheerio
  • A hardened server-side fetcher: SSRF protection, redirect re-validation, timeout and size cap
  • Saved recipes kept privately on the device, synced across tabs
  • Next.js, React, TypeScript and Tailwind
Kept Recipes showing an extracted guacamole recipe card

Contact

Want to work together, or just talk shop? Email me.

[email protected]