Dillon Haffner — Realtor® & Product Engineer

I don't just sell homes. I build the software that runs the business.

Licensed real estate agent by day. The rest of the time, I'm shipping native SwiftUI apps and full-stack web platforms — usually solo, usually with an AI-assisted engineering workflow standing in for a dev team.

$
Scroll
0native SwiftUI apps, shipped across iPhone, iPad & Mac
0real Temecula wineries — geocoded and researched, never guessed
0CRM modules running against my own live production data
0scraped logos or photos — every asset original or licensed

Under the hood

What I actually work with

Not a bullet-point list of buzzwords — this is the stack behind the three projects below, plus the process that keeps a solo build honest.

Native Apple Platforms

  • SwiftUI across iOS, iPadOS & macOS from one codebase
  • Real Liquid Glass (.glassEffect()), not a faked web imitation
  • SwiftData + CloudKit sync for data that survives a lost device
  • ARKit / RealityKit for GPS-gated AR experiences

Web & Backend

  • React + Vite single-page apps, deployed on Netlify
  • Supabase — Postgres, Auth, and Row-Level Security policies
  • Passkeys and TOTP 2FA hardening for real client logins
  • Privacy-consent gates for data multiple users can see

Geospatial & Real-World Data

  • CoreLocation geofencing for proximity-gated features
  • Live 3D MapKit flyover imagery instead of scraped photos
  • CLGeocoder-verified coordinates for every real address
  • Parallel research passes for facts, never invented content

Engineering Process

  • CLI-only build/verify loop — XcodeGen, xcodebuild, simctl
  • AI-assisted, agent-orchestrated engineering workflow
  • Every feature verified against real production data first
  • Copyright-conscious product decisions, made deliberately

Selected work

Three things I built recently

One rebuilt from the ground up, one hardened for a real launch, one built purely because it was a fun idea worth shipping well.

Dashboard
Good afternoon
4 things need your attention
Follow-ups, birthdays & touchpoints
18Contacts
3This week
2Active deals

↑ that's the real Theme Customizer's accent picker — try it

Native · SwiftUI · iOS / iPadOS / macOS

SBH CRM — rebuilt my own CRM from scratch

My real estate CRM started as a web app. The glass effects were faked and expensive to render, so I rebuilt it natively in SwiftUI to get real Liquid Glass instead — one codebase running on iPhone, iPad, and Mac.

Six tabs (Dashboard, Contacts, Pipeline, Route, Activity, Settings), full CRUD across five live Supabase tables, a route planner wired into Google Maps, and a Theme Customizer with ten wallpaper gradients and a live accent picker — the same one animating on the left. Every screen was clicked through against my actual production data, which is how a dashboard contrast bug and a duplicate back-button bug got caught before they mattered.

SwiftUISupabaseXcodeGenLiquid GlassCross-platform

New Lead

Initial consultBooked · Thu
Proposal requestAwaiting reply

In Progress

Site visitScheduled tomorrow
Full estimateQuote sent

Complete

Contract signedSigned off
Final walkthroughFollow-up sent
72%Win rate this quarter

Illustrative data — a real client's pipeline runs here

Web · React · Supabase · Netlify

A client web platform — hardened for a real launch

A web platform for a small sales team: React + Vite on the frontend, Supabase (Postgres, Auth, Row-Level Security) on the backend, deployed on Netlify. Warm cream, earthy palette, no dark mode — by their design preference, not mine.

Before the real launch I ran a full pre-launch audit: fixed a foreign-key bug on new-deal creation, corrected the overdue-date math for deals with no due date, resolved a chart overflow, and hardened the passkey and beta-invite calls. Added a privacy consent gate — every user acknowledges, with a timestamp, that what they enter is visible to admins — and deliberately held passkeys back from the beta since a passkey's relying-party ID is permanent once enrolled, and the permanent domain wasn't live yet.

ReactViteSupabase RLSNetlifyPasskeys / TOTP
Wine Passport map tab showing pins for 45 real Temecula wineries Winery detail page with a live 3D MapKit flyover snapshot and a fun-fact popup Passport tab showing collected hand-drawn ink-stamp badges Stamp Collected celebration screen after finding a winery in the AR hunt Help Me Pick recommendation quiz intro screen

Map — 45 real wineries, every pin geocoded from a real address

Temecula Wine Passport app icon Native iOS · ARKit · MapKit · CloudKit

Temecula Wine Passport — an app that markets my business by being genuinely fun

All 45 real Temecula-area wineries, every address geocoded and every "known for" fact researched — not invented. Visit one in person and a ~150m geofence unlocks an ARKit camera hunt for a hand-drawn, three-piece collectible stamp; the pieces are custom SwiftUI Shapes, not stock icons. Progress lives in SwiftData and syncs through CloudKit, so losing a phone doesn't lose a collection.

Winery pages show a live 3D MapKit flyover of the real property instead of a scraped photo — real imagery, zero copyright risk. A "Help Me Pick" quiz recommends wineries from real review-sourced attributes, and the splash screen and a quiet "Moving?" tab tie it back to my brokerage — no outbound link, just a native lead form.

ARKitCoreLocationMapKit 3DSwiftDataCloudKit

Process

How it actually gets built

There's no Xcode GUI or dev team in this workflow — just a terminal, a simulator, and a habit of never shipping a guess.

$

Geocode, don't guess

The first pass at the winery map used hand-estimated coordinates — off by miles, smeared into a line that didn't match the real corridors. Every address now runs through a real geocoder before it goes in the app.

Research, don't invent

Every winery's phone number, hours, and "did you know" fact came from real sources across parallel research passes — not generated copy dressed up to look researched.

Verify against real data

New CRM features get built, then clicked through against my actual production Supabase data before I call them done — not just a placeholder demo that happens to render.

Build history

What shipped recently

Jul 13, 2026

SBH CRM — Milestone 3

The native Liquid Glass shell compiles and runs against live production data — real contacts, a real transaction, real theme settings.

Jul 13, 2026

SBH CRM — Milestone 4

A ten-item polish pass: confirmation prompts, picker fixes, custom wallpaper upload, and a tab-bar refresh bug closed out.

Jul 14, 2026

Temecula Wine Passport — scaffolded, then expanded

GPS geofencing + ARKit hunt architecture decided, then the winery list expanded to all 45 real locations with researched, geocoded data.

Jul 14, 2026

3D flyover imagery replaces scraped photos

Winery detail pages get a live MapKit flyover snapshot; hand-drawn stamp pieces replace stock icons for the AR hunt reward.

Jul 15, 2026

A client platform — pre-launch audit

RLS hardening, a privacy consent gate, and a clean production build ahead of a real weekend beta.

Jul 16, 2026

This page

Built the same way as everything above it.

Full circle

Same rigor. Different client.

I hang my license with Coldwell Banker Associated Brokers Realty, a top-producing brokerage serving Temecula Valley and North County San Diego since 1983 — five-star reviews, straight answers, fast replies. The interactive market map and 3D property tour on my main site were built with the exact same care as everything above.

See the real estate side →