本文へ移動
cccskills
無料GitHub で公開日本語紹介

create-chatgpt-mockup

会話データをもとに、ChatGPTのiOSアプリ風画面を静止画像として描画します。広告やSNS投稿に使えるHTMLとPNGを出力します。

原文原文の説明を見る

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.

gooseworks-ai/goose-skillsスター 1,272(GitHub 1,272 + cccskills 0)
連携ツールPlaywrightOpenAI

実行スコア 未検証

インストール方法を見る

こんなときに便利

  • 会話画面入りのSNS画像を作りたいとき
  • 広告用にチャット画面を見せたいとき
  • スレッドJSONから画面モックを作りたいとき
  • 絵コンテ用の会話画面を用意したいとき

日本語での紹介

できること

会話内容を記述したJSONから、ChatGPTのiOSアプリ風の画面を1枚の画像として描画します。ユーザーのテキストや画像添付、アシスタントの文章、引用チップ、入力欄の状態などを指定でき、ヘッダーの見せ方も選べます。出力には単体で開けるHTMLと、9:16比率のPNG画像、再現用の入力JSONが含まれます。広告クリエイティブ、SNS投稿、動画の絵コンテ、製品モックアップに使う静止画を作れます。

こんなときに便利

会話画面を含む広告や投稿の素材を作りたいとき、会話例を製品モックアップに入れたいときに向いています。入力JSONを用意すれば、同じ会話画面を再出力できます。アニメーション付きのチャット動画ではなく、単一フレームの画面を作る用途です。

使い方の例

  • 「この会話内容を使って、ChatGPT風の画面画像を作ってください」
  • 「このスレッドJSONを9:16のPNGにしてください」

注意点

描画にはNode.js、npmでの依存関係の導入、PlaywrightとChromiumのセットアップが必要です。ライトモードのみで、ダークモード、横スクロールカード、画面キーボード、表やコード装飾付きMarkdownには対応していません。

この紹介文は、公開されている SKILL.md をもとに AI(OpenAI Codex)が作成しました。正確な仕様は下の原文を確認してください。

含まれるファイル(20)

  • SKILL.md14.9 KB
  • examples/01-sunscreen-image.json467 B
  • examples/02-sleep-apnea-long.json1.1 KB
  • examples/03-poem-iphone-mac.json1007 B
  • examples/04-empty-typing.json258 B
  • examples/05-seatfinch-gpt-chip.json596 B
  • examples/06-short-howto.json750 B
  • examples/assets/sunscreen-sky.svg3.1 KB
  • generate.js16.3 KB
  • package.json348 B
  • render.js3.0 KB
  • screenshot.js2.5 KB
  • skill.meta.json136 B
  • templates/chat.css16.6 KB
  • templates/icons.js11.5 KB
  • tests/expected-output.md2.8 KB
  • tests/human-test.md1.8 KB
  • tests/run-all.sh414 B
  • tests/sample-input.md1.8 KB
  • tests/smoke-test.md796 B

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

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

FlagEffect
--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 ChatGPT and its chevron — no wrapping.
  • User bubble is right-aligned, soft-gray (#F4F4F4), border-radius: 28px, max-width 78% of stage.
  • User image attachments use the same 28px corner radius and sit right-aligned above the text bubble.
  • Assistant body is plain prose (no bubble), left-aligned, full-width within the gutter.
  • Composer corner radius is 999px (full pill), 1px border #E5E5E5, send button is 44 × 44 round.
  • When composer.text is set: send button is solid black with a white up-arrow. Caret sits right after the last character of typed text.
  • When composer.streaming: true: send button shows a black square stop icon.
  • When a citation marker [[cite:Foo +1]] is in the assistant text, it renders as a pill chip inline at the end of the sentence.

Failure modes

SymptomCauseFix
Thread file not foundWrong path or running from a different cwdUse absolute paths or run from the skill directory
Image attachment shows broken-image glyphsrc is relative but the renderer couldn't resolve itrender.js resolves relative src against the thread.json's directory — make sure the asset exists at that path
Send button stays light gray after typingcomposer.text is empty string "" instead of unsetEither omit text entirely or set it to a real string
Caret renders as a stray | separated from the textCaret span is being treated as a flex childThe CSS rule for .composer .input uses inline content flow — do not switch it to display: flex
Streamed list-item words render with no spaces ("Howconversationswork").word { display: inline-block } collapses inter-span text-node whitespace inside <div> parents (works fine inside <p>)Use display: inline for .word — modern browsers honor filter: blur() + opacity transitions on inline elements too
Bullets visible while list-item text is still hidden during streamingCSS list-style markers are browser-painted; the word-stream wrapper only sees text nodesThe atom auto-converts <ul><li>X</li></ul> to <div class="md-list"><div class="md-li">• X</div></div> when stream: true — keep that pass; don't regress it. Any new markdown that emits browser-painted glyphs (::marker, quotes, counter-content) needs the same text-conversion treatment.
Markdown --- doesn't render an <hr>The --- line isn't on a line by itself, or the surrounding text didn't end its paragraphSurround --- with blank lines on both sides
Stanzas of a poem joined into single paragraphsLines separated by single \n get joined as a single paragraph but with <br> between them — this is the intended behavior. If you want stanza breaks, use \n\n between stanzas.
Header right cluster overlaps the model tag on long titlesTitle text is too wide for the centered slotShorten header.title, drop the model tag, or switch header.style to "title-only"

Files

FilePurpose
render.jsCLI entry — parses flags, generates HTML, takes screenshot, writes outputs
generate.jsThread JSON → standalone HTML page (markdown-ish parser inside)
screenshot.jsHTML → PNG via Playwright (chromium headless) at fixed 750×1334 / DPR 3
templates/chat.cssAll visual styling
templates/icons.jsInline SVG icons (hamburger, chevrons, spiral logo, mic, plus, send arrow, stop square, signal/wifi/battery, thumbs up/down)
examples/*.json6 reference threads exercising every variant
examples/assets/Placeholder image assets used by image examples
tests/run-all.shBuilders only, in the goose-skills repo (installs have no tests/): render every example into tests/output/ for visual review

Known limitations

  • Light mode only. Dark mode would require a separate theme block and is out of scope for v1.
  • No carousel / horizontal-scroll cards. The Apps-SDK ticketing-app reference shows a horizontal card carousel inside the assistant response; not modeled here.
  • No live keyboard rendering. The composer is the bottom pill only — no on-screen keyboard chrome, suggestion bar, or QWERTY grid. (If you need the keyboard, scale the screen down 50% and overlay a separate keyboard image.)
  • Markdown is intentionally minimal — no tables, no fenced code blocks with syntax highlighting, no nested lists. Add to generate.js#renderMarkdown if a brief requires more.
  • Emoji rendering depends on system fonts. Chromium on macOS ships Apple Color Emoji; on Linux ships Noto Color Emoji.

Quality Checks

Render each examples/*.json with render.js and open the PNGs (builders in the goose-skills repo can run bash tests/run-all.sh, which renders all six into tests/output/), then confirm:

  • Every example renders without error. All six examples/*.json produce an index.html + screenshot.png + thread.json triplet; render.js exits 0.
  • Dimensions are stable. Each screenshot.png is 2250 × 4872 (the .stage is 750 × 1624 and screenshot.js captures at deviceScaleFactor: 3). A wrong size means the stage box or DPR changed.
  • Light mode, white background. Background is white, text near-black. This atom does not render dark mode.
  • Status bar. Time sits top-left; the signal / wifi / battery cluster sits top-right, unclipped. When statusBar.dnd: true (see 02-sleep-apnea-long.json, 05-seatfinch-gpt-chip.json) a moon glyph renders next to the time.
  • Header style matches the JSON. model-tag shows ChatGPT 5.1 ▾ (01-sunscreen-image.json, 06-short-howto.json); title-only shows the plain title + right chevron (02, 03, 05); plain-title shows the upsell title with no chevron (04-empty-typing.json). The center cluster never wraps and the right icons never overlap it.
  • User turns. User text is a right-aligned soft-gray bubble (#F4F4F4, 28px radius). A user-image (see 01-sunscreen-image.json) renders the attachment right-aligned, same 28px corners, above the text bubble.
  • Assistant turns. Assistant prose is left-aligned plain text with no bubble. Markdown renders: bold/italic, ## headings, bullet and ordered lists (06-short-howto.json), --- horizontal rules and the [[cite:…]] pill chip (02-sleep-apnea-long.json), an [[icon:💡]] inline prefix, and title as bold heading text (03-poem-iphone-mac.json, 05-seatfinch-gpt-chip.json). feedback: false hides the thumbs chips.
  • Empty state. When messages is empty (04-empty-typing.json) the centered OpenAI spiral hero renders instead of a conversation.
  • Composer. Default is the full-pill (999px) bar with +, input, mic, and a round 44×44 send button. With composer.text set (04-empty-typing.json) the send button is solid black and a caret follows the typed text. With streaming: true (02, 03) the send button shows the black stop square. With composer.chip (05-seatfinch-gpt-chip.json) the Apps-SDK GPT chip renders inside the composer above the input row.

Failure Modes

SymptomLikely causeWhat to do
Thread file not found: … then exit 1--thread path is wrong or the cwd is not the skill dirPass an absolute path or cd into the skill directory first (render.js resolves the path against cwd)
Error: playwright not installednpm install never ran in the skill dirRun npm install, then npx playwright install chromium (see Setup)
Run hangs ~15s then page.goto … timeoutscreenshot.js is waiting on networkidle for an asset that never loads (e.g. a remote/http image src)Use a local relative src that resolves under the thread.json dir, or an inline SVG asset like examples/assets/sunscreen-sky.svg
Image attachment shows the broken-image glyphuser-image.src is relative but the file is missing on diskrender.js rewrites a relative src to file://<threadDir>/<src>; make sure the asset actually exists there
Send button stays gray after setting textcomposer.text is "" (empty string) rather than a real valueSet composer.text to a non-empty string, or omit it to keep the placeholder state
PNG comes out the wrong size.stage width/height in templates/chat.css or DEVICE_SCALE/VIEWPORT in screenshot.js was changedKeep .stage at 750 × 1624 and deviceScaleFactor at 3 so output stays 2250 × 4872
Header right icons overlap the model tag on a long titleheader.title is too wide for the centered slotShorten the title, drop the model tag, or switch header.style to "title-only"
[[cite:…]] or [[icon:…]] prints literally instead of renderingThe marker is mistyped (missing double brackets / colon)Match the exact [[cite:Source +1]] / [[icon:💡]] form parsed by formatInline in generate.js
Markdown --- shows as text, not an <hr>The --- line is not on its own line between blank linesPut a blank line above and below the ---, as in 02-sleep-apnea-long.json

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

コメント

ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。

まだコメントはありません。最初のコメントを書いてみませんか。

送信するとすぐに公開されます。メールアドレスや電話番号などの個人情報は書かないでください。URL は 2 つまでです。

0 / 1000 文字

このフォームは reCAPTCHA で保護されており、Google のプライバシーポリシーと利用規約が適用されます。

同じリポジトリのスキル

<slug>

無料概要あり

資料には具体的なスキルの内容や手順が記載されていないため、用途や得られる結果を特定できません。

  • 用途を確認したいとき
  • 入力や手順を確認したいとき
  • 期待する結果を確認したいとき
gooseworks-ai/goose-skills1,2722026年10月27日 更新

ad-angle-miner

無料概要あり

顧客の課題や商品情報、広告事例を調べ、根拠のある広告訴求と静止画・動画・コピー案にまとめます。動画案は実際の制作フォーマットとの相性も確認し、商品単位の角度集として整理します。

  • 商品の根拠に沿った広告の切り口を探したいとき
  • 静止画広告や動画広告の案を作りたいとき
  • 顧客の言葉から見出しや広告文を考えたいとき
gooseworks-ai/goose-skills1,2722026年10月27日 更新

ad-campaign-analyzer

無料概要あり

Google、Meta、LinkedInなどの広告実績を分析し、成果の出た広告や予算の無駄を特定します。停止・拡大・テスト案や、具体的な予算配分を提案します。

  • 広告予算の無駄を見つけたいとき
  • 複数媒体の成果を比較したいとき
  • 広告の停止・拡大候補を決めたいとき
gooseworks-ai/goose-skills1,2722026年10月27日 更新

ad-lead-quality-analyzer

無料概要あり

広告費と登録後の成果を照合し、質の高いリード獲得にかかった実コストを算出します。広告素材ごとに拡大・維持・調査・停止の判断材料を整理するスキルです。

  • 広告素材ごとの実質獲得コストを比べたいとき
  • 低CPAでも質の低い広告を見つけたいとき
  • 登録後の成果データとの照合状況を調べたいとき
gooseworks-ai/goose-skills1,2722026年10月27日 更新

ad-management-intake

無料概要あり

Meta広告を始める前にブランド情報を調べ、予算や広告表現に関わる不明点だけを質問して準備を整えます。確認事項と仮定を記録し、ブランド情報とキャンペーン概要を作成します。

  • ブランド情報が未記録の状態で広告を始めたいとき
  • 予算や広告期間の前提を整理したいとき
  • 広告で使う主張や制約を記録したいとき
gooseworks-ai/goose-skills1,2722026年10月27日 更新

ad-policy-check

無料概要あり

広告文や画像内の表現を配信先と商品カテゴリのルールに照らして確認し、直せる箇所を修正しながら、法務や人の判断が必要なリスクを広告ごとに整理します。

  • 広告の配信前チェック
  • 広告画像や動画の表現確認
  • クリエイター広告の表示確認
gooseworks-ai/goose-skills1,2722026年10月27日 更新

gooseworks-ai のスキルをすべて見る

このスキルの問題を報告する