███████╗██╗ ██╗███╗ ██╗████████╗███████╗██████╗
██╔════╝╚██╗ ██╔╝████╗ ██║╚══██╔══╝██╔════╝██╔══██╗
███████╗ ╚████╔╝ ██╔██╗ ██║ ██║ █████╗ ██████╔╝
╚════██║ ╚██╔╝ ██║╚██╗██║ ██║ ██╔══╝ ██╔══██╗
███████║ ██║ ██║ ╚████║ ██║ ███████╗██║ ██║
╚══════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚══════╝╚═╝ ╚═╝
Building Synter
The Full Story — 103 Days, 5 Pivots, 1 Vision
September 11, 2025 → December 23, 2025
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 │
└─────────────────────────────────────────────────────────────┘
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 with D3.js ChartsSeptember 13, 2025

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.

Platform IntegrationsOctober 17, 2025

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.

Before: Dashboard-FirstNovember 2025

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
From a Python monolith to a chat-first IDE with sandboxed AI execution — built by humans and machines working together.
████████╗██╗ ██╗███████╗ ███████╗███╗ ██╗██████╗ ██████╗
╚══██╔══╝██║ ██║██╔════╝ ██╔════╝████╗ ██║██╔══██╗╚════██╗
██║ ███████║█████╗ █████╗ ██╔██╗ ██║██║ ██║ ▄███╔╝
██║ ██╔══██║██╔══╝ ██╔══╝ ██║╚██╗██║██║ ██║ ▀▀══╝
██║ ██║ ██║███████╗ ███████╗██║ ╚████║██████╔╝ ██╗
╚═╝ ╚═╝ ╚═╝╚══════╝ ╚══════╝╚═╝ ╚═══╝╚═════╝ ╚═╝