Noah Elsner

Portfolio

A mix of client work and projects of my own. The personal projects are mine end to end, so I can show them in full. Client and agency work is under NDA: the categories are public, the specifics are available on request.

Client & freelance work

Freelance and agency work since 2020, under NDA. I can walk through the specifics, screens and outcomes privately. Just ask.

Hospitality: mobile booking app
Hospitality: website and mobile app
Social Media: app features

Personal project, 2026, in progress

AdventuresApp

A React Native app for planning real-world meet-ups with friends, built solo from the database up. The backend is Supabase: a six-table Postgres schema with row-level security on every table, plus Edge Functions for the server-side pieces. Group chat runs on Stream Chat, authenticated through a JWT-verified Edge Function so the client never sees a raw API key. The app itself is Expo with Expo Router, Zustand for state, Google Places for picking locations, and photo uploads for event covers and the group feed. Push notifications, a top-to-bottom redesign and a few smaller features are still to come.

Stack and tools
App
React Native 0.81Expo 54Expo RouterZustand
Backend
SupabasePostgres with row-level securityEdge Functions
Services
Stream ChatGoogle PlacesExpo Image Picker
Photo feed
The home feed of photos from your groups, pulled live from Supabase.
Upcoming events
Upcoming and your own events, each with its date, time and place.
Plan an adventure
Creating an event: cover photo, who can see it, title, description and place.
Event detail
An event page with its place, dates and guests, plus links to chat and photos.
Guest list
Who is going and who is invited, with row-level security scoping who can see the list.
My role

Designed the schema, wrote the RLS policies and Edge Functions, built the app in React Native/Expo, and integrated Stream Chat. Solo, no team.


Personal tool, 2026, live

Ledger

A personal fitness tracker for logging workouts and watching progress over time. It works on the device first, with no Ledger account, and then syncs between your phone and laptop through a file in your own Google Drive, with no server of mine in between. It works offline, queues changes until you are back online, and shows a live map of which devices have synced and when. It includes a library of more than 750 exercises, past workouts can be logged and edited, and it can be installed to the home screen, where it updates itself when a new version ships. A rule-based coach reads the log and suggests the next workout, weighing which muscles have recovered against what is due in the rotation, with next-set targets by double progression and weekly sets per muscle checked against a range for your goal. An interactive body map shows the sets, recovery and last trained date for each muscle. A rest timer runs between sets. It lives at noahelsner.com/lab/fitness as the first tool in my Lab.

Stack and tools
Front end
React 19JavaScript (JSX)Custom SVG charts, no chart library
Build
ViteNetlify, proxied under /lab/fitness
Data
On-device storage (localStorage)Google Drive sync (drive.file scope, no server)Item-by-item merge with timestamps and deletion recordsOffline queue that syncs on open, on return and after each changeJSON export and importFree Exercise DB (public domain), 750+ exercises
App features
Google sign-in by OAuth redirect (works in the Home Screen app)Installable web app (manifest)Persistent storage requestSafe-area layout for the iPhone Home Screen appHour-long browser-only sign-in, one tap to reconnectEstimated one-rep max (Epley formula)Rest timer with a Web Audio beep and vibrationSelf-updating Home Screen app (checks for a new build on return)
Coach
Rule-based, no AI: recovery days, weekly sets per muscle, double progressionGoal setting (strength, size, cut, maintain) and tone settingInteractive body map: per-muscle sets, recovery and last trained, with drawings creditedNext workout picked from your history, or a new one built from rested musclesTested with the Node test runner
Design
Fraunces, Work Sans and JetBrains MonoDark UI built in plain CSS
Overview
The week at a glance: sessions, volume, bodyweight and streak, with deltas against the previous four weeks.
Lifts
A watchlist of exercises with sparklines, and an estimated one-rep max chart for the selected lift.
Log a session
Logging a workout, with search across more than 750 exercises or your own custom ones.
Body map
The Coach tab body map. Tap a muscle for its sets against the target range, when it was last trained and how recovered it is, and switch between sets and rest.
Train
A workout started from the coach, with a target for each exercise and the rest timer running after a set.
Sync
The Data tab: this device, the log file in your own Google Drive, and your other devices, each with when it last synced.
My role

Designed and built it solo, as a React app with on-device storage, Google Drive sync and a rule-based coach.