OpenAdOps is a local-first AI workspace for overseas app growth operators. It turns client briefs, rough media notes, and Google Ads / Meta Ads / TikTok Ads / AppsFlyer data into a structured strategy draft, an execution plan, an experiment ledger, optimization judgments, and client-ready reports.
简体中文 · English · Product · Roadmap · Contributing
- End-to-end loop: intake → strategy draft → plan → creative production → execution plan → experiment ledger → optimize → report
- Chinese-first UI in the product (English docs keep clear English names)
- Task-aware model routing: lighter models for questions/fast draft; stronger models for deep review and execution plans; automatic structure retry
- Optional performance targets: add or remove Media CPI, AF-CPI, CPA, and ROAS independently; keep a metric observation-only during learning instead of inventing a threshold
- Code does the math: KPI and experiment sizing are deterministic
- Workspace backup: export current project or full workspace as JSON; import with merge or replace
- Consistent model identity: all generation surfaces show the actual Terra / Sol variant and reasoning effort
- Sol for optimization diagnosis: optimization uses Sol high while strategy and creative judgments stay on Terra medium
- Handoff-ready creative production: market, format, quantity, owner, deadline, status, test variable, and export live in one task
- Reusable mapping profiles: save common media / AppsFlyer mappings at workspace level, auto-apply exact header matches, and carry them in full-workspace backups
- Traceable period comparison: compare two non-overlapping ranges with deterministic changes for spend, installs, CPI, CPA, and ROAS
- Optimization decision history: preserve every diagnosis with its data range, aggregate evidence, model metadata, operator review state, and report trail
- Actionable Codex failures: distinguish exit codes from termination signals, hide unrelated Skill logs, and limit Skill loading by task
- More reliable local runtime: preserve readable projects when storage migration cannot write back, and give explicit states for cancellation, offline service, and invalid responses
- Stale-process guard: warn when the page and local Bridge versions differ, with a concise action when port 4173 is already occupied
- Resilient local routing: malformed Host or request targets no longer take down the workspace service
- Auditable date periods: impossible calendar dates stay out of ranges and comparisons while affected rows remain explicit in aggregate totals
- Corrupt CSV rejection: duplicate headers and unterminated quoted fields fail at import instead of producing partial metrics
- Zero is not fake efficiency: CPI, CPA, and rate metrics with zero denominators stay unavailable while real zero outcomes remain zero
- Mock does not invent KPIs: target-multiple pause rules appear only when an AF-CPI threshold is explicitly configured
- Invalid numbers never silently become zero:
N/A,--, and other non-empty invalid cells block import by field; blanks are counted separately - Traceable data quality: blank-number and invalid-date warnings remain visible in optimization, reports, and the matching diagnosis history
- Stricter import integrity: row-width mismatches, broken numeric grouping, suffixed dates, and malformed backups fail before entering a project
- No attribution identity leakage: mapped AF installs remain the AF basis even when the total is zero instead of borrowing media installs
Paid media work is usually scattered across ad UIs, spreadsheets, screenshots, and chat. A generic LLM can write prose, but it rarely:
- keeps multi-step project context
- separates confirmed / inferred / missing facts
- guarantees CPI vs AF-CPI and sample-size math
OpenAdOps keeps one local project for the full loop:
- Intake — paste client material and media notes; structure a brief and clarification list
- Strategy draft — fast draft or deep review of a working strategy
- Plan / creative production — goals, media roles, budgets, then production quantities, specs, owners, deadlines, and delivery status
- Execution plan — campaign blueprints, production briefs, measurement layers, launch checks, first 7 days
- Experiment ledger — now / next / later queue with thresholds, evidence, and learnings
- Optimize — CSV metrics by code, evidence-backed diagnosis, and operator adoption / execution / validation notes
- Report — management HTML and print / PDF with recent optimization decisions
- Code calculates. Metrics, sample size, duration, relative change
- AI judges. Schema-validated strategy, diagnosis, and next actions
- Evidence stays attached to every claim
- Unknowns stay visible (confirmed / inferred / missing)
- Learning periods do not require fake KPIs: zero is not a target, and missing thresholds never become stop-loss or scale rules
- Execution output is handoff-ready (names, events, bids, single variables, owners)
- Launch checks have owners; blockers block “ready”
- Inconclusive is valid when sample thresholds are not met
- Local-first: browser storage; raw CSV rows are not sent to the model bridge
- Safe failure: errors instead of fabricated success
- Usable without an account: GitHub Pages mock demo
Open the live demo. Browser-only labeled demo data; no local model calls.
git clone https://github.com/leoL007/open-adops.git
cd open-adops
npm startOpen http://127.0.0.1:4173. No npm install — Node built-ins only.
npm run check| UI label | Requirements | Behavior |
|---|---|---|
| Local demo | None | Deterministic mock output; no model usage |
| GPT-5.6 · smart routing (backed by local Codex CLI) | Signed-in Codex CLI | Local Node bridge → codex exec with task-aware models |
Default routing (does not inherit a global ultra-high reasoning setting):
| Task | Default model | Effort |
|---|---|---|
| Client questions | gpt-5.6-terra |
low |
| Fast strategy draft | gpt-5.6-terra |
medium |
| Deep strategy review | gpt-5.6-sol |
high |
| Strategy / creative diagnosis | gpt-5.6-terra |
medium |
| Optimization diagnosis | gpt-5.6-sol |
high |
| Execution plan | gpt-5.6-sol |
high |
| Experiment ledger | gpt-5.6-terra |
medium |
Failed structure validation on Terra triggers one gpt-5.6-sol + medium retry. The UI distinguishes GPT-5.6 Terra / Sol, effort, timing, cancel, and sticky errors.
OPENADOPS_TERRA_MODEL=gpt-5.6-terra OPENADOPS_DEEP_MODEL=gpt-5.6-sol npm startLegacy overrides: OPENADOPS_MODEL, OPENADOPS_REASONING_EFFORT, OPENADOPS_TIMEOUT_MS (apply to all tasks — use carefully).
Optional Ads skills (e.g. Claude Ads) can deepen analysis; mock mode works without them.
The Creative Production page turns AI directions or execution-plan briefs into handoff-ready tasks:
- Platform, market, language, deliverable type, format, and version count
- Owner, deadline, and backlog / in progress / review / delivered / live status
- Angle, Hook, hypothesis, single variable, and success metric
- Asset link, production notes, and compliance requirements
- Manual tasks survive later AI refreshes; legacy creative plans migrate automatically
- UTF-8 CSV and Markdown export for creative and media teams
Turns intake + strategy draft into an operator handoff:
- Media roles and budget shares (no invented budgets)
- Campaign-ready naming, goals, events, geos, bidding, split logic
- Per-platform creative production briefs with one primary variable
- Media / MMP / business source-of-truth layers
- Launch checklist with status, owner, evidence (finance compliance gates included)
- Day 0–7 actions and decision rules
- Document / HTML export and local snapshots
Builds a cross-platform test queue from execution-plan creative briefs:
- One primary variable; control / variant / primary metric / guardrails frozen first
- Native methods for Google App asset experiments, Meta A/B, TikTok Split Testing
- Deterministic sizing for rate metrics; blank when baseline or traffic is missing
- Evidence, win / lose / inconclusive, learning, next action
- Exports and management-report rollup
See experiment methods.
Requires Spend and at least one of Media Installs or AF Installs.
| Dimensions | Metrics |
|---|---|
| Date, Platform, Country, Campaign, Ad group / Ad set, Creative, Conversion Event | Spend, Impressions, Clicks, Media Installs, AF Installs, Conversions, Revenue, D1 Retained |
- Common EN/ZH aliases; user can correct mapping before calc
- Save the current mapping as a workspace profile; exact header matches auto-apply and partial matches show an explicit match count
- Media installs and AF installs stay separate — an AF-only column is not bound to media installs
- Mapped numeric columns are quality-checked before calculation; invalid non-empty cells block import, while blanks treated as zero are explicitly counted
- A mapped date enables previous-vs-current comparison; raw rows stay transient and only aggregate evidence is persisted
- Demo file: openadops-demo.csv
npm run check115 automated tests cover intake, creative-production migration and export, execution plans, experiment ledgers, optimization decision history, workspace backup and migration safety, AI request errors, runtime-version checks, startup failures, request-target parsing, calendar-date validation, CSV row width and numeric quality, data-quality state, budget shares, undefined metrics, Mock KPI boundaries, static-server boundaries, CSV mapping profiles, period comparison, model routing and labels, optional performance targets, finance blockers, small-budget focus, experiment sizing, conversion-event identity, platform aliases, missing-data protection, AF/media install mapping, media CPI vs AF-CPI, aggregation, and schema validation. Tests never call a live model.
- CSV import (export XLSX to CSV first)
- Paste-text intake; no OCR yet
- Browser-local projects; no multi-user sync
- Planning and recommendations only — no live ad-account writes
- Google / Meta / TikTok + AppsFlyer app UA focus
- Attribution windows and profit definitions still need operator judgment
More: PRODUCT.md · benchmarks · experiments · user cases · decisions · releasing
Early public release. See the roadmap, open a feature request, or contribute adapters.
MIT. Independent open-source project; not affiliated with Google, Meta, TikTok, AppsFlyer, or OpenAI.
