# SlideClark: guide for AI assistants Version 5.0.0 · canonical copy: https://slideclark.com/ai-guide.md · also inside the app: `SlideClark.guide()` SlideClark (called Pitchcraft until October 2026) is a browser presentation studio at https://slideclark.com/app. A deck is **plain JSON**. You write or edit that JSON, the user opens it in SlideClark, edits it visually and presents it. There is no server: everything is validated and rendered in the user's browser. This guide is generated from the same specs the app runs on, so it is always accurate for version 5.0.0. **Plain-text routes.** If your tool rewrites URLs, equals signs or long output, fetch this guide as plain markdown (https://slideclark.com/ai-guide.md) or together with the schema in one file (https://slideclark.com/llms-full.txt). In the page, `SlideClark.guide(9)` returns one section at a time. **Three ways to build a slide, and you can mix them in one deck.** 1. **Template layout**: fill in fields such as `headline` and `items`. Fast and consistent. Best for plain text, lists and simple charts (section 4). 2. **Blank layout with objects**: text, shapes, images and icons placed at x/y/w/h (section 6). 3. **Custom slide**: your own HTML, CSS and JavaScript (section 9). This is the full-capability route. It can do any layout, brand styling, diagram, animation or canvas. When the look of a slide matters, write a custom slide. ## 1. Which job are you doing? 1. **You are a chat window** (ChatGPT, Claude, Gemini, Copilot, etc.) and you cannot touch the user's open SlideClark. Produce a deck file (section 2) for the user to import. Follow sections 3 to 10. 2. **You are an AI inside the user's browser** (a browser agent or assistant with the SlideClark tab open). Edit the live deck with the `SlideClark` API (section 11). Read sections 3 to 10 first so your edits are valid. ## 2. Delivering a deck (chat windows) - Preferred: create a downloadable file named `.sldc` whose entire content is the deck JSON. The user drops it onto SlideClark (Open, or drag it anywhere on the page). - If you cannot create files: reply with the JSON alone in a single ```` ```json ```` code block, with no commentary inside it. The user copies it and uses Open, then pastes it. - Output valid JSON only: double quotes, no comments, no trailing commas, no `...` placeholders. - Always write the current names: the file extension `.sldc` (a SlideClark deck) and `"format": "slideclark"`. Files named `.pitchcraft` with `"format": "pitchcraft"` are from before the rename. SlideClark still opens them and upgrades them on save, so you may read one, but do not create new ones. - The importer sanitises everything (unknown layouts become "statement", bad colours and URLs are dropped, limits are enforced) and reports warnings. It never runs code from the deck outside a sandbox. ## 3. Deck format ```json { "format": "slideclark", "version": 3, "meta": { "name": "Deck title", "theme": "studio", "numbers": false, "transition": "fade" }, "slides": [ { "id": "s1", "layout": "title", "...": "layout fields" } ] } ``` - `meta.theme`: one of `studio`, `editorial`, `contrast`, `aurora`, `brutal`. `meta.transition`: `none`, `fade`, `slide`, `zoom`, `rise`, `blur`. `meta.numbers`: show slide numbers. `meta.css`: optional shared CSS for custom slides (section 9). - Slide fields that every layout accepts: `id` (unique, letters digits `-` `_`), `layout`, `bg` (`""`, `tint`, `dark`, `accent`, `grad`), `tone` (accent colour: `coral`, `amber`, `teal`, `green`, `blue`, `violet`, `pink`), `transition` (per-slide override), `notes` (speaker notes), `fill` (custom background colour), `bgImage` (https or `data:image/...` picture behind everything), `objects` (section 6), `tweaks` (section 7). - Limits: 120 objects per slide, 200 slides per deck, 20000 characters per text object, 300000 characters per custom html/css/js field. ### Themes - `studio`: Studio. Clean and confident. Bricolage Grotesque headlines. - `editorial`: Editorial. Instrument Serif on warm paper. Reads like a magazine. - `contrast`: Contrast. Loud, dark and uppercase. Syne headlines. (dark theme) - `aurora`: Aurora. Deep gradients and glass cards. (dark theme) - `brutal`: Brutalist. Hard borders, hard shadows, no apologies. ## 4. Layouts Every slide has exactly one `layout`. Pick the layout whose fields match your content. Fields not listed for a layout are ignored. ### Free-form - `blank`: Blank. An empty canvas. Add text, images and shapes anywhere. Fields: objects:[{id,type:"text"|"shape"|"image"|"icon",x,y,w,h?,...}] - the whole slide is free-form objects on the 1280x720 stage (see "Free-form objects" in the AI guide). No kicker/headline/body. ### Story - `title`: Title. Big opening statement. Fields: kicker, headline, body - `statement`: Statement. One idea, centred. Fields: kicker, headline, body - `section`: Section. Chapter divider with a huge number. Fields: kicker (the number, e.g. "02"), headline, body - `quote`: Quote. A pull quote with attribution. Fields: headline (the quote), body (who said it) - `closing`: Closing. Final call to action. Fields: kicker, headline, body, items:[{icon?,label,value}] ### Data - `metrics`: Metrics. Big-number KPI cards. Fields: kicker, headline, items:[{value,label,trend:"up"|"down"?,note?}] (2-4 items) - `chart`: Chart. Bar, line, area or donut with insight. Fields: kicker, headline, body (insight), chartType:"bar"|"hbar"|"line"|"area"|"donut", chartData:{labels:[],series:[{name,values:[]}]} or {segments:[{label,value}],centerLabel?,centerSub?}, items?:[{value,label}] callouts - `demo`: Data → slide. Shows the JSON next to what it renders. Fields: same fields as chart; the code panel is generated from chartData - `table`: Table. Reference table. Fields: kicker, headline, tableData:{headers:[],rows:[[]]} ### Structure - `split`: Split. Two big ideas side by side. Fields: kicker, headline, columns:[{icon?,headline,body}] (2-3) - `cards`: Cards. Three or four icon cards. Fields: kicker, headline, items:[{icon,title,body}] (3-4) - `comparison`: Comparison. Before / after, us / them. Fields: kicker, headline, columns:[{headline,body,items:["line",…]}] (exactly 2; first is the "old", second the "new") - `bullets`: Bullets. Numbered points beside a headline. Fields: kicker, headline, body, items:[{title,body}] (3-5) - `process`: Process. Steps left to right. Fields: kicker, headline, items:[{step?,icon?,title,body}] (3-5) - `timeline`: Timeline. Milestones along a line. Fields: kicker, headline, items:[{date,title,body,status:"done"|"now"|"next"?}] (3-5) - `flow`: Flow diagram. Inputs → hub → outputs. Fields: kicker, headline, items:[{col:"in"|"hub"|"out",icon,title,body}] (1-3 "in", exactly 1 "hub", 1-3 "out") ### Visual - `bento`: Bento. Mixed-size tile grid. Fields: kicker, headline, items:[{size:"s"|"w"|"t"|"l",tone?,icon?,title,value?,body?}] (aim for tiles that fill a 4x3 grid: e.g. one "l", one "w" and six "s") - `anatomy`: Editor anatomy. Annotated diagram of the editor. Fields: kicker, headline, body, items:[{title,body}] (up to 5; numbered hotspots on a drawing of the editor) - `themes`: Themes. Live previews of the built-in themes. Fields: kicker, headline, items:[{theme:"studio"|"editorial"|"contrast"|"aurora"|"brutal",title,body}] - `code`: Code. Syntax-highlighted window. Fields: kicker, headline, body, code:{language:"json"|"js"|"html"|"css"|"bash",filename?,source} - `image`: Image. Picture beside text. Fields: kicker, headline, body, image:{src (https URL or data URI),alt} ### Custom - `custom`: HTML, CSS and JS. Write the slide as code: any layout, brand style or animation. Fields: headline (a NAME only, not drawn), custom:{html,css?,js?,base?,interactive?}. html is the whole 1280x720 slide: write anything. See "Custom layout" in the AI guide. Icon names (for `icon` fields and icon objects): `bolt`, `layers`, `sparkles`, `chart`, `lock`, `globe`, `wand`, `cursor`, `clock`, `check`, `users`, `user`, `target`, `rocket`, `shield`, `cpu`, `box`, `link`, `star`, `type`, `image`, `table`, `pie`, `terminal`, `flag`, `presentation`, `heart`, `key`, `puzzle`, `git`, `compass`, `mail`, `feather`, `gauge`, `edit`, `tag`, `map`, `file`, `code`, `download`, `upload`, `eye`, `palette`, `grid`, `play` ### Text markup (every text field, including text in objects) `**bold**`, `*italic*`, `==accent highlight==` and `` `code` ``. Use `==highlight==` on one or two words of a headline. Line breaks inside free-form text objects are kept; generated fields are single-line. ## 5. Choosing between template, free-form and custom Decide per slide. The three routes mix freely, so a deck can be mostly templates with a few custom slides, or custom all the way through. - **Custom slide** (section 9): your own HTML, CSS and JavaScript. Use it whenever the design matters: a brand look, a diagram, a timeline, a chart that is not one of the built-in types, an animation, a canvas, an interactive demo. There is no layout it cannot produce. If the user supplied a brand guide, build in custom slides and put the shared styling in `meta.css`. Custom slides cost more effort to write, and they are edited as code rather than field by field. - **Template layouts** (section 4): plain text, lists, simple charts, tables. They adapt to every theme and the user can edit them field by field without touching code. Use them for slides where the content matters more than the layout. - **Blank layout + objects** (section 6): precise placement without code. Good for a big number, a logo, photos, callouts and simple diagrams built from shapes. - **Objects on top of a template slide**: any layout accepts `objects`; they float above the layout. Good for a logo, a sticker, an annotation. If the user said nothing about style, a good default is templates for the plain slides and custom slides for the two or three that carry the story. ## 6. Free-form objects `objects` is an array, drawn in order: later items are on top. The stage is **1280 wide, 720 tall**, origin top-left, all units are pixels, `rot` is degrees clockwise. Maximum 120 objects per slide. Common fields: `id` (unique on the slide; generated if you omit it), `type`, `x`, `y`, `w`, `h` (optional for text: it grows with its content), `rot`, `opacity` (0 to 1), `shadow` (true), `name` (label shown in the editor's layers list), `flipH` / `flipV` (mirror), `locked` (the editor will not move or edit it), `group` (objects sharing a group id select and move together), `link` (`https://`, `mailto:` or `#slide-id`, followed when presenting), `alt` (alternative text for shapes, icons and lines). A slide can also be hidden from the presentation with `"hidden": true` (it stays in the editor and is skipped when presenting and exporting to PDF). | type | extra fields | |---|---| | `text` | `text`, `font`, `size` (px), `weight` (100 to 900), `italic`, `underline`, `caps` (uppercase), `align` (left, center, right, justify), `valign` (top, middle, bottom; only when `h` is set), `color`, `lh` (line height multiple), `ls` (letter spacing in em) | | `shape` | `shape`, `fill`, `fill2` + `gradAngle` (a two-colour gradient), `stroke`, `strokeW`, `dash` (solid, dashed, dotted), `radius` (rect only), and all the text fields above for text inside the shape. Put a label in the shape's own `text`; do not lay a separate text object over it | | `line` | `kind` (`straight`, `elbow` for right-angle corners, `curve`), `stroke`, `strokeW`, `dash`, `arrowStart` / `arrowEnd` (`none`, `triangle`, `stealth`, `open`, `dot`, `diamond`), `vert` (elbow and curve leave vertically instead of horizontally), `bend` (0.05 to 0.95: where the middle run sits), `from` / `to` (glue an end to another object: `"objectId:t"`, `:r`, `:b` or `:l`; the line follows when that object moves). The start is the top-left of the box and the end the bottom-right, unless `flipH` / `flipV` mirror it | | `image` | `src` (https URL or `data:image/...`), `alt` (always write it), `fit` (cover, contain, fill), `radius`, `stroke`, `strokeW` | | `icon` | `icon` (name from the list in section 4), `color` | Shapes: `rect` (Rectangle), `round` (Rounded rectangle), `ellipse` (Ellipse), `triangle` (Triangle), `diamond` (Diamond), `hexagon` (Hexagon), `star` (Star), `arrow` (Right arrow), `chevron` (Chevron), `arrowleft` (Left arrow), `arrowup` (Up arrow), `arrowdown` (Down arrow), `arrowboth` (Left-right arrow), `pentagon` (Pentagon), `octagon` (Octagon), `parallelogram` (Parallelogram), `trapezoid` (Trapezoid), `plus` (Cross), `callout` (Speech bubble), `donut` (Ring), `cylinder` (Cylinder), `heart` (Heart), `line` (Line (old)), `connector` (Arrow line (old)). For a diagram, glue connectors to boxes with `from` / `to` rather than guessing coordinates: `{ "type": "line", "kind": "elbow", "from": "a:r", "to": "b:l", "arrowEnd": "triangle", "stroke": "var(--muted)", "strokeW": 3 }`. Their `x`, `y`, `w`, `h` are recomputed from the glue. Fonts (`font`): `body` (Theme body), `display` (Theme heading), `inter` (Inter), `bricolage` (Bricolage Grotesque), `serif` (Instrument Serif), `syne` (Syne), `mono` (JetBrains Mono), `arial` (Arial), `georgia` (Georgia), `times` (Times New Roman), `verdana` (Verdana), `trebuchet` (Trebuchet MS), `courier` (Courier New), `dmsans` (DM Sans), `manrope` (Manrope), `plusjakartasans` (Plus Jakarta Sans), `spacegrotesk` (Space Grotesk), `outfit` (Outfit), `montserrat` (Montserrat), `worksans` (Work Sans), `sora` (Sora), `figtree` (Figtree), `urbanist` (Urbanist), `poppins` (Poppins), `raleway` (Raleway), `nunito` (Nunito), `lato` (Lato), `rubik` (Rubik), `archivo` (Archivo), `epilogue` (Epilogue), `ibmplexsans` (IBM Plex Sans), `josefinsans` (Josefin Sans), `quicksand` (Quicksand), `cabin` (Cabin), `playfairdisplay` (Playfair Display), `lora` (Lora), `fraunces` (Fraunces), `sourceserif4` (Source Serif 4), `cormorantgaramond` (Cormorant Garamond), `librebaskerville` (Libre Baskerville), `dmserifdisplay` (DM Serif Display), `oswald` (Oswald), `anton` (Anton), `bebasneue` (Bebas Neue), `abrilfatface` (Abril Fatface), `pacifico` (Pacifico), `lobster` (Lobster), `caveat` (Caveat), `spacemono` (Space Mono), `ibmplexmono` (IBM Plex Mono), `firacode` (Fira Code), `inconsolata` (Inconsolata). Any other plain family name (letters, digits, spaces and `- . _ & +`) also works but only renders if installed on the viewer's machine, so prefer the keys. They are all bundled and load on demand. Colours (`color`, `fill`, `stroke`): hex (`#1a1a2e`), `rgb()`/`rgba()`, a plain colour name, or a **theme token** that follows the deck theme and the slide background. Prefer tokens so the slide survives a theme change: `var(--fg)` text, `var(--muted)` muted text, `var(--shape)` accent, `var(--on-shape)` on accent, `var(--card)` card, `var(--slide-bg)` background, `#ffffff` white, `#000000` black, `var(--c1)` palette 1, `var(--c2)` palette 2, `var(--c3)` palette 3, `var(--c4)` palette 4, `var(--c5)` palette 5, `var(--c6)` palette 6. Defaults when a field is omitted: - `text`: w 520, size 36, weight 400, font "body", align "left", valign "top", color "var(--fg)", lh 1.25, ls 0 - `shape`: w 260, h 160, shape "rect", fill "var(--shape)", stroke "", strokeW 0, radius 0, dash "solid", size 28, weight 600, font "body", align "center", valign "middle", color "var(--on-shape)", lh 1.2, ls 0 - `image`: w 480, h 320, fit "cover", radius 0, stroke "", strokeW 0 - `icon`: w 96, h 96, color "var(--shape)" - `line`: w 320, h 0, kind "straight", stroke "var(--shape)", strokeW 5, dash "solid", arrowStart "none", arrowEnd "none", bend 0.5 Rules for good free-form slides: - Keep everything inside the safe area: x from 74 to 1205, y from 40 to 668, unless it is a deliberate full-bleed shape or image. - Body text at least 26 px; nothing under 22 px except small captions. Headlines 56 to 88 px, weight 700, `font: "display"`. - Text needs contrast against what is behind it (4.5:1). On a coloured shape use `var(--on-shape)`; on the slide use `var(--fg)`. - Align objects to a grid (multiples of 8) and reuse the same left margin. Give a text object enough `w` for its longest line; it wraps inside `w`. - Do not stack text boxes on top of each other unless it is deliberate. ## 7. Tweaks: moving and restyling a template slide's own elements Every editable text in a template slide has a path (`headline`, `body`, `kicker`, `items.1.title`) and every card or row has an item key (`items.1`). `tweaks` nudges or restyles them without leaving the layout: ```json "tweaks": { "headline": { "dx": 40, "dy": -20, "size": 96, "color": "var(--shape)" }, "items.1": { "dx": 0, "dy": 24 } } ``` `dx` and `dy` are pixel offsets. Text fields also accept `font`, `size`, `weight`, `italic`, `underline`, `caps`, `align`, `color`, `lh`, `ls`. Tweaks are optional: do not add them unless the user asks for a specific move or restyle. ## 8. Design rules - 8 to 14 slides for a full deck. Start with a `title` slide, end with a `closing` slide. - One idea per slide. Headlines under 9 words. Body text under 30 words. Cards and rows: short phrases. - Use varied layouts: never the same layout twice in a row. Alternate `bg` (`dark`, `accent`, `tint`) every few slides for rhythm. - Never invent facts, numbers, quotes or logos. If data is unknown, write `[NEEDS EVIDENCE]` or label the kicker "Sample data". - Choose a theme that fits the tone of the brief; do not mix `bg` and `fill` on the same slide (`bg` wins). - Write speaker notes (`notes`) when the user will be presenting. ### Writing style Slides are read in seconds, so weak writing shows. Write natural, precise British English, the way a knowledgeable person with one specific point to make would write it. Aim for clarity and accuracy, not polish, enthusiasm or impact. Swapping banned words for synonyms is not enough: avoid the patterns underneath (artificial contrast, neat triads, manufactured punchiness, inflated abstraction, repeated summaries). **Titles and headings** - A title says what the slide shows or concludes, in literal words: "Pilots stall at the national specification" and not "Where the magic happens", "The elephant in the room" or "Bridging the gap". No puns, slogans, teasers or questions. No "The Bottom Line", "Key takeaway" or "In summary" slide or label unless the content needs one. - Kickers are plain topic labels ("Funding", "Part 2 of 5"). No heading for a single thought. **Start and end** - State the point first. No scene-setting ("In today's rapidly evolving landscape", "In an era where"), no announcing ("Let's break this down", "Here's the thing"), no definition of terms the audience knows. - End on the actual next step, decision or open question. No slogan, no "the future belongs to", no "Now is the time to", no offer of more help. **Words** - Plain words: "use", not "leverage", "harness" or "utilise". Avoid "unlock", "seamless", "robust", "holistic", "powerful", "game-changing", "transformative", "cutting-edge", "innovative", "meaningful", "tangible", "actionable insights", "strategic imperative", "journey", "landscape", "ecosystem", "navigate", "foundation", "catalyst", "paradigm shift", "future-proof", "data-driven" unless it is the most precise term. - Concrete verbs and actors: "The team reviews each order", not "enable alignment" or "drive outcomes". Replace "support", "facilitate", "empower", "enhance", "accelerate" with what actually happens. Prefer "implement" to "the implementation of". Name who does what rather than "will be ensured". - Say how, not just that: "improves collaboration" needs a mechanism or should go. **Sentences and structure** - No "not X but Y", "it's not just X, it's Y", "the question is no longer whether", "from X to Y" slogans, "whether you're X or Y". No rhetorical question followed by its answer. No dramatic fragments ("The result? Chaos."), fake suspense ("But there's a catch") or stock transitions ("That said", "With that in mind"). - Do not group everything in threes or pairs of adjectives. Use as many points as the subject has. Do not invent frameworks, pillars, stages, maturity models or named concepts. - Vary sentence and bullet length. A slide where every bullet is a bold label, a colon and eight words reads as machine output. Bold sparingly. Few em dashes: use commas, colons, brackets or a new sentence. - Do not repeat the same point on the title, the body and the closing slide. Do not add "this means that" to a point that already speaks for itself. **Claims and tone** - Do not overclaim. Skip "crucially", "importantly", "ultimately", "fundamentally" and superlatives you cannot back up. Give a number and its source, or leave the claim out. No "research shows" or "experts agree" without naming them. No invented quotes, personas or analogies. - Make a judgement when the evidence supports one. No forced balance, no "it depends on your needs", no generic caveats or risk lists. If something is uncertain, say what and why, once. - Do not attribute feelings to the audience ("You may be wondering"), and do not reassure, cheer or sell. No exclamation marks. ## 9. Custom layout (HTML, CSS, JavaScript) ```json { "id": "s5", "layout": "custom", "headline": "short name", "custom": { "html": "...", "css": "...", "js": "...", "interactive": false } } ``` - `custom.html` is the whole 1280 x 720 slide body (no ``, `` or `