About

Dan Friedman

I'm a musician who learned to code but mainly I have ideas. Now with AI I can bring ideas to life in days that would've taken months previously.

Technical tools I work with

A rough inventory across the projects on this site. The list reflects what's actually in the repos, not what I'd put on a résumé.

AI / LLM workflow
Claude Code is the daily driver: agentic coding sessions, custom skills that run recurring pipelines (a news digest rebuilt three times a day, a read-later queue drained and annotated on a schedule), headless runs fired by launchd, and a six-persona AI review board for pushing projects from 80% done to shipped. ChatGPT for research and second opinions. Claude and GPT models via API inside the apps themselves: vision tagging, structured extraction, translation, place classification. whisper.cpp for local transcription. The division of labor is consistent: AI does the volume work, the editorial judgment stays human.
Mobile (iOS)
SwiftUI (iOS 17+), SwiftData, CoreLocation with distance-filtered updates and geofencing, Share Extensions as ingest surfaces (read-later saves, menu photos), iOS Keychain, AVSpeechSynthesizer, Siri / Shortcuts integration, xcodegen-driven project layout, Sign in with Apple (planned for multi-user apps), App Store IAP loop.
Backends
Python 3.11+ with FastAPI and uvicorn. SQLite for read-heavy single-user apps (with hit-counted caches keyed by hashed prompts/queries); Postgres 16 + Alembic where an app has gone multi-user (More Than Salad's shared analysis cache); SQLModel elsewhere. .ics calendar feeds where useful. Static web clients served from the same FastAPI mount.
Web frontends
Next.js 14/15 (App Router) with React, TypeScript, and Tailwind. Drizzle ORM over better-sqlite3, built so the move to Postgres is a driver swap. react-map-gl + Mapbox GL JS for map-first UIs. Jinja2 server rendering where a build step isn't earning its keep.
AI / structured output
Anthropic Python SDK with Claude (Haiku 4.5 for cost-sensitive high-volume vision tagging, Sonnet/Opus for heavier reasoning). Pydantic v2 schemas passed to messages.parse() so structured output validates without regex. Prompt versions baked into cache keys so prompt edits invalidate stale entries transparently.
Data wrangling
Pydantic models, pandas for the trading bot's analytics layer, DuckDB for crawl experiments over open places data, Pillow + pillow-heif for iPhone HEIC handling, EXIF parsing for DateTimeOriginal / GPS, JSONL as append-only resumable log format. lxml for KML/XML parsing. Hand-reconciled grant data across 11 funders for the Animal Funder project.
Geo / CAD
shapely for polygon math, pyproj for coordinate transforms, simplekml for KMZ output, ezdxf for AutoCAD-compatible DXF (with PDF underlay and legacy IMAGE-entity paths), USDA NAIP aerial imagery, ArcGIS REST API for parcel and assessor data.
External APIs
Google Places (with my own place-classification cascade for "what kind of place am I in"), Airtable REST + Meta API via pyairtable (with typecast=True so controlled vocabularies grow organically), Google Drive as canonical photo storage, OpenAlex + Europe PMC + Unpaywall for literature mining, a brokerage REST API for paper trading, OpenAI for one project that pre-dates the Anthropic standardization.
HTTP / resilience
httpx with tenacity for retries, custom rate limiters per source, aiosqlite for async caching of expensive API calls.
CLIs & tooling
Typer for command-line surfaces (always with a --verbose, always resumable from on-disk state), Jinja2 templates for thin web frontends layered over the same code, Python entry-point scripts so a project's CLI becomes $ sitescan rather than python -m.
Infra & deploy
Hetzner VPS, Docker + Docker Compose per app, Caddy reverse proxy with automatic HTTPS on per-app subdomains, per-repo GitHub deploy keys, manual git pull + docker compose up -d --build deploy step (no CI yet; the stack is small enough that the friction is honest).
Editorial / corpora
Markdown files in a Git-versioned corpus repo, separated from the application code that serves them. Small ingest scripts produce SQLite that the backend reads. Hand-styled HTML rendered to single-scroll PDFs with headless Chrome for designed documents. Editorial principles live in the corpus repo's README and are re-read whenever the temptation to add something clever arises.

Contact

The best way to reach me is by email: dan@munjackmill.com. I read everything and answer most of it within a few days.