Source of truth
The active marketing context gives people and agents one approved model of the product, audience, positioning, proof and hypotheses.
System documentation
Learn how to initialize the context, run developer marketing work through explicit states, connect your agents and feed measured results back into the next decision.
Bootstrap
Quiver is an agentic developer marketing system. It keeps product context, customer evidence, active work, shipped output and measured results connected so people and agents operate from the same approved state.
01
Name the organization and choose its slug. Hosted workspaces get a shared address at your-slug.quivergtm.dev.
02
Founder includes up to three seats. Team includes unlimited seats. Both hosted plans include the current hosted feature set.
03
Add Anthropic, OpenAI, Google, OpenRouter or another OpenAI-compatible endpoint. Your account determines model cost and usage policy.
04
Paste the website or describe the product. Quiver drafts the starting model; you review assumptions before relying on it.
05
Onboarding ends by handing you an MCP key, shown once, plus your workspace MCP URL. Browser clients can sign in with OAuth instead.
06
Choose Strategy, Create, Feedback, Analyze or Optimize. Every session starts from the active approved context.
07
Save the work, move it through production states, log the result and review what should change before the next cycle.
Architecture
Quiver applies familiar engineering properties to developer marketing. These are product behaviors—not a metaphor layered over generic chat.
The active marketing context gives people and agents one approved model of the product, audience, positioning, proof and hypotheses.
Context and artifacts keep their history. You can inspect changes, restore earlier versions and prevent silent drift.
Artifacts move through Draft → Review → Approved → Live → Archived. Generated output does not become published truth by accident.
The Content API serves approved content to websites. MCP lets external agents operate the system through structured tools.
Campaigns connect the context, evidence, sessions, content, tasks and outcomes behind an initiative.
Results can produce proposed context changes. A human reviews what the system carries into the next cycle.
Team boundary
Model layer
Agent runtime
Modes give the agent a job boundary and load the context most relevant to that job. Pick one directly or describe the outcome you need and let Quiver route the session.
Use for positioning, ICP, message architecture, campaign planning and decisions that shape what the team should do.
Use for production work. Choose the artifact type and build from approved context, relevant evidence and earlier work.
Use for qualitative input such as call notes, objections and reactions. Turn raw evidence into findings, next steps and proposed context changes.
Use for interpreting campaign, content or channel results. Separate observations from conclusions and preserve what the team should learn.
Use for improving existing pages, copy, signup flows and onboarding. Evaluate the current work against the active audience and positioning.
Source of truth
The active context stores the product model agents should use: positioning, ICP, messaging, customer language, proof, hypotheses and brand voice.
Production state
Operating scope
A campaign is the scope that connects an initiative's sessions, evidence, artifacts, content, tasks and performance. It is how Quiver keeps the plan, execution and outcome traceable.
Content infrastructure
Content in Quiver keeps markdown, production state, SEO and social metadata, authorship, tags, repurposing lineage, distribution records and metric snapshots together.
Live URLs are recorded for you
Set your public site once in Settings → API tokens: the site address (for example https://www.example.com) and the path your content lives at (for example /blog/{slug}, which defaults to /{slug}). From then on, publishing a piece records a website distribution with its live URL automatically, and renaming the slug of a published piece updates that same record instead of adding another. Nothing is duplicated if you publish twice, and a workspace with no public site configured is unaffected.
Content API
Published content is available as structured JSON with its markdown body and SEO/social metadata. Quiver remains the editorial source of truth while the website controls presentation.
GET https://quivergtm.dev/api/public/content
GET https://quivergtm.dev/api/public/content/[slug]Release notes
A changelog is a content type, not a separate product. Entries are content pieces with contentType: changelog, so they move through the same draft and published states, carry the same SEO and tags, and are served by the same public Content API as everything else.
changelog-drafting skill tells it how to turn them into release notes: grouped by user-visible change rather than by commit, leading with what someone can now do, internal refactors left out, one short paragraph each. It saves the result through MCP as a draft.v2.4.0 becomes the release label), and publish when it reads the way you want it to. Nothing is published on your behalf./api/public/content?contentType=changelog, so your site renders them wherever you want. Quiver’s own changelog, at /changelog, is that API rendered — full entries inline, newest first, grouped by month, with its own RSS feed.Quiver never talks to GitHub. Your agent already has whatever repository access you gave it; Quiver’s job is to store the entry, keep its history and publish it.
Evidence layer
Store calls, interviews, surveys, reviews, forums, support tickets, social posts, community exports and field notes beside the work they should influence.
Competitive layer
A workspace can watch up to three competitors, and up to fifteen pages for each one. Quiver re-reads those pages on your schedule, notices what actually changed, and writes what it means for you against your own marketing context.
Who pays for what
Fetching the pages is Quiver’s cost. Reading a competitor’s page and hashing it to see whether it moved is on us, and a page that did not move costs nothing beyond that fetch — no analysis, no model call.
Analysing what changed is your cost, through the provider key you connected. Only pages whose content actually moved are analysed: one small call per changed surface, then one call that pulls those findings together against your context. Nothing sends fifteen pages to a model in one prompt. This is why the cadence is yours to set, and why an agent connected over MCP can pause scanning or change how often it runs but can never switch it on: starting to scan is the workspace agreeing to spend its own tokens, and that is a person’s decision.
Eleven named surfaces, read in this order so that if a run runs short the pages a positioning argument turns on are already in hand: Homepage, Pricing, Product, Changelog, Blog, Reviews, Careers, About / profile, Docs, GitHub and Social. Every field in every surface is optional, and each surface shows a coverage figure, so a thin reading is shown as thin rather than presented as a complete picture. Changes are reported per field with the old and new value, not as an opaque “something changed”.
off, monthly or weekly. Only an admin can change it. Workspaces created now start on monthly; an older workspace that has never touched the setting reads as off.off does not mean unmapped. Adding a competitor still reads their homepage once to learn which surfaces they have, whatever the cadence — you just get no scans until scanning is on.off, turning it on catches up: anything still watching only its homepage has its surfaces discovered, and anything never scanned gets its baseline. That spends fetches and your tokens on purpose — it is what you just opted into — and it runs once, on the real transition, not every time you save the same cadence.The first reading of a competitor is a baseline: a profile, not a change report. There is nothing behind it to compare against, so claiming a diff would be inventing one. A baseline is still read against your own context — where you overlap, where they claim what you claim, where they claim something you cannot match, and what that implies — but it proposes no context changes, because one reading of one competitor is not evidence to change your source of truth.
From the second scan onward you get the change-over-change brief: threat assessment, positioning, content and product opportunities, the change log and the watch list. Each brief is saved as an artifact of type competitor_analysis, and any context changes it suggests arrive as proposals you accept or dismiss on the Context page. A competitor is also re-baselined if Quiver changes how it reads pages, rather than reporting every page as changed on the strength of a technical difference.
Nothing to configure. Each brief ends with up to eight standing things to re-check for that competitor — “watch for a freemium tier”, “track hiring in enterprise sales” — and that list is fed into the next scan, so the model has to say whether each item moved. It is how a one-off report becomes a standing watch. You can edit the list by hand, and anything you added is kept ahead of model-generated items when the list is full.
The 0–100 number beside a competitor’s name, with its sparkline, is a momentum reading: how much is happening over there. It is explicitly not a judgement about how good they are, and a higher number does not mean a better competitor. It is four observed signals, weighted:
Read it as a trend for one competitor, not as a ranking across them. Only signals Quiver actually observed are scored, and the weights are shared out across those — a surface it could not read is left out rather than counted as a zero, so a competitor with no careers page is never confused with one that is hiring nobody. A baseline has no earlier reading to compare against, so momentum is not scored at all on a first scan; the score comes from whatever else was read. When nothing at all could be read there is no score, and Quiver shows none rather than a number that would mean nothing. Two competitors are still only comparable when their coverage is.
Read: list_competitors, get_competitor, get_competitive_intel
Manage: add_competitor, update_competitor, remove_competitor
Operate: run_competitor_scan, set_competitive_intel
An agent gets the same rules you do, not a back door. run_competitor_scan runs the schedule early and scans only what is already due; calling it again costs nothing and answers with when the next scan lands, rather than failing. add_competitor shares the same five-adds-a-day cap. And an agent may move between monthly and weekly, or turn scanning off, but it cannot turn scanning on when it is off: that is the decision that commits your model tokens, so it stays with an admin in Settings → Competitors.
Feedback loop
pending, approved or rejected.Work layer
The built-in task system is part of hosted Quiver and is not included in the open-source edition.
list_tasks, create_task, update_task and complete_task.Feedback
The speech-bubble button in the workspace header, next to notifications and the theme toggle, opens the feedback form from anywhere in the app. One form covers both — it asks whether you are reporting a bug or requesting a feature, so there is nothing to choose before you start typing.
The form can also receive three optional fields describing the situation, so nobody has to ask what you were doing: userEmail, replayUrl — a link to your PostHog session replay, so the exact session can be watched back rather than reconstructed from memory — and quiverContext, a single line holding your workspace, plan, user id and role, the page you were on and the id of the object it shows, the deploy’s git commit and environment, your browser, viewport, timezone and locale, and the last few JavaScript errors your browser raised.
Those three are sent on every submission but are only recorded if the form declares a hidden field with the matching name; Fillout ignores the rest. So a form that declares none of them still works perfectly, and adding one starts capturing it immediately with no change to Quiver.
Nothing you wrote is attached automatically. No prompts, session messages, artifact, content or research bodies, context values, object titles or API keys are ever included — only what you type into the form itself.
Agent interface
MCP lets compatible agents read and write Quiver through structured tools. Your agent environment can keep its broader context and connections while Quiver remains the system of record for developer marketing work.
Open Settings → Connectors → Add custom connector and paste the full workspace MCP URL:
https://<your-workspace>.quivergtm.dev/api/mcpKeep the detected OAuth settings: Sign in now, automatic client registration and no custom request headers. Approve the connection after Quiver sign-in. The workspace comes from the URL and actions are attributed to the signed-in member. Add and approve each workspace separately.
For clients that support a static authorization header, create an API token with the mcp scope in Settings → API tokens.
{
"mcpServers": {
"quiver": {
"type": "http",
"url": "https://<your-workspace>.quivergtm.dev/api/mcp",
"headers": { "Authorization": "Bearer qvr_..." }
}
}
}Tokens are workspace-scoped and revocable. OAuth-capable local clients can use the browser sign-in flow instead of storing a static token.
Context: get_context, get_context_history, propose_context_update, apply_context_update, restore_context_version
Campaigns: list_campaigns, get_campaign, create_campaign, update_campaign, update_campaign_status, delete_campaign
Artifacts: list_artifacts, get_artifact, save_artifact, update_artifact, update_artifact_status, archive_artifact, delete_artifact. update_artifact can also move an artifact to a different campaign.
Performance: log_performance, get_performance_log, get_close_the_loop_queue, list_proposals, action_proposal
Content: list_content, get_content, save_content, update_content, add_distribution, log_content_metrics, get_content_metrics, get_content_calendar, archive_content, delete_content
Research: list_research_entries, get_research_entry, save_research_entry, update_research_entry, delete_research_entry, list_quotes, update_quote, delete_quote, get_linear_payload
Sessions: list_sessions, get_session, delete_session
Tasks: list_tasks, create_task, update_task, complete_task
Workspace: get_dashboard_summary
An agent cannot publish content, and there is no setting that lets it. save_content always creates a draft, and neither it nor update_content accepts a status at all, so an agent cannot even ask. Content is publicly readable through the Content API the moment it is published, so promoting a piece — or taking it back down — is something you do in Quiver. An agent can still edit a piece that is already published; that does not unpublish it, and publishing from the Quiver app is never restricted.
Use propose_context_update when a change needs human review. Use apply_context_updateonly when a person explicitly asks to change the active context immediately.
Each proposal has an op. add sends only the new items for a list field (proofPoints, customerLanguage, activeHypotheses, competitiveLandscape, messagingPillars, wordsToUse, wordsToAvoid). correct fixes one list item, named by its current text in replaces, or one other field, and says what_is_wrong. A correction of icpDefinition sends only the sub-keys it changes, never text. A proposal that would rewrite a whole list, repeats an existing entry, or leaves out a quote's source or a proof point's evidence is refused with a message saying why.
Packaging
MIT licensed and free to self-host. A strong fit for technical founders and startups comfortable running the application, database, authentication and updates. The built-in task system is not included.
Ready-to-use shared workspaces, simple team invitations, managed infrastructure and hosted-only features such as tasks. Founder supports three seats; Team supports unlimited seats.