Feta AI (in production)
Feta AI is a comprehensive agency management operating system I architected and built as a co-founding engineer. It serves as the central hub for a digital marketing agency, managing everything from client relationships and contracts to ad performance, SEO strategy, and team task coordination. AI is woven throughout, from intelligent task creation and communications analysis to keyword research and content planning.
Challenge: Agency teams were juggling fragmented tools for CRM, analytics, task management, SEO, and client delivery, which created operational drag and weak executive visibility. Solution: As a co-founding engineer, I designed and built a unified platform that brings client ops, reporting, AI workflows, and marketing tooling into one multi-tenant system with strong access control and automation. Impact: The result is a central operating layer that supports day-to-day execution, strategic reporting, and scalable service delivery for a real agency business.
- CRM & Client Management: Full company, people, and contact management with activity timelines, communication history, and service assignment tracking across 150+ client accounts.
- Contract Lifecycle: End-to-end contract management with PDF generation, e-signatures, billing breakdowns, auto-renewal tracking, and $253K annual TCV monitoring.
- AI Task Management: Task system with AI-powered task creation from natural language, templates, subtasks, priorities, and automated notifications via Inngest workflows.
- Analytics Dashboards: Unified dashboards pulling data from Google Analytics 4, Google Ads, Meta Ads, Search Console, and PageSpeed with AI-generated insights.
- SEO Suite: Keyword research, competitor scorecards, site maps, content planning, keyword position tracking, SERP analysis, and AI-powered content editing.
- Google Ads Toolkit: Campaign builder, RSA ad writer, budget calculator, negative keyword manager, ad strength analyzer, and keyword research integrated with the Google Ads API.
- Executive Command Center: Communications digest, G Suite integration, mail management, recruiting tools, and high-level performance overviews for agency leadership.
- Data Sync Engine: Idempotent, retry-safe sync pipelines for GA4, Google Ads, Meta Ads, and Search Console across hundreds of accounts, run on Inngest job and scheduled queues. Error-classified logging, full vs. partial re-syncs, fan-out per account, and fan-in roll-ups so franchise and multi-location businesses get one unified dashboard.
- Multi-Company Architecture: Multi-tenant system supporting 150+ client companies with role-based access, impersonation, and per-company data isolation via Supabase RLS.
Built with Next.js 16, React 19, Supabase, Tailwind, React Query, Inngest, Anthropic, OpenAI, Google APIs, Sentry, Resend, Stripe
AdPacer AI (offline)
AdPacer AI is a standalone SaaS product I conceived, designed, and built entirely on my own. It solves a real problem for ad agencies and in-house teams, keeping ad spend on pace with monthly budgets. The platform connects to Google Ads via OAuth, pulls real-time spend data, and provides pacing dashboards with AI-powered forecasting to predict end-of-month spend.
Challenge: Marketing teams needed a faster way to spot pacing problems before budgets drifted off target, without relying on manual spreadsheet checks and delayed reporting. Solution: I built a focused SaaS product that connects directly to Google Ads, forecasts spend trajectory, and wraps the full product in self-serve billing and multi-org account management. Impact: It demonstrates full-stack product ownership, from go-to-market landing page and onboarding flow to the core forecasting experience and billing engine.
- Google Ads OAuth Integration: Full OAuth 2.0 flow for connecting Google Ads accounts, with MCC support for agency-level access to multiple client accounts.
- Budget Pacing Dashboard: Real-time pacing calculations showing daily spend vs. target, projected end-of-month spend, and alerts for over/under-pacing campaigns.
- AI Forecasting: ML-powered spend forecasting using historical patterns, seasonality, and current trajectory to predict month-end budget utilization.
- Stripe Billing: Complete subscription management with Stripe, including signup, plan selection, payment processing, and lifecycle handling.
- Multi-Org Architecture: Support for multiple organizations with team invitations, role-based access, and per-org Google Ads account connections.
- Polished Landing Page: Marketing site with animated background, typewriter hero, bento grid features, pricing section, and smooth scroll powered by GSAP and Lenis.
Built with Next.js 15, React 19, Supabase, Stripe, Framer Motion, GSAP, Google Ads API, Anthropic, OpenAI, Recharts
Fleet Command Center (prototype)
When several AI agents build in separate git worktrees at once, the hard part stops being the code. It becomes knowing which lane serves which task, which lanes touch the same files, what is waiting on me, and what is safe to clean up. Fleet Command Center puts all of that on one animated terminal screen, so I don't have to hold it in my head.
The terminal UI is a working prototype that runs on a snapshot file. The live layer (git, GitHub, tmux and task-board sync) is specified but not built yet.
- Spin-up asks once. Starting a lane asks one question: which project or task is this for? It pulls project, milestone and task from the task board, then links the worktree.
- A singleton hub. tmux decides whether the hub is running. If it is, the new lane just animates in. If not, one detached session starts. If two start at once and the name is taken, that counts as running. No PID files.
- The link is declared once. The worktree-to-task link is written to git config, so it travels with the branch, and to a link file the hub watches. Links are many-to-many. A link the AI inferred is drawn dashed with a ? until it is confirmed.
- The board follows the code. Each board lane maps to a code stage. Cards move as a side effect of linking, pushing and merging. Merges done elsewhere are caught through gh and queued for one-key approval.
- Every write is previewed. A board move or task-description update is shown before and after, then confirmed with one keypress. If the board is unreachable, writes wait in a queue and are never dropped silently.
- One hub, ever. One tmux session named fleet-hub. Every spin-up joins the hub that is already running instead of starting another.
- Declare the link once, at spin-up. Ask once when the lane starts and store the answer in git config and in a watched link file.
- The board follows the code. Map the four board lanes to four code stages and move cards as a side effect of linking, pushing and merging, through a single board-move call. Cards never move across workspaces.
- Preview every write. Every write is shown first and confirmed with one keypress. Description updates replace only a short “From the build” section, at most three plain-language bullets.
- Show commands, never run them. The hub never runs git or shell commands. It shows the command, like git wt remove <name>, and a person or an agent runs it.
- Keep live data and AI judgment apart. A live layer polls git, gh, tmux and the board with no AI. A judgment layer calls Claude (claude -p) on demand, at most every 30 minutes, and caches the result with its age.
- Visual before verbal. Motion and markers carry status: ◆ board vs ● code (merging into ◉ when they agree), a ↯ line between lanes that share files, one ▪ per worktree in each cleanup zone. Text is short labels.