---
title: "Creating a post"
description: "The three ways to start an article: from an approved Topic, from a brief you write, or from a draft you already have."
updated: "2026-08-28"
verifiedAgainst:
  - apps/web/lib/new-post-topic-plan.ts
  - packages/shared/src/free-grant.ts
  - apps/web/lib/new-post-custom-brief.ts
  - apps/web/lib/new-post-import.ts
---

There are three entry points, and they differ in how much of the article you are
bringing with you.

<CardGrid>
  <Card title="From a Topic">
    The normal route. Pick an approved Topic and let the pipeline run.
  </Card>
  <Card title="From a custom brief" href="/content/custom-brief">
    You know exactly what you want written. Describe it and the pipeline writes
    that.
  </Card>
  <Card title="From an import" href="/content/import">
    You already have the words. Bring the markdown and let the pipeline finish
    it.
  </Card>
</CardGrid>

## From a Topic

Open **Content**, then **Topics**, choose an approved Topic and generate. The
run does the same work Autopilot would do for that Topic: research against your
Knowledge Engine, drafting in the Direction's voice and length, images, internal
links against destinations that actually exist, and metadata.

You end up with a Post at whatever gate its Direction requires.

## What a generation run costs

Each run consumes one post from the Project's allowance, plus images from the
image allowance. A run that fails does not consume the allowance twice on retry.

On a paid plan that allowance is the billing period's and refills with it. On a
Free Project it is the one-time lifetime grant, so each of the 3 posts is spent
for good.

## While it runs

The run is a job, not a page load. You can leave the page. Progress is visible
in the Content workspace, and the Post appears as soon as there is something to
show.

<Callout variant="note">
  A run needs an allowance with room left in it. It does not need a plan: a Free
  Project has no plan and generates perfectly well against its grant. If the
  Project has used its posts, the request is refused with that reason rather than
  failing silently. See [usage and limits](/billing/usage).
</Callout>
