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.cppfor 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.
.icscalendar 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-heiffor iPhone HEIC handling, EXIF parsing forDateTimeOriginal/ 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(withtypecast=Trueso 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
httpxwithtenacityfor retries, custom rate limiters per source,aiosqlitefor 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$ sitescanrather thanpython -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 --builddeploy 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.