LLM Cache · Source: https://syntermedia.ai/story · Markdown version · Cache Index · 1249 words · Cached: 9/8/2026

Synter - The AI Agent Operator for Ads

Skip to main content

    ███████╗██╗   ██╗███╗   ██╗████████╗███████╗██████╗ 
    ██╔════╝╚██╗ ██╔╝████╗  ██║╚══██╔══╝██╔════╝██╔══██╗
    ███████╗ ╚████╔╝ ██╔██╗ ██║   ██║   █████╗  ██████╔╝
    ╚════██║  ╚██╔╝  ██║╚██╗██║   ██║   ██╔══╝  ██╔══██╗
    ███████║   ██║   ██║ ╚████║   ██║   ███████╗██║  ██║
    ╚══════╝   ╚═╝   ╚═╝  ╚═══╝   ╚═╝   ╚══════╝╚═╝  ╚═╝
          

Building Synter

The Full Story — 103 Days, 5 Pivots, 1 Vision

September 11, 2025 → December 23, 2025

8,437
Commits
876K
Lines Added
5
Major Pivots
146
AI Commits
Pivot #1
September 11, 2025 — Day 1
From ai-advertising to Synter

The first commit tells the story: "Rebrand from ai-advertising to Synter - AI Advertising Agency." A FastAPI backend, Railway deployment configs, and a vision document that would guide everything that followed.

Architecture v1: Python Monolith
graph LR subgraph "Railway" A[FastAPI] --> B[(MySQL)] A --> C[Redis Queue] C --> D[Workers] end E[User] --> A style A fill:#1a1a2e,stroke:#c9f554 style B fill:#1a1a2e,stroke:#38bdf8 style C fill:#1a1a2e,stroke:#f59e0b style D fill:#1a1a2e,stroke:#a78bfa

┌─────────────────────────────────────────────────────────────┐
│  Day 1 Commits                                              │
│  ─────────────────────────────────────────────────────────  │
│  d31b2ff  Rebrand from ai-advertising to Synter             │
│  ef6e0df  Add Railway deployment configuration              │
│  e499e68  Fix nixpacks.toml: remove duplicate section       │
│  97061ff  Fix nixpacks.toml: properly configure Python      │
│  c027f8f  Fix nixpacks.toml: correct providers syntax       │
│  6d3f2b7  Fix nixpacks.toml: use ensurepip                  │
│  fcead60  Simplify nixpacks.toml                            │
│  f947cbb  Simplify deployment                               │
│  ─────────────────────────────────────────────────────────  │
│  13 commits in one day — the deployment dance               │
└─────────────────────────────────────────────────────────────┘
              
138
Commits
13,113
Lines Added
Pivot #2
September 12-13, 2025 — Days 2-3
Python → Next.js

In 48 hours, the entire frontend shifted from Python templates to Next.js 15. D3.js charts, a settings panel, auth sessions, RBAC — 22,000+ lines in a single day.

PPC Dashboard
PPC Dashboard with D3.js ChartsSeptember 13, 2025
Dashboard Overview
Dashboard OverviewOctober 17, 2025
Architecture v2: Next.js + Python Backend
graph TB subgraph "Vercel" A[Next.js 15] --> B[API Routes] end subgraph "Railway" C[FastAPI] --> D[(PostgreSQL)] C --> E[Redis] end B --> C F[User] --> A style A fill:#1a1a2e,stroke:#c9f554 style B fill:#1a1a2e,stroke:#38bdf8 style C fill:#1a1a2e,stroke:#f59e0b style D fill:#1a1a2e,stroke:#a78bfa
October 2, 2025 — Day 22
Multi-Platform Ad Vault

The first major feature: OAuth connections to Google Ads, LinkedIn, Microsoft, Reddit. A credential vault with auto token refresh. The foundation for cross-platform campaign management.

Integrations
Platform IntegrationsOctober 17, 2025
Onboarding
Onboarding FlowOctober 17, 2025
OAuth Token Management
sequenceDiagram participant U as User participant S as Synter participant P as Ad Platform participant DB as PostgreSQL U->>S: Connect Platform S->>P: OAuth Redirect P->>S: Auth Code S->>P: Exchange for Token P->>S: Access + Refresh Token S->>DB: Store Encrypted Note over S,DB: Auto-refresh before expiry
Pivot #3
November 11, 2025 — Day 62
The AI Enters

Amp makes its first commits. The codebase gains a collaborator. 439 commits in one day — 16 files touched by AI. The vision of human-machine collaboration becomes real.

Joel
"Apparently these are moats for YC startups — please review and let me know how this compares to Synter."
Amp
"Your strongest near-term play is Counter-Positioning + Speed. The 'Cursor for ad campaigns' vision directly challenges legacy dashboard tools that can't cannibalize their own seat-based revenue."
Nov 11
First AI commits appear
16 files touched by Amp
Nov 16
625 commits in one day
Massive feature push
Nov 22
Campaign IDE redesign
"Chat-first interface (Cursor-style)"
Nov 24
Claude joins
Second AI collaborator
Pivot #4
November 22, 2025 — Day 73
Dashboard → Chat-First IDE

The biggest pivot: "Redesign Campaign IDE landing as chat-first interface (Cursor-style)." No more dashboards with forms. Just describe what you want, and the AI builds it.

Dashboard Era
Before: Dashboard-FirstNovember 2025
Campaign IDE
After: Chat-First IDEDecember 2025
Campaign IDE Architecture
graph TB subgraph "Campaign IDE" A[Chat Interface] --> B[AI Agent] B --> C[Tool Registry] C --> D[Google Ads API] C --> E[LinkedIn API] C --> F[Reddit API] C --> G[Analytics APIs] B --> H[Document Editor] H --> I[YJS Real-time] end style A fill:#1a1a2e,stroke:#c9f554 style B fill:#1a1a2e,stroke:#38bdf8 style C fill:#1a1a2e,stroke:#f59e0b
Joel
"I started building campaign memory with a RAG model. Accept/Reject is good — we have it in the agent, yet I don't know if it's really being incorporated."
Amp
"Found the gap. The feedback is being collected but never retrieved to influence future responses. It's write-only. Let me implement the feedback loop to close it."
November 25, 2025 — Day 76
The Nango Migration

Four major refactors in one day: "Switch all ad platforms to use Nango authentication." Migrate to NextAuth.js v5. Move all OAuth flows to frontend. Remove Railway backend dependency for auth.

Before: Custom OAuth per Platform
graph LR A[Frontend] --> B[Railway Backend] B --> C[Google OAuth] B --> D[LinkedIn OAuth] B --> E[Meta OAuth] B --> F[Reddit OAuth] style B fill:#1a1a2e,stroke:#ef4444
After: Unified Nango Flow
graph LR A[Frontend] --> B[Nango] B --> C[All Platforms] B --> D[Token Refresh] B --> E[Webhook Sync] A --> F[Vercel API] F --> G[(PostgreSQL)] style B fill:#1a1a2e,stroke:#c9f554
December 4-6, 2025 — Days 85-87
Teaching the Agent to Think

The Oracle enters: GPT-5 reasoning for complex analysis. Business profile inference. Funnel blueprints per company type. The agent learns to think differently about enterprise vs. SaaS customers.

Joel
"Investigate why the agent continues to focus solely on PostHog tracking. For enterprise customers, PostHog tracking is not always the right fit — they use offline conversion APIs."
Oracle
"Synter is PostHog-biased because PostHog is treated as the 'analytics truth' in tool definitions. The simplest fix is to infer a business profile for each workspace, define a funnel blueprint per business type, and wire that into system prompts."
Business Profile → Funnel Intelligence
graph TB subgraph "Profile Inference" A[CRM Connected?] --> B{Business Type} B -->|Enterprise| C[Pipeline Focus] B -->|SaaS| D[Subscription Focus] B -->|E-commerce| E[Transaction Focus] end subgraph "Funnel Blueprint" C --> F[Ads → Web → CRM → Revenue] D --> G[Ads → Product → Conversion] E --> H[Ads → Cart → Purchase] end style B fill:#1a1a2e,stroke:#38bdf8 style C fill:#1a1a2e,stroke:#c9f554 style D fill:#1a1a2e,stroke:#f59e0b style E fill:#1a1a2e,stroke:#a78bfa
Pivot #5
December 22-23, 2025 — Days 103-104
Agent Autonomy

The final frontier: teaching the agent to execute code. E2B sandboxed execution. Approval workflows. Script catalogs. The agent becomes truly autonomous.

Sandboxed Execution Architecture
graph TB subgraph "Agent" A[Chat Request] --> B[Tool Selection] B --> C{Needs Code?} end subgraph "Sandbox Orchestrator" C -->|Yes| D[Script Catalog] D --> E[E2B Sandbox] E --> F[Isolated VM] F --> G[stdout/stderr] end subgraph "Safety" H[Egress Allowlist] --> E I[Approval Flow] --> D J[Audit Log] --> E end C -->|No| K[Direct Tool Call] G --> L[Response] K --> L style E fill:#1a1a2e,stroke:#c9f554 style I fill:#1a1a2e,stroke:#f59e0b
Amp
"Done! The sandbox executor is deployed to Railway. E2B stdout capture is working. Phase 3b complete."

┌─────────────────────────────────────────────────────────────┐
│  Sandbox Implementation Phases                              │
│  ─────────────────────────────────────────────────────────  │
│  ✓ SYN-94  Disable broken execute_python in production      │
│  ✓ SYN-95  Implement constrained HTTP API tool              │
│  ✓ SYN-96  Formalize Python script catalog                  │
│  ✓ SYN-97  Design sandboxed executor architecture           │
│  ✓ SYN-98  Build sandbox orchestrator service               │
│  ✓ SYN-99  Implement approval workflows                     │
└─────────────────────────────────────────────────────────────┘
              

103 Days Later

Final Architecture
graph TB subgraph "Frontend - Vercel" A[Next.js 15] --> B[Campaign IDE] B --> C[Chat Interface] B --> D[Document Editor] D --> E[YJS Real-time] end subgraph "Backend - Railway" F[FastAPI] --> G[E2B Sandbox] F --> H[Script Catalog] end subgraph "Services" I[Nango OAuth] --> J[6 Ad Platforms] K[PostgreSQL] --> L[pgvector RAG] M[Stripe] --> N[Billing System] end subgraph "AI Layer" O[Claude/GPT] --> P[Tool Registry] Q[Oracle] --> R[Deep Reasoning] S[Feedback Loop] --> T[Memory System] end C --> O C --> F A --> I A --> K A --> M style B fill:#1a1a2e,stroke:#c9f554 style O fill:#1a1a2e,stroke:#38bdf8 style I fill:#1a1a2e,stroke:#f59e0b
8,437
Total Commits
876,298
Lines Added
254,819
Lines Removed
6
Ad Platforms
146
AI Commits

From a Python monolith to a chat-first IDE with sandboxed AI execution — built by humans and machines working together.


   ████████╗██╗  ██╗███████╗    ███████╗███╗   ██╗██████╗ ██████╗ 
   ╚══██╔══╝██║  ██║██╔════╝    ██╔════╝████╗  ██║██╔══██╗╚════██╗
      ██║   ███████║█████╗      █████╗  ██╔██╗ ██║██║  ██║  ▄███╔╝
      ██║   ██╔══██║██╔══╝      ██╔══╝  ██║╚██╗██║██║  ██║  ▀▀══╝ 
      ██║   ██║  ██║███████╗    ███████╗██║ ╚████║██████╔╝  ██╗   
      ╚═╝   ╚═╝  ╚═╝╚══════╝    ╚══════╝╚═╝  ╚═══╝╚═════╝   ╚═╝   
          
Synter - The AI Agent Operator for Ads