SignalFlow Studio is an open-source, review-first campaign workspace. It turns product notes, public links, repository context, and supported text/code files into editable drafts for twelve destinations while keeping generation, review, export, and publishing states explicit.
The active product requires a real model provider. Retired template, offline, prompt-only, and automatic fallback generation are rejected rather than presented as real campaign output.
- Add a campaign name, source brief, audience, public links, repository, and optional supported files.
- Select destinations across social, community, video, and owned channels.
- Choose an available model route for the current deployment/session.
- Generate a staged campaign and destination-specific drafts.
- Review and edit one authoritative current draft per channel.
- Save in the current browser, export deterministic Markdown/JSON, copy/open a destination, or publish through a genuinely configured official connector.
- Social: LinkedIn, X, Instagram, Facebook, Threads
- Community: Reddit, Hacker News
- Video: YouTube, TikTok
- Owned: Newsletter, Blog, Release notes
LinkedIn, X, and Reddit have official OAuth connector code paths. Every other destination currently uses an explicit review, copy, export, and open-platform handoff.
Supported adapters:
- Gemini
- OpenAI
- Claude
- OpenRouter
- Groq
- Custom OpenAI-compatible endpoint
- Ollama
- LM Studio
A route is usable only when GET /api/capabilities reports it available for the current deployment and session.
- Hosted non-owner sessions can use supported temporary personal keys where the provider allows them.
- Server-configured credentials and owner tools remain owner-only on protected/public hosted deployments.
- Custom, Ollama, and LM Studio routes are owner/trusted-local capabilities. Hosted local-model use requires a reachable trusted base URL.
- Temporary keys are request-scoped and excluded from saved campaigns.
- Saved campaigns are browser-local in the current product. There is no cloud campaign database, cross-device sync, collaboration, or account workspace yet.
- Saved records use a versioned Campaign domain contract.
- Each channel has one authoritative current draft.
- Original generated text is optional revision history, never another active draft.
- Legacy browser-library records are migrated into the canonical contract when read.
- Clearing browser site data can remove the local library; export important campaigns first.
Markdown and JSON exports are projected from the same canonical Campaign snapshot. They include campaign/source/generation IDs, provider/model, snapshot timestamp, warnings, quality states, and the authoritative current drafts. Identical campaign state produces deterministic output.
GET /api/capabilities is the server-owned source of truth for hosted, local, and self-hosted profiles. It describes current-session permissions and availability for models, persistence, repositories, exports, connectors, MCP, extension capture, quotas, and owner tools.
Clients fail closed when a known capability is missing or discovery fails. “Configured” and “available to this session” are separate states.
See docs/CAPABILITY_MATRIX.md.
The extension is an experimental capture client. It can perform a versioned capability handshake with an open Studio tab.
Acknowledged extension ingestion is not implemented yet. The Send action remains disabled, and dispatching a tab message or DOM event is not reported as durable delivery. Screenshot, recording, review, upload queue, and store-release work remain tracked separately.
The mcp/ package exposes:
- deployment capability discovery;
- provider status;
- provider connection testing;
- campaign creation through the canonical generation API.
MCP requires an explicitly configured SignalFlow base URL and any required workspace/provider credentials in the MCP environment. Secrets are not accepted from model-authored tool arguments unless the server route intentionally supports a temporary request key.
Direct publishing code exists for LinkedIn, X, and Reddit, but code presence is not production proof. A connector is complete only after:
- developer application and production credentials are configured;
- canonical callback URL and required products/scopes are approved;
- a real account authorizes;
- a real publish succeeds and is confirmed by the destination API;
- refresh, expiry, rejection, permission, and rate-limit behavior are verified.
SignalFlow reports direct success only after the destination API confirms it. No campaign is silently published.
See docs/CONNECTOR_READINESS.md.
Implemented:
- written campaign brief and audience;
- public link extraction with bounded failure handling;
- public GitHub repository context;
- opt-in trusted local repository context on eligible local/self-hosted deployments;
- browser extraction for supported text, Markdown, CSV, JSON, and code files;
- image/video file metadata and user descriptions as planning references.
Not implemented in the active campaign route:
- automatic visual understanding of uploaded image/video content;
- durable cloud asset storage;
- extension screenshot/recording ingestion;
- background generation jobs.
Requirements:
- Node.js 22 (the CI version)
- npm
- Python 3.10 only for the retained Python test suite
- at least one real model provider route
cd frontend
npm ci
npm run devOpen http://localhost:3000.
Copy frontend/.env.example to frontend/.env.local and configure the chosen provider. Never commit credentials or prefix server secrets with NEXT_PUBLIC_.
Protected hosted deployment example:
SIGNALFLOW_ACCESS_KEY=use-a-long-private-value
SIGNALFLOW_PUBLIC_HOSTED=true
NEXTAUTH_URL=https://your-canonical-domain.example
Frontend:
cd frontend
npm ci
npm test
npm audit --omit=dev --audit-level=high
npm run buildMCP:
cd mcp
npm testPython compatibility suite:
python -m pip install -r requirements.txt
python -m pip install pytest
pytest -qA change is not complete when only compilation succeeds. Relevant contract, regression, security, migration, and user-flow evidence must pass.
Root Directory: frontend
Framework Preset: Next.js
Install Command: npm install
Build Command: npm run build
Output Directory: .next
frontend/app/page.js— current Studio, Library, Connections, and Settings UIfrontend/app/api/capabilities/— deployment/session capability documentfrontend/app/api/launch_kit/— canonical campaign generation routefrontend/app/api/social/— OAuth status/connect/callback/disconnect routesfrontend/app/api/publish/— confirmed-only publishing routefrontend/lib/domain/— versioned records, invariants, serialization, and portsfrontend/lib/application/— shared campaign use cases and composition rootsfrontend/lib/infrastructure/— browser, memory, and injected-store adaptersfrontend/lib/export/campaignExport.mjs— authoritative deterministic export projectorfrontend/lib/context/— repository, URL, and file context extractionfrontend/lib/ai/— provider adapters, policy, and staged generationfrontend/lib/social/— connector configuration, encrypted session handling, and providersextension/— experimental browser capture companionmcp/— supported MCP server packagedocs/DOMAIN_ARCHITECTURE.md— canonical domain/application/adapter boundariesdocs/CAPABILITY_MATRIX.md— current deployment truth
- Review before publish
- One authoritative current draft per channel
- Real model routes only; no fake fallback output
- Browser-local and self-hostable today, cloud-ready through adapters
- Truthful capability, connector, extension, and success states
- No credential harvesting or platform bypasses
- Calm creative workspace rather than a crowded dashboard
Start with AGENTS.md before making repository changes. Security and ethics guidance is in SECURITY.md.