# Pushing content (/push)



`inklet.push.*` is the high-level entry point. Each method takes assets,
creates a Content, uploads any binaries, retries a failed upload once, confirms
the Content, and hands back the result.

The three methods differ in **how much of the decision you keep** and whether
inklet AI processes the assets.

|                                   | Chooses the display | Lays out the content | Plan        | Assets                |
| --------------------------------- | ------------------- | -------------------- | ----------- | --------------------- |
| [`push.auto`](/push/auto)         | inklet              | inklet AI            | Pro         | 1–50, any type        |
| [`push.manual`](/push/manual)     | You                 | inklet AI            | Pro         | 1–50, any type        |
| [`push.hardcode`](/push/hardcode) | You                 | You                  | Free or Pro | exactly 1 PNG or JPEG |

See [Plans and AI features](/plans) for authorization behavior and upgrade
handling.

## Shared options [#shared-options]

Every push accepts:

| Option           | Type            | Notes                                                |
| ---------------- | --------------- | ---------------------------------------------------- |
| `assets`         | `InkletAsset[]` | At least one. Build them with `inklet.assets.*`.     |
| `title`          | `string`        | Optional label, shown in the dashboard.              |
| `intent`         | `string`        | Optional sentence of direction for the layout.       |
| `idempotencyKey` | `string`        | Optional. Generated if omitted, and always returned. |

`push.manual` and `push.hardcode` additionally require `displayId`.

## Shared result [#shared-result]

All three return the same shape:

<SdkType file="push" name="PushResult" />

<Callout type="warn">
  `presentationIds` is commonly **empty** on return, and `state` is commonly
  `processing`. That is success, not failure — rendering happens after the call.
  See [Lifecycle](/lifecycle).
</Callout>

## What `intent` is for [#what-intent-is-for]

`intent` is a sentence of direction, not a template and not a prompt for prose.
It steers how inklet arranges what you sent:

```ts
intent: "Make the key update easy to scan"
intent: "Lead with the number, keep the chart secondary"
intent: "This is a reference sheet — density over drama"
```

It is optional. Without it, inklet infers a layout from the assets themselves.

## Assets [#assets]

Build assets through `inklet.assets.*` so they are validated in your process,
before a request is made:

```ts
inklet.assets.text("Milk, eggs, coffee");
inklet.assets.link("https://example.com/report");
inklet.assets.image({ data, filename: "chart.png", contentType: "image/png" });
inklet.assets.file({ data, filename: "menu.pdf", contentType: "application/pdf" });
```

Limits: **10 MiB** per binary asset, **50** assets per Content. See
[Assets](/api/assets) for accepted content types.

<Cards>
  <Card title="Auto" href="/push/auto">
    Let inklet pick the room.
  </Card>

  <Card title="Manual" href="/push/manual">
    Name the display, keep the typesetting.
  </Card>

  <Card title="Hardcode" href="/push/hardcode">
    Send a finished image.
  </Card>
</Cards>
