Turboslide
Health Uyari
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Basarisiz
- process.env — Environment variable access in apps/cli/e2e/deck-transfer.mjs
- network request — Outbound network request in apps/cli/e2e/deck-transfer.mjs
- process.env — Environment variable access in apps/cli/e2e/mcp-http.mjs
- network request — Outbound network request in apps/cli/e2e/mcp-http.mjs
- process.env — Environment variable access in apps/cli/e2e/mcp-stdio.mjs
- exec() — Shell command execution in apps/cli/src/args.ts
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
Turboslide: an agent native presentation editor for people and agents. Live at turboslide.com
Turboslide
Turboslide is a slides editor in the browser. It has menus and keyboard shortcuts for editing, arranging and presenting. No account is needed.
- Live studio: https://www.turboslide.com, with the product page at /home and the agent guide at /llms.txt
- Agents run the same 194 actions over the CLI, MCP and HTTP: The CLI in brief
- What works today and what is held: What works today; the default view and why: docs/FOCUS.md; the release notes: docs/updates.md
- Documentation: docs/README.md and the index at the end of this page
- The identity: docs/brand.md; why it is fast: docs/performance.md
- Rules for working in the repository: AGENTS.md
- License: MIT (LICENSE)
Contents
- Advanced tools
- The identity
- Why it is fast
- Getting started
- The CLI in brief
- Architecture
- What works today
- Documentation
- License
Advanced tools
Tools > Advanced tools is one check row in the Tools menu. Off, which is the default, the menu bar, the toolbar, the right click menus, Search the menus and the Keyboard shortcuts dialog show the core set of docs/FOCUS.md section 2 and nothing else. On, every feature below appears in its place in the menus exactly as before, and the setting is remembered in the browser.
A parked feature is hidden, never disabled and never deleted. A deck that carries one of its blocks (a chart, a table, a diagram, an icon, a material, a code panel, a word art block, a gallery shape) still draws it on the sheet, in the show, in the viewer and in every download, and the block can be selected, moved, resized, ordered, aligned, duplicated and deleted through the rows of the default view; only its own tail controls and menu rows are hidden. The keyboard shortcut of a parked row does nothing while the switch is off. One control is the exception to hidden: the Font box on the text tail stays visible and disabled with the sentence "The GT theme sets Inter", so a seller who pastes from an email and sees the font change finds the answer where they look.
What is behind the switch, by menu. FOCUS.md section 3 is the row by row list of the focus round with the reason for each departure from the sales research, and docs/archive/rounds/RETURN.md sections 2, 3 and 8 name what came back in the return round of 2026-09-19 and what stays; this is the same list in fewer words, read from the menu model. The parked list of the people round's ship of 2026-09-30 is docs/gslides-parity/focus/ship-4300058d.json, rendered from the ship step's gate run of record on the enforce preview with its once reruns narrowed to the rows beside it (docs/archive/rounds/PEOPLE.md 6.2), and it carries the objects round's list of 2026-09-26 (ship-c1a7ff3.json) forward unchanged: nothing of the people round is parked (the own chip and the roster's own row, Change avatar and the avatar builder's Picture tab stay in the default view, their rows green on the preview and on the local node server with an identity database), and the ids behind the switch are the objects round's: the features inbox and templates (carried from the product round's ship, red again), the carried rows view.live-pointers.second-browser (Live pointers) and versions.show-changes-marks (Show changes in Version history), each keeping the controls it names behind the switch while the rest of its feature stays in the default view, the four P1 rows of docs/archive/rounds/FEATURES.md 2.3, 4.11 and 3.5 whose controls no ship has built yet (the table bar under a selected table, the text controls of a group's tail, the picker's Symbol, Wordmark, Color and Mono controls and the brand kit's Find a logo), ship two's Shader row of Change background with its three P1 rows (Add to theme, the engine chip, the Frame scrubber and Capture this frame), and the vector round's svg.copy.markup (Cmd+C on an svg picture putting the markup on the clipboard: the markup's read ahead did not land within its bound on the preview and on production at ship two and at the objects round's ship, and read red again on the people round's preview, so the copy writes the block payload alone while the switch is off; for the vector round's owner), whose ids sit in packages/chrome/src/parked-controls.ts so the gate reads their rows behind the list. The rows the list names in notParked with their mechanisms (docs/archive/rounds/PEOPLE.md section 7; the ship note docs/gslides-parity/people/build/ship.md): the objects round's seven (svg.render.vector-at-zoom, the blob tier's timing class by id; logos.index.refresh-fixture and logos.index.cached-offline, fixture only rows production never drives; decks.file.open-list-search, Kevin's standing row; the features brand, fonts and assist, P1 and environment rows alone), ship two's two rulings for the P1 show rows shaders.show.plays-when-on and shaders.show.frame-when-off, whose parks name the built View > Play shaders row, and five rows red once in the run of record and green on their once rerun narrowed to them (logos.cache.open-licence-only, shaders.frame.reuse-and-prune, shaders.panel.kit-colours, shaders.panel.slider-live-undo, svg.sanitize.broken), flaky by the rule. Two rows of the unparkable features read red on that preview outside the list and are recorded by id in the ship note for the production gate to read again: share.dialog.co-edit-from-copied-link (the copied link answering 404 to a second browser within a second of the mint, the blob tier's per instance link index) and fonts.preload.italic-on-edit-only (its spec file's teardown check alone). The objects round's production run is in docs/gslides-parity/focus/VERIFICATION.md, "Objects round, the production table"; the people round's follows its push.
- Title row: the own row of the roster and the account menu (change name, avatar, sign in, sign out, forget this browser, sessions), the inbox, Join chat and Present on another screen. Follow on the presence chips and the Go to slide word are in the default view (Go to slide since the features round's ship one, Follow since the realtime round, for every editor and owner including by link).
- File: From template gallery and Save as template (the templates feature, parked at the product round's ship of 2026-09-21: on the blob tier a template renamed, deleted or picked as the default on one instance stayed as it was on another for the rows' bounds while the public store's edge refused the just written index, so the gallery's card menus and the default are not yet the same on every instance; the gallery page stays at /decks/templates and the template actions stay for agents), Make a copy of selected slides, Publish to the web, Download as plain text, ODP or SVG, Show changes in Version history, Delete older versions, Delete history, Email collaborators and Page setup.
- View: Grid view and the bottom bar's two view buttons, Live pointers, Show sections and Edit guides.
- Insert: Image from this presentation; Rule, Curve, Polyline and Scribble under Line; Special characters; Icon; Material; Audio, Video, Templates and Building blocks. Image by URL is in the default view since the product round, and the four shape grids (Shapes, Arrows, Callouts and Equation) since the vector round of 2026-09-24.
- Format: Indentation options, List options, Replace image by URL or From this presentation, Dither, Alt text, Drop shadow and Edit HTML. Mask image and Change shape are in the default view since the vector round.
- Slide: Transition and Edit theme; the Shader row of Change background with its Dither toggle and Place (the features round's ship two, parked on
shaders.background.place-answers; the ground's shader still lands throughslide.setBackgroundMaterialon every transport, and a placed ground's words and its Shader options link in the dialog go with the row). - Tools: Spelling (Spell check, Underline errors and Personal dictionary), Notification settings, Activity dashboard, the Advanced submenu (Show source, Light and dark side by side, Suggestion marks, Show ids, Render this slide, Change history, Sections tree, Read as a book, Pictures and materials, Run an action) and Preferences. The accessibility rows and Check slides stay in Tools with the switch off.
- Extensions: Agent access and Embed in a site; the menu is not drawn while the switch is off.
- The toolbar: the fill and border controls on a text box (on word art they are in the default view since the objects round of 2026-09-26), the border controls and Dither on a picture, and Format options and Replace image on the other blocks; Change shape leads the shape tail in the default view since the vector round.
- The right click menus: Transition on a filmstrip card or the empty canvas; Drop shadow, Alt text and Edit HTML on an object; Dither on a picture. Change shape on a shape and Mask image on a picture are in the default view since the vector round.
Shapes and lines are two features so that one can stand without the other (FOCUS.md section 4). Rectangle, Rounded rectangle and Ellipse, and Line and Arrow with the elbow and curved connectors, are in the default view since the return round of 2026-09-19, when every one of their matrix rows passed twice on the enforce preview and once on production (docs/archive/rounds/RETURN.md sections 2.2 and 2.3; the release note in docs/updates.md). Tables, charts, diagrams, word art and the formatting rows returned with them under the same rule. A release in which one of their rows fails puts that feature, whole, behind the switch again. The four shape grids returned in the vector round of 2026-09-24 with the geometry interpreter, which draws each of the 135 presets from its PowerPoint definition (docs/archive/rounds/VECTOR.md section 2); a grid row carries parks naming its own category, so a red gallery row re parks that category alone and never the three named rows.
For agents nothing moves. Every action stays on the CLI, MCP, HTTP and the window API whether or not its menu row is in the default view; GET /api/agent lists them all, and the skills document the parked ones as advanced. The setting is readable from an open page as window.turboslide.studio.describe().state.settings.advancedTools, and the page carries data-advanced-tools on .pt-viewer while it is on.
Bringing a feature back follows one rule (FOCUS.md section 8). Its interactions are written as matrix rows with stable ids, a feature and a driver; the rows are driven on a preview and on production and pass; the release note lists them; then, and only then, its rows lose the advanced flag. A feature returns whole or not at all: one not driven or failed row keeps every row of the feature parked. The rows that already passed their audit (Group, Ungroup, Distribute, Rotate 90, Show ruler, the guides, Snap to) are the least work to bring back. Tables and charts came back in the features round, Image by URL in the product round, the shape galleries with the interpreter in the vector round, and the table's edge "+", heads and row seams and the word art outline controls in the objects round; the Dither controls, the grid view and the JPEG and PNG downloads return with their fixes.
The identity
The mark is a slanted T with three bars under its left arm, in the speed register of General Translation's brand deck: five rectangles sheared by 12 degrees with an 8 unit cut through the stem and the middle bar, built the way the GT bar monogram is built, and drawn with no font. One module draws it everywhere (packages/theme/src/brand.ts), which commits the path with its sha256: the tab icon, the title row, the /decks bar, the print bar, Not found, the lockup at the top of this page, the site card and the terminal banner of turboslide --version. At 16 px it is a hand drawing of whole pixels; from 24 px it is the vector with its cap in whole pixels and every horizontal edge on a whole row. Beside it the word Turboslide is live Inter 500, its cap equal to the mark's, the baselines met and half the cap between them. The identity is paper and ink. The one colour in the chrome is the selection's GT blue #2f5ce0 in both appearances, with white text on the selection chip: it marks a selected object, its handles, the marquee and the crop frame, and it holds at least 3:1 on a white slide and on a dark photograph. Every icon, the manifest, robots.txt, the card and its mood picture are static files that scripts/build-brand.ts writes and pnpm check step 29 compares, the mark's path against its rectangles included. docs/brand.md is the record: the construction and the sizes, the lockup, the tile, the tokens, the accessibility record with its WCAG 2.2 citations, the build and its records, the mapping of the 2026-10-01 brand deck to Turboslide, the picture credits and the repository metadata.
Why it is fast
Most of the speed is structural: one renderer, contracts generated ahead of time, immutable documents and caches, and export work that runs where the browser already is. Every number below is a measurement and names the file or the report it comes from with its date; a sentence about a change that is still landing says so, and the tense of every row follows docs/performance.md section 2, which lists what is true today and what becomes true when a named change lands.
- One renderer.
renderSlide(packages/render/src/slide.ts) turns a slide into the same HTML and CSS for the editor, the viewer, the embed, the CLI's screenshots and the exporters, so a render at one revision is the same pixels on every surface and no second layout engine has to agree with the first. The 170 renders of the GT deck match the brand deck's own screenshots within 0.5 percent (check step 12) and the canvas conversion changes at most 0.262 percent of pixels over 342 pairs (scripts/canvas-fidelity.mjs, check step 24). - Contracts generated once. Every operation is one entry in
packages/schema/src/actions.ts; the CLI parsers, the MCP tools, the HTTP contract, the window API list, the OpenAPI document,llms.txtand the four skills are generated from it and committed, so describing the API costs nothing per request and a stale copy fails check step 3. The generated files hold 169 actions, 146 MCP tools and 153 HTTP paths in the OpenAPI document, 149 of them under/api/actions/(packages/theme/brand/facts.json, written frompackages/agent/generated/on 2026-09-14). The hosted studio serves the generated OpenAPI document at/openapi.jsonand the agent index at/llms.txtfrom the bundle (production answered both with the full files on 2026-09-14). - Rust where the arithmetic must not drift. The two tone screen, the 1-bit PNG encoder and the image diffs are a Rust crate (
crates/turboslide-native) compiled to a Node addon and to WebAssembly, with a TypeScript copy of the same arithmetic where neither is built, andpackages/effects/src/parity.test.tsproves the three light the same cells: 0 disagreements over 30 screens of 360,000 cells and the 1,440,000 cell golden (docs/native.md, 2026-09-10). The crate exists for that agreement; where the addon is built it also cuts a 1600 by 900 screen in 20 ms against 52 ms in TypeScript and 23 ms through wasm (docs/native.md"Costs", Apple M5 Max). The hosted studio runs the TypeScript stages today. - The export is a screenshot. Perfect PowerPoint rasterises each page in Chromium at twice the sheet size, stores it in the smallest encoding that decodes within budget, then decodes it again and compares it with the shot before the file is written; the page is the screen. The worst decoded mismatch over the 170 pages of the GT deck is 0.003 percent, at about 15.5 MiB per theme (
docs/pptx.md;docs/archive/status/HOSTED-STATUS.md, 2026-09-11). - Export in batches. On the hosted studio a deck longer than 60 slides exports in batches of 60, each one function call, with a progress sentence and a merge at the end; a failed batch is retried on its own and the file is never started over (
packages/export/src/batch/plan.ts,apps/studio/src/server/export-batch.ts). The 85 slide GT deck exported from production in 187.9 to 203.1 s as one call (docs/hosting.mdsection 7, 2026-09-11) and in 239.5 s batched at a 784.2 MiB peak on a preview (docs/archive/gslides-parity/VERIFICATION-2.md, 2026-09-12). - Compute that lasts. The export and render routes and the server functions run on Vercel functions with an 800 second budget (
HEAVYinapps/studio/vite.deploy.config.ts; the memory is the project's standard setting, since thememoryfield the config once carried is inert on fluid compute and was dropped in the sync and costs round), on fluid compute, so several requests to one deployment share one warm process and a render does not wait for a cold start when the process is up. One Chromium job runs at a time per instance (docs/hosting.mdsection 8), so the claim is about the process and never about parallel exports. What a page costs while it is open is counted in every release run since the sync and costs round (docs/archive/rounds/SYNC.mdsection 6): an idle editor tab makes at most 12 function requests a minute and the deck at most 11 advanced store calls a minute, a show makes none after its load, and a viewer or show page opens no agent session unless its address carriesagent=1. - Routes load before the click.
defaultPreload: 'intent'inapps/studio/src/router.tsxloads a route's code and data when the pointer reaches its link, the first twelve cards of the list preload in the viewport, preloaded data stays fresh for 30 seconds, and the title row's mark is a link of the same document: from the click on a card to the studio ready and settled took 168 ms for the 85 slide GT deck and the move from the editor back to the list 16 ms in page, warm, on production on 2026-09-14 (docs/archive/gslides-parity/VERIFICATION-4.mdsection 5.2; the day 0 numbers were 598 ms and a 1,114 ms document load). - Immutable documents and caches. Every committed write stores the whole document under the md5 of its manifest bytes (
packages/store/src/snapshots.ts), so a reader proves it holds the current document from oneheadand fetches no slide it already has; a thumbnail named by its revision is cached for a year (apps/studio/src/server/thumbs.ts); the GT deck's pictures are static files on the CDN that answer before the function runs. The GT deck's pictures carrymax-age=3600for the browser ands-maxage=86400for the CDN, so a second visit to the deck within the hour fetched 0 of 16 of them again on production, and the icon set, the card and/homeanswered from the CDN's cache on their second request (docs/archive/gslides-parity/VERIFICATION-4.mdsections 5.1 and 5.2, 2026-09-14). The thumbnail cache is shared across instances on Blob (apps/studio/src/server/thumbs.ts).
What is still slow is measured too, on production on 2026-09-14 after the round four ship (docs/archive/gslides-parity/VERIFICATION-4.md section 5; verification-4/perf-budget-production-2026-09-14.json): the presentation list's first byte is 409 ms at the median of a cold visit and 3.8 s in its worst sample (the slow server mode of the day 0 baseline is rarer and shorter, not gone); the viewer of the 85 slide GT deck is ready 1.07 s after a cold load; the editor is ready 570 ms after a cold request of /new and 353 ms warm; one instance renders one slide at a time; every route loaded 946 to 2,205 KB of JavaScript against the 3,049 to 3,187 KB before the round, with the entry chunk at 914,233 bytes over its 600,000 byte ceiling in that run; the fixer round cut the entry chunk to 577,949 bytes on the tree that ships (check step 6, 2026-09-14). The plan against each is docs/performance.md.
Getting started
Turboslide needs Node 24 and pnpm 11.15.1, which corepack installs from the packageManager field. Renders, exports and the tests need the Chrome for Testing binary that playwright-core installs.
git clone https://github.com/Kevin-Liu-01/Turboslide.git
cd Turboslide
corepack enable
pnpm install
pnpm exec playwright-core install --with-deps chromium
pnpm dev
pnpm dev starts the studio on http://localhost:4321, always on that port. The root opens a fresh presentation; /decks lists the decks under decks/, where the GT brand deck and the templates live; /edit/gt-brand opens the brand deck. Derived files land under .turboslide/, which is not committed.
pnpm generate-routes # write apps/studio/src/routeTree.gen.ts (before typecheck)
pnpm generate:contracts # regenerate the CLI, MCP, OpenAPI, manifest, llms and skill tables from the action table
pnpm typecheck # tsc -b over every package
pnpm test # vitest, every package as a project
pnpm lint # eslint per package with the baseline
pnpm build # the studio bundle and the CLI bundle
pnpm check # the acceptance chain; node scripts/check.mjs --list prints the steps
pnpm build:brand # rebuild the icon set and the brand records; pnpm build:brand -- --check compares them
node docs/readme/what-works.mjs # rewrite the "What works today" section of this page from the core matrix; --check compares
The CLI runs from the repository root as pnpm exec turboslide <command> and finds the deck from a deck.json upward or from --deck <dir>. An agent uses it the same way:
pnpm exec turboslide info --json
pnpm exec turboslide slides --json
pnpm exec turboslide slide new --layout split --after title --deck decks/gt-brand
pnpm exec turboslide render all --theme light,dark --out .turboslide/render --json
pnpm exec turboslide lint all --json
pnpm exec turboslide export pptx --mode flatten --theme both --out .turboslide/export
pnpm exec turboslide mcp --deck decks/gt-brand
Optional tooling: Docker for the render worker image and the container verification, Python 3 with fontTools in .turboslide/venv for turboslide fonts build, Rust with the wasm32-unknown-unknown target and wasm-bindgen-cli for the native module (docs/native.md), and the Prototemplate checkout for the two check steps that re-import the brand deck and compare against its screenshots.
The CLI in brief
Every command is an action of the table; --json prints machine output, --base-revision names the revision a write read, --author names the writer, and exit codes are 0, 1 (findings at the gate or a verify failure) and 2 (usage or validation). Every command below runs whether or not its menu row is in the editor's default view; the commands of a parked feature (tables, charts, diagrams, groups, masks, dithers, materials, the shape galleries) are the advanced ones, and the skills say so.
| Group | Commands |
|---|---|
| Deck | info, validate, import <dir> --into <id>, deck create <name> --from gt-brand|blank, deck rename, deck set <path> <value>, deck list, deck copy, deck trash, deck restore, deck remove --confirm, deck background, deck guides, sections set |
| Bundles and transfer | deck pack <id>, deck unpack <file.zip>, deck push <id> --to <url>, deck pull <id> --from <url> |
| Slides | slides, slide get|put|patch|insert|remove|move, slide new --layout, slide duplicate, slide skip, slide apply-layout, slide import, slide set-layout, slide to-canvas, slide measure, slide background |
| Blocks and objects | block set|insert|remove|move, block align|distribute|order|duplicate, block group|ungroup|regroup, block rotate|flip, block crop|mask|reset-image|adjust, block alt, block shadow, block autofit |
| Text | text style, text case, text insert, text list, text spacing, text columns, text indent, text replace |
| Tables and charts | table merge|unmerge|insert-rows|insert-columns|delete-rows|delete-columns|distribute|cell-style, chart set-data, chart set-kind |
| Shapes and lines | shape set, line set (kinds, decorations, weight, dash, bend, points, --connect-start, --connect-end, --detach), diagram insert --kind --count --style |
| Assets and materials | asset add <file|url> --role --alt [--two-tone], asset dither, asset capture <url>, material list, material capture <id> --anchor <ms> |
| Render and verify | render [ids|all] --theme light,dark --scale 1|2, sheet --cols --thumb --overlay lint|plate, lint [--layers static|rendered|both] [--baseline], lint --chrome --url --widths --themes, fix [--rule], judge bundle --out, diff [from [to]] [--render] |
| Versions and leases | version save|list|restore, lease <slideId> [--force] [--release] |
| Export | export pptx --mode flatten|native --theme light,dark|both [--embed-fonts] [--include-notes] [--include-skipped] [--verify], export pdf, export txt, export jpeg, export check <file.pptx>, build --out <file> --budget 16, fonts build [--check] |
| Agent surface | mcp (the MCP server over stdio), generate (the contracts generator) |
The generated reference with every action's input, transports, CLI usage and MCP tool is skills/turboslide-api/references/actions.md.
Architecture
The repository is a pnpm workspace on TanStack Start, TypeScript strict and ESM throughout, with no barrel files: every package exports its modules through explicit subpaths. Every package under packages/ except viewer, chrome and native is framework free, and headless Chromium never runs inside the web app in a checkout.
apps/studio is the TanStack Start application deployed to Vercel: the editor at /edit/:deckId and the draft at /new, the home page and the trash, the viewer, the embed, the presenter and the print preview, the agent HTTP surface, MCP over HTTP, the export downloads, the bundle routes and the server functions the pages reach the store through.
apps/cli is the turboslide binary, the file transport that needs no browser page. Its store-actions.ts registers every write as a typed function on the dispatcher, and the studio's HTTP and MCP routes and the editor's own handlers run those same store actions, so one implementation serves the four transports.
apps/render-worker is the job queue the studio's renders and exports run on in a checkout (render, sheet, export, verify, PDF and measure jobs over the CLI, one at a time, an export ahead of the queued thumbnail renders), with an HTTP surface and a render cache; the Docker image turboslide-render-worker carries Chrome for Testing, LibreOffice and the fonts, and inside a Vercel function the worker runs in process.
packages/schema holds the document: the types and Zod schemas, validateDeck, applyWrite, diffDecks, the migrations, the block catalogue, the rule table, the 21 layouts and applyLayout, the canvas conversion (toCanvas, fromCanvas), the shape preset table and shapePath (which presets draw their own path and which wait for the geometry interpreter is docs/FOCUS.md section 4), the connectors, the diagram templates, the text markup and the action table.
packages/store is the deck store behind one DeckStore type: FileStore over decks/, the tmp overlay and the Vercel Blob mirror; typed writes, the version log, leases, the watch channel, the templates, the seed, the store selection and the deck bundle (zip, pack, unpack).
packages/render is the renderer: renderSlide, renderDeck, renderStandalone, renderThumb, renderStage, the print document, the block renderers, the diagram and chart SVG on the half-pixel grid, and the one DOM measurer the canvas conversion reads.
packages/theme is gt-ink-paper: sheet.css and stage.css ported once from the brand deck's head.html, the same values as data in tokens.ts with a parity test, and the icon sprite; since round four it also holds the identity's geometry module src/brand.ts (the mark's rectangles, its committed path and the 16 px rows, the placements, the tile, the token data, the contrast helpers) and brand/ (the SVG sources, site.ts with the description, the icon paths and the manifest, the build's records). packages/fonts carries InterVariable and its italic, and the static export font set cut by scripts/build-fonts.py.
packages/viewer is the React viewer and editor stage: Stage, Sheet, the slide, grid and book modes, the Editor with selection, gestures, the canvas handles, marquee, snap lines, rulers, guides, crop mode, zoom and pan, the present pieces (the toolbar, the slide list, the presenter console, the channel) and the material mount.
packages/chrome is the Prototemplate shell ported as source (PORTED_FROM.json records the origin of every file, and which files are Turboslide's own): the tokens, the brand sheet (brand.css, the sixteen --ts- identity tokens and the lockup), the Turboslide mark, the app bar lockup, the empty state figure, the title row, the menu bar and its model (where the Advanced tools switch and the advanced flag of the focus round live), the toolbar and its tails, the filmstrip, the panels, the dialogs, the pickers, the context menus, the snackbar, the tooltip primitive and the editor shell contract.
packages/export is the exporter: scene extraction in headless Chromium, PPTX in the perfect and editable text modes through pptxgenjs, the page raster policy, the OOXML post-process and package validation, the PDF printer, the verify loop over LibreOffice, the batched export plan and merge, and export check.
packages/headless drives Chrome for Testing through Playwright: launch, readiness, the sheet page, measurement, screenshots, the PDF, the site capture recipes and the shell driver the chrome lint uses.
packages/effects is the two-tone pipeline (Bayer dither, tone, resample, filters), the 1-bit PNG encoder, plate metrics, the diffs and DSSIM, and the backend selection between the native addon, the wasm module and TypeScript. packages/native and crates/turboslide-native are the Rust crate behind @turboslide/native with its napi and wasm bindings and the per platform packages.
packages/materials is the Paper Shaders catalogue with uniform schemas and presets, the stage mount, material.capture and the asset actions. packages/lint is the grammar linter with its static and rendered rules, the fixture deck and the known findings gate. packages/import turns the Prototemplate deck HTML into the document with zero escape blocks.
packages/agent is the action dispatcher, the HTTP request rules, the window API and the contracts generator with its committed outputs (manifest, describe, CLI, MCP tools, OpenAPI, llms.txt). packages/mcp is the MCP server over stdio and streamable HTTP.
decks/ holds gt-brand (the GT brand deck), templates/gt-brand and templates/blank (what deck.create copies) and fixture (the test decks). skills/ holds the four agent skills, scripts/ the acceptance chain, the audits and the probes (scripts/probes/editor-walk-probe.mjs --core drives the matrix), docker/ the render worker image, tooling/ the shared tsconfig, eslint and prettier configs, and docs/ the reference and status documents.
What works today
Turboslide is a slide editor for a team that tailors an existing deck and presents it. Every feature in the default view is driven end to end against the production deployment before a release, at human speed, and the release note carries the table of what passed. Features that are not yet tested that way are behind Tools > Advanced tools and are documented as advanced.
Rendered from docs/gslides-parity/focus/core-matrix.json by docs/readme/what-works.mjs, from what the focus audits saw on production on 2026-09-15. A feature appears below only while every row of its part of the matrix passes; the rest of the matrix is listed under "Held until every row passes". docs/FOCUS.md is the specification.
Costs. An open editor, a hidden tab, an editing session, two tabs on one deck and a show each make a bounded number of requests a minute, and the store calls a deck costs a minute are counted in every release run and stay under their ceilings.
Walked by hand, never counted as passed by a run (docs/gslides-parity/focus/manual-checklist.md): text.clipboard.paste-without-formatting, accounts.google-roundtrip, setup.free-plan.caps, setup.do.memory.
Driven on a node server with an identity database, never on the deployment this reading comes from (docs/archive/rounds/PEOPLE.md 6.2; the gate's --only accounts run judges them): people.verified-badge, people.versions-author-account, people.labels-disambiguated, share.dialog.grant-email-line, people.avatar-upload, people.avatar-cap-refusal, people.avatar-rotation, people.avatar-fallback-plate, people.avatar-link-visitor, people.avatar-metadata-stripped, accounts.sign-out-clean, accounts.decks-list-scoped, accounts.google-button, accounts.google-leaves, accounts.google-error-sentence, accounts.email-hidden-without-mail, accounts.google-roundtrip, accounts.plate.cancel-comes-home, accounts.plate.states, accounts.device-flow, accounts.failure-says-why, accounts.anonymous-deck-kept, accounts.menu.words, accounts.mail-branded.
Measured and recorded, never holding a release (docs/archive/rounds/PRODUCT.md 8.2): export.download.large-deck-pdf (broken), export.download.large-deck-pptx (broken), cost.editor-idle.calls (broken), cost.editor-hidden.calls (broken), cost.editor-editing.calls (broken), cost.show.calls (broken), shaders.perf.editor-frame (not driven), decks.home.load-budget (broken), cost.redis.commands (not driven), cost.do.requests (not driven), cost.do.duration (not driven), cost.do.rows-written (not driven), cost.d1.reads (not driven), cost.d1.writes (not driven), cost.worker.requests (not driven), home.budget.shared (not driven), home.budget.lcp (not driven), home.budget.frame (not driven), home.budget.main-thread (not driven).
Held until every row passes
A feature is in the default view only when every one of its interactions passes on the preview and on production (docs/FOCUS.md section 1). Each feature below has a row that failed or was not driven in the run above, so its menu rows sit behind Tools > Advanced tools until the rows named pass; the switch itself cannot be parked, and a failed or not driven row of it blocks the release.
- Decks: 157 of 202 rows hold it:
decks.new.ground-paint(flaky),decks.title.tab-title-after-rename(broken),decks.save.acknowledged(flaky),decks.card.rename-enter(broken),decks.row.rename-enter(broken),decks.card.make-a-copy(flaky),decks.card.open-in-new-tab(flaky),decks.trash.listed-after-move(flaky),decks.trash.lists-after-restore(broken),decks.trash.delete-forever-enter(broken),decks.access.paint(flaky),decks.file.make-a-copy(not driven),decks.name.follows-heading(broken),decks.recent.drops-trashed(broken),decks.trash.editor-undo-snackbar(broken),decks.recent.this-browser-sentence(not driven),decks.home.seller-lead(broken),decks.card.thumbnail-slide-1(broken),decks.card.edited-relative-time(broken),decks.card.more-glyph(broken),decks.trash.button-heights(broken),decks.trash.confirm-dialog-chrome(broken),decks.new.skeleton-one-frame(broken),decks.access.stranger-links(broken),decks.notfound.sentence-case(broken),decks.recent.keeps-new-deck(broken),decks.card.rename-everywhere(broken),decks.list.one-card-per-deck(broken),decks.list.own-and-shared(broken),decks.list.action-scoped(broken),decks.manifest.paper(broken),decks.trash.leaves-at-once(broken),decks.card.title-ellipsis(broken),decks.card.download-powerpoint(broken),decks.import.upload-drop-zone(broken),decks.back.list-restored(broken),decks.card.thumbnail-or-plate(broken),decks.trash.enter-confirms(broken),decks.card.rename-field-fits(broken),decks.trash.empty-not-primary(broken),decks.polish.pages-sweep(broken),decks.thumbnail.never-502(broken),decks.home.pictures-three-widths(broken),decks.home.copy-rules(broken),decks.home.product-pictures(broken),decks.home.links-and-card(broken),decks.home.layout-shift(broken),decks.home.grammar(broken),decks.home.capture-plain(broken),decks.home.copy(broken),decks.home.phone(broken),decks.list.ruled-rows(broken),decks.og.deck-card(broken),home.page.order(broken),home.page.markup-final(broken),home.hero.type(broken),home.budget.bytes-first(broken),home.budget.bytes-page(broken),home.a11y.skip-and-contrast(broken),home.hero.select(broken),home.hero.edit(broken),home.canvas.gestures(broken),home.canvas.log(broken),home.objects.keyboard(broken),home.menus.bar(broken),home.menus.rows(broken),home.budget.live-module(broken),home.tailor.apply(broken),home.tailor.filmstrip(broken),home.kits.restyle(broken),home.kits.color(broken),home.agents.rest(broken),home.agents.typed(broken),home.agents.transports(broken),home.agents.history(broken),home.agents.recorded(broken),home.agents.chips(broken),home.versions.scrub(broken),home.versions.restore(broken),home.present.show(broken),home.present.focus(broken),home.present.print(broken),home.export.seam(broken),home.export.figure(broken),home.export.loupe(broken),home.motion.in-view(broken),home.motion.rest(broken),home.motion.reduced(broken),home.motion.hidden-tab(broken),home.a11y.keyboard-walk(broken),home.page.bands-after-load(broken),home.hero.stage(broken),home.lead.visit(broken),home.numbers.row(broken),home.features.table(broken),home.motion.pause(broken),home.motion.develop(broken),home.hero.run(broken),home.interludes.glyphs(broken),home.motion.loops(broken),home.motion.offscreen(broken),home.patterns.pair(broken),home.people.loop(broken),home.people.type(broken),home.nav.icons(broken),home.type.default-glyphs(broken),home.radius.ladder(broken),home.scroll.regions(broken),home.pictures.all-load(broken),home.hero.frame-chrome(broken),home.hero.terminal-never-empty(broken),home.hero.steps(broken),decks.pages.access-plates(broken),home.menus.icons(broken),home.canvas.panel(broken),home.tailor.dialog(broken),home.diagrams.flows(broken),home.present.figure(broken),home.export.dialog(broken),home.patterns.stills(broken),home.kits.themes(broken),home.agents.history-panel(broken),home.people.share-dialog(not driven),home.hero.font-swap(broken),home.kits.colors(broken),decks.pages.radius(broken),decks.pages.numerals(broken),decks.pages.default-glyphs(broken),decks.pages.scrollbar(broken),themes.render.each-theme(not driven),themes.agent.theme-list(not driven),themes.export.pptx-token-colours(broken),themes.default.new-is-simple(broken),themes.appearance.theme-default(broken),themes.agent.create-default(broken),themes.migration.gt-unchanged(not driven),themes.closing.no-gt-mark-on-simple(broken),themes.layouts.no-gt-pictures-on-simple(broken),themes.picker.lists-library(broken),themes.picker.apply-one-commit(broken),themes.picker.keyboard(broken),themes.gt.selectable(broken),themes.reset.returns-to-theme(broken),themes.reset.field-returns-to-theme(broken),themes.logo.theme-logo-only(broken),themes.pickers.follow-theme(not driven),decks.refused.address-words(broken),decks.trash.ruled-rows(broken),home.menus.readout(broken),home.present.no-prompts(broken),home.hero.thumb-frames(broken),home.export.pdf-appearance(broken),home.export.one-mark(broken),home.nav.no-pause(broken),home.nav.fits-320(broken),home.nav.theme-first-paint(broken),home.hero.side-fits-headline(broken). - Slides: 21 of 90 rows hold it:
slides.delete.two-selected-menu(broken),slides.delete.two-selected-edit-menu(broken),slides.delete.canvas-focus-undo(flaky),slides.delete.undo-redo-saved(flaky),slides.layout.fresh-slide-two-picks-no-carry(broken),slides.layout.snackbar-counts-typed-only(broken),slides.clipboard.copy-paste-card(not driven),slides.reorder.menu-up-down-beginning(not driven),slides.reorder.cmd-shift-up-down(not driven),slides.notes.view-menu-toggle(not driven),slides.context.empty-canvas(not driven),slides.numbers.apply(not driven),slides.layout.title-and-body-single(broken),slides.layout.subtitle-prompt(not driven),slides.layout.new-slide-inherits(not driven),slides.layout.tile-sentences(broken),slides.layout.plate-four-columns(broken),slides.import.none-preselected(broken),slides.layout.blank-empty(broken),slides.background.picture-grid(broken),slides.filmstrip.follows-every-move(broken). - Text: 60 of 106 rows hold it:
text.title.single-click(broken),text.selected.typing-replaces(not driven),text.selected.enter-appends(not driven),text.title.double-click-enters(not driven),text.textbox.drag-inside-moves(broken),text.textbox.burst-reliability(broken),text.italic.toolbar-word(broken),text.color.swatch-on-word(broken),text.list.bulleted-toolbar(broken),text.list.numbered-toolbar(broken),text.link.cmd-k-enter(broken),text.link.present-click(not driven),text.format-menu.text-fitting(not driven),text.autofit.textbox-grow(broken),text.find-replace.shortcut(flaky),text.list.numbered-menu-preset(not driven),text.list.chords(not driven),text.link.toolbar-button(not driven),text.format-options.panel(not driven),text.layout-runs.type(not driven),text.context.text-block(not driven),text.context.text-selection(not driven),text.context.inside-session(broken),text.format-menu.size-decrease(not driven),text.format-menu.spacing-single-1-15(not driven),text.format-menu.align-indent-rows(not driven),text.textbox.toolbar-button(not driven),text.title.one-click-tail(broken),text.title.bold-menu(broken),text.title.bold-cmd-b(broken),text.title.align-menu(broken),text.title.size-menu(broken),text.title.format-options-marks(broken),text.title.apply-layout-after-format(not driven),text.fontsize.type-one-undo(broken),text.format-options.field-one-undo(broken),text.link.detect-url(broken),text.link.detect-email(broken),text.select.double-click-address(broken),text.select.shift-home-line(broken),text.link.popover-apply-remove(broken),text.link.slide-target(broken),text.format-options.padding-grid(broken),text.format-options.remembers-section(not driven),text.autofit.shrink-on-overflow(not driven),text.find-replace.count-while-typing(broken),text.bold.toolbar-marks-run(broken),text.paragraph.toolbar-live(broken),text.list.enter-tab-no-error(broken),text.size.run-and-typed-value(broken),text.marks.whole-block-from-menu(broken),text.tail.heading-takes-list-indent(broken),text.heading.enter-keeps-session(broken),text.link.chip-on-click(broken),text.title.shrink-on-overflow(broken),text.title.second-session-survives-reload(broken),text.link.popover-anchored(broken),text.link.detection-setting(broken),text.tail.size-reads-heading(broken),text.polish.highlight-console(broken). - Pictures: 37 of 65 rows hold it:
images.insert.first-on-new-deck(broken),images.insert.upload(flaky),images.insert.upload-while-pending(broken),images.insert.drop(flaky),images.insert.paste(flaky),images.guides.centre-x(flaky),images.resize.edge-fill(broken),images.crop.toolbar-escape-cancels(broken),images.replace.upload(broken),images.background.upload-picture(flaky),images.replace.drop-on-picture(not driven),images.context.image(not driven),images.options.menu-row(not driven),images.background.hex-field(not driven),images.insert.centred-in-body(broken),images.insert.instant-preview(broken),images.caption.add(not driven),images.options.picture-sections-only(broken),images.insert.menu-direct(broken),images.upload.failure-snackbar(not driven),images.transparency.slider(broken),images.border.drawn(broken),images.insert.by-url(broken),logos.intake.url-sentence(broken),images.insert.no-external-banner(broken),images.replace.keeps-aspect(broken),images.picture.no-plate(broken),images.panel.seller-words(broken),images.panel.drop-shadow(not driven),images.mask.picker-fits-panel(broken),images.caption.grows-box(broken),images.border.color-draws-at-once(broken),images.alt.focused-empty(broken),images.byurl.preview-contained(broken),images.drop.clamped(broken),images.crop.dims-outside(broken),images.polish.natural-size(broken). - Selection and arrange: 38 of 100 rows hold it:
arrange.multi.drag-inside-moves-all(broken),arrange.align.right(flaky),arrange.align.top(broken),arrange.align.bottom(broken),arrange.clipboard.cut-paste-undo(flaky),arrange.clipboard.menu-copy-paste(flaky),arrange.clipboard.paste-after-new-slide-button(broken),arrange.clipboard.paste-with-filmstrip-focus(broken),arrange.duplicate.menu-selects-copy(broken),arrange.redo.after-undone-duplicate(broken),arrange.keys.backspace-empty-selection(broken),arrange.zoom.menu-in(broken),arrange.zoom.cmd-minus(broken),arrange.zoom.cmd-plus(broken),arrange.zoom.fit(flaky),arrange.zoom.menu-out(broken),arrange.zoom.menu-presets(not driven),arrange.toolbar.select(not driven),arrange.group.context-rows(not driven),arrange.context.rotate-distribute(not driven),arrange.guides.drag(flaky),arrange.snap.grid-effect(not driven),arrange.insert.selected-after-menu(broken),arrange.insert.free-rectangle(not driven),arrange.group.tail-text-controls(not driven),gestures.draw.shape-fill-at-step5(broken),gestures.draw.click-at-press(broken),gestures.draw.grammar-slide-converts(broken),gestures.resize.text-reflows(not driven),gestures.resize.diagram-follows(not driven),gestures.resize.wordart-scales(not driven),gestures.move.connector-follows-live(broken),gestures.rotate.ring-turns-live(broken),gestures.rotate.ring-after-release(broken),gestures.frame.one-render-per-frame(not driven),gestures.frame.cost-budget(not driven),gestures.watch.chart-se-after-mark-click(flaky),arrange.select.no-browser-highlight(broken). - Shapes: 39 of 48 rows hold it:
shapes.insert.named-rows(not driven),shapes.default-look(broken),shapes.move(not driven),shapes.resize.eight-handles(not driven),shapes.rotate(not driven),shapes.fill.colour(not driven),shapes.border.colour-weight-dash(not driven),shapes.text.type-align-bold(not driven),shapes.duplicate-delete-undo-redo(not driven),shapes.format-options.size-position(not driven),shapes.export.pdf(not driven),shapes.export.pptx(not driven),shapes.reload-and-viewer(not driven),shapes.context.shape(not driven),shapes.text.colour-toolbar(broken),shapes.label.centred-default(broken),shapes.geometry.shapes.hexagon-sheet(broken),shapes.geometry.shapes.star5-adjust(not driven),shapes.geometry.shapes.pie-arc(broken),shapes.geometry.shapes.multipath-can(broken),shapes.geometry.shapes.flowchart-own-space(broken),shapes.geometry.arrows.right-arrow(broken),shapes.geometry.arrows.curved-right(broken),shapes.geometry.callouts.wedge-rect(broken),shapes.geometry.callouts.cloud(broken),shapes.geometry.equation.plus-divide(broken),shapes.geometry.text-rect(broken),shapes.geometry.sites(broken),shapes.geometry.resize-keeps-adjust(not driven),shapes.geometry.export.pptx-prst-avlst(not driven),shapes.geometry.export.raster-modes(not driven),shapes.insert.grid-shapes(broken),shapes.insert.grid-arrows(broken),shapes.insert.grid-callouts(broken),shapes.insert.grid-equation(broken),shapes.icons.named-rows(broken),shapes.change-shape.plate(not driven),shapes.mask-image.plate(not driven),shapes.geometry.cloud-callout-closed(broken). - Lines: 12 of 16 rows hold it:
lines.insert.line-drag(not driven),lines.insert.arrow-drag(not driven),lines.end-handle(not driven),lines.tail.colour-weight-dash-ends(not driven),lines.context.line(not driven),lines.connector.re-end(not driven),lines.tail.line-start-end-menu(not driven),lines.chip.kind-name(broken),lines.hit.stroke-only(broken),lines.move.detaches(broken),lines.select.handles-no-ring(broken),lines.connector.perpendicular-at-sites(broken). - Present: 10 of 26 rows hold it:
present.keys.blank-black-white(not driven),present.skipped-left-out(not driven),present.show.no-white-block(broken),present.show.bar-on-entry(broken),present.presenter.sentence-case(broken),present.presenter.phone-head(broken),present.bar.no-dead-control(broken),present.laser.visible(broken),present.link.first-paint-show(broken),present.presenter.surfaces(broken). - Share: 39 of 73 rows hold it:
share.view-link-cannot-edit(broken),share.stranger-cannot-edit(broken),collab.edit-from-second-browser(flaky),collab.slide-added-appears(flaky),collab.presence-chips(broken),collab.rename-reaches-second-browser(broken),share.view-link-excludes-skipped-and-notes(not driven),share.present-link-excludes-skipped(not driven),share.file-menu-share-with-others(not driven),share.dialog.one-link(broken),share.dialog.slideshow-checkbox(not driven),share.dialog.more-row(broken),share.dialog.you-label(broken),share.dialog.co-edit-from-copied-link(broken),people.chip-plate-size(broken),people.mark-renderers-agree(broken),people.own-chip-follows-name(broken),people.own-chip-follows-avatar(broken),people.chip-tooltip-trust(broken),share.dialog.owner-resolved(broken),collab.caret-hue-matches-chip(broken),share.name-prompt.empty-field(broken),share.dialog.ruled-rows(broken),share.dialog.new-deck-restricted-viewer(broken),share.role-change.keeps-link(broken),share.dialog.restricted-and-more(broken),share.name-prompt.never-mid-drag(broken),collab.follow.anonymous-editor(not driven),collab.presence.join-within-2s(broken),collab.polish.session-sweep(broken),share.access.true-sentence(broken),accounts.no-dead-method(broken),accounts.signin.one-dialog(broken),accounts.sign-in-fits(broken),accounts.plate.signin-page(broken),accounts.provider-error-sentence(broken),accounts.google-button-guideline(broken),accounts.sign-in-everywhere(broken),accounts.dialog-in-brand(broken). - Comments: 8 of 11 rows hold it:
comments.on-title-placeholder(broken),comments.resolve(flaky),comments.toolbar-and-menu-routes(not driven),comments.reaches-second-browser(not driven),comments.panel.empty-gesture(broken),people.comment-departed-guest(broken),comments.insert.needs-selection(broken),comments.marker.one-per-anchor(broken). - Version history: 10 of 15 rows hold it:
versions.restore(flaky),versions.undo-restore(not driven),versions.show-changes-marks(not driven),versions.panel.author-you(broken),versions.window-mark-column(broken),versions.restore-in-more(broken),versions.panel.seam-and-time(broken),versions.panel.rows-read-clean(broken),versions.title-row.last-edit-inline(broken),versions.field.corner(broken). - Download and print: 26 of 46 rows hold it:
export.pdf.notes-honest(broken),export.print.download-pdf-follows-preview(broken),export.print.file-menu-after-close(flaky),export.html.web-page(flaky),export.jpg.current-slide(broken),export.png.current-slide(broken),export.download.named-after-title(broken),export.download.pdf-direct(broken),export.download.pptx-direct(broken),export.pptx.rotated-frames(broken),export.download.options-dialog(not driven),export.download.progress-per-slide(broken),export.download.mode-sentence(not driven),logos.export.pdf-pptx-crisp(not driven),shaders.export.pdf-frame(broken),shaders.export.pptx-frame(broken),shaders.export.html-frame(broken),shaders.export.missing-frame-row(not driven),export.print.deck-appearance(broken),export.details.seller-card(broken),export.refusal.sentence-and-retry(broken),export.print.opens(broken),export.download.one-name-rule(broken),export.picture.progress-and-capture(broken),export.remove.copies-gone(broken),export.fonts.upstream-names(broken). - Help: 12 of 17 rows hold it:
help.documentation-link(broken),help.shortcuts.no-duplicates(broken),help.shortcuts.question-key(broken),help.check-slides.plain-sentence(broken),help.docs.page(broken),help.docs.prerendered(broken),help.docs.nav-client(broken),help.docs.search(broken),help.docs.twin(broken),help.docs.copy-page(broken),help.docs.reference(broken),help.docs.links(broken). - Tables: 54 of 65 rows hold it:
tables.cell.tab-from-written(broken),tables.cell.shift-tab(not driven),tables.menu.format-table-with-session(broken),tables.menu.format-table-selected(broken),tables.menu.format-table-rows(not driven),tables.column.insert-keeps-widths(broken),tables.column.resize-seam(not driven),tables.cell.align-menu(broken),tables.cell.align-toolbar(broken),tables.cell.fill-border-tail(not driven),tables.cells.merge-unmerge(not driven),tables.tail.merge-unmerge-buttons(not driven),tables.distribute.rows-columns(not driven),tables.light-appearance(not driven),tables.export.pptx-editable(broken),tables.cell.click-places-caret(broken),tables.cell.click-then-type(broken),tables.range.drag-from-selected(not driven),tables.selected.typing-appends(broken),tables.cell.arrows-cross-cells(not driven),tables.range.shift-arrows(not driven),tables.range.bold-italic(broken),tables.range.size-color(not driven),tables.panel.table-first(broken),tables.seam.row-drag(not driven),tables.edge.add-row-column(not driven),tables.heads.select-row-column(not driven),tables.bar.row-column-buttons(not driven),tables.paste.tsv-makes-table(broken),tables.paste.into-cell-spreads(broken),tables.command.keeps-caret(broken),tables.cells.tabular-figures(broken),tables.select.ring-with-cell-open(broken),tables.cell.ring-on-cell(broken),tables.cells.empty-grid-guides(broken),tables.light-appearance-guides(not driven),tables.insert.box-fits-rows(broken),tables.rows.grow-with-text(broken),tables.resize.rows-share-extra(broken),tables.seam.visible-with-cell-open(broken),tables.heads.header-toggle(not driven),tables.panel.section-words(broken),tables.cells.no-prompt(broken),tables.rows.ring-follows-typing(broken),tables.header.rule-with-text(broken),tables.cell.click-moves-caret(broken),tables.tail.size-step-ladder(broken),tables.insert.box-never-shorter-than-rows(broken),tables.heads.keys-act-on-range(broken),tables.insert.one-placement-rule(broken),tables.edge.stays-inside-sheet(broken),tables.range.align-cells-only(broken),tables.context.object-menu-on-frame(broken),tables.polish.seams-snap-grid(broken). - Charts: 21 of 32 rows hold it:
charts.type.panel-legible(broken),charts.type.toolbar(not driven),charts.type.menu(not driven),charts.data.toolbar-edit-data(not driven),charts.data.menu-edit-data(not driven),charts.legend.toolbar(not driven),charts.number-format.toolbar(not driven),charts.data.paste-rows(not driven),charts.context(not driven),charts.light-appearance(not driven),charts.export.pdf(not driven),charts.grid.type-to-edit(broken),charts.grid.escape-stays(broken),charts.double-click.opens-data(broken),charts.mark.click-selects-cell(not driven),charts.legend.none-from-toolbar(broken),charts.panel.no-duplicate-controls(broken),charts.grid.remove-visible(broken),charts.pie.add-series-refused(broken),charts.grid.every-series-in-view(broken),charts.labels.fit-slot(broken). - Diagrams: 9 of 13 rows hold it:
diagrams.edit-label(not driven),diagrams.light-appearance(not driven),diagrams.reload(not driven),diagrams.label.double-click-opens(broken),diagrams.label.tab-next(not driven),diagrams.step.one-object(broken),diagrams.export.step-label(not driven),diagrams.member.duplicate-delete(not driven),diagrams.label.double-click-selects-word(broken). - Word art: 6 of 8 rows hold it:
wordart.edit(not driven),wordart.light-appearance(not driven),wordart.resize.scales-letters(broken),wordart.tail.fill-outline(not driven),wordart.bar.closes(broken),wordart.polish.chip-weight-arming(broken). - Formatting: 12 of 28 rows hold it:
formatting.superscript.menu-word(broken),formatting.subscript.menu-word(broken),formatting.italic.menu-word(broken),formatting.context.selection-rows(not driven),formatting.align.toolbar-justify(not driven),formatting.spacing.1-15-value(broken),formatting.paint-format.chords(not driven),formatting.clear.inline-marks(broken),formatting.theme.import-hidden(not driven),formatting.numerals.tabular-row(not driven),formatting.spacing.table-cells(broken),formatting.border-weight.menu-opens(broken). - The editor's chrome: 86 of 94 rows hold it:
chrome.split.one-box(broken),chrome.split.hover-no-inversion(broken),chrome.split.chevron-menu-aligned(broken),chrome.split.enter-chevron(broken),chrome.split.enter-label(broken),chrome.split.arrow-down-label(broken),chrome.split.tab-order(flaky),chrome.split.aria(broken),chrome.split.collapse-900(broken),chrome.separators.once(broken),chrome.cluster.gaps-heights(broken),chrome.comments-glyph.toggle(broken),chrome.bottom-bar.removed(broken),chrome.menu.no-tooltip-with-submenu(broken),chrome.menu.escape-focus-stage(broken),chrome.presence.tooltip(broken),chrome.contrast.titanium-light(broken),chrome.disabled.token-both-appearances(not driven),chrome.field.boundary-3-1(broken),chrome.hover.ground(broken),chrome.floating.edge-frame(broken),chrome.focus.one-ring-rule(broken),chrome.filmstrip.one-ring(broken),chrome.appearance.first-visit-follows-os(broken),chrome.tooltip.none-on-focus-in-menus(broken),chrome.menu.plate-fits-labels(broken),chrome.menu.no-mnemonics-mac(broken),chrome.select.one-rule(broken),chrome.check.draws-check(broken),chrome.toolbar.fold-any-width(broken),chrome.toolbar.bold-follows-selection(broken),menus.icons.insert-rows(broken),menus.icons.format-rows(broken),chrome.format-options.fields-by-kind(broken),chrome.plate.fits-viewport(broken),chrome.tail.reads-mode(broken),menus.rows.icon-on-every-row(broken),chrome.snackbar.refusal-sentence(broken),chrome.handles.tooltip-words(broken),chrome.tooltips.only-on-hover(broken),chrome.chip.above-ring(broken),chrome.dialog.no-loading-jump(broken),chrome.dialog.focus-return-and-trap(broken),chrome.context.escape-closes-submenu(broken),chrome.title-row.phone(broken),chrome.phone.menus-key(not driven),chrome.title-row.name-after-first-write(flaky),chrome.title-row.one-status(broken),chrome.stage.deck-appearance(broken),chrome.mark.one-product-mark(broken),chrome.ai.no-sparkle(broken),chrome.selection.gt-blue(broken),chrome.scroll.no-smooth(broken),chrome.toolbar.select-glyph(broken),chrome.words.one-spelling(broken),chrome.menus.one-logo-row(broken),chrome.menus.preferences-named(broken),chrome.menus.download-four-first(broken),chrome.words.no-process-words(broken),chrome.menus.structure-sweep(broken),chrome.buttons.one-rule(broken),chrome.colors.pairs-at-floor(broken),chrome.font.one-subset(broken),chrome.font.on-demand(not driven),chrome.layers.tooltip-over-bar(broken),chrome.layers.toast-over-dialog(broken),chrome.layers.top-layer(broken),chrome.layers.follows-anchor(broken),chrome.radius.floating(broken),chrome.radius.windows(broken),chrome.radius.controls(broken),chrome.plates.separation(broken),chrome.scroll.default-everywhere(broken),chrome.scroll.stage-track(broken),chrome.numerals.tabular(broken),chrome.type.default-glyphs(broken),chrome.appearance.system-until-picked(broken),chrome.font.no-stylistic-sets(broken),chrome.font.tabular-figures(not driven),chrome.select.every-site(broken),chrome.select.keyboard(broken),chrome.select.pointer(broken),chrome.select.over-dialog(broken),chrome.select.placement(broken),chrome.select.phone(broken),chrome.select.look(broken). - The View menu: 8 of 14 rows hold it:
view.mode.viewing-hides-toolbar(broken),view.hide-menus-chevron(not driven),view.live-pointers.second-browser(not driven),view.comments.show-all-panel(broken),view.comments.modes-markers(not driven),shaders.view.play-setting(not driven),view.deck.surfaces(broken),view.book.hint-clear(broken). - Notifications: 3 of 3 rows hold it:
inbox.bell-panel-toggle(broken),inbox.settings-persist(broken),inbox.notification-arrives(not driven). - The brand kit: 25 of 25 rows hold it:
brand.panel.opens(not driven),brand.logo.replace-every-slide(not driven),brand.logo.use-on-every-slide(not driven),brand.logo.remove(not driven),brand.colors.primary-live(not driven),brand.colors.palette-row(broken),brand.colors.control-ids-unique(broken),brand.colors.collab-rerender(not driven),brand.colors.version-history-entry(not driven),brand.colors.role-tooltips(not driven),brand.background.enter-keeps-open(broken),brand.fonts.roles(not driven),brand.footer.text(not driven),brand.counter.format(not driven),brand.frame.toggles(not driven),brand.appearance.default(broken),brand.export.pdf-logo(not driven),brand.surfaces.viewer-and-show(not driven),brand.layout.tiles-in-kit(broken),brand.agent.set-get(not driven),brand.objects.kit-colours-first(not driven),brand.panel.words-match-sheet(broken),brand.template.blank-no-gt-mark(broken),brand.template.blank-plain(broken),brand.template.blank-mark-not-an-object(broken). - Fonts: 22 of 22 rows hold it:
fonts.dropdown.opens(not driven),fonts.dropdown.apply-selection(not driven),fonts.dropdown.search(not driven),fonts.format-menu.row(not driven),fonts.more-fonts.licence(not driven),fonts.budget.no-load-before-ready(not driven),fonts.export.editable-names-face(not driven),fonts.export.pdf-face(not driven),fonts.face.reload-and-show(not driven),fonts.agent.font-list(not driven),fonts.inter.italic-release(broken),fonts.links.licence-v4-1(broken),fonts.fallback.in-stack(broken),fonts.display-features.inter-only(not driven),fonts.catalog.geist(not driven),fonts.catalog.six-families(not driven),fonts.picker.specimen-rows(not driven),fonts.picker.recent-group(not driven),fonts.picker.search-category(not driven),fonts.preload.italic-on-edit-only(not driven),fonts.table.takes-family(not driven),fonts.field.own-face(broken). - Templates: 7 of 7 rows hold it:
templates.gallery.page(broken),templates.gallery.strip-and-link(broken),templates.save.as-template(not driven),templates.save.same-name-replaces(not driven),templates.card.rename-and-delete(not driven),templates.default.use-for-new(not driven),templates.deck.read-only(not driven). - The assist: 19 of 19 rows hold it:
assist.entry.title-row(not driven),assist.panel.first-line-and-cards(not driven),assist.tailor.dialog-one-undo(not driven),assist.tailor.agent-deck-tailor(not driven),assist.rewrite.card-accept-undo(not driven),assist.notes.draft(not driven),assist.free-ask.fallback-sentence(not driven),assist.mark.chip-and-history(not driven),assist.outside-write.snackbar(broken),assist.finder.terms(broken),assist.finder.ask-row(not driven),assist.quota.429(not driven),assist.viewer.disabled(not driven),assist.agent.propose-accept(not driven),assist.panel.mode-aware(broken),assist.tailor.one-pass(broken),assist.snackbar.names-change(broken),assist.panel.words-and-layout(broken),assist.polish.agent-sweep(broken). - Sync: 13 of 16 rows hold it:
sync.title.concurrent-both-kept(broken),sync.title.offline-both-kept(broken),sync.block.concurrent-same-offset-order(broken),sync.structural.concurrent(not driven),sync.viewer.live-updates(broken),sync.undo.after-remote(not driven),sync.resend.idempotent(not driven),sync.pull.no-listing(broken),sync.slide.concurrent-add-both-kept(broken),sync.title-row.save-words-truthful(broken),sync.reject.sentence-below-toolbar(broken),sync.write.5xx-keeps-document(broken),sync.recovered.no-plate-for-held-writes(broken). - Realtime: 14 of 16 rows hold it:
realtime.keystroke.within-300ms(broken),realtime.caret.within-300ms(broken),realtime.caret.offset-after-merge(broken),realtime.selection.outline-within-300ms(broken),realtime.block.drag-live(broken),realtime.title.two-typers(broken),realtime.join.chip-within-1s(broken),realtime.follow.for-everyone(not driven),realtime.agent.write-announced(broken),realtime.share-link.every-instance(flaky),realtime.pointer.second-browser(not driven),realtime.caret.dims-and-leaves(broken),realtime.card.chip-painted(broken),realtime.departed-guest.name-stable(flaky). - Setup: 2 of 4 rows hold it:
setup.worker.health(not driven),setup.do.two-instances(not driven). - Logos: 25 of 25 rows hold it:
logos.insert.row(not driven),logos.picker.search(not driven),logos.picker.paper-and-ink(not driven),logos.picker.your-brand(not driven),logos.picker.empty-state(not driven),logos.picker.recents(not driven),logos.picker.licence-words(not driven),logos.picker.chrome-1280(not driven),logos.insert.one-click-asset(not driven),logos.insert.logo-size(not driven),logos.insert.mono-tint(not driven),logos.insert.every-slide(not driven),logos.tailor.find-customer-logo(not driven),logos.replace-image.row(not driven),logos.route.mark-headers(not driven),logos.index.refresh-dry-run(not driven),logos.index.refresh-fixture(not driven),logos.index.cached-offline(not driven),logos.cache.open-licence-only(not driven),logos.agent.search-insert(not driven),logos.picker.variants(not driven),logos.kit.find-a-logo(not driven),logos.export.svgblip(not driven),logos.dialog.results-in-view(broken),logos.dialog.sentence-case-whole-names(broken). - Shaders: 27 of 28 rows hold it:
shaders.insert.gallery-thumbnails(not driven),shaders.insert.selected-free-rectangle(broken),shaders.insert.words(broken),shaders.panel.section-groups(broken),shaders.panel.slider-live-undo(not driven),shaders.panel.preset-tiles(broken),shaders.panel.control-sentences(not driven),shaders.panel.kit-colours(not driven),shaders.panel.one-home(broken),shaders.frame.auto-capture(broken),shaders.frame.box-aspect(not driven),shaders.frame.reuse-and-prune(not driven),shaders.frame.one-capturer(not driven),shaders.background.place-answers(broken),shaders.perf.one-context(not driven),shaders.perf.hidden-pauses(not driven),shaders.agent.list-insert-set-render(not driven),shaders.background.add-to-theme(not driven),shaders.library.glyph-engines-render(not driven),shaders.frame.scrubber-capture(not driven),shaders.show.plays-when-on(broken),shaders.show.frame-when-off(not driven),shaders.insert.gallery-hover-live(not driven),shaders.frame.large-png-lands(broken),shaders.gallery.words-and-head(broken),shaders.insert.free-rectangle(broken),shaders.insert.chip-noun(broken). - SVG pictures: 18 of 18 rows hold it:
svg.import.upload(broken),svg.import.paste-file(not driven),svg.import.paste-markup(not driven),svg.import.drop(not driven),svg.import.url(not driven),svg.render.vector-at-zoom(not driven),svg.render.picture-gestures(not driven),svg.copy.markup(not driven),svg.export.pdf-vector(not driven),svg.export.pptx-svgblip(not driven),svg.export.pptx-fallback(not driven),svg.export.web-page(not driven),svg.sanitize.script-and-handlers(not driven),svg.sanitize.data-image-kept(not driven),svg.sanitize.cap(not driven),svg.sanitize.broken(not driven),svg.paste.keeps-text(broken),svg.intake.long-comment(broken). - For agents and advanced tools: 9 of 10 rows hold it:
surface.menus.open-close-escape(not driven),surface.advanced.off-by-default(not driven),surface.advanced.on-shows-parked(not driven),surface.advanced.remembered(not driven),surface.parked-blocks-render(not driven),surface.parked-shortcut-unbound(not driven),surface.parked-block-core-rows(not driven),surface.domain.build-commit(broken),surface.skeleton.matches-editor(broken).
Documentation
docs/README.md is the index of every document under docs/, with the binding ones first.
| Document | What it covers |
|---|---|
| docs/README.md | The index of the documents: where to start, the reference by subsystem, the closed rounds and the records |
| docs/NEXT.md | The next program: the rounds for speed, cost, features, the brand and sign in |
| docs/FOCUS.md | The rule, the core set by menu row, the parked set behind Tools > Advanced tools, the test matrix and the ship gate |
| docs/updates.md | The release notes, one entry per release with what changed in the default view |
| AGENTS.md | The rules for working in the repository: code rules, the agent surface, the parity chains, acceptance, the rounds |
| docs/spec/SPEC.md | The specification: the document model, the renderer, the editor, the agent surface, export, hosting |
| skills/ | The four agent skills: turboslide-api, turboslide-create, turboslide-studio, turboslide-verify |
| THIRD_PARTY_NOTICES.md | Third-party licenses |
License
MIT, copyright 2026 Kevin Liu (LICENSE). Third-party licenses are listed in THIRD_PARTY_NOTICES.md.
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi