# Ghost editor cards → Offprint blocks
This page maps Ghost's editor cards to the `app.offprint.block.*` records that GhostOff produces.
Source: [Ghost editor cards](https://ghost.org/help/cards/)
| Ghost card | Offprint block | Notes |
|---|---|---|
| **Image** | `app.offprint.block.image` | Single images, with `alt`, `caption`, and `aspectRatio`. |
| **Gallery** | `app.offprint.block.imageGrid` | Galleries of up to 9 images become an `imageGrid`; single-image galleries become a plain `image`. Offprint also has `imageCarousel` and `imageDiff`, but Ghost doesn't produce those natively. |
| **Markdown** | `app.offprint.block.text`, `app.offprint.block.heading`, `app.offprint.block.codeBlock`, `app.offprint.block.bulletList`, `app.offprint.block.orderedList`, `app.offprint.block.blockquote`, `app.offprint.block.horizontalRule` | Parsed into the matching Offprint blocks. Footnote-like content is flattened to text. |
| **HTML** | varies / `app.offprint.block.webEmbed` | Raw HTML is parsed; known embeds (e.g. `blockquote class="bluesky-embed"`) are detected, iframes become `webEmbed`. Custom scripts/forms are skipped. |
| **Divider** | `app.offprint.block.horizontalRule` | `---`/`
` maps directly. |
| **Bookmark** | `app.offprint.block.webBookmark` | Link card with `href`, `title`, `description`, `siteName`, and optional `preview` blob when a Ghost-hosted thumbnail is available. |
| **Email content** | — | Skipped. Email-only cards are not part of the public post. |
| **Call to action** | `app.offprint.block.text` / `app.offprint.block.button` | Treated like a styled paragraph/button when possible; full sponsor styling is not preserved. |
| **Public preview** | — | Skipped. Paid-content dividers are not emitted. |
| **Button** | `app.offprint.block.button` | Ghost button cards map to the Offprint button block when available. Currently folded into a text link if the button block is not enabled. |
| **Callout** | `app.offprint.block.callout` | Ghost callouts with emoji/text map to Offprint callouts. Background color is not preserved. |
| **GIF** | `app.offprint.block.image` | Animated GIFs are uploaded as blobs and emitted as images. |
| **Toggle** | `app.offprint.block.text` | Toggle header/body are flattened into paragraphs/headings; collapsible behavior is not preserved. |
| **Audio** | — | Skipped. No Offprint audio block exists. |
| **Video** | — | Skipped. No Offprint video block exists; embedded video URLs may become `webEmbed` if hosted externally. |
| **File** | `app.offprint.block.webBookmark` | File cards are represented as a link card to the download URL. |
| **Product** | `app.offprint.block.webBookmark` | Product images become an image block; purchase link becomes a `webBookmark` or plain link. |
| **Header** | `app.offprint.block.heading` + `app.offprint.block.image` | Header background images become image blocks; heading/subheading text become headings. Layout styling is not preserved. |
| **Embed** (YouTube, Spotify, etc.) | `app.offprint.block.webEmbed` | oEmbed/iframe embeds become `webEmbed` with the source URL. |
| **Signup card** | — | Skipped. Member signup forms are Ghost-specific. |
## Inline formatting
Ghost inline styles map to `app.offprint.richtext.facet` features:
| Ghost style | Offprint facet |
|---|---|
| Bold | `app.offprint.richtext.facet#bold` |
| Italic | `app.offprint.richtext.facet#italic` |
| Underline | `app.offprint.richtext.facet#underline` |
| Strikethrough | `app.offprint.richtext.facet#strikethrough` |
| Inline code | `app.offprint.richtext.facet#code` |
| Link | `app.offprint.richtext.facet#link` |
| Highlight | `app.offprint.richtext.facet#highlight` |
## Notable differences
- **No audio/video blocks.** Audio and uploaded video cards are dropped. If the same media is also linked from a public embed/iframe, it may still appear as `webEmbed`.
- **No forms or member gates.** Signup cards, email-only content, and public-preview dividers are skipped.
- **Callout background colors** and **button styling** are not preserved; only the text/emoji content is kept.
- **Bookmarks** fetch OpenGraph data from the URL itself at read time inside Offprint, so GhostOff only needs to provide the URL and any available metadata.