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

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

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 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
Current Role
What I Do Now
I'm currently an SEO Consultant at Botify, advising enterprise ecommerce brands on technical SEO and how they show up across AI search. My work sits where search craft meets the systems behind it: structured data, product feeds, content operations, analytics, and the automation that ties them together.
I help teams make sure their products can be found, understood, and recommended wherever people are now making decisions, then measure whether it is working and improve from there.
Perspective
On the Future of Search
The way people search is changing faster than most teams can re-tool for. A question that used to mean a query, a results page, and a click can now be answered inside an AI assistant, an answer engine, or a product feed, sometimes without a visit at all. The demand has not gone anywhere. People still need to find products, compare them, and decide, and more of that now happens with AI in the loop.
For ecommerce brands, this raises the bar on the fundamentals. Content and technical foundations still matter, and they now sit inside a larger system of structured data, product information, feeds, and the content operations that keep all of it accurate. The brands that win the agentic shopping surface are the ones whose product data and schema are correct, complete, and readable by machines that often do not execute JavaScript.
Measurement is changing too. AI answers are non-deterministic, so visibility shifts from run to run and model to model. An honest read means building representative query sets, sampling across surfaces, and being careful about what counts as a citation, a mention, or a recommendation. I would rather measure that carefully than sell certainty about it.
