# Turboslide > A block document with a validator and a grammar linter; every operation is a named action in one table, reachable from the CLI, MCP, HTTP and the studio window API (SPEC 1, 7.1). Turboslide holds the GT brand deck as typed JSON (deck.json plus slides/.json), renders it with one renderer, lints it against the deck grammar, and exports it to PPTX with a verified report, pixel identical in its default mode (docs/pptx.md). There are no coordinates: a slide is a kind, a layout and typed blocks in named slots. ## Discovery - /api/agent: the manifest (transports, rules, execution rules, action ids, skills, resources, what this instance implements) - /openapi.json: the OpenAPI 3.1 contract of POST /api/actions/ - /mcp: MCP over streamable HTTP; `turboslide mcp` is the same server over stdio - /llms-full.txt: this guide with every action and every lint rule - skills/turboslide-{create,api,studio,verify}/SKILL.md: the four skills with their generated reference tables - docs/grammar.md: the deck grammar (slide kinds, layouts, blocks, rules) ## Rules - Every mutating action requires baseRevision and rejects a stale one with 409 and the current document. - Every write returns the normalized result; re-read from the response, not from memory. - Unknown fields are rejected with unknown_field and a JSON pointer, except under ext on a slide, a block or an asset. - An agent write to a slide another author leased is refused with 409 and the holder unless force is set. - A claim about a deck names the revision; render both themes and lint before claiming a slide is done. ## Calling an action over HTTP - POST /api/actions/; GET /api/actions/ returns the action contract: input and output JSON Schema, transports, milestone and whether this instance implements it. - Body: One JSON object, the action input exactly as the input schema states it; unknown fields are refused with 400 and code unknown_field plus a JSON pointer. - Deck: ?deck= names the deck; without it the instance default (gt-brand) is used. - Author: x-turboslide-author: agent: (or ?author=); a request without one writes as agent:http. - Force: ?force=1 (or x-turboslide-force: 1) writes to a slide another author leased; without it the write is 409 with the holder and the current document. - Auth: Authorization: Bearer on every deployed instance; open only on localhost when the instance has no token; a request off localhost without a token is 401. - Limits: 1048576 bytes per write body, 26214400 bytes per asset upload. - Errors: { error: { name, status, message, code?, pointer?, currentRevision?, current?, holder?, milestone? } }; TypeError 400, RangeError 404, ConflictError 409, NotImplementedError 501, Error 500. ## MCP over HTTP - MCP streamable HTTP: POST JSON-RPC to /mcp (initialize first), GET for the notification stream, DELETE to end the session; the mcp-session-id header carries the session. - One MCP session is bound to one deck and one author at initialize; tools are deck_ for every implemented action on the mcp transport. - ?deck= on the initialize request; the instance default otherwise. x-turboslide-author or ?author= on the initialize request; agent:mcp-http otherwise. - deck_goto_slide (view.goto) is listed when a studio page is attached to the deck and runs in that page: the editor at /edit while it is visible, and a /deck, /present or /embed page opened with ?agent=1 while it is visible; a page hidden for 10 s detaches and the call answers 404 until it is shown again. ## Leases and revisions - slide.lease takes ten minutes on a slide; an agent write to a slide another author holds is 409 with the holder unless force is set; a human write warns and goes through (SPEC 6.7). - Every mutating action takes baseRevision; a stale one is 409 with currentRevision and the current document; re-read from the response and retry once. ## Renders and exports over HTTP - GET /api/render/?deck=&theme=light|dark&scale=1|2 answers the PNG with the RenderRecord in the X-Turboslide-Record header; ?format=json (or Accept: application/json) answers the record. ?w=160|320|640 is the cached thumbnail. - POST /api/export/ takes the export.run input as one JSON object (format defaults to pptx; out is ignored, the file lands in the job folder). ?sync=1 (or "sync": true in the body) runs the export inside the request and answers the file, or the ExportReport with the files and their URLs under ?format=json (or Accept: application/json); the X-Turboslide-Export-Report header carries the summary. - A hosted studio (a serverless function) runs every POST synchronously, ?sync=1 or not, and says so in X-Turboslide-Sync: hosted: a queued job would get CPU only while another request kept the instance busy, and its record lives on that instance alone. Send ?sync=1 so the request means the same everywhere. - In a checkout or against the Docker worker, a POST without ?sync=1 answers 202 with the job and a Location to poll: GET /api/export/?job= for the record (the ExportReport under report once done), GET without job for the deck's jobs. - A file over 4.5 MB cannot leave a function: the route answers 302 to the stored copy when the deployment has a Blob store, else 413 with the JSON body; export one theme or a slide subset then. - Auth: both routes require Authorization: Bearer when the instance has the token set (the thumbnail variant of the render route stays open for the editor); without it they are open. ## Transports - cli: turboslide --json --author agent: - mcp: turboslide mcp (stdio) or POST /mcp (streamable HTTP); tools deck_ - http: POST /api/actions/ with the input as JSON - window: window.turboslide.studio.invoke(, input) after the turboslide:studio-api-ready event ## Skills - turboslide-create (skills/turboslide-create/SKILL.md): Write or revise slides in the grammar - turboslide-api (skills/turboslide-api/SKILL.md): Discover and write through the action table - turboslide-studio (skills/turboslide-studio/SKILL.md): Drive the studio through the window API - turboslide-verify (skills/turboslide-verify/SKILL.md): Render, lint, judge and verify exports ## Verification - Render both themes, read the contact sheet by its cell map, run the grammar linter, judge with the six lenses (deck_review prompt), verify exports against the web render (skills/turboslide-verify). - A claim about a deck names the revision it was verified at; a severity 3 finding blocks the ship step. ## Actions Every mutating action takes baseRevision. The transports column says where the action is offered; an action whose milestone has not landed answers NotImplementedError (501). - deck.info (Deck info; read; cli, mcp, http, window; M1): Title, theme, sections with slide ids and titles, counts (the canvas slides, charts and guides included) and the current revision. Input: none. CLI: turboslide info. MCP: deck_get_info. - deck.create (New deck; mutates; cli, mcp, http, window; M4): Creates a deck under decks/ from a template of the index (template.list), the deployment default when `from` is absent (Blank: one title slide in the Simple theme, light), and returns its id, revision and counts. Input: name, from?, id?. CLI: turboslide deck create --from --id . MCP: deck_create. - deck.rename (Rename deck; mutates; cli, mcp, http, window; M4): Sets the deck title, the name the sidebar head, the toolbar and the deck list show; one deck.set of /title. Input: name, baseRevision. CLI: turboslide deck rename . MCP: deck_rename. - deck.set (Set a deck field; mutates; cli, mcp, http, window; GS1): Writes one field of the deck manifest by JSON pointer (/title, /theme, /defaults/appearance, /defaults/counter, /defaults/notes) as one deck.set mutation, the write the Theme panel and Slide numbers make; an absent value removes the field. /theme takes an id of theme.list (gt-ink-paper is stored as general-translation). Input: path, value?, baseRevision. CLI: turboslide deck set . MCP: deck_set. - deck.pack (Pack deck bundle; read; cli; M6): Writes decks/ (deck.json, slides, assets, versions and the sidecars) as one zip with a manifest.json carrying the bundle version, the deck id, its revision and a digest per file (docs/deck-transfer.md). Input: id, out?, versions?. CLI: turboslide deck pack --out . - deck.unpack (Unpack deck bundle; mutates; cli; M6): Creates a deck under decks/ from a bundle zip after validating it, under a free id when the bundle id is taken unless `replace` removes the deck that holds it (docs/deck-transfer.md). Input: file, as?, replace?. CLI: turboslide deck unpack --as --replace. - deck.push (Push deck to a studio; mutates; cli; M6): Packs decks/ and uploads the bundle to a hosted studio through POST /api/decks/bundle with the bearer token, so the deck can be edited there (docs/deck-transfer.md). Input: id, to, token?, as?, replace?, fromUrl?. CLI: turboslide deck push --to --token --as --replace --from-url . - deck.pull (Pull deck from a studio; mutates; cli; M6): Downloads a deck bundle from a hosted studio through GET /api/decks//bundle with the bearer token and unpacks it into decks/, so the deck can be edited locally (docs/deck-transfer.md). Input: id, from, token?, as?, replace?. CLI: turboslide deck pull --from --token --as --replace. - deck.list (List decks; read; cli, mcp, http, window; GS1): The manifest facts of every deck under decks/ (id, title, slide and section counts, revision, the stamps), newest first; decks in the trash are left out unless asked. Input: includeTrashed?. CLI: turboslide deck list --include-trashed. MCP: deck_list. - deck.copy (Make a copy; mutates; cli, mcp, http, window; GS1): Copies a deck under a new id with a new title, every slide or the named ones, with or without the speaker notes, at revision 0 with an empty version log; the output names the new deck. Input: id, name, newId?, slideIds?, removeNotes?, copyComments?, baseRevision. CLI: turboslide deck copy --name --id --slides --remove-notes --copy-comments. MCP: deck_copy. - deck.trash (Move to trash; mutates; cli, mcp, http, window; GS1): Moves a deck to the trash by writing trashedAt on its manifest: the home page, the fresh presentation route and deck.list leave it out until deck.restore clears the stamp or deck.remove deletes it; nothing else changes. Input: id, baseRevision. CLI: turboslide deck trash . MCP: deck_trash. - deck.restore (Restore from trash; mutates; cli, mcp, http, window; GS1): Clears trashedAt on a deck in the trash, so the home page and deck.list show it again. Input: id, baseRevision. CLI: turboslide deck restore . MCP: deck_restore. - deck.remove (Delete forever; mutates; cli, http, window; GS1): Deletes a deck: the folder under decks/ or the prefix in the Blob store, with its slides, assets and version log. Irreversible; the Trash page calls it, and `confirm` must be true. Input: id, confirm, baseRevision. CLI: turboslide deck remove --confirm. - deck.setBackground (Set theme background; mutates; cli, mcp, http, window; GS2): Writes the background colour every slide without its own takes, what Add to theme writes; null removes it. Input: background, baseRevision. CLI: turboslide deck background --color . MCP: deck_set_background. - deck.guides (Set guides; mutates; cli, mcp, http, window; GS2): Adds, removes, moves, sets or clears the deck’s guide lines, sheet pixels the same on every slide; the result is sorted and inside the sheet, and an empty result removes the field. Input: add?, remove?, move?, set?, clear?, baseRevision. CLI: turboslide deck guides --add-vertical --add-horizontal --remove-vertical --remove-horizontal --set --clear. MCP: deck_set_guides. - template.list (Templates; read; cli, mcp, http, window; P1): The template index: every template with its name, category, cover, sentence, slide count, theme and appearance, the organisation flag of a template saved on this deployment and its brand kit, plus the id of the template new presentations start from. Input: none. CLI: turboslide template list. MCP: deck_list_templates. - template.slides (Template slides; read; cli, mcp, http, window; P1): The slides of one template in order with their titles and kinds, the rows the gallery and Import slides read. Input: id. CLI: turboslide template slides . MCP: deck_template_slides. - template.create (Save as template; mutates; cli, mcp, http, window; P1): Saves a deck as a template of this deployment: decks/templates/ with the deck manifest, its slides, its assets and its brand kit, listed under Your organisation in the gallery; a name an organisation template already carries replaces that template and keeps its slug (the dialog says so first). Input: deckId, name, sentence?, baseRevision. CLI: turboslide template create --sentence . MCP: deck_create_template. - template.update (Replace a template; mutates; cli, mcp, http, window; P1): Replaces the slides, assets and brand kit of an organisation template from a deck and keeps its id, name and sentence; the templates Turboslide ships are refused. Input: id, deckId, sentence?, baseRevision. CLI: turboslide template update . MCP: deck_update_template. - template.rename (Rename a template; mutates; cli, mcp, http, window; P1): Renames an organisation template; its id and its folder stay, so every link and every default record still name it. The templates Turboslide ships are refused. Input: id, name. CLI: turboslide template rename . MCP: deck_rename_template. - template.delete (Delete a template; mutates; cli, mcp, http, window; P1): Deletes an organisation template folder and its index row; presentations made from it are not changed. The template new presentations start from is refused until another is chosen, and so are the templates Turboslide ships. Irreversible; `confirm` must be true. Input: id, confirm. CLI: turboslide template delete --confirm. MCP: deck_delete_template. - template.setDefault (Use for new presentations; mutates; cli, mcp, http, window; P1): Makes a template the one /new and the Blank card start from on this deployment (decks/templates/default.json), whose name, logo and appearance every Reset and every default logo read; `blank` restores the blank deck Turboslide ships. An agent token needs the admin scope. Input: id. CLI: turboslide template default . MCP: deck_set_default_template. - slide.list (List slides; read; cli, mcp, http, window; M1): Every slide in deck order with its number, section, title, kind and lint counts. Input: sectionId?. CLI: turboslide slides. MCP: deck_list_slides. - slide.get (Get slide; read; cli, mcp, http, window; M1): The normalized slide, the assets it references and its last render record. Input: slideId. CLI: turboslide slide get . MCP: deck_get_slide. - slide.insert (Insert slide; mutates; cli, mcp, http, window; M2): Inserts a slide into a section after the named slide, or first. Input: sectionId, after?, slide, baseRevision. CLI: turboslide slide insert --section --after < slide.json. MCP: deck_insert_slide. - slide.remove (Remove slide; mutates; cli, mcp, http, window; M2): Removes a slide from the deck and its section. Input: slideId, baseRevision. CLI: turboslide slide remove . MCP: deck_remove_slide. - slide.move (Move slide; mutates; cli, mcp, http, window; M2): Moves a slide to a section after the named slide, or first. Input: slideId, sectionId, after?, baseRevision. CLI: turboslide slide move --to --after . MCP: deck_move_slide. - slide.update (Patch slide; mutates; cli, mcp, http, window; M2): Applies a mutation list to one slide and returns the normalized slide with its findings. Input: slideId, baseRevision, mutations. CLI: turboslide slide patch --set =. MCP: deck_update_slide. - slide.replace (Replace slide; mutates; cli, mcp, http, window; M2): Replaces a slide with the given document; what the source drawer’s Apply emits. Input: slideId, baseRevision, slide. CLI: turboslide slide put < slide.json. MCP: deck_replace_slide. - slide.setLayout (Set layout; mutates; cli, mcp, http, window; M6): Moves a content slide to another layout and refiles its blocks: to freeform the slide converts to the canvas, every block getting the position box it is drawn at (measured); from freeform the boxes are dropped and the blocks fall into the target slots by geometry (docs/freeform.md). Input: slideId, layout, baseRevision. CLI: turboslide slide set-layout --type --ratio --gap --layout . MCP: deck_set_layout. - slide.new (New slide; mutates; cli, mcp, http, window; GS1): Inserts one slide made from a layout with empty placeholders after the named slide (or first in the section), as one slide.insert with template set; a Section header starts a new section that takes the slides after the anchor. Input: layout, after?, sectionId?, id?, baseRevision. CLI: turboslide slide new --layout --after --section --id . MCP: deck_new_slide. - slide.duplicate (Duplicate slide; mutates; cli, mcp, http, window; GS1): Copies the named slides with fresh ids after the last of them, in one write; a copied section header starts a new section. Input: slideIds, baseRevision. CLI: turboslide slide duplicate . MCP: deck_duplicate_slide. - slide.skip (Skip slide; mutates; cli, mcp, http, window; GS1): Sets or clears skip on the named slides in one write: a skipped slide is left out of the slideshow, the shared view, the downloads and the print unless asked. Input: slideIds, skip, baseRevision. CLI: turboslide slide skip --off. MCP: deck_skip_slide. - slide.applyLayout (Apply layout; mutates; cli, mcp, http, window; GS1): Applies a layout to the named slides in one write, one slide.replace per slide: the title, the body, the lists, the tables and the pictures move into the matching placeholders and the rest is appended; only a Title slide or a Main point drops what does not fit, and the output names the dropped blocks. Input: slideIds, layout, baseRevision. CLI: turboslide slide apply-layout . MCP: deck_apply_layout. - slide.import (Import slides; mutates; cli, mcp, http, window; GS1): Copies slides from another deck after the named slide in one write: the assets they use are copied into this deck, colliding slide ids are renamed, and the output lists the slides and the assets that came over. Input: sourceDeckId, slideIds, after?, sectionId?, baseRevision. CLI: turboslide slide import --after --section . MCP: deck_import_slides. - slide.toCanvas (Arrange by hand; mutates; cli, mcp, http, window; GS2): Converts slides to the canvas, the freeform layout, every object taking the position box it is drawn at (measured on a rendered sheet); a slide already on the freeform layout is left as it is; one write, one browser page for the call. Input: slideIds, baseRevision. CLI: turboslide slide to-canvas . MCP: deck_slide_to_canvas. - slide.setBackground (Change background; mutates; cli, mcp, http, window; GS2): Writes the background colour of slides in one write; null removes it and the theme default applies. A background picture is a picture object at the bottom of the stack. Input: slideIds, background, baseRevision. CLI: turboslide slide background --color . MCP: deck_set_slide_background. - text.replaceAll (Find and replace; mutates; cli, mcp, http, window; GS1): Replaces every occurrence of a string in the visible text of the deck (every Text of every block, the title slide fields, the table cells and the speaker notes) in one write, case insensitive unless asked; the output counts the replacements. Input: find, replace, matchCase?, slideIds?, baseRevision. CLI: turboslide text replace --match-case --slides . MCP: deck_replace_text. - block.set (Set block property; mutates; cli, mcp, http, window; M2): Writes one property of a block by JSON pointer; an absent value deletes it. Input: slideId, blockId, path, value?, baseRevision. CLI: turboslide block set # . MCP: deck_update_block. - block.insert (Insert block; mutates; cli, mcp, http, window; M2): Inserts a block into a slot after the named block, or first; a block carrying pos on a slide that is not a canvas yet converts the slide first and lands as an object. Input: slideId, slot, after?, block, baseRevision. CLI: turboslide block insert --slot --after < block.json. MCP: deck_insert_block. - block.remove (Remove block; mutates; cli, mcp, http, window; M2): Removes a block from its slide. Input: slideId, blockId, baseRevision. CLI: turboslide block remove #. MCP: deck_remove_block. - block.move (Move block; mutates; cli, mcp, http, window; M2): Moves a block to a slot after the named block, or first. Input: slideId, blockId, slot, after?, baseRevision. CLI: turboslide block move # --slot --after . MCP: deck_move_block. - block.align (Align blocks; mutates; cli, mcp, http, window; M6): Aligns objects on one edge, against the selection for several, the slide for one, or the content box; against the selection the shared edge is the extreme object's own edge unless snap is true, and the slide's and the content box's edges stay exact; a slide that is not a canvas yet converts first (docs/FOCUS.md rank 14). Input: slideId, blockIds, edge, to?, snap?, baseRevision. CLI: turboslide block align --blocks --edge --to . MCP: deck_align_blocks. - block.distribute (Distribute blocks; mutates; cli, mcp, http, window; M6): Spreads freeform blocks along one axis with equal gaps between the first and the last, or with a fixed gap; with snap the moved edges round to the 8 px grid. Input: slideId, blockIds, axis, gap?, snap?, baseRevision. CLI: turboslide block distribute --blocks --axis --gap . MCP: deck_distribute_blocks. - block.order (Order block; mutates; cli, mcp, http, window; M6): Moves a freeform block through the stacking order, to the front or back or by one step, or to a given z rank, and renumbers the stack densely. Input: slideId, blockId, move?, z?, baseRevision. CLI: turboslide block order # --move --z . MCP: deck_order_block. - block.duplicate (Duplicate block; mutates; cli, mcp, http, window; GS1): Copies the named blocks of a slide with fresh ids, each after its original; a positioned copy sits 16 px right and down and on top of the stack, a copied group takes a fresh tag and copied connectors keep their attachments to copied targets. Input: slideId, blockIds, baseRevision. CLI: turboslide block duplicate --blocks . MCP: deck_duplicate_block. - block.group (Group; mutates; cli, mcp, http, window; GS2): Writes one group tag on two or more objects of a slide in one write; the tag is generated when none is given; a slide that is not a canvas yet converts first. Input: slideId, blockIds, group?, baseRevision. CLI: turboslide block group --blocks --as . MCP: deck_group_blocks. - block.ungroup (Ungroup; mutates; cli, mcp, http, window; GS2): Removes the group tag from the named objects, or from every member of a named group, in one write. Input: slideId, blockIds?, group?, baseRevision. CLI: turboslide block ungroup --group --blocks . MCP: deck_ungroup_blocks. - block.regroup (Regroup; mutates; cli, mcp, http, window; GS2): Writes a tag back on the named objects, the set the editor remembers from the last ungroup. Input: slideId, blockIds, group, baseRevision. CLI: turboslide block regroup --blocks --as . MCP: deck_regroup_blocks. - block.rotate (Rotate; mutates; cli, mcp, http, window; GS2): Rotates objects to an angle or by an angle, degrees clockwise normalized to 0 up to 360, about each box or about the selection (a group rotation moves the members around the union centre); attached connectors follow; a slide that is not a canvas yet converts first. Input: slideId, blockIds, to?, by?, about?, baseRevision. CLI: turboslide block rotate # --to --by --about . MCP: deck_rotate_block. - block.flip (Flip; mutates; cli, mcp, http, window; GS2): Toggles one flip axis on objects; about the selection every member also mirrors about the union centre and its angle becomes 360 minus itself (a group flip); attached connectors follow. Input: slideId, blockIds, axis, about?, baseRevision. CLI: turboslide block flip # --axis --about . MCP: deck_flip_block. - block.crop (Crop image; mutates; cli, mcp, http, window; GS2): Writes the crop of a picture as fractions of it trimmed from each side; a slide that is not a canvas yet converts first when the picture is positioned. Input: slideId, blockId, trim, baseRevision. CLI: turboslide block crop # --left --right --top --bottom . MCP: deck_crop_image. - block.mask (Mask image; mutates; cli, mcp, http, window; GS2): Clips a picture to a closed shape preset, or removes the mask with null. Input: slideId, blockId, mask, baseRevision. CLI: turboslide block mask # . MCP: deck_mask_image. - block.resetImage (Reset image; mutates; cli, mcp, http, window; GS2): Removes the crop, the mask, the adjustments and the round one crop anchor and aspect of a picture in one write. Input: slideId, blockId, baseRevision. CLI: turboslide block reset-image #. MCP: deck_reset_image. - block.adjust (Adjustments; mutates; cli, mcp, http, window; GS2): Writes a picture’s transparency (0 to 1), brightness and contrast (-1 to 1); null clears one. Input: slideId, blockId, transparency?, brightness?, contrast?, baseRevision. CLI: turboslide block adjust # --transparency --brightness --contrast . MCP: deck_adjust_image. - block.setAlt (Alt text; mutates; cli, mcp, http, window; GS2): Writes the description of an object: on the block for a shape, chart, line or text box, on the asset for a block that shows a picture, so two pictures of one asset share one description; the output names where it went. Input: slideId, blockId, alt, baseRevision. CLI: turboslide block alt # . MCP: deck_set_alt_text. - block.shadow (Drop shadow; mutates; cli, mcp, http, window; GS2): Writes or removes the drop shadow of objects: colour, opacity, angle, distance and blur, the absent ones at their defaults. Input: slideId, blockIds, shadow, baseRevision. CLI: turboslide block shadow # --on --color --opacity --angle --distance --blur . MCP: deck_set_shadow. - block.autofit (Text fitting; mutates; cli, mcp, http, window; GS2): Writes the fitting mode of a text carrying block: Do not autofit, Shrink text on overflow or Resize shape to fit text (grow, positioned blocks only); with apply the fit is measured and written in the same write, and the output names the fields written. Input: slideId, blockId, autofit, apply?, baseRevision. CLI: turboslide block autofit # --apply. MCP: deck_set_autofit. - text.style (Text style; mutates; cli, mcp, http, window; GS2): Marks a range of a Text italic, underlined, struck, superscript or subscript, gives it a text or highlight colour, or a size in pixels (true sets, false clears, null clears a colour or the size), as one text.replace of the whole Text; the output returns the new markup. Input: slideId, blockId, path, range, marks, baseRevision. CLI: turboslide text style # --range --italic --underline --strike --superscript --subscript --color --highlight --size . MCP: deck_style_text. - text.list (List options; mutates; cli, mcp, http, window; GS2): Writes the marker, the preset and the items’ levels of a list block (a paragraph or text box converts to a list first); levels run 1 to 9. Input: slideId, blockId, marker?, preset?, items?, level?, levelBy?, baseRevision. CLI: turboslide text list # --marker --preset --items --level . MCP: deck_set_list. - text.spacing (Line and paragraph spacing; mutates; cli, mcp, http, window; GS2): Writes the line spacing (a factor) and the space before and after paragraphs (px) of text blocks; null clears one. Input: slideId, blockIds, line?, before?, after?, baseRevision. CLI: turboslide text spacing # --line --before --after . MCP: deck_set_spacing. - text.columns (Columns; mutates; cli, mcp, http, window; GS2): Writes the column count of text blocks, 1 to 3. Input: slideId, blockIds, columns, baseRevision. CLI: turboslide text columns # . MCP: deck_set_columns. - text.indent (Indent; mutates; cli, mcp, http, window; GS2): Steps the left indent of text blocks by 64 px in or out, or writes it; on a list block with items the items’ levels step instead. Input: slideId, blockIds, by?, to?, items?, baseRevision. CLI: turboslide text indent # --in --out --to --items . MCP: deck_indent_text. - text.case (Capitalization; mutates; cli, mcp, http, window; GS2): Rewrites the characters of a range in lowercase, UPPERCASE or Title Case, marks and links kept, as one text.replace. Input: slideId, blockId, path, range, mode, baseRevision. CLI: turboslide text case # --range . MCP: deck_set_case. - text.insert (Insert text; mutates; cli, mcp, http, window; GS2): Inserts a string at a plain text offset of a Text, the special characters picker’s write, as one text.replace at [at, at]. Input: slideId, blockId, path, at, text, baseRevision. CLI: turboslide text insert # --at . MCP: deck_insert_text. - chart.setData (Edit chart data; mutates; cli, mcp, http, window; GS2): Writes a chart’s categories and series in one write; every series carries one value per category. Input: slideId, blockId, categories, series, baseRevision. CLI: turboslide chart set-data # < data.json. MCP: deck_set_chart_data. - chart.setKind (Chart type; mutates; cli, mcp, http, window; GS2): Writes a chart’s kind; a pie keeps the first series and the output names the dropped ones. Input: slideId, blockId, kind, baseRevision. CLI: turboslide chart set-kind # . MCP: deck_set_chart_kind. - table.merge (Merge cells; mutates; cli, mcp, http, window; GS2): Merges the cells from one corner to another into the anchor; the covered cells’ texts join the anchor’s with a line break. Input: slideId, blockId, from, to, baseRevision. CLI: turboslide table merge # --from --to . MCP: deck_merge_cells. - table.unmerge (Unmerge cells; mutates; cli, mcp, http, window; GS2): Removes the merge that covers a cell. Input: slideId, blockId, at, baseRevision. CLI: turboslide table unmerge # --at . MCP: deck_unmerge_cells. - table.insertRows (Insert rows; mutates; cli, mcp, http, window; GS2): Inserts rows above or below a row, merges and cell styles shifted, in one write. Input: slideId, blockId, at, count?, where, baseRevision. CLI: turboslide table insert-rows # --at --count --above --below. MCP: deck_insert_rows. - table.insertColumns (Insert columns; mutates; cli, mcp, http, window; GS2): Inserts columns left or right of a column, every row gaining empty cells, merges and cell styles shifted, in one write. Input: slideId, blockId, at, count?, where, baseRevision. CLI: turboslide table insert-columns # --at --count --left --right. MCP: deck_insert_columns. - table.deleteRows (Delete rows; mutates; cli, mcp, http, window; GS2): Deletes the rows from one index to another; deleting every row removes the table. Input: slideId, blockId, from, to?, baseRevision. CLI: turboslide table delete-rows # --from --to . MCP: deck_delete_rows. - table.deleteColumns (Delete columns; mutates; cli, mcp, http, window; GS2): Deletes the columns from one index to another; deleting every column removes the table. Input: slideId, blockId, from, to?, baseRevision. CLI: turboslide table delete-columns # --from --to . MCP: deck_delete_columns. - table.distribute (Distribute rows or columns; mutates; cli, mcp, http, window; GS2): Gives every row an equal height or every column an equal width from a total; without a total the widths or heights clear so the content sizes them. Input: slideId, blockId, axis, total?, range?, baseRevision. CLI: turboslide table distribute # --total . MCP: deck_distribute_table. - table.cellStyle (Cell fill and border; mutates; cli, mcp, http, window; GS2): Writes the fill and the border of cells in one write; null clears one; a border weight of 0 draws no border. Input: slideId, blockId, cells, fill?, border?, baseRevision. CLI: turboslide table cell-style # --at --fill --border-color --border-weight --border-dash . MCP: deck_style_cells. - shape.set (Shape; mutates; cli, mcp, http, window; GS2): Writes the shape fields of shape blocks in one write: the preset, its adjust values, fill, border colour, weight, dash and corner radius; null clears one. Input: slideId, blockIds, kind?, adjust?, fill?, stroke?, width?, dash?, radius?, baseRevision. CLI: turboslide shape set # --kind --adjust --fill --stroke --width --dash --radius . MCP: deck_set_shape. - line.set (Line; mutates; cli, mcp, http, window; GS2): Writes the line fields of line blocks in one write: the kind, the start and end decorations, weight, dash, bend and points; a connect end attaches to a shape’s connection site and moves the end onto it, null detaches. Input: slideId, blockIds, kind?, start?, end?, weight?, dash?, bend?, points?, connect?, baseRevision. CLI: turboslide line set # --kind --start --end --weight --dash --bend --points --connect-start --connect-end --detach . MCP: deck_set_line. - diagram.insert (Insert diagram; mutates; cli, mcp, http, window; GS2): Inserts a diagram template as one group of shape, text and line objects, centred on the sheet unless a box is given; a slide that is not a canvas yet converts first; the output names the ids. Input: slideId, kind, count, style?, pos?, after?, baseRevision. CLI: turboslide diagram insert --kind --count --style