Skip to content
Marketing
Skill

/create-chatgpt-mockup

Render pixel-accurate ChatGPT mobile (iOS) screen mockups in light mode from a thread JSON. Supports user text bubbles, user image attachments, assistant markdown prose, citation chips, the OpenAI spiral logo, the Apps-SDK GPT chip in the composer, and three header styles

From plugin
goose-skills
1.3k181 skills

Claude Code

$ npx -y skills add gooseworks-ai/goose-skills --skill create-chatgpt-mockup --agent claude-code

SKILL.md

create-chatgpt-mockup.SKILL.md
name: create-chatgpt-mockup
description: Render pixel-accurate ChatGPT mobile (iOS) screen mockups in light mode from a thread JSON. Supports user text bubbles, user image attachments, assistant markdown prose, citation chips, the OpenAI spiral logo, the Apps-SDK GPT chip in the composer, and three header styles (model-tag, plain title, "Get Plus"). Fixed 9:16 viewport. Outputs HTML + PNG.
status: superseded
superseded_by: phone-chat@1.2.0

> **Superseded:** the video kit now does this with the phone-chat part, version 1.2.0, in the parts folder of this repository. Every phone-chat style is a style file that draws the same screen frame by frame from the plan's scenes, with the original sounds, in the kit's browser. This atom stays, unchanged in behaviour, for skills outside the kit until they move; its scripts still run.

create-chatgpt-mockup

Purpose

Generate single-frame ChatGPT mobile screens that read as real iOS captures โ€” accurate header chrome, user/assistant message styling, composer pill, status bar, and the OpenAI spiral mark. Designed for use inside ad creatives, social posts, video storyboards, and product mockups.

If you need an **animated, video-recorded chat reveal** (bubbles popping over time, SFX, music bed, end card), use the `render-chatgpt-chat` skill. This atom only produces a single still frame.

Inputs

Compose a `thread.json` matching the schema below, then pass it to `render.js`.

Thread JSON schema

{
  "statusBar": {
    "time": "9:41",
    "dnd": false
  },
  "header": {
    "style": "model-tag",
    "title": "ChatGPT",
    "model": "5.1",
    "rightIcons": ["personPlus", "dottedCircle"]
  },
  "messages": [
    { "type": "user-image", "src": "assets/photo.jpg", "aspect": "square" },
    { "type": "user-text",  "text": "Make this face sunscreen better" },
    {
      "type": "assistant",
      "title": "Optional H1 with spiral logo",
      "feedback": true,
      "text": "Markdown-ish prose. **bold**, *italic*, ## H2, * bullet, 1. ordered, [[cite:Source +1]], [[icon:๐Ÿ’ก]] inline-icon."
    }
  ],
  "composer": {
    "placeholder": "Ask anything",
    "text": "Typed text to show with caret",
    "cursor": true,
    "streaming": false,
    "chip": { "name": "Seatfinch" }
  }
}

Field reference

**`statusBar`**

  • `time` โ€” string shown top-left (e.g. `"9:41"`, `"08:18"`).
  • `dnd` โ€” when `true`, renders a small moon glyph next to the time (matches iOS Focus-on indicator).

**`header.style`** โ€” one of:

  • `"model-tag"` โ€” `โ‰ก ChatGPT 5.1 โ–พ โ—โ—` โ€” used when a specific model is active.
  • `"title-only"` โ€” `โ‰ก ChatGPT โ€บ โ—โ—` โ€” the plain in-chat header.
  • `"plain-title"` โ€” `โ‰ก Get Plus โœฆ โ—โ—` โ€” for the upsell/empty-state title.

**`header.rightIcons`** โ€” array of icon keys, rendered left-to-right on the right side. Available: `"personPlus"`, `"dottedCircle"`, `"edit"`, `"more"`. Default is `["personPlus", "dottedCircle"]` for `model-tag`, `["edit"]` for `title-only`.

**`messages[]`** โ€” one of:

  • `{ "type": "user-image", "src": <path>, "aspect": "square"? }` โ€” relative `src` paths resolve against the thread.json directory.
  • `{ "type": "user-text", "text": <string> }` โ€” right-aligned soft-gray bubble.
  • `{ "type": "assistant", "text": <markdown>, "title"?: <string>, "feedback"?: <bool> }` โ€” left-aligned plain prose. If `title` is set, an OpenAI spiral logo + bold title is rendered above the body. `feedback: false` hides the thumbs-up/down chips.

**Assistant `text` markdown** โ€” supported syntax:

  • `**bold**`, `*italic*`
  • `# H1`, `## H2`, `### H3`
  • `* item` / `- item` bullet lists
  • `1. item` ordered lists
  • `---` horizontal rule
  • `[[cite:Some Source +1]]` โ€” pill citation chip
  • `[[icon:๐Ÿ’ก]]` โ€” inline emoji prefix (kept un-escaped)
  • Single `\n` โ†’ soft line break (`<br>`); double `\n\n` โ†’ new paragraph

**`composer`**

  • `placeholder` โ€” shown when `text` is empty (default `"Ask anything"`).
  • `text` โ€” typed-in text. When present, the send button activates (black bg).
  • `cursor` โ€” whether to render the blinking caret after `text` (default `true`).
  • `streaming` โ€” when `true`, replaces the send arrow with a stop square (matches "response generating" state).
  • `chip` โ€” optional GPT chip in the composer. `chip.name` is the GPT name. Sets `placeholder` to `"Ask ChatGPT"` if you don't override it.

CLI

node render.js --thread examples/01-sunscreen-image.json
node render.js --thread my-thread.json --output ./exports --name nightly

Flags

| Flag | Effect | |---|---| | `--thread <path>` | (required) JSON file matching the schema above | | `--output <dir>` | parent dir for the dated output folder; default `./chatgpt-mockup-exports/` | | `--name <slug>` | override the output folder slug |

Output

<output>/<YYYY-MM-DD>-<slug>/
  index.html       # standalone HTML (CSS inlined)
  screenshot.png   # 2250 ร— 4002 PNG (DPR 3, 9:16)
  thread.json      # copy of the input for reproducibility

Workflow

1. Receive a brief or existing thread JSON. 2. If only a brief is given, compose `thread.json` matching the schema above. 3. Run `node render.js --thread <path>`. 4. Open the PNG. If anything looks off (header alignment, bubble width, missing icon), edit the JSON or `templates/chat.css` and re-render.

Setup (one-time)

cd create-chatgpt-mockup
npm install
npx playwright install chromium

Quality checks

  • [ ] Renders in **light mode only** (white background, dark text). Dark-mode rendering is out of scope for v1.
  • [ ] Status bar time and right cluster (signal / wifi / battery) sit at the very top, no clipping under the iOS status-bar safe area.
  • [ ] Header chrome icons (hamburger / personPlus / dottedCircle / edit / more) all visually weigh the same as a real ChatGPT iOS screenshot at the same display size โ€” **eyeball, don't pixel-match**. Sub-reading-weight icons read as broken even when their pixel dimensions "match the spec."
  • [ ] Header model tag (`5.1`, `5.2`) sits inline with `ChatGP
Read more
@gooseworks-ai
Ships withgoose-skills

Put your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.

1.3k181 skills
Get the whole plugin

Stars on GitHub

Momentum

stars in total
1.3k
Star history of gooseworks-ai/goose-skills on GitHub, a chart by star-history.com

Other skills on goose-skills.

goose-ads

goose-ads

Edit, resize, animate and study image ads with GooseWorks in this chat. New static or image ads go to the make-static-ads skillโ€ฆ

goose-video

goose-video

Make a video ad in this chat from a real reference ad, found or theirs; styles are the fallback. Follow every answer's next_step.

gooseworks

gooseworks

GooseWorks growth coworker and router for markets, competitors, audiences, creators, campaigns, ads, photos, graphics, video,โ€ฆ

More skills from other plugins.

seo

seo

Comprehensive SEO analysis for any website or business type. Full site audits, single-page analysis, technical SEO (crawlability,โ€ฆ

@agricidaniel@agricidanielInstall Skill
brag

brag

Turn the current project website into a short, polished, shareable launch video using Hyperframes. Use when someone says "/brag",โ€ฆ

brag2w21k
@latent-spaces@latent-spacesInstall Skill
geo-audit

geo-audit

Full website GEO+SEO audit with parallel subagent delegation. Orchestrates a comprehensive Generative Engine Optimization auditโ€ฆ

Questions about create-chatgpt-mockup.

Which coding agents can use create-chatgpt-mockup?
create-chatgpt-mockup installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.