# 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.