# Manage your account (/account/manage-account) Everything about your account lives in Settings in the [app](https://app.paragraph.com). This page covers what you can manage there, and how to leave with your data if you ever want to. ## Settings at a glance [#settings-at-a-glance] | Area | What it covers | | ----------- | ------------------------------------------------------------------------------------------------------------------ | | Account | Your personal details and login | | Agent | How your agent behaves, its [voice and memory](/agent/voice-and-memory), and its [connections](/agent/connections) | | Billing | Your plan and credits (see [plans and credits](/account/plans-and-credits)) | | Publication | Your publication's name and logo | | Website | How your public site looks and works (see [website](/publishing/website)) | ## Your account [#your-account] Your account details, including how you log in, live in Settings under Account. Update them there whenever something changes. Emails from your agent include an "Unsubscribe or manage email subscription" link at the bottom. Daily reports and other agent messages have separate switches there, so you can stop one without the other, and resubscribe if you change your mind. ## Your publication [#your-publication] Your publication's identity lives in Settings under Publication. Set your publication's name and logo here. Both appear on your website and in the emails you send, so readers see a consistent identity everywhere your writing shows up. For how your public site looks and behaves, see [website](/publishing/website). To put your site on your own domain (available on Starter and above), see [custom domains](/publishing/custom-domains). ## Automation authorization [#automation-authorization] Standing authorization belongs to a named automation, not an account-wide permission. Open **Automations** (from search, or add it to your sidebar via **Customize sidebar**) to review what each job can use and do, pause it, or re-enable a public action. See [approvals](/agent/approvals) for how one-time suggestions and automations differ. ## Billing [#billing] Your plan and credits live in Settings under Billing. For what each plan includes and how credits work, see [plans and credits](/account/plans-and-credits). ## Your data is yours [#your-data-is-yours] Paragraph is built on a simple promise: your writing and your audience belong to you. ### Export your subscribers [#export-your-subscribers] You can export your subscriber list at any time, on any plan. There's no waiting period and no gatekeeping. If you ever decide to publish somewhere else, your list goes with you. ### Delete your workspace [#delete-your-workspace] If you want to leave entirely, you can delete your workspace from Settings. Deleting your workspace is permanent. Export your subscriber list and save copies of anything you want to keep before you delete. ## Need a hand? [#need-a-hand] For anything you can't sort out in Settings, email [support@paragraph.com](mailto:support@paragraph.com). Account questions, billing puzzles, and export help all welcome. # Plans and credits (/account/plans-and-credits) Paragraph has four plans. Every plan, including Free, gives you a hosted site, posts, and a subscriber list you own. Paid plans unlock more of the agent and more room to grow. You can compare plans on the [pricing page](https://paragraph.com/pricing), and manage your own plan in Settings, under Billing, in the [app](https://app.paragraph.com). ## Plans at a glance [#plans-at-a-glance] | Plan | Monthly | Annual | Credits per month | | ------- | ------- | ----------------------------------- | ----------------- | | Free | $0 | $0 | 500 | | Starter | $20 | $16/mo billed annually ($192/yr) | 1,500 | | Growth | $100 | $80/mo billed annually ($960/yr) | 8,500 | | Scale | $200 | $160/mo billed annually ($1,920/yr) | 17,500 | Annual billing saves 20% on every paid plan. ## What each plan includes [#what-each-plan-includes] ### Free [#free] A permanent home for your site, posts, and subscribers. * Hosted website for your writing * Subscriber capture, so readers can sign up * A taste of the agent, with 500 credits a month * Limited [API and MCP access](/developers) Free is genuinely free, and your work stays yours. There's no time limit and no pressure to upgrade before you're ready. ### Starter [#starter] For writers getting started with Paragraph. * Everything in Free * Full agent access * [Custom domain](/publishing/custom-domains) * X posting, so your agent can share your work * Recurring workflows through [scheduled tasks](/agent/scheduled-tasks) * Email support ### Growth [#growth] For writers publishing every week and building an audience. * Everything in Starter * Advanced models for agent work * Bigger job headroom for larger and longer-running tasks * Priority support ### Scale [#scale] For audience businesses that run on content. * Everything in Growth * Advanced analytics * Onboarding support * Migration help from our team (see [import your publication](/getting-started/import-your-publication)) * A private Slack channel with us * Optional credit top-ups ## How credits work [#how-credits-work] Credits are what your agent runs on. Whenever it does work for you, it uses credits. That includes: * Drafting and editing posts * Research * Recurring tasks, like a weekly digest or regular social sharing * Image generation Each plan includes a monthly credit allowance, shown in the table above. Bigger plans include more credits because they're built for writers who lean on the agent more. On Scale, you can also add optional credit top-ups when you need extra headroom. Writing and publishing yourself doesn't use credits. Credits only cover work the agent does for you. ## Managing your plan [#managing-your-plan] Open Settings in the app and go to Billing. From there you can see your current plan and credits, switch plans, and choose monthly or annual billing. ## Common questions [#common-questions] They stay put. Free is a permanent home for your site, posts, and subscribers. You don't lose your work or your list by staying on Free. No. Free includes 500 credits a month, enough to try the agent on real work. Starter and above unlock full agent access, recurring workflows, and social posting. Custom domains are available on Starter and above. See [custom domains](/publishing/custom-domains) for setup. Optional credit top-ups are available on the Scale plan. On other plans, your credits refresh monthly. If you're regularly running out, the next plan up is usually the better fit. Yes, at any time, on any plan. Your subscriber list is exportable whenever you want it. See [manage your account](/account/manage-account). Questions about billing we didn't answer here? Email [support@paragraph.com](mailto:support@paragraph.com). # Approvals (/agent/approvals) Paragraph asks for a decision at the point where it matters. A draft is private work you can review. Publishing to an audience is a public action. There are two ways to let the agent act: * **Choose a suggestion once.** The button names the result, such as **Create draft**, **Apply edit**, or **Post on X**. That choice applies only to that suggestion. * **Enable an automation.** An enabled automation is standing authorization for the job, trigger and timing, capabilities, and connected account you confirmed. There are no global approval rules. Choosing one suggestion never authorizes future suggestions of the same kind. ## Suggestions are one-time choices [#suggestions-are-one-time-choices] A [suggestion](/agent/inbox) waits until you choose its action or dismiss it. Private outcomes use direct labels: * **Create draft** saves a private draft. * **Apply edit** changes an unpublished draft. * **Run task** carries out a routine, one-time task. Public outcomes are equally explicit. **Post on X**, **Publish post**, and **Send email** describe the action that will reach an audience. You can edit a draft before publishing it. Creating the draft does not make it public or authorize future publishing. ## Automations are standing authorization [#automations-are-standing-authorization] An automation repeats a named job without asking on every run. Its authorization is limited to: * The saved instructions, trigger, and timing * The capabilities shown in its configuration * The connected tools left switched on for it * The public action you confirmed * The connected account named in the confirmation Routine capabilities, such as reading publication content, creating drafts, or reading from a connected tool, do not need a public-action confirmation. Public actions do, and so does any connected tool that makes a change somewhere else. For the first public automation capability, Paragraph supports one original, text-only X post per run. Confirmation names the automation, trigger and timing, and connected X handle. Saving a public automation paused does not authorize it. Choose **Allow and enable** when you're ready for it to run. ## When an automation needs review [#when-an-automation-needs-review] Editing an enabled public automation pauses it and clears its authorization. Disconnecting or changing the connected X account also causes the automation to show **Needs review**, and so does disconnecting a server whose tool the automation was allowed to use. Review the current definition and choose **Allow and enable** again. For scheduled automations, **Run now** follows the same rules as a scheduled run and stays unavailable until review is complete. Disabling a public automation also clears its authorization. This keeps a past confirmation from silently applying when the automation is enabled later. ## Direct requests in chat [#direct-requests-in-chat] If you directly ask the agent to perform a public action in the current conversation, that explicit request applies to that action. It does not create standing authorization. Use an automation when you want the action to repeat. ## Common questions [#common-questions] No. A draft remains private. You still choose whether and when to publish it. No. Every suggestion is a separate, one-time choice. Yes, but only after you explicitly enable that named automation with its public action and connected account shown. It pauses and moves to Needs review. Re-enable it to confirm the updated definition. # Chat with your agent (/agent/chat) Chat is the fastest way to put your agent to work. Open your workspace at [app.paragraph.com](https://app.paragraph.com), start a conversation, and ask for what you need in plain English. Your agent already knows your publication. It keeps your goals, brand, and voice in mind across every chat, so you don't have to re-explain yourself each time. See [Voice and memory](/agent/voice-and-memory) for how to shape that context. ## What you can ask for [#what-you-can-ask-for] Chat covers the full range of what your agent can do: * **Write and create.** Draft posts and newsletters, repurpose existing pieces, write video scripts, and generate images. * **Publish and grow.** Post to X, set up automations for recurring work, and analyze how your posts and readers are doing. * **Research and decide.** Run web research, and work through your daily [Inbox](/agent/inbox) together. * **Power tools.** Use a code and data workspace, call connected services via MCP, and upload files for the agent to work with. If you're not sure whether something is possible, just ask. The agent will tell you what it can do and what it needs from you. ## Starter prompts [#starter-prompts] These prompts come straight from the in-app guide. Copy one, or use it as a template for your own. | Goal | Prompt | | ------------------- | ---------------------------------------------------------------------------------------------------- | | Plan my day | "What should I focus on today? Give me a short plan and a few post ideas I can start now." | | Draft a post | "Draft a short post about something trending in my niche this week, with a strong opening." | | Set a weekly recap | "Every Friday at 5pm, review my best posts from the week and suggest one follow-up to write." | | Follow up on a post | "One day after I publish a post, draft a short thread from it." | | Make a cover image | "Generate a clean, modern cover image for my next post." | | Find a fresh angle | "Search the web for what people are saying about my topic, then suggest three angles I could write." | | Post at a set time | "Draft a tweet about my new post, then send it at 3pm tomorrow." | The weekly recap and post follow-up prompts become [automations](/agent/scheduled-tasks) that keep running without you. One uses a recurring schedule; the other responds to each matching publication event after the delay you requested. The last one is different. Naming a single time schedules that exact draft, so the words you approved are the words that post. See [scheduling a post](/agent/inbox#schedule-it-for-later). ## How sessions work [#how-sessions-work] Each conversation is a session. Within a session, the agent remembers everything you've discussed, so you can build on earlier messages ("make it shorter", "now turn that into a thread"). Across sessions, the agent still remembers who you are. Your goals, brand voice, and notes carry over, so a new chat starts informed, not blank. A few habits that help: * Keep one topic per session when you can. It keeps the thread easy to follow. * Start a fresh session when you switch to something unrelated. * If the agent should remember something permanently, ask it to save a note, or add it yourself in Settings → Agent. ## Chat from anywhere [#chat-from-anywhere] You don't have to be at your desk. Connect Telegram to message your agent from your phone, or add it to your team's Slack and mention it in a channel or thread. Either way, the conversation stays linked to the same session on Paragraph. Setup for both lives in [Connections](/agent/connections). ## Steering and stopping [#steering-and-stopping] You stay in control. Suggestions the agent makes wait for your approval, and you can steer or stop the agent at any time, mid-task included. Anything visible, like publishing a post or sending a newsletter, goes through [approvals](/agent/approvals) first. Chat and the work it kicks off use the monthly credits included with your plan. See [Plans and credits](/account/plans-and-credits). # Connections (/agent/connections) Connections give your agent reach beyond your Paragraph site. Some let it publish and read on social channels, some let you chat with it from other apps, and some give it access to the tools your work already lives in. All of them are managed in Settings → Agent in your workspace. ## X [#x] Connect an X account and your agent can post and read on X: publishing threads, checking how they perform, and folding results back into what it writes next. A few things to know: * The connected account is the one your agent uses when working on this publication. * It's shared with everyone on your team, so the whole team's agent work posts from the same account. * Connecting X requires the Starter plan or above. See [Plans and credits](/account/plans-and-credits). Once connected, X becomes a distribution channel. A suggestion to post on X is a one-time choice. An enabled X automation is scoped to the named job, trigger and timing, and account you confirm. See [approvals](/agent/approvals). ## Telegram [#telegram] Connect Telegram and message your agent right from your phone. It replies in the chat, and your conversation stays linked to the same session on Paragraph. That means no context is lost between surfaces. Start a thread from the couch, and pick it up in your workspace later with the full history intact. It's the same agent, same memory, same [voice settings](/agent/voice-and-memory). ## Slack [#slack] Add your agent to your team's Slack. Mention it in a channel or thread and it replies inline, with everything saved back to your Paragraph session. This works well for teams: anyone in the channel can see the exchange, and the conversation still lands in your Paragraph session history. ## Tools via MCP [#tools-via-mcp] MCP (Model Context Protocol) is an open standard for connecting AI agents to outside tools. Connect a service over MCP, and your agent can use it directly in chat and in tasks. Select **Search providers** to browse more than 1,000 compatible remote MCP servers cataloged by integrations.sh. The directory supports OAuth, bearer tokens, and servers that don't require authentication. Popular examples include: | Provider | What your agent gets | | ---------- | ------------------------------------------------------------ | | Slack | Channels, messages, and workspace search | | Linear | Issues, projects, and comments | | Notion | Pages, databases, and workspace search | | GitHub | Repositories, issues, and pull requests | | Canva | Designs, brand assets, and creative workflows | | HubSpot | CRM records, contacts, companies, and sales activity | | monday.com | Boards, items, projects, and team workflows | | Sentry | Errors, releases, projects, and application performance | | Fathom | Meeting recordings, transcripts, summaries, and action items | | PayPal | Payment operations and developer tools | With these connected, you can ask things like "summarize this week's Linear issues into a changelog post" or "pull the outline from my Notion page and draft the essay". The Slack MCP provider is different from the Slack chat connection above. The chat connection lets you talk to your agent in Slack; the MCP provider lets your agent read your Slack workspace as a tool. ### Connected tools in automations [#connected-tools-in-automations] Everything you connect is available to your [automations](/agent/scheduled-tasks) too, not just to chat. An automation that drafts a weekly changelog can read your commits on its own, on schedule. Two rules keep that safe: * **Reading runs on its own.** Anything that only reads is available to every automation from the moment you connect it. * **Changes need your say-so.** A tool that writes somewhere (filing an issue, posting a message) stays off until you turn it on for that specific automation, in its access settings. You can also keep a connection out of a single automation. Open the automation, find **Connected tools**, and switch off the ones it shouldn't reach. It's per automation, so turning one off doesn't affect your other automations or your chat. Automations only ever see the tools you enabled for that server in Settings → Agent. Turning a tool off there removes it everywhere at once. ### Custom MCP servers [#custom-mcp-servers] Beyond the provider directory, you can connect any remote MCP server. Paragraph supports three ways to authenticate: * **OAuth**, for servers that support a standard sign-in flow * **Bearer token**, for servers that use an API key * **No auth**, for open servers Bearer-token providers ask for a token before connecting. Paragraph encrypts the token and stores it with that MCP connection. Add a custom server in Settings → Agent with the server's URL and the auth method it expects. If you're building your own tools, see [MCP for developers](/developers/mcp). ## Getting started [#getting-started] Open Settings → Agent at [app.paragraph.com](https://app.paragraph.com). Select **Search providers**, choose a service, and follow its sign-in flow. For another service, add its remote MCP URL manually. Test it in [chat](/agent/chat): ask the agent to use the new connection, and confirm it responds the way you expect. Having trouble with a connection? Write to [support@paragraph.com](mailto:support@paragraph.com) and we'll help you sort it out. # Inbox (/agent/inbox) Your Inbox is where you review what your agent proposes and watch what it's doing. Suggestions waiting on you sit at the top, and today's runs sit below them on a single timeline. Suggestions are one-time proposals your agent generates for work that could help your publication. Each one waits for you to choose its action or dismiss it. On paid plans, your agent refreshes these suggestions once a day. On the free plan, you can still request fresh suggestions from the Inbox or ask your agent in chat. ## What the agent suggests [#what-the-agent-suggests] Suggestions can include: * Drafts for posts or newsletters * Edits to existing drafts * Titles, descriptions, and cover ideas * Follow-ups based on your archive and goals * Distribution ideas for X * Updates to your agent's voice or publication context The mix follows your [voice and goals](/agent/voice-and-memory). Change those settings when you want the queue to focus on different work. ## Choosing an action [#choosing-an-action] The primary button describes the outcome instead of asking for a generic approval: * **Create draft** saves a private draft. * **Apply edit** updates a draft. * **Post on X** publishes the proposed text to X. * **Publish post** makes a post public. * **Send email** sends the proposed email. * **Run task** handles another one-time task. You can also **Dismiss** a suggestion or open it in chat to ask for changes. When the inbox has piled up, **Dismiss all** clears every pending suggestion at once. Paid plans refresh the queue each day, and any writer can request fresh suggestions, so nothing is lost for good. For drafts, you can edit the piece in the [editor](/publishing/editor) before it goes anywhere. Your choice applies only to that suggestion, as covered in [Approvals](/agent/approvals). Creating a draft is not a publishing permission. The draft remains private until you choose a public action later. Choosing any suggestion applies only once and never authorizes a later suggestion. See [Approvals](/agent/approvals) for the distinction between a one-time choice and an enabled automation. ## Today's runs [#todays-runs] Below your suggestions, the Inbox shows everything happening today on one chronological line: * Scheduled automation fires expected today, drawn with a dashed line until they run * Event automation runs after their matching publication event starts them * Scheduled tasks and posts due today * Suggestions you approved, from the moment you approved them Each row carries a small status dot: scheduled, queued, running, completed, failed, or skipped. Rows that wrote to a chat open that conversation, so you can read what the agent actually did. Approving a suggestion moves it out of the list at the top and onto this timeline, where its status updates as the work runs. You don't have to go looking for it. ## Schedule it for later [#schedule-it-for-later] Instead of choosing an action now, pick **Schedule** and set a date and time. You can also drag a suggestion down onto today's timeline to schedule it for that moment. Either way it leaves the list at the top and waits on the [Schedule](/agent/scheduled-tasks) calendar until it runs. You can also just say when in chat: "post this at 3pm tomorrow." Your agent shows you the draft and schedules it in one step. For a text-only X post or thread, the text you scheduled is the text that posts. Nothing rewrites it, and you aren't asked to approve it again. That's the point of scheduling: you decide once, and the words you saw are the words your readers see. A scheduled thread posts in order, each tweet replying to the one before it. A few limits: * You can schedule up to 30 days ahead. * Posts with images and quote posts can't be scheduled yet. Your agent drafts those as normal suggestions instead. * A scheduled X post still counts against X's own limits. If X refuses it, the suggestion comes back to your Inbox. To change the time, tell your agent ("actually make it 5pm") or open the block on the Schedule calendar and pick a new one. Cancel it to send the suggestion back to your Inbox. If a scheduled item doesn't run (your X account was disconnected, X rate-limited it, or your plan ran out of credits) you get a notification and the suggestion returns with what went wrong, so nothing fails quietly. On the timeline that run reads as failed. From there you can pick a new time with **Try again later**, or dismiss it. ## After a suggestion runs [#after-a-suggestion-runs] The run shows its outcome on today's timeline, and the result appears on the suggestion. Drafts open in the editor for review. When the work updates agent settings, the result links to Settings → Agent so you can inspect what was saved. ## Making suggestions better [#making-suggestions-better] * **Tune your voice.** Update your brand voice in Settings → Agent when drafts miss your tone. * **Sharpen your goals.** Specific goals produce a more focused queue. * **Explain changes in chat.** Tell the agent what was off and ask it to remember useful guidance. * **Dismiss work you don't want.** A dismissal is feedback, not a standing rule. ## From a suggestion to an automation [#from-a-suggestion-to-an-automation] If a useful job should repeat, create an [automation](/agent/scheduled-tasks). The automation has its own name, trigger and timing, capabilities, and enabled state. Public actions are confirmed as part of enabling that automation, not by approving a previous suggestion. Turn a repeated job into a scoped, reviewable routine. Learn when a choice applies once and when authorization continues. # Meet your agent (/agent) Every Paragraph publication comes with an agent. It reads everything you've published and learns how you write. On paid plans, it also works on your publication every day, not just when you're in the app. The agent's work falls into three areas: drafting, distributing, and maintaining. A fourth idea, approval, ties them together. You see everything it does, and anything visible waits for your yes. ## Draft [#draft] Your agent reads your archive, then drafts what should come next. That includes: * Weekly newsletter drafts built from what you've already published * New posts and essays built around ideas your readers respond to * Refreshes of older posts that are losing traffic * Titles and descriptions written to be found, and to sound like you * A handful of on-brand cover image options for each post * Series and follow-ups queued up so you're never staring at a blank page Nothing ships without your OK. Drafts land as [suggestions](/agent/inbox) you can review, edit, or dismiss. ## Distribute [#distribute] Publishing a post is the start, not the finish. Your agent turns each post into threads, clips, and newsletter sends, shaped for each channel and scheduled while you write the next one. Today it can distribute to X, LinkedIn, and your Paragraph newsletter: * X threads that earn the click back to the full piece * LinkedIn versions written for a professional feed * Newsletter sends to your [subscribers](/audience/subscribers) * A standing queue, so a week of posts is spaced out and ready * Scheduling at the times your readers actually show up It also folds results back in. Formats that earn readers get repeated, and ones that don't get retired. See [Distribution](/audience/distribution) for the full picture. ## Maintain [#maintain] Your agent patrols your site every day, fixes small problems on its own, and keeps your content easy for readers and AI to find: * Broken links repaired * Slow pages trimmed * Missing titles and descriptions written * Posts quietly losing traffic refreshed before they fall off * Clean structure and sitemaps, so search engines can do their job Every fix is measured against traffic, so you can see whether the upkeep is paying off. Learn more in [SEO](/publishing/seo). ## Approve [#approve] An agent is only useful if you can trust it. Paragraph makes each decision concrete and keeps recurring authorization attached to a named automation. * Suggestions use outcome-specific actions, such as **Create draft** or **Post on X** * Choosing a suggestion applies once and never authorizes later suggestions * An enabled automation is the only standing authorization * Public automations name the action, trigger and timing, and connected account before you enable them * Editing or disconnecting a public automation moves it to **Needs review** Pause an automation at any time to stop future runs. The full model is covered in [Approvals](/agent/approvals). Agent work uses the monthly credits that come with your plan. See [Plans and credits](/account/plans-and-credits) for what's included. ## Explore this section [#explore-this-section] What to ask, starter prompts, and how sessions work. Set goals, brand voice, social voice, and notes so the agent sounds like you. Review what your agent proposes, and follow today's runs. Set workflows that respond to publication events or run on a schedule. How one-time choices and automation authorization differ. Connect X, Telegram, Slack, and other tools via MCP. New to Paragraph? Start with the [quickstart](/getting-started/quickstart), then take the [workspace tour](/getting-started/workspace-tour). # Automations (/agent/scheduled-tasks) Automations are named jobs your agent runs when a specific trigger occurs. An enabled automation is also the product's standing authorization boundary: it can use only the capabilities in its saved definition. ## Create an automation [#create-an-automation] There are two ways in, and both end up in the same place. **Ask for it in chat.** Describe the job ("every Monday, draft a recap from last week's posts") and your agent answers with a setup card in the conversation. The card walks you through what it does, when it runs, and what it can access, one step at a time, with the agent's suggestions already filled in. Change anything you like as you go. **Create automation** on the Automations page, and **New automation** in the sidebar's Create menu, both open that same conversation — the agent explains what automations can do, then asks what you want this one to do. The Automations page starts hidden, so open it from search (`Cmd`/`Ctrl` + `K`) or add it to your sidebar with **Customize sidebar**. Whatever the agent proposes is saved paused. Nothing runs until you turn it on in the last step of the card. **Build it yourself.** On the Automations page, open the arrow beside **Create automation** and choose **Create manually** to fill in the same fields in one form. ## Choose a trigger [#choose-a-trigger] An automation can start in three ways: * **Before publish** runs while you prepare to publish a post. Use it for focused checks that should finish before the post goes live. * **After an event** runs when something happens in your publication. It can start immediately or after a delay of up to 30 days. * **On a schedule** runs on the hourly, daily, weekday, or weekly cadence you choose. A scheduled automation can also be saved for manual runs only. Event automations support these publication events: * A post is published * A post is scheduled * A post is unpublished * A post is archived or restored * A reader subscribes Each matching event starts one run. **A post is scheduled** means the moment you schedule it, not the later moment when it publishes. Choose a delay of zero to run immediately, or add seconds, minutes, hours, or days for a follow-up. A reader subscription can create private drafts or notify you, but it cannot directly start a public action. This keeps reader-controlled data from publishing on your behalf. ## Configure the job [#configure-the-job] Give each automation one clear job and a specific trigger. Its capabilities are grouped by what they do: * **Sources** include your posts, publication details, analytics, and audience stats. New automations can also search and read the public web, including RSS feeds. Web access starts on, and you can turn it off. * **Outputs** let it create and edit private drafts. * **Delivery** can email the result to you. * **Public actions** can publish to an audience and require confirmation. * **Connected tools** are the services you wired up in Settings → Agent. All of them are available to a new automation, and you can switch off any it shouldn't reach. These groups describe what the automation may attempt. The agent cannot add a new tool or public action during a run. ## Connected tools [#connected-tools] Your [connected tools](/agent/connections) work in automations, not just in chat, so an automation can pull from GitHub, Linear, Notion, or any server you've added. Reading happens on its own. Anything that makes a change somewhere else (filing an issue, sending a message) stays off until you turn it on for that automation under **Connected tools**. Those grants work like Post on X: they're part of what you confirm when you enable the automation, and changing them sends it back for review. If you disconnect a server, or turn its tool off in Settings → Agent, any automation counting on it moves to **Needs review** rather than quietly skipping the step. ## Draft and delivery examples [#draft-and-delivery-examples] | Trigger | Example request | Capabilities | | ---------------------- | ---------------------------------------------------------- | ----------------- | | Daily | "Every morning, summarize what I should work on today." | Sources, Delivery | | Weekly | "Every Monday, draft a recap from last week's posts." | Sources, Outputs | | Post published + 1 day | "One day after I publish, email me three follow-up ideas." | Sources, Delivery | | Reader subscribes | "When a reader subscribes, draft a welcome follow-up." | Sources, Outputs | Draft automation output remains private. Emailing the writer is delivery to the account owner, not public publishing. ## Automations vs. scheduling one post [#automations-vs-scheduling-one-post] Both can start work later, but they're different tools: * An **automation** is a standing job. Your agent writes fresh content whenever its event or schedule occurs, so you're authorizing a kind of work, not a specific piece of it. * A **scheduled post** is one piece of content you already read, parked on a date. The text is fixed when you schedule it and posts exactly as written. Use an automation for "every Monday, draft a recap" or "one day after I publish, draft a thread." Use scheduling for "post this at 3pm." See [your inbox](/agent/inbox#schedule-it-for-later) for scheduling a single post. ## The built-in daily overview [#the-built-in-daily-overview] Paragraph includes a **Daily overview** automation by default. On paid plans, it emails you a short report of your recent impact and what to focus on each morning at 8am in your timezone. Daily overview generation and delivery pause on the free plan. The schedule remains saved and starts running automatically after you upgrade. You can pause or re-enable it from **Automations** like any other scheduled automation. The unsubscribe link in the email also stops delivery without changing the automation. ## Public actions on X [#public-actions-on-x] Paragraph's first public automation capability is **Post on X**. It can read the connected account and publish one original, text-only post per run. Replies, threads, quote posts, engagement, and media are not included. When you select it, the confirmation states: * The automation's name * Its trigger and timing * The connected X handle * That it may publish one text post per run Choose **Allow and enable** to authorize and start it. Choose **Save paused** to keep the definition without authorization, or **Cancel** to leave without saving. In the chat setup card the same choice is **Turn it on** or **Keep it paused**, and the card won't let you turn on an automation whose access still needs a connected account. Connect the X account you want the automation to use before enabling it. Authorization is bound to that account. ## Review and re-enable [#review-and-re-enable] An enabled public automation moves to **Needs review** when its definition or connected account no longer matches what you confirmed. Editing or disabling it also clears its public authorization. Review the current name, instructions, trigger, timing, capabilities, and account. Then choose **Allow and enable** again. Until then, public actions are skipped and the automation remains paused. **Run now** is also unavailable for scheduled automations. ## Run now [#run-now] **Run now** is available for scheduled automations. It uses the same safety checks as a scheduled run and does not bypass the automation's capabilities or public authorization. Event automations wait for a real publication event because the event supplies the post or reader context for the run. ## Manage an automation [#manage-an-automation] Open an automation to change its instructions, event or cadence, delay, or capabilities. You can pause or delete work you no longer need. Review the first few runs and keep each automation focused on one job. Automation runs use the monthly credits included with your plan, just like chat. See [Plans and credits](/account/plans-and-credits). # Voice and memory (/agent/voice-and-memory) Your agent is only as good as what it knows about you. Voice and memory settings are where you teach it what you're working toward and how you sound, once, instead of repeating it in every chat. Most of this lives in Settings → Agent in your workspace, and you can set your [visual brand](#visual-brand) by asking the agent. The agent keeps your goals, brand, and voice in mind across every chat, so updates you make apply everywhere: drafts, [suggestions](/agent/inbox), [scheduled tasks](/agent/scheduled-tasks), and social posts. ## Goals [#goals] Goals tell your agent what to focus on. You can set up to 20. Good goals are specific enough to act on: * "Grow my newsletter to 5,000 subscribers" * "Publish one deep essay a month" * "Turn my best posts into an X audience" The agent uses goals to prioritize. If growing your newsletter is a goal, expect more suggestions about [newsletter sends](/publishing/newsletters) and [subscriber](/audience/subscribers) growth. If a goal changes, update it, and the agent's priorities follow. ## Brand voice [#brand-voice] Brand voice describes how the agent writes for your site: posts, newsletters, titles, and descriptions. You have up to 10,000 characters, so there's room to be thorough. Things worth including: * **Tone.** Formal or conversational? Playful or restrained? * **Structure.** Short punchy paragraphs, or long-form argument? * **Vocabulary.** Words you love, and words you never use. * **Punctuation.** Habits worth keeping, especially em dashes. Drafts leave them out unless your voice says you use them. * **Point of view.** First person? Do you address the reader directly? * **Examples.** A few sentences of your writing that capture the sound you want. The more concrete you are, the closer the drafts land. "Warm but direct, short sentences, no buzzwords" beats "professional". ## Social voice [#social-voice] Social voice covers how the agent sounds on social channels like X and LinkedIn. It's separate from brand voice because most writers sound different in a thread than in an essay. Use it to set the register for [distribution](/audience/distribution): looser or tighter than your site, whether you use emoji, how you open a thread, and what you'd never post. ## Visual brand [#visual-brand] Your visual brand is how your work looks: its colors, fonts, spacing, corners, shadows, logo, and a few reference images. The agent reads it whenever it makes something visual, so cover images and social cards come out looking like yours instead of generic. Ask the agent to show it or change it: * "What's my visual brand?" * "Set up my brand based on stripe.com" * "Set my brand colors to deep navy and warm cream" * "Use Playfair Display for headings and Inter for body text" * "Use this font file for my headings" (with the file attached) * "Use these two images as my brand references" A few things worth knowing: * **You can point it at a website.** Name a site (yours or one you admire) and the agent reads its palette, fonts, and mood, then shows you a card with what it found. You can also attach screenshots, a logo, or a PDF brand guide instead. * **Re-basing your brand on a new site starts fresh.** Ask for a different site later and the previous one's values are replaced, not blended. If the new site offers no logo or artwork the agent can use, it clears the old one's rather than leaving it on a brand that's moved on, and tells you so. * **Fonts come from Google Fonts, or you can bring your own.** Name any Google Fonts family, or attach a font file (`.woff2`, `.woff`, `.otf`, `.ttf`) and ask the agent to use it. Only upload a font you own or are licensed to use, since we host the file on your site and serve it to your readers. When you point the agent at a website, it'll tell you which typeface that site uses. If that family is on Google Fonts, it uses the real one. If it isn't, it picks the closest family and names the original, so you can bring the file yourself. A font on someone else's site isn't ours to serve from yours. * **Reference images do the most work.** You can store up to three. They pin your palette, treatment, and mood, and they steer generated images more than any other setting, so pick ones you'd be glad to see echoed. * **Your logo is stored separately** from the reference images. * **A site is a starting point, not a copy.** The agent reads a source's palette, type, and treatment for your own work, and what it generates won't reproduce another company's name, wordmark, or slogans. Anything it saves from a site is a placeholder you can swap for your own. Once a brand is set, it applies to the [cover options](/publishing/editor) the agent offers for a post, to social cards, and to anything else it generates. Ask it to change any part of the brand and the next thing it makes follows. ## Notes [#notes] Notes hold extra context that doesn't fit the other fields: your posting cadence, topics to avoid, ongoing projects, or facts about your niche. Notes are shared memory. You can write them, and the agent also writes its own notes here as it learns things worth keeping. If you spot a note that's wrong or stale, edit or remove it, and the agent moves on with the corrected version. You can also add to memory from a conversation. If something comes up in chat that the agent should remember permanently, ask it to save a note. ## How it all fits together [#how-it-all-fits-together] Set your goals so the agent knows what success looks like. Write your brand voice and social voice so drafts sound like you from day one. Add notes for anything else, and let the agent keep them current as you work together. Review drafts and suggestions, and refine these settings whenever something feels off. Voice takes a little tuning. If a draft misses your tone, don't just fix the draft. Update your brand voice too, so the next one starts closer. You stay in control throughout. Suggestions wait for your approval, and you can steer or stop anytime. See [Approvals](/agent/approvals) for how review works. # Analytics (/audience/analytics) The Analytics area in [app.paragraph.com](https://app.paragraph.com) shows how your writing performs across every channel: your website, your newsletter, social, and search. Use it to answer the questions that actually matter: what's working, who's reading, and what to do next. ## Reading the analytics page [#reading-the-analytics-page] Analytics is organized by channel, with a tab for each: | Tab | What it shows | | ----------- | ---------------------------------------------------------------------- | | Web | Traffic to your site and posts | | Newsletter | How sends perform, including delivery rate and opens | | Social | Your X presence: followers, impressions, and recent post engagement | | Campaigns | Traffic by channel, clickthroughs, and signups attributed to sends | | Search & AI | Visits from search engines and AI assistants, plus AI crawler activity | You can view each tab daily, weekly, monthly, or all time, and narrow from all published posts down to a single post to see how one piece is doing. A few notes on the less obvious tabs: * **Social** needs your X account connected to report followers and post engagement. See [Connections](/agent/connections). * **Search & AI** separates visits from search engines, visits from AI assistants (ChatGPT, Perplexity, and friends), and AI crawler hits. New sites usually see crawler visits within a few days of publishing. Need the numbers outside the app? You can export a PDF report from the analytics page. ## Subscriber analytics [#subscriber-analytics] Subscriber growth and list health have their own view within Analytics. See how your list is trending, and pair it with the Subscribers area for the list itself. More in [Subscribers](/audience/subscribers). ## Ask your agent [#ask-your-agent] Dashboards show you what happened. Your agent helps with why, and what to do about it. Ask in [chat](/agent/chat): * "What's my top post from the last month, and why do you think it worked?" * "How many active subscribers do I have, and how's that trending?" * "Which posts are quietly losing traffic?" Your agent also uses these numbers on its own: [distribution](/audience/distribution) repeats the formats that earn readers, and [site maintenance](/publishing/seo) measures every fix against traffic. ## Making sense of the numbers [#making-sense-of-the-numbers] A few honest framings that help: * **Watch trends, not days.** Any single day is noise. The weekly and monthly views tell you the truth. * **Judge each channel by its own job.** A thread's job is the click back to the piece. A newsletter's job is delivery and opens. A post's job is being read. * **Small lists aren't a problem.** Delivery rate and opens matter more than raw counts while you grow. ## Advanced analytics [#advanced-analytics] Advanced analytics come with the Scale plan. See [Plans and credits](/account/plans-and-credits) for what's included in each plan. ## Next steps [#next-steps] Act on what the numbers tell you. Let your agent turn insights into daily next steps. # Distribution (/audience/distribution) Publishing a post is half the job. The other half, turning it into the formats each channel rewards, is work most writers skip because it's tedious. Your agent does it for you. ## What your agent creates from each post [#what-your-agent-creates-from-each-post] For every post, your agent can produce: * **X threads** written to earn the click back to the full piece, not to replace it. * **LinkedIn versions** rewritten for a professional feed, as drafts you can post. * **Newsletter sends** that deliver the post to your [subscribers](/audience/subscribers) by email. Each one is an adaptation, not a copy-paste. A thread reads like a thread, and a LinkedIn post reads like it belongs there. ## Everything stays together [#everything-stays-together] Each post and the versions made from it share a row in [Content](/getting-started/workspace-tour). The post sits first, and the thread, LinkedIn version, or email drawn from it line up beside it, so you can see at a glance what a piece has turned into and what's still missing. The buttons at the end of each row make the next version without you writing a prompt. ## Nothing posts without you [#nothing-posts-without-you] Drafts arrive as [suggestions](/agent/inbox) you can review, edit, or skip. Posting to X, sending an email, anything public, waits for your explicit approval. See [Approvals](/agent/approvals). A thread opens as the chain it will become: one card per tweet, laid out the way it will look on X. Edit any tweet in place, add one, or remove one, and each card counts its own characters against X's 280 limit. When you approve, the tweets post in order, each replying to the one before it. ## The queue and best-time scheduling [#the-queue-and-best-time-scheduling] Instead of publishing everything the moment it's ready, your agent keeps a standing queue that spaces out a week of posts. Best-time scheduling slots each piece into the moment your audience is most likely to see it. The result: a steady presence on your channels from each post you write, without you managing a content calendar. ## Set up each channel [#set-up-each-channel] **X.** Posting to X requires connecting your X account, available on Starter and above. See [Connections](/agent/connections). Once connected, your agent can post approved threads for you and track how they perform. **LinkedIn.** Your agent writes LinkedIn versions as drafts for you to post. Ask for one in chat, or let suggestions surface them after you publish. **Email.** Newsletter delivery works out of the box. See [Newsletters](/publishing/newsletters). ## Ask for it, or let it come to you [#ask-for-it-or-let-it-come-to-you] Two ways to use distribution: * **Ask in [chat](/agent/chat).** "Turn my latest post into a thread." "Write a LinkedIn version of my latest post." "Draft a three-post thread about the lessons from my latest piece." * **Let suggestions surface it.** After you publish, distribution drafts show up in your [Inbox](/agent/inbox), ready to review. You can also make it recurring with an [automation](/agent/scheduled-tasks), like "Every Monday at 9am, turn my newest post into a thread" or "One day after I publish a post, draft a thread from it." ## The learning loop [#the-learning-loop] Results feed back in. Your agent watches how each format performs, and the formats that earn readers get repeated. Over time your distribution gets more like the things that work for your audience, not a generic playbook. You can see the numbers yourself in the Social and Newsletter tabs of [Analytics](/audience/analytics), or ask directly: "What did my recent posts on X do well? Suggest one to follow up on." ## Next steps [#next-steps] Connect your X account so your agent can post for you. See which formats and channels earn readers. # Subscribers (/audience/subscribers) Your subscribers are the readers who asked to hear from you. Paragraph treats that list as yours: you can bring it with you, see it clearly, and take it with you at any time. ## The Subscribers area [#the-subscribers-area] The Subscribers area in [app.paragraph.com](https://app.paragraph.com) lists everyone on your list, with when they joined and where they came from. You can: * **Search** for a specific subscriber. * **Filter by status**: active, unsubscribed, or all. * **Filter by source**: organic, imported, or manual. The sources mean what you'd expect: | Source | What it means | | -------- | -------------------------------------- | | Organic | Subscribed through your site or a post | | Imported | Came in with a list you imported | | Manual | Added by hand | ## How readers subscribe [#how-readers-subscribe] Your [website](/publishing/website) includes subscribe prompts, so readers can join your list from any post or page. Once subscribed, they receive the posts you [deliver by email](/publishing/newsletters). Readers can unsubscribe from any email you send. Unsubscribed readers stay visible in your list (filtered under "Unsubscribed"), but they don't receive sends. ## Import your list [#import-your-list] Moving from Substack, or anywhere else? Bring your list with you as a CSV. Export your subscribers from your current platform. Every major platform offers a CSV export. Check the file has an email column. That's the only thing Paragraph needs, extra columns are fine. Open Chat, attach the CSV, and ask your agent to import the subscribers from it. CSV files can be up to 10 MB, and the import continues in the background. The [import guide](/getting-started/import-your-publication) walks through bringing over subscribers and posts together. Imported subscribers start receiving your future sends, the same as they did on your old platform, and they show up in your list with the "Imported" source. If your import is large or the file is unusual, email [support@paragraph.com](mailto:support@paragraph.com) and we'll help you bring it across. ## Export your list [#export-your-list] Export is always available. Your list is yours, full stop, and you can download it whenever you like: as a backup, for analysis, or to leave (though we'd rather you stayed). If you can't find what you need, [support@paragraph.com](mailto:support@paragraph.com) will get you a copy. ## Understand your list [#understand-your-list] Subscriber analytics live in the [Analytics](/audience/analytics) area, where you can see growth over time and how your list is trending. Your agent is often the fastest route to an answer, though. Ask in [chat](/agent/chat): * "How many active subscribers do I have, and how's that trending?" * "How many subscribers joined this month, and from where?" ## Next steps [#next-steps] Send your posts to this list by email. See subscriber growth and engagement over time. # Agent skills (/developers/agent-skills) [Paragraph agent skills](https://github.com/paragraph-xyz/skill) are portable instructions that teach AI agents (Claude Code, Cursor, and others) how to work with Paragraph. They follow the [Agent Skills](https://agentskills.io) standard. The skills include working agreements, commands and endpoints with examples, JSON response shapes, and common patterns. ## Available skills [#available-skills] | Skill | Covers | Install required | | --------------- | ------------------------------------------------------------ | ----------------------------------------- | | `paragraph-cli` | The [CLI](/developers/cli) and [MCP server](/developers/mcp) | Yes (`npm install -g @paragraph-com/cli`) | | `paragraph-api` | The REST API and [TypeScript SDK](/developers/sdk) | No | ## Automatic discovery [#automatic-discovery] Agents that support the [Agent Skills Discovery RFC](https://github.com/cloudflare/agent-skills-discovery-rfc) can discover Paragraph's published skill from [`/.well-known/agent-skills/index.json`](https://paragraph.com/.well-known/agent-skills/index.json). ## Install [#install] Install all skills: ```bash npx skills add paragraph-xyz/skill ``` Install a specific skill: ```bash npx skills add paragraph-xyz/skill --skill paragraph-api npx skills add paragraph-xyz/skill --skill paragraph-cli ``` Or manually copy the `SKILL.md` file into your agent's skills directory: | Agent | Path | | ----------- | ---------------------------------------- | | Claude Code | `~/.claude/skills//SKILL.md` | | Cursor | `.cursor/skills//SKILL.md` | | Any agent | Check your agent's skill directory | ## No install: paste a prompt [#no-install-paste-a-prompt] If you can't install skills, you can paste a short prompt into your agent's context instead. It covers the MCP server, CLI, REST API, and SDK. ```text title="Paragraph agent prompt" # Paragraph — Publishing & Newsletter Platform You can manage posts, publications, subscribers, and coins on paragraph.com. Use the **MCP server** for the best experience, the **CLI** for shell access, or the **REST API** directly. ## MCP Server (recommended) Connect to the hosted server — no installation or API key management needed: claude mcp add paragraph --transport http https://mcp.paragraph.com/mcp Or add {"url": "https://mcp.paragraph.com/mcp"} to your MCP config for Claude Desktop, Cursor, or VS Code. ## CLI (shell access) Install: npm install -g @paragraph-com/cli Authenticate: paragraph login ### Posts paragraph post create --title "My Post" --file ./draft.md paragraph post list --json paragraph post get --json paragraph post update --title "New Title" paragraph post publish paragraph post schedule --at "2026-05-01T09:00:00Z" paragraph post unschedule paragraph post delete --yes paragraph search post --query "ethereum" --json ### Subscribers paragraph subscriber list --json paragraph subscriber add --email user@example.com paragraph subscriber add --wallet 0x1234...abcd paragraph subscriber count ### Publications & Coins paragraph publication get --json paragraph coin get --json paragraph coin popular --json Always use --json for structured output when processing results programmatically. ## REST API (no install) Base URL: https://public.api.paragraph.com/api Auth: pass API key as Bearer token in Authorization header. Get a key at app.paragraph.com under Settings → API keys. ### Key endpoints GET /v1/posts/ — get post GET /v1/publications/slug/ — get publication POST /v1/posts — create post (auth required) PUT /v1/posts/ — update post (auth required) GET /v1/subscribers — list subscribers (auth required) POST /v1/subscribers — add subscriber (auth required) GET /v1/discover/search?q= — search posts ### Create a post (curl) curl -X POST https://public.api.paragraph.com/api/v1/posts \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"title": "My Post", "markdown": "# Hello World"}' ### Schedule a post for future publication curl -X POST https://public.api.paragraph.com/api/v1/posts \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"title": "My Post", "markdown": "# Hello", "scheduledAt": 1746090000000}' PUT /v1/posts/ with {"scheduledAt": } to schedule a draft. PUT /v1/posts/ with {"scheduledAt": null} to cancel. ## TypeScript SDK npm install @paragraph-com/sdk import { ParagraphAPI } from "@paragraph-com/sdk" const api = new ParagraphAPI({ apiKey: "" }) const post = await api.posts.create({ title: "My Post", markdown: "# Hello" }) const scheduled = await api.posts.create({ title: "My Post", markdown: "# Hello", scheduledAt: Date.now() + 86400000 }) const { items } = await api.posts.list() const pub = await api.publications.get({ slug: "@blog" }).single() const results = await api.search.posts("ethereum") OpenAPI spec: https://github.com/paragraph-xyz/paragraph-sdk-js/blob/main/openapi.json Full docs: https://docs.paragraph.com/llms-full.txt ``` You can also give your agent complete knowledge of Paragraph's API by sharing [llms-full.txt](https://docs.paragraph.com/llms-full.txt). Every page on this docs site also has a Markdown variant (append `.md` to the URL). ## Prefer MCP? [#prefer-mcp] For MCP-compatible clients, you can skip skills entirely and use the hosted Paragraph MCP server. No CLI or API key required: ```bash claude mcp add paragraph --transport http https://mcp.paragraph.com/mcp ``` See the [MCP server guide](/developers/mcp) for client-specific setup. ## Resources [#resources] Explore the skills, contribute, or report issues. Learn about the portable skill format these skills follow. # CLI (/developers/cli) The Paragraph CLI is a command-line tool for managing posts, publications, subscribers, and coins. It works for both human and programmatic (agent) usage. **Prerequisites**: Node.js version 18 or higher (not needed for the Homebrew install). ## Install [#install] ```bash npm install -g @paragraph-com/cli ``` ```bash brew tap paragraph-xyz/tap && brew install paragraph ``` ## Authentication [#authentication] Get your API key in the app at [app.paragraph.com](https://app.paragraph.com) under **Settings → API keys**. ### Authenticate [#authenticate] ```bash paragraph login ``` Or provide the key directly: ```bash paragraph login --token ``` ### Verify [#verify] ```bash paragraph whoami ``` For CI or agent environments, you can pipe the token or set an environment variable: ```bash echo "" | paragraph login --with-token PARAGRAPH_API_KEY= paragraph post list ``` Credentials are stored in `~/.paragraph/config.json` (mode 0600). ## Quick examples [#quick-examples] ```bash paragraph post create --title "My Post" --file ./draft.md paragraph post publish my-post paragraph post list paragraph search post --query "ethereum" ``` Run `paragraph --help` for all commands, or `paragraph --help` for details on any command. Using an AI agent like Claude Code or Cursor? Install the [Paragraph CLI skill](/developers/agent-skills) to teach it how to use the CLI: ```bash npx skills add paragraph-xyz/skill --skill paragraph-cli ``` ## Command reference [#command-reference] ### Posts [#posts] #### List posts [#list-posts] ```bash paragraph post list paragraph post list --status draft paragraph post list --limit 50 --cursor # List posts from any publication (public, no auth required) paragraph post list --publication ``` #### Get a post [#get-a-post] Accepts an ID, URL, or `@publication/slug`: ```bash paragraph post get paragraph post get @yearn/some-post-slug paragraph post get https://paragraph.com/@yearn/some-post-slug ``` Extract a single field (raw value to stdout, pipeable): ```bash paragraph post get --field markdown > post.md paragraph post get --field title ``` #### Create a post [#create-a-post] Creates a draft by default: ```bash paragraph post create --title "My Post" --text "# Hello World" paragraph post create --title "My Post" --file ./draft.md cat draft.md | paragraph post create --title "From Stdin" paragraph post create --title "Post" --text "Content" --subtitle "Summary" --tags "web3,defi" ``` #### Update a post [#update-a-post] ```bash paragraph post update --title "New Title" paragraph post update --file ./updated.md --tags "new,tags" ``` #### Post lifecycle [#post-lifecycle] ```bash paragraph post publish paragraph post publish --newsletter # publish + email subscribers paragraph post draft # revert to draft paragraph post archive ``` #### Preview and test [#preview-and-test] ```bash paragraph post publish --dry-run paragraph post delete --dry-run paragraph post test-email # send test email (drafts only) ``` #### Delete a post [#delete-a-post] ```bash paragraph post delete paragraph post delete --yes # skip confirmation ``` #### Browse posts [#browse-posts] ```bash paragraph post by-tag defi --limit 20 paragraph post feed --limit 10 ``` #### Shortcuts [#shortcuts] Top-level shortcuts for common operations: ```bash paragraph create --title "Quick Post" --text "Content" paragraph update my-post-slug --title "Updated" paragraph delete my-post-slug --yes ``` ### Publications [#publications] ```bash paragraph publication get @variantwriting paragraph publication get blog.variant.fund paragraph publication get ``` ### Search [#search] ```bash paragraph search post --query "ethereum" paragraph search blog --query "web3" ``` ### Subscribers [#subscribers] ```bash paragraph subscriber list --limit 100 paragraph subscriber count paragraph subscriber add --email user@example.com paragraph subscriber add --wallet 0x1234...abcd paragraph subscriber import --csv subscribers.csv ``` ### Coins [#coins] ```bash paragraph coin get paragraph coin popular --limit 10 paragraph coin search --query "test" paragraph coin holders --limit 50 paragraph coin quote --amount ``` ### Users [#users] ```bash paragraph user get paragraph user get 0x1234... # by wallet address ``` ## Agent and programmatic usage [#agent-and-programmatic-usage] The CLI is designed for use by AI agents and scripts. ### JSON output [#json-output] All commands support `--json`. Data goes to **stdout**, status messages to **stderr**: ```bash paragraph --json post list | jq '.data[0].title' paragraph --json post get | jq '.markdown' paragraph --json search post --query "web3" | jq '.length' ``` Paginated commands return: ```json { "data": [{ "id": "...", "title": "..." }], "pagination": { "cursor": "abc123", "hasMore": true } } ``` Single-item commands return the object directly: ```json { "id": "...", "title": "...", "markdown": "..." } ``` ### Structured errors [#structured-errors] In `--json` mode, errors are structured JSON on **stderr** with a non-zero exit code: ```json { "error": "Not found.", "code": "NOT_FOUND", "status": 404 } ``` Error codes: `UNAUTHORIZED`, `FORBIDDEN`, `NOT_FOUND`, `RATE_LIMITED`, `SERVER_ERROR`, `REQUEST_FAILED`, `CLIENT_ERROR`, `UNKNOWN`. ### Non-interactive safety [#non-interactive-safety] * `delete` requires `--yes` in non-TTY environments * `login` supports `--with-token` for stdin piping and `--token` for direct input * Destructive commands support `--dry-run` * Set `PARAGRAPH_NON_INTERACTIVE=1` or `CI=true` to force CLI mode ### Environment variables [#environment-variables] | Variable | Purpose | | --------------------------- | -------------------------------- | | `PARAGRAPH_API_KEY` | API key (alternative to `login`) | | `PARAGRAPH_API_URL` | Custom API base URL | | `PARAGRAPH_NON_INTERACTIVE` | Set to `1` to disable TUI | | `CI` | Set to `true` to disable TUI | ## Interactive TUI [#interactive-tui] Running `paragraph` with no arguments launches an interactive terminal UI with menus, scrollable lists, and keyboard navigation. The TUI is disabled automatically when: * `--json`, `--help`, or `--version` flags are used * stdout is not a TTY (e.g., piped output) * `CI=true` or `PARAGRAPH_NON_INTERACTIVE=1` is set ## Resources [#resources] Explore the source code or report issues. View on npm. # Build with Paragraph (/developers) Paragraph provides an API for building applications on top of its publishing platform. Access publication data, manage posts, work with coins, and integrate user profiles, all through a simple REST API or our TypeScript SDK. A few things to know before you start: * The API is in alpha. There may be breaking changes until we finalize the design. * The API is rate-limited. If you're hitting rate limits and want to request an increase, reach out to [support@paragraph.com](mailto:support@paragraph.com). * Some endpoints require authentication via an API key. Generate one in the app at [app.paragraph.com](https://app.paragraph.com) under **Settings → API keys**. ## Pick your tool [#pick-your-tool] Install our TypeScript SDK and start building in minutes with full type safety and intuitive methods. Manage posts, publications, and subscribers from the command line. Works with AI agents and CI pipelines. Let AI agents interact with Paragraph directly via the Model Context Protocol. Install portable skills that teach any AI agent how to use the Paragraph API, CLI, or MCP server. ## The REST API [#the-rest-api] Prefer raw HTTP? The API is served at `https://public.api.paragraph.com/api`. Authenticated endpoints take your API key as a Bearer token in the `Authorization` header. Every endpoint is described in the [OpenAPI spec](https://github.com/paragraph-xyz/paragraph-sdk-js/blob/main/openapi.json), which you can also use for code generation and API exploration. The spec lives in the [SDK repository](https://github.com/paragraph-xyz/paragraph-sdk-js). ## Core features [#core-features] * **Publications**: access publication metadata, settings, and content collections. * **Posts**: fetch posts with pagination, filtering, and full content support. * **Coins**: integrate coin functionality for monetization and community support. * **User profiles**: retrieve user data including wallet addresses and Farcaster profiles. ## Use with AI tools [#use-with-ai-tools] Building with an AI assistant like Claude Code, Cursor, or ChatGPT? A few things make that easier: * **This docs site is agent-readable.** We serve [llms.txt](https://docs.paragraph.com/llms.txt) and [llms-full.txt](https://docs.paragraph.com/llms-full.txt), and every page has a Markdown variant (append `.md` to any page URL). Paste llms-full.txt into your LLM conversation to give it complete knowledge of Paragraph's API endpoints, data models, and capabilities. * **The [MCP server](/developers/mcp)** connects agents directly to Paragraph, with hosted and local options. * **The [agent skills](/developers/agent-skills)** teach agents the CLI, REST API, SDK, and MCP server, including commands with examples, JSON response shapes, and common patterns. * **The [CLI](/developers/cli)** is designed for agent and programmatic usage. All commands support `--json` for structured output. ## Resources [#resources] Explore the SDK source code, contribute, or report issues. The complete API surface, ready for code generation and exploration. # MCP server (/developers/mcp) The Paragraph MCP server lets AI agents interact with Paragraph directly. Manage posts, publications, subscribers, coins, and more from any MCP-compatible client. This page is about giving your AI tools (Claude Code, Cursor, and so on) access to Paragraph's API. If you want the opposite (connecting external tools to your Paragraph agent so it can use them), see [agent connections](/agent/connections). ## Quick start [#quick-start] The fastest way to get started is with the hosted server at `mcp.paragraph.com`. No installation or API key management needed. You authenticate through your Paragraph account in the browser. ```bash claude mcp add paragraph --transport http https://mcp.paragraph.com/mcp ``` Add to your `claude_desktop_config.json`: ```json { "mcpServers": { "paragraph": { "url": "https://mcp.paragraph.com/mcp" } } } ``` Add to `.cursor/mcp.json` in your project root: ```json { "mcpServers": { "paragraph": { "url": "https://mcp.paragraph.com/mcp" } } } ``` Add to `.vscode/mcp.json` in your project root: ```json { "servers": { "paragraph": { "url": "https://mcp.paragraph.com/mcp" } } } ``` ## Local server [#local-server] If you prefer to run the server locally, use npx. Requires Node.js 18+. ```bash npx @paragraph-com/mcp ``` The server runs over stdio and works with any MCP client. ```bash claude mcp add paragraph -- npx @paragraph-com/mcp ``` To include your API key: ```bash claude mcp add --env PARAGRAPH_API_KEY=your-key paragraph -- npx @paragraph-com/mcp ``` Add to your `claude_desktop_config.json`: ```json { "mcpServers": { "paragraph": { "command": "npx", "args": ["@paragraph-com/mcp"], "env": { "PARAGRAPH_API_KEY": "your-key" } } } } ``` Add to `.cursor/mcp.json` in your project root: ```json { "mcpServers": { "paragraph": { "command": "npx", "args": ["@paragraph-com/mcp"], "env": { "PARAGRAPH_API_KEY": "your-key" } } } } ``` Add to `.vscode/mcp.json` in your project root: ```json { "servers": { "paragraph": { "command": "npx", "args": ["@paragraph-com/mcp"], "env": { "PARAGRAPH_API_KEY": "your-key" } } } } ``` ## Authentication [#authentication] The remote server at `mcp.paragraph.com` handles authentication automatically. When you first connect, you'll be redirected to approve access through your Paragraph account in the browser. For the local server, the MCP server resolves your API key in this order: 1. **`PARAGRAPH_API_KEY` environment variable** (highest priority) 2. **Shared CLI config** at `~/.paragraph/config.json` (set via `npx @paragraph-com/cli login`) Get your API key in the app at [app.paragraph.com](https://app.paragraph.com) under **Settings → API keys**. Read-only tools like search, feed, and public post fetching work without authentication. You only need to authenticate for write operations and accessing your own publication data. ## Available tools [#available-tools] The server exposes 18 tools organized into toolsets: | Toolset | Tools | Auth required | | ---------------- | ---------------------------------------------------------------------------------------- | -------------- | | **posts** | `get-post`, `list-posts`, `create-post`, `update-post`, `delete-post`, `send-test-email` | Write ops only | | **publications** | `get-publication` | No | | **subscribers** | `list-subscribers`, `get-subscriber-count`, `add-subscriber` | Yes | | **users** | `get-user` | No | | **coins** | `get-coin`, `list-coin-holders` | No | | **search** | `search-posts`, `search-blogs`, `search-coins` | No | | **feed** | `get-feed` | No | | **me** | `get-me` | Yes | ## Filtering toolsets [#filtering-toolsets] Expose only the tools your agent needs to reduce context usage: ```bash npx @paragraph-com/mcp --toolsets posts,search ``` Available toolset names: `posts`, `publications`, `subscribers`, `users`, `coins`, `search`, `feed`, `me` ## HTTP mode [#http-mode] For server deployments, run the MCP server over HTTP instead of stdio: ```bash npx @paragraph-com/mcp --http --port 3100 ``` The HTTP server binds to `127.0.0.1` (localhost only) and accepts POST requests. A health check is available at `GET /health`. ## Resources [#resources] Explore the source code or report issues. View on npm. # TypeScript SDK (/developers/sdk) The Paragraph SDK is a TypeScript wrapper around our REST API. All functionality in the SDK is described in the [OpenAPI spec](https://github.com/paragraph-xyz/paragraph-sdk-js/blob/main/openapi.json), in the repository on [GitHub](https://github.com/paragraph-xyz/paragraph-sdk-js), and in the documentation on [npm](https://www.npmjs.com/package/@paragraph-com/sdk). **Prerequisites**: Node.js version 18 or higher. ## Getting started [#getting-started] ### Install the SDK [#install-the-sdk] ```bash npm i @paragraph-com/sdk ``` ### Instantiate the class [#instantiate-the-class] Instantiate the `ParagraphAPI` class. ```typescript import { ParagraphAPI } from "@paragraph-com/sdk" // For public endpoints (no API key required) const api = new ParagraphAPI() // For protected endpoints (API key required) const apiWithAuth = new ParagraphAPI({ apiKey: "your-api-key" }) ``` You can generate an API key in the app at [app.paragraph.com](https://app.paragraph.com) under **Settings → API keys**. ### Query data [#query-data] ```typescript // Fetch a publication by slug (use .single() for single object) const publication = await api.publications.get({ slug: "@blog" }).single() console.log(`Fetched publication: ${publication}`) // Fetch posts (paginated list) const { items: posts, pagination } = await api.posts.get({ publicationId: publication.id }) console.log(`Fetched ${posts.length} posts from @blog, out of ${pagination.total} posts: ${JSON.stringify(posts)}`) ``` ## Examples [#examples] Practical examples for common use cases. Each one assumes you've installed and initialized the SDK as shown above. ### Fetching paginated posts [#fetching-paginated-posts] Retrieve posts from a publication with pagination support. This example demonstrates how to fetch multiple pages of posts using cursor-based pagination. ```typescript /** * Given a Paragraph publication slug, fetch the first two * pages of posts. */ async function fetchParagraphPosts(slug: string) { const publication = await api.publications.get({ slug }).single() console.log("Publication:", publication) const posts = [] const firstBatch = await api.posts.get({ publicationId: publication.id }) posts.push(...firstBatch.items) console.log("Posts:", firstBatch.items) if (firstBatch.pagination.hasMore && firstBatch.pagination.cursor) { const secondBatch = await api.posts.get({ publicationId: publication.id, cursor: firstBatch.pagination.cursor }) posts.push(...secondBatch.items) } console.log(`Last ${posts.length} posts from ${slug}, out of ${firstBatch.pagination.total} posts: ${JSON.stringify(firstBatch.items)}`) } ``` ```json Last 2 posts from @blog, out of 39 posts: [ { "id": "jBY6aEvHXTneYkxnHQ9k", "title": "What We're Learning from Coins on Paragraph", "slug": "what-were-learning-from-coins-on-paragraph", "staticHtml": "

Why coins?

It's been a little over a month since we...[truncated]", "json": "{\"type\":\"doc\",\"content\":[{\"type\":\"heading\",\"attrs\":{\"textAlign\":\"left\",\"level\":3}...[truncated]", "markdown": "### Why coins?\n\nIt's been a little over a month since we [shipped]...[truncated]", "coinId": "MTmpnfHJWMTcd84d9kWB", "publishedAt": "2025-09-03T14:30:09.640Z", "updatedAt": "2025-09-04T20:33:28.966Z" }, ] Pagination: { "cursor": "eyJjcmVhdGVkQXQiOiIyMDI1LTA5LTA1VDEwOjE1OjMyLjAwMFoifQ", "hasMore": true, "total": 39 } ``` ### Working with coins and holders [#working-with-coins-and-holders] Fetch coin information and holder data associated with a specific post. This example shows how to retrieve monetization details for content. ```typescript /** * Given a publication & post slug, fetch coin & holders. */ async function fetchCoinFromPost(publicationSlug: string, postSlug: string) { const publication = await api.publications.get({ slug: publicationSlug }).single() const publicationId = publication.id const post = await api.posts.get({ publicationId: publicationId, slug: postSlug }).single() if (post.coinId) { const [coin, holders] = await Promise.all([ api.coins.get({ id: post.coinId }).single(), api.coins.getHolders({ id: post.coinId }) ]) console.log("Fetched coin & holders from post:", coin, holders) } } ``` ```json Fetched coin & holders from post: { "id": "N3j7OrRYuRKZQM1rhYEh", "contractAddress": "0xe9bb3166ff5f96381e257d509a801303b68e5d34", "symbol": "WDLA8I", "postId": "WDla8iypUlssljGYjk3h" } { "items": [ { "walletAddress": "0xf3EA0031318D72bc1094F1F7757eA0C21AB7B9d8", "balance": "692968251623303893599919671", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0xe9bb3166ff5F96381E257d509a801303b68E5D34", "balance": "100000000000000000000000000", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0x7f9E22F20dcFC3DeC17b46399cc584efB8c5A258", "balance": "20199589120082817066031281", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0x34D600129974704933a7E2619FB98c9fe030Fcb5", "balance": "17897201041146921014305499", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0x11111113eA761E8605CE2bb5051F74D2940E3B6B", "balance": "15009842364429493492778480", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0xAf328cD95630B34fc7E3f38d268666F3EbD78cC7", "balance": "14140720297880197457303025", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0xF0344f61EDF4599a46743A92fBBa74d365B16352", "balance": "13730282600000000000000000", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0x44dF085447dBEBCf69C6675c3B8A795c7fdeB3F4", "balance": "12301804207719445739306739", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0xd53c3e1e2c76165C675Aa7ADd2630f4c78B8C8aE", "balance": "10900130118020538645621876", "supportedAt": "2025-09-09T18:17:55.599Z" }, { "walletAddress": "0x74BE1a3d4C5aF15a22ca1BFc27C1fA6084caDd78", "balance": "10336598882089679867027544", "supportedAt": "2025-09-09T18:17:55.599Z", "userId": "UwjHeDkUp0tGTvgCd585" } ], "pagination": { "cursor": "0x000000000000000000000000000000000000000000084595163347d29334c08faee989fda15dfa276bebf116b81d26ba233235ce", "hasMore": true, "total": 205 } } ``` ### User profile lookup [#user-profile-lookup] Retrieve user profile information by wallet address, including any associated Farcaster profiles. ```typescript /** * Given a wallet address, fetch the user profile including * any associated Farcaster profile. */ async function getUserProfileByWallet(walletAddress: string) { const user = await api.users.get({ wallet: walletAddress }).single() console.log("User profile:", user) } ``` ```json User profile: { "id": "AeAOtR8TqKWyzG5apA1R", "walletAddress": "0xc9ddb5E37165827BBBFf15b582E232C06862C4E8", "avatarUrl": "https://storage.googleapis.com/papyrus_images/cb027d7a045c7c1d6b6700d9c95b2f56", "publicationId": "BMV6abfvCSUl51ErCVzd", "name": "Colin Armstrong", "farcaster": { "fid": 12312, "username": "paragraph", "displayName": "Paragraph" } } ``` ## Next steps [#next-steps] * Browse the [OpenAPI spec](https://github.com/paragraph-xyz/paragraph-sdk-js/blob/main/openapi.json) for the full API surface. * View the [SDK repository](https://github.com/paragraph-xyz/paragraph-sdk-js) for more examples. * Check out the [npm package](https://www.npmjs.com/package/@paragraph-com/sdk) for version information. # Import your publication (/getting-started/import-your-publication) Already publishing somewhere else? You can bring your writing and your subscriber list with you. Nothing gets locked in on the way out of your old platform, and nothing gets locked in here either. On Paragraph, your list is yours, and you can [export it any time](/account/manage-account). ## Before you start [#before-you-start] Export your data from your current platform. Most platforms (including Substack and Beehiiv) let you download: * **A subscriber list** as a CSV file of email addresses. * **A post archive**, usually as a file containing your published posts. Grab both before you begin. If your platform buries the export option, its help docs will point you to it. ## Import your subscribers [#import-your-subscribers] ### Check your CSV [#check-your-csv] Your file needs a column of email addresses. If your export includes extra columns (names, signup dates, and so on), that's fine. ### Upload it [#upload-it] Open Chat, attach the CSV, and ask your agent to import the subscribers from it. CSV files can be up to 10 MB. The agent starts the import in the background, so you can keep working while it runs. ### Confirm the results [#confirm-the-results] Once the import finishes, your subscribers appear in [Subscribers](/audience/subscribers). Spot-check the count against your old platform to make sure everyone made it over. Only import lists of people who signed up to hear from you. Purchased or scraped lists hurt your deliverability and aren't allowed. ## Import your posts [#import-your-posts] Your agent can help you migrate your content. Share your export file, or tell it where your old publication lives, and ask it to bring your posts over. It helps carry your writing across so you don't have to rebuild your archive by hand. After the import, skim a few posts to check formatting, especially images and embeds. If something didn't survive the trip, your agent can help clean it up. On the [Scale plan](/account/plans-and-credits), migration help from our team is included. We'll help move your publication over with you. ## After you import [#after-you-import] * **Point your domain at Paragraph.** If your old publication used a custom domain, set it up here so old links keep working. See [custom domains](/publishing/custom-domains). * **Tell your readers.** Send a short post letting subscribers know where you've moved. Email delivery continues from Paragraph, so most readers won't need to do anything. * **Check your SEO basics.** See [SEO](/publishing/seo) to keep search traffic flowing to your new home. ## Need help? [#need-help] If an import misbehaves, or your old platform's export is in an odd format, email [support@paragraph.com](mailto:support@paragraph.com). We've moved a lot of publications and we're happy to help with yours. # Quickstart (/getting-started/quickstart) This guide takes you from zero to a published post. It takes about ten minutes, and most of that is writing. ### Create your account [#create-your-account] Go to [app.paragraph.com](https://app.paragraph.com) and sign up. Continue with Google, or use your email address. No password required either way. If you sign up another way (with a wallet, say), we'll ask you to add and confirm an email address too. It's how we keep your account reachable. ### Meet your agent [#meet-your-agent] When you first sign in, Paragraph sets up your personal agent and starts a short onboarding conversation. This is worth doing properly, not rushing. Tell your agent who you are, what you write about, and who you write for. It uses this to set up your publication and to sound like you later, in drafts, suggestions, and social posts. You can refine all of this any time in [voice and memory](/agent/voice-and-memory). ### Land in your workspace [#land-in-your-workspace] After onboarding, you arrive in your workspace. Home gives you an overview and a place to start a chat. The sidebar holds everything else: the editor, your subscribers, analytics, and settings. Not sure where things live? Take the [workspace tour](/getting-started/workspace-tour). ### Write your first post [#write-your-first-post] You have two good options: * **Write it yourself.** Open the Editor and start typing. It's a clean, focused writing surface. See [the editor](/publishing/editor) for what it can do. * **Start with your agent.** In Chat, describe the post you want. Your agent can research the topic, propose an outline, or write a first draft for you to shape. Most writers end up mixing both. Draft with the agent, then rewrite in your own words in the editor. ### Publish [#publish] When your post is ready, publish it. It goes live on your website right away. You can also send it to your subscribers as a newsletter, so it lands in their inboxes too. See [newsletters](/publishing/newsletters) for how sending works. That's it. You have a site, a post, and a list ready to grow. Your agent never publishes or sends anything important without your sign-off. You review its work in your [Inbox](/agent/inbox), and you can tune what needs approval in [approvals](/agent/approvals). ## What's next [#whats-next] Bring your posts and subscribers from Substack or another platform. Put your site on your own domain (available on Starter and above). Let your agent share your posts to social and work across your tools. Hand off research digests, social sharing, and other repeat tasks. # Workspace tour (/getting-started/workspace-tour) Your workspace at [app.paragraph.com](https://app.paragraph.com) is where you write, talk to your agent, and manage your publication. Here's what each area does and when you'll use it. ## Home [#home] Your overview and starting point. Home shows you what's going on across your publication and gives you a quick way into a conversation with your agent. ## Chat [#chat] Where you talk to your agent. Ask it to research a topic, draft a post, share something to social, or change your website. Conversations are organized into sessions, so you can keep separate threads for separate projects. See [chat](/agent/chat). ## Content [#content] Everything you've written, grouped with the versions made from it. Each row starts with a post and holds the X thread, LinkedIn post, or email drawn from it, so a piece of writing and everything it turned into stay together. Open any card to edit it, or use the create buttons at the end of a row to make another version. Tabs across the top narrow the view to posts, socials, emails, or files. See [the editor](/publishing/editor). ## Inbox [#inbox] Proposals from your agent, waiting for your review. Drafts, social posts, site changes, and other work land here before anything ships. Approve what you like, edit what's close, and dismiss the rest. Below them, a timeline shows today's runs (automations, scheduled work, and anything you approved) with a status for each. See [your inbox](/agent/inbox) and [approvals](/agent/approvals). ## Schedule and Automations [#schedule-and-automations] These two start hidden, because the Inbox already shows what's running today. Open them from search (`Cmd`/`Ctrl` + `K`), or bring them into the sidebar for good with **Customize sidebar** below. **Schedule** is your agent's calendar. It shows one-off work scheduled for a specific time, queued suggestions waiting for their turn, and the upcoming runs of your automations. See [scheduled tasks](/agent/scheduled-tasks). **Automations** are named jobs that run before publishing, after publication events, or on a schedule. Configure their sources, outputs, delivery, and public actions, then pause or review them at any time. Standing work lives here rather than on the calendar, so this is also where you change when an automation runs. See [automations](/agent/scheduled-tasks). ## Subscribers [#subscribers] Your list. See who's subscribed, import readers from another platform, and export your list whenever you want. It's yours. See [subscribers](/audience/subscribers). ## Analytics [#analytics] How your writing is doing. Track your posts and your audience, including subscriber analytics, so you can see what's resonating and where readers come from. See [analytics](/audience/analytics). ## Files [#files] Files you've uploaded or that your agent is working with, all in one place. ## Notifications [#notifications] Activity that needs your attention, like agent work that's ready for review. ## Settings [#settings] Everything configurable lives here: * **Account**: your personal details and login. * **Agent**: how your agent behaves, including [voice and memory](/agent/voice-and-memory) and [connections](/agent/connections). * **Billing**: your plan and credits. See [plans and credits](/account/plans-and-credits). * **Publication**: your publication's name and logo, shown on your site and in your emails. * **Website**: how your public site looks and works. See [website](/publishing/website). For account details, teams, and exporting your data, see [manage your account](/account/manage-account). ## Customize the sidebar [#customize-the-sidebar] You don't have to keep every area in view. Right-click anywhere in the sidebar and choose **Customize sidebar** (it's also in Settings, under Account). From there you can drag items into the order you want, show the ones that start hidden (Schedule and Automations), hide the ones you don't use, and choose whether badges show a count or a small dot. Inbox can also be set to show only when it has something waiting for you. Hiding an item doesn't remove it. It keeps its address, its keyboard shortcut, and its place in search (`Cmd`/`Ctrl` + `K`), and **Reset to default** brings the whole sidebar back. Your layout is personal to you, and saved in the browser you set it in. ## Where to start [#where-to-start] If you're brand new, open Chat and talk to your agent, or head straight to Content and write. The rest of the workspace fills in around your writing as you go. # Welcome to Paragraph (/) Paragraph is a publishing platform built for writers. You get a website, a newsletter, and a subscriber list that belongs to you. You also get an agent. It helps you research ideas, share your posts to social, customize your website, improve your SEO, and run recurring workflows that would otherwise eat your week. It works with your approval: run by AI, approved by you. ## Explore the docs [#explore-the-docs] Sign up, meet your agent, and publish your first post. Chat, voice and memory, suggestions, scheduled tasks, and approvals. The editor, newsletters, your website, custom domains, and SEO. Subscribers, distribution, and analytics. The SDK, CLI, MCP server, and agent skills. ## Where to go next [#where-to-go-next] * **New to Paragraph?** Start with the [quickstart](/getting-started/quickstart). * **Moving from another platform?** [Import your posts and subscribers](/getting-started/import-your-publication). * **Curious what the agent can do?** See [your agent](/agent) and [your inbox](/agent/inbox). * **Comparing plans?** Read [plans and credits](/account/plans-and-credits). If you get stuck anywhere, email [support@paragraph.com](mailto:support@paragraph.com). A real person will help. # Custom domains (/publishing/custom-domains) A custom domain puts your site on an address you own, like `example.com` or `blog.example.com`, instead of your paragraph.com address. It strengthens your brand, and the search value you build over time accrues to a domain that's yours. Custom domains are included with Starter and above. See [Plans and credits](/account/plans-and-credits). ## Before you start [#before-you-start] You'll need: * A domain you own, registered anywhere (Namecheap, Cloudflare, GoDaddy, and so on). * Access to that domain's DNS settings at your registrar. A subdomain like `blog.example.com` is the easiest to set up and works with every DNS provider. A root domain like `example.com` works too, with one caveat covered below. ## Connect your domain [#connect-your-domain] In **Settings → Website**, find the custom domain section and enter your domain. Paragraph shows the DNS records to add: a CNAME record that points your domain at Paragraph, and TXT records that verify you own it. Copy each one exactly as shown. Add those records in your registrar's DNS dashboard, then save. Wait a little while (30 minutes is a good first check), then refresh the verification status in Paragraph. Once every record verifies, your site loads at your new domain. DNS changes can take up to 24 to 48 hours to propagate everywhere, though most domains resolve within a few hours. You can remove the domain later from the same page, and your site goes back to its paragraph.com address. ## Common DNS mistakes [#common-dns-mistakes] **Entering the full domain in the Name field.** Most DNS providers append your domain to whatever you type: | You enter | What gets created | | ------------------ | ------------------------------ | | `blog` | `blog.example.com` (correct) | | `@` | `example.com` (correct) | | `blog.example.com` | `blog.example.com.example.com` | **Leaving an old A record in place.** If the same name already has an A record (from a previous website), delete it before adding the CNAME. A records take precedence and will keep traffic from reaching Paragraph. **Wildcard records.** A `*` record pointing elsewhere can interfere with your subdomain. Remove it, or make sure your specific record wins. **Root domains without CNAME support.** Some DNS providers don't allow CNAME records at the root (`@`). If yours doesn't, use an ALIAS record instead, use a subdomain like `www.example.com`, or move your DNS to a provider that supports CNAME at the root (Cloudflare does, for free, and your domain can stay registered where it is). ## Troubleshooting [#troubleshooting] Check that every record matches what Paragraph shows, character for character, and that your changes are saved at the registrar. Then give propagation more time and refresh the verification status again. Most verification failures are a typo in the Name field or an unsaved change. Verification checks the TXT records, but traffic follows the CNAME. Make sure the CNAME record exists, points at the value Paragraph gave you, and isn't shadowed by an old A record on the same name. That's DNS propagation. Different networks pick up changes at different times. If it works anywhere, the records are right, and the rest will follow within a day or two. Still stuck after 48 hours? Email [support@paragraph.com](mailto:support@paragraph.com) with your domain, a screenshot of your DNS records, and what you're seeing. We'll get you sorted. # Editor (/publishing/editor) The editor is where your posts take shape. Open the Editor area in [app.paragraph.com](https://app.paragraph.com) to see everything you've written: drafts, scheduled posts, and published pieces. Open any post to keep working on it. Everything you publish lands on your [website](/publishing/website), and any post can also go out to your subscribers [by email](/publishing/newsletters). ## Start a post [#start-a-post] There are two ways to begin: * **Start from scratch.** Create a new post in the Editor area and start typing. * **Start with your agent.** Ask for a draft in [chat](/agent/chat) ("Help me outline a post about what I've been working on lately"). The draft lands in the editor, where you can shape it however you like. Drafts and agent edits live in the same document. When your agent works on a post, you'll see its changes in the editor, and you can edit right over them. While chatting, the post opens in a side panel next to the conversation, and you can expand it into the full editor at any time. From the full editor, **Open chat** brings your agent back alongside the post. Your work saves automatically as you write. ## Write and format [#write-and-format] Give your post a title, then write the body below it. Select any text to bring up formatting options like bold, italic, links, and color. To add a block, type `/` on a new line to open the insert menu, then pick what you want (or keep typing to filter). You can add: * Headings, lists, to-do lists, quotes, and dividers * Callouts and collapsible sections to organize longer posts * Code blocks and inline equations (LaTeX between `$$` marks) * Images, tables, and footnotes * Embeds (a YouTube video, an X post, a Spotify track, and more) * Buttons to subscribe, share, or link out For an embed, choose **Embed** from the menu and paste a link. You can also paste a link on its own line, and Paragraph turns it into an embed. ## Cover images [#cover-images] Every post can have a cover image. You can: * **Upload one.** Add an image file, or drag and drop it onto the cover area. * **Generate one.** Your agent can generate cover options from your post. Pick the one you like, or ask for new options until it feels right. You can swap or remove the cover at any time before or after publishing. ## Publish a post [#publish-a-post] Click **Publish** in the editor. Before anything goes live, you'll review the final settings. Check the social preview: the cover, title, and description readers will see when your post is shared or found in search. Set the post URL. Paragraph suggests a slug from your title, and you can edit it. Credit the right author. If your publication has more than one member, you can change who the post is bylined to, or add a second author. You'll only see this step when there's somebody else to credit. Choose whether to deliver the post as a newsletter. If it's on, you'll see how many subscribers will receive it. See [Newsletters](/publishing/newsletters) for details. Publish now, or schedule for later. ## Schedule for later [#schedule-for-later] Instead of publishing right away, pick a date and time and Paragraph publishes the post for you. Scheduled posts show up in the Schedule area, alongside your agent's [scheduled tasks](/agent/scheduled-tasks), so you can see your whole week at a glance. ## Get a post ready with your agent [#get-a-post-ready-with-your-agent] When a draft feels close, ask your agent to help you get it ready to publish. It reviews the post and surfaces: * A settings recap where you can adjust the slug, author, newsletter delivery, and cover in place. * Review suggestions you can apply or skip. * A publish bar to publish or schedule when you're happy. Nothing publishes until you say so. Your agent always [asks before](/agent/approvals) anything goes public. ## Next steps [#next-steps] Send your posts to subscribers by email. Turn each post into X threads, LinkedIn versions, and newsletter sends. # Newsletters (/publishing/newsletters) Paragraph is a full newsletter platform. Any post you publish can also land in your subscribers' inboxes, and every email you send is archived on your [website](/publishing/website) so new readers can catch up. ## Send a post by email [#send-a-post-by-email] Email delivery is a choice you make when you publish. In the publish settings, turn on newsletter delivery and you'll see exactly how many subscribers will receive the post. Leave it off for posts that should only live on your site. This works the same whether you publish right away or [schedule for later](/publishing/editor): the email goes out when the post goes live. The recipient count reflects active subscribers who receive your emails. Readers who unsubscribed, or opted out of email, aren't included. ## Your email archive [#your-email-archive] Every newsletter you send stays readable on your site. That matters more than it sounds: new readers can browse your back catalog, search engines can find it, and a post keeps earning readers long after the send. ## Grow your list [#grow-your-list] Your site includes subscribe prompts, so readers who find a post can join your list right there. Each new subscriber then gets your future sends automatically. To bring an existing list with you, see [Subscribers](/audience/subscribers). You can import a CSV from Substack or anywhere else. ## Deliverability [#deliverability] Getting email into inboxes is genuinely hard, so Paragraph handles it for you: sender reputation, infrastructure, and monitoring are all managed on our end. A few habits on your side help too: * **Publish consistently.** Regular sends at similar times build reader engagement, and engaged readers keep you out of spam folders. * **Ask new subscribers to reply or move your email to their primary inbox.** One small action teaches their email provider that you're wanted. * **Keep your list healthy.** A smaller list of real readers beats a large list of dormant addresses. ## Newsletters and your agent [#newsletters-and-your-agent] Your agent can help with email beyond publishing posts: * Draft a standalone email to your subscribers, like a reader update or an announcement. * Fold newsletter sends into your [distribution](/audience/distribution) plan for each post. * Answer questions like "How did my last send perform?" in [chat](/agent/chat). Nothing is sent without your explicit go-ahead. Emails to your list are exactly the kind of action your agent always [confirms first](/agent/approvals). ## See how sends perform [#see-how-sends-perform] The Newsletter tab in [Analytics](/audience/analytics) shows how each send did, including delivery rate and opens. Use it to learn which topics and subject lines your readers respond to. ## Next steps [#next-steps] Manage, import, and export your list. Understand how your sends and posts perform. # SEO and site maintenance (/publishing/seo) Being found is half of being read. Your Paragraph site ships with solid technical SEO out of the box, and your agent maintains it every day, so your writing keeps showing up in search engines and AI tools without you thinking about it. ## What's built in [#whats-built-in] Every Paragraph site ships with: * **Clean structure.** Fast pages that search engines can crawl and understand. * **Sitemaps.** Every post is listed, so crawlers find new work quickly. * **Structured data.** Machine-readable metadata that helps search engines present your posts well. * **llms.txt.** A guide for AI tools, so assistants like ChatGPT can find and cite your work accurately. None of this needs configuration. It's part of publishing on Paragraph. ## What you control [#what-you-control] The publish settings for each post are where your input matters most: * **Title and description.** These become your search snippet and social preview. Clear beats clever. * **Post URL.** Paragraph suggests a slug from your title. Keep it short and descriptive. Ask your agent for help here. It's good at writing descriptions that summarize a post honestly, and it can suggest better titles when you're stuck. If you're on a [custom domain](/publishing/custom-domains), the search value you build accrues to a domain you own. ## Your agent's daily patrol [#your-agents-daily-patrol] Sites decay quietly: links rot, pages bloat, old posts slip in rankings. Your agent patrols your site every day and does the maintenance work most writers never get to: * **Repairs broken links and redirect chains** before readers or crawlers hit them. * **Trims slow, oversized pages** so everything stays fast. * **Writes missing titles and descriptions** where posts lack them. * **Refreshes posts that are quietly losing traffic**, updating them so they keep earning readers. * **Measures every fix against traffic**, so you can see whether the work paid off. You don't need to schedule any of this. It's part of what your agent does for your publication. ## What happens automatically, and what waits for you [#what-happens-automatically-and-what-waits-for-you] The line is simple: routine upkeep happens on its own, and anything readers would notice waits for your approval. | Happens automatically | Waits for your approval | | --------------------------- | ---------------------------------- | | Link and redirect repairs | Rewrites to a post's content | | Page performance trims | Visible changes to your site | | Filling in missing metadata | Anything a reader would see as new | Pending changes show up for review, and nothing visible ships without your sign-off. See [Approvals](/agent/approvals) for how that works. ## See the results [#see-the-results] The **Search & AI** tab in [Analytics](/audience/analytics) shows how discovery is going: visits from search engines, visits from AI assistants like ChatGPT and Perplexity, and which posts are being found. It's the scoreboard for all of the above. You can also just ask in [chat](/agent/chat): "How's my search traffic trending?" or "Which posts are losing readers?" ## Next steps [#next-steps] Track search, AI, web, and newsletter performance. How your agent asks before making visible changes. # Your website (/publishing/website) Publishing on Paragraph gives you a real website, not just a feed. It includes your posts, your pages, and an archive of every newsletter you've sent. Readers can browse, subscribe, and share from it, and search engines can find it. See [SEO and site maintenance](/publishing/seo) for what's built in. You have two options for how it looks: * **A Paragraph website.** The default design. Clean, fast, and ready the moment you publish. * **A custom site.** A site your agent designs, builds, and deploys just for you. ## Website settings [#website-settings] Everything lives in **Settings → Website**, where you choose what readers see on your publication URL. If you've been on Paragraph a while, the main control is the **Use a Paragraph website** toggle. When on, readers see the new Paragraph website instead of your classic blog, so this is how you move from the classic design to the new one. If you joined on the new app, your website is already the Paragraph website, so this toggle doesn't appear. Once you have a custom site deployed, a second toggle appears: **Use custom website**. It switches readers between your custom site and the default design. Turning it off doesn't delete anything, your custom site stays saved and you can switch back any time. The same page shows your public URL and the status of your site, including your custom site's build and deploy state, so you can see when it's active. ## Build a custom site [#build-a-custom-site] Ask your agent to build your website in [chat](/agent/chat). The quickest way in is **Create new… → New website** in the sidebar, which opens a chat that already asks for one. A typical flow: Tell your agent what you want ("Build me a website" is enough to start). It offers a set of themes to start from, or you can start from scratch. Your agent builds the site using your real posts and pages, and shows you its progress. Ask for changes in plain English: layout, colors, typography, new pages, anything. When you're happy, tell your agent to publish. It deploys the site, and you can watch the status (build, deploy, active) in Settings → Website. Your agent never publishes website changes on its own. Deploys wait for your explicit go-ahead, like every other public action (see [Approvals](/agent/approvals)). ## Change your site later [#change-your-site-later] Your website isn't one-and-done: * **Restyle it.** Ask your agent to adjust anything, from a single page to the whole look. * **Switch themes.** Your agent can rebuild on a new theme. This replaces the current site's customizations (your posts and subscribers are untouched), so it confirms with you first. * **Fall back safely.** Turn off **Use custom website** to show the default design while you rework your custom site. Your posts, pages, and subscribers live in your publication, not in any one design. Switching designs or themes never touches your content or your list. ## Use your own domain [#use-your-own-domain] By default your site lives at your paragraph.com address. On Starter and above, you can point your own domain at it instead. See [Custom domains](/publishing/custom-domains). ## Next steps [#next-steps] Put your site on a domain you own. How your site stays fast, findable, and healthy.