---
title: "Custom briefs"
description: "Writing the instruction yourself when you know exactly what the article should be, without adding a Topic first."
updated: "2026-08-28"
verifiedAgainst:
  - apps/web/lib/new-post-custom-brief.ts
  - packages/shared/src/free-grant.ts
  - apps/web/lib/server/new-post-generation-contract.ts
  - apps/web/lib/server/new-post-generation-acceptance.ts
  - apps/web/app/app/posts/new/page.tsx
  - workers/lib/draft/custom-resource-evidence.ts
---

A custom brief is the route for an article you already have in your head. It
skips Topic approval and goes straight to a drafting run against your own
instruction.

## When to use one

- A launch post, an announcement, or anything tied to a date.
- An article a customer asked for, in the words they asked for it in.
- A piece that does not belong in any existing Direction.

## What to put in it

The more specific the brief, the less generic the draft. Worth including: who it
is for, what it should argue, which product capabilities it should mention, and
anything it must not claim.

<Callout variant="tip">
  A brief is an instruction, not a prompt to be clever with. Write it the way you
  would brief a writer who knows your product but not this article.
</Callout>

## Adding resource links

A brief can carry its own reading list. Paste complete `https://` links into the
brief and Blogged detects them automatically, then shows a checkbox list titled
**Optional resource links** below the box. Detection is the whole of what
happens while you type: nothing is fetched yet.

You decide which of the detected links become candidate resources for the run.
**Use all valid links** ticks every link that passed validation, and **Clear**
empties the selection.

A link that cannot be used is listed with the reason rather than quietly
dropped, so you can fix it and paste it again.

| Why a link is unselectable | Reason shown |
| --- | --- |
| It is not HTTPS | HTTPS is required. |
| It carries credentials in the link | Remove credentials from the link. |
| The host is an IP address | IP address links are not accepted. |
| The hostname is incomplete or not a public one | Use a public link with a complete hostname. |
| It carries sensitive query parameters, such as a token, key or session id | Remove sensitive query parameters before selecting this link. |

You can select at most 10 links. That ceiling is enforced twice, in the browser
as `MAX_SELECTED_CUSTOM_BRIEF_RESOURCE_LINKS` and again on the server as
`MAX_CUSTOM_BRIEF_RESOURCE_URLS`, so a request that reaches the API by some
other route is held to the same limit.

### What the worker does with them

Selected links are fetched only after you generate, by the worker, and never
while you are still writing. Every axis of that fetch is bounded:

<PropertyList>
  <Property name="Concurrency" type="3 resources at a time">
    Ten links do not open ten connections to ten sites.
  </Property>
  <Property name="Timeout" type="15 seconds total">
    A total budget for a batch, not a per-link allowance. A slow host cannot
    hold the run open.
  </Property>
  <Property name="HTML downloaded" type="1.5 MB per resource">
    Anything past the cap is not read.
  </Property>
  <Property name="Text read" type="about 8,000 characters">
    Taken from the parsed main text, so a long page contributes its article
    rather than its navigation.
  </Property>
  <Property name="Facts extracted" type="at most 12 per resource">
    A resource contributes a bounded set of atomic facts, not a summary of
    itself.
  </Property>
</PropertyList>

A link whose robots policy disallows fetching is skipped, recorded as
`robots_disallowed`. A link that fails to fetch for any other reason contributes
nothing and does not fail the run: the article is written from what was
gathered. Only verified facts extracted from a resource can inform the article,
so a page that was reached but yielded nothing usable ends up in the same place
as one that was never reachable.

<Callout variant="warning" title="Resource links never appear in the prose">
  A resource is evidence, not a link to drop into a sentence. No resource URL is
  written into the body of the article. Eligible sources that the article
  actually drew on appear in the bibliography below the published post instead,
  and that footer selection gives every distinct domain one slot before any
  domain gets a second. A link you selected but the draft did not use will not
  appear anywhere on the page. See
  [sources and citations](/content/sources-citations) for how the rest of an
  article's evidence is handled.
</Callout>

## What still applies

A custom brief does not bypass the rest of the pipeline:

- The draft is written against your [Knowledge Engine](/knowledge/overview), so
  claims stay tied to sources. Facts extracted from resource links join that
  same evidence rather than going around it.
- Internal links are proposed only against destinations that exist.
- The post lands with author mode `Assisted`, because the pipeline wrote it. The
  brief was yours; the article was generated.
- The run counts against the Project's post allowance: the billing period's on
  a paid plan, the one-time lifetime grant on a Free Project.

## Retrying

If a run fails, retrying reuses the request you submitted rather than asking you
to type it again. That includes the resource links you selected, which are
re-checked against the brief so a link you have since edited out is dropped
rather than silently carried forward.
