1. Collector
Pulls every relevant signal in parallel from your Appeeky data and your synced App Store Connect tables. The collector is dumb on purpose — it never decides anything, it just assembles aCollectorPayload.
What it pulls per run:
ASO brief is the only signal we don’t refresh daily — it changes slowly and costs API credits, so we refresh it weekly.
2. Reasoner
Two-phase LLM pipeline using the Vercel AI SDK:Phase 1 — Research (skipped in quick mode)
generateText with tools. The model can drill into specific keywords, competitors, or memory facts before producing the report. The agent autonomously decides what’s worth investigating.
Phase 2 — Synthesis
generateObject with a strict Zod schema (DailyReportSchema). The model receives:
- The full collector payload as text
- Phase-1 research findings
- Active memory facts (“this app is for X”, “owner prefers concise output”)
- Last 5 episodes (action → outcome pairs) for learning
Specialist agents
Focused sub-agents (ads, ASO, product intelligence, release intelligence, social media) run their own internal reports when relevant, and the main reasoner folds their findings into the briefing. You’ll see their conclusions cited in the report rather than raw data dumps.Which model runs
The model comes from your LLM settings — pick a provider (OpenAI, Anthropic, Google, Kimi, DeepSeek), optionally bring your own API key, and choose research/synthesis models from the catalog.analysisDepth no longer selects the model; it controls how much investigation the agent is allowed to do:
3. Actor
Readsreport.proposedExternalActions and decides what to do per action:
Read mode vs write mode
- Read mode (
agentMode: "read"): onlyslack_summary,webhook_post, andnotion_pageare allowed. The agent can analyze and notify but never writes to ASC or opens issues. - Write mode (
agentMode: "write"): all action types allowed, but each one still requires either being inautoApproveTypesor human approval via the API/Slack buttons.
Fingerprinting & dedup
Every action gets asha1(owner+app+type+subject) fingerprint. If the same action shows up tomorrow, it’s marked superseded instead of duplicated. This is why the agent can run twice a day without spamming you.
Memory
All in Supabase, split between what the agent learned and what you told it:- Facts (
cofounder_memory_facts) — structured key/value the agent knows about you and your app. Set automatically (owner_name,app_category) or by you via the memory API. - Episodes (
cofounder_memory_episodes) — a record of every applied action with before/after metric snapshots. Drives the learning loop. - Company profile (
cofounder_company_profile,cofounder_app_profile) — what you tell the agent about the business: stage, ICP, positioning, brand voice, and hard rules like “never recommend removing the free tier.” Drafted for you after onboarding, then yours to correct. Unlike facts it is never scored or evicted — everything you confirm reaches every run. - Documents (
cofounder_documents) — the prose half of the same idea.business_context.mdis read on every briefing; the rest of the Library is retrieved when it matches the work at hand. The agent can propose edits to your context but never make them (knowledge patches).
Persistence
Every run writes to:cofounder_runs— orchestration row with cost, duration, statuscofounder_reports— the structuredDailyReport(full JSONB)cofounder_actions— every proposed/applied action with status timelinecofounder_competitor_snapshots— today’s competitor metadata for tomorrow’s diffcofounder_metadata_snapshots— today’s your metadata (for A/B test memory)cofounder_review_baselines— rolling 30d sentiment baseline (for crisis mode)cofounder_public_diary— sanitized entry if public diary is enabled

