Selected Work
Projects
Hands-on builds across RAG, AI-powered outbound, CRM enrichment, and AI search visibility.

A full-stack RAG application that transforms my grandfather's 200-page WWII memoir into an interactive conversational experience, built for his 103rd birthday.
- RAG Engine: LlamaIndex and FastEmbed for local retrieval; GPT-4o for summarizing the response.
- Custom Voice: ElevenLabs voice cloning of my grandpa's voice for immersive book excerpt readings.
- Architecture: Decoupled FastAPI backend on Render with a responsive Vercel frontend.
- Python
- LlamaIndex
- GPT-4o
- ElevenLabs
- Vercel
- Render

An end-to-end n8n workflow that leverages Apify to mine LinkedIn job listings for growth signals at small plumbing businesses, then generates 1:1 personalized outreach.
- Signal Capture: Apify's LinkedIn Jobs Scraper pulls plumbing companies hiring for Sales, Dispatch, or Operations roles, a proxy for shops outgrowing their manual processes.
- Qualification & Contact Resolution: Rule-based filters narrow to US-based shops under 200 employees, then a GPT-4o-mini classifier buckets each job description as High, Low, or No Intent; qualified leads pass to AnyMailFinder's /decision-maker endpoint to resolve verified Sales contacts via webhook.
- Research-Driven Personalization: Perplexity sonar-pro runs a per-company query prioritizing geographic expansion, public recognition, and team growth, then GPT-4o converts that structured JSON into a single observational opener with cascading fallback logic.
- n8n
- Apify
- AnyMailFinder
- Perplexity Sonar
- OpenAI GPT-4o
A fully self-hosted enrichment proof-of-concept that auto-researches new HubSpot contacts and writes structured intelligence back to the record. Deployed end-to-end on Railway.
- Infrastructure: Railway's "n8n with workers" template provisions a four-service production architecture (n8n Primary, Worker, Postgres, Redis).
- Orchestration: n8n listens for HubSpot contact.creation webhooks, fetches the full record, calls the Python service and writes results back via the native HubSpot node.
- Enrichment: A stateless FastAPI endpoint runs a domain-aware Perplexity sonar-pro query to research the partner's services and territory, returning a normalized summary and fit score.
Next iteration: a human-in-the-loop review queue before CRM write-back to catch hallucinated summaries and edge-case misclassifications before they hit the source of truth.
- Self-hosted n8n on Railway
- Python
- Perplexity Sonar
- HubSpot

A Streamlit tool that shows how Gemini expands a search query, which sources it cites, and how often a target domain appears in AI-generated answers.
- Query Fan-Out: Runs the same query multiple times through Gemini with Google Search grounding to capture hidden subqueries and citation patterns.
- Share of Voice: Labels cited URLs as Target or Other, then calculates how much visibility a chosen domain has across Gemini's cited sources.
- Content Gap Analysis: Compares top-cited competitor pages against the target page using embeddings to surface on-page opportunities.
- Python
- Streamlit
- Gemini API
- Google Search Grounding
- pandas
- sentence-transformers
- scikit-learn
A two-part n8n workflow to handle post-event lead intake. Automatically enrich prospects against ICP criteria leveraging Firecrawl, then send enriched prospects to Google Sheets for a rep to provide a HITL review. The user can choose which prospects to add to HubSpot through an Apps Script integration.
- Intake & Enrichment: Badge-scan data is parsed and enriched against ICP criteria using Firecrawl.
- Human-in-the-Loop: Enriched prospects land in Google Sheets where a rep reviews and selects who advances.
- CRM Sync: Selected prospects are pushed to HubSpot through an Apps Script integration.
- n8n
- Firecrawl
- Google Sheets
- Apps Script
- HubSpot
Track Record
Brands I've worked with
A decade of search, growth, and revenue operations work across SaaS, retail, finance, and media.
- Bare Minerals
- Bonobos
- Botify
- Credit One Bank
- DC Universe
- Discogs
- Guess Jeans
- Human Interest
- ID.me
- Lucky Brand Jeans
- P&G
- Visa
- Walgreens
- Walmart
