Skip to content

Create decks and documents with AI (work in progress) - #105

Draft
RedtRocks wants to merge 57 commits into
mainfrom
claude/project-thread-0t3kvf
Draft

RedtRocks wants to merge 57 commits into
mainfrom
claude/project-thread-0t3kvf

Conversation

@RedtRocks

Copy link
Copy Markdown
Owner

Requested by redt · project thread

What changes for users

Before: Glance opens and lightly edits files, and AI apps can view, convert and edit PDF text through it, but nobody can create a slide deck or document in Glance.

After (when this branch is done): people and their AI apps (Claude Code, Codex, Gemini, Muse and the rest) create, rearrange and restyle decks and documents in Glance, starting from a "What do you want to make?" screen, templates, a brand kit and design sliders. If an AI is signed in, AI comes first. If not, Glance offers sign-in, and everything also works by hand.

This draft collects the whole feature on one branch, as redt asked. It merges only after redt has tested the CI builds and said OK. Plan: Glance agent documents. Approved mockups: Glance create mockups.

How

  • ADR 0018: decks and documents use Glance's own formats (.gdeck, .gdoc), with PowerPoint, Word and PDF as exports. ADR 0019: Glance gives its design and writing skills to whichever agent is running.
  • Glossary: deck, slide, template, theme, brand kit, skill, check.
  • src/core/deck/: the deck model (12 layouts with typed slots), applyOps (all-or-nothing operations shared by AI tools and hand editing), and checkDeck (the design check agents must pass).
  • Still to come on this branch: the renderer and Wollo theme, MCP tools, exports, the editor UI, Ask AI with the agent team, templates, documents, spreadsheets, and the PDF and image additions.

Testing

  • npm run typecheck and npm test pass (49 files, 356 tests; tests/deck.test.ts is new)
  • cargo test in src-tauri passes (if Rust changed): no Rust yet
  • Tried in the app (say how): nothing visible yet
  • Screenshots in light and dark mode (if the UI changed): mockups linked above

Checklist

  • UI text goes through t(): no UI yet
  • Still works, or is hidden, on Linux and in the browser version
  • A line under the top ## New in section of CHANGELOG.md, if users will notice: added once the feature is visible
  • README, docs/FORMATS.md or docs/AI-APPS.md updated: later on this branch
  • No new network calls, telemetry or GPL/AGPL dependencies

Generated by Claude Code

RedtRocks and others added 3 commits October 18, 2026 09:39
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
ADR 0018: decks and documents use Glance's own formats, Office and PDF
are exports. ADR 0019: Glance gives its skills to whichever agent runs.
Glossary gains Template, Theme, Brand Kit, Skill and Check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
A deck is a theme plus slides; a slide is one of 12 layouts with its
slots filled in. applyOps applies a list of operations all or nothing
(add, move, delete, duplicate, hide, setLayout, setSlot, clearSlot,
setNotes, setTheme, split, merge) and checks values against the layout.
checkDeck lists what to fix: missing title slide, missing or too-long
slots, too many entries, three same layouts in a row, missing alt text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
@RedtRocks RedtRocks self-assigned this Oct 18, 2026
RedtRocks and others added 14 commits October 18, 2026 10:18
Each layout turns a slide's slots into boxes on a 1920 by 1080 slide. The
HTML view draws them, and the PowerPoint export will draw the same boxes.
Text is fitted by estimating how it wraps, so layout stays pure and testable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
A zip with deck.json and the pictures under media/. Reading checks every
slide and keeps what it can, with a warning for anything left out. Pictures
must sit in media/, so a deck can't point outside itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
.gdeck files open in their own tab with the slides down the sidebar. Click
any text on a slide to type over it, click a picture to replace it, drag
slides to reorder them, and use the Slide menu or right-click to add,
duplicate, hide or delete them. Every change is one undo step, and decks
save and autosave like PDFs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
glance_create makes a deck from slides the AI fills in, glance_deck_edit
changes it with deck operations as one undo step, glance_deck_check lists
what to fix, glance_deck_outline reads it back and glance_deck_render shows
slides as pictures. Pictures named by local path are copied into the deck.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
…irst

File > New asks what you want to make. With an AI signed in, Glance opens a
new deck and the AI fills it; otherwise it offers to sign in, or to start by
hand. Decks export to PDF (real text, Urbanist embedded), PowerPoint (with
notes and hidden slides) and PNG, print through the PDF export, and AI apps
get glance_export. pptxgenjs (MIT) loads only when exporting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Pitch Deck, Book Report, Weekly Report, Class Lesson and Event Plan sit
under the make screen; with an AI signed in and a request typed, the AI
fills the template's placeholders. Decks gain the Sunrise, Blossom and
Ink themes, picked from a theme menu in the deck bar and by AI apps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Every theme now has three colours that layouts take in turn: cards
blocked in colour with big numbers, the big number on a disc, numbered
timeline steps, a coloured title column for points, a tinted quote
slide with a large quote mark, and circles, rings and pills that run off
the edge of title, section and empty picture slides. Slides of one
layout vary their shapes by slide. PDF and PowerPoint exports draw the
new outlines too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Fraunces, Bricolage Grotesque, Space Grotesk, Caveat and DM Serif Display, as woff2
with their OFL licences, and Urbanist as its full variable font. Browsers fetch each
only when a slide uses it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
A slide with layout design names a design (like bakeSale.2) and keeps only its text;
the design's art and text boxes are trusted app assets. Every lookup of a slide's
slots goes through slotSpecsOf, so operations, the design check, typing and reading
a .gdeck all work on designed slides. Text longer than the sample shrinks to fit,
measured in the real font where there is one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
scripts/build-templates.mjs renders each board in Chromium, keeps every text as an
editable text box (position, turn, font, size, colour, spacing, alignment and the
sample text) and the rest as art, and writes src/deck/designs: 18 templates of six
slides, each loaded only when needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
File > New lists the 18 templates by purpose with their real first slides; a preview
shows all six, to use as they are or have the AI make them about something. Typing on
a designed slide edits its text box in place, and the slide menus offer the deck's
template's designs. PDF draws the art as a picture under real text in the design
fonts (variable fonts set to each box's weight, turned boxes turned); PowerPoint gets
the art as a picture and editable text boxes; pictures inline the fonts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
glance_templates lists each template and its designs, with what each slide is for and
its slots' hints and maxChars. glance_create takes a template, and slides of any of
its designs in any order and number; glance_deck_edit adds and switches to designs.
The instructions tell agents to prefer the designs and keep text within maxChars.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Comment thread scripts/build-templates.mjs Fixed
Comment thread scripts/build-templates.mjs Fixed
RedtRocks and others added 11 commits October 21, 2026 15:45
Pure code in src/core/sheet: cells with values, formulas and styles, Excel number
formats, a formula parser and evaluator (references, ranges, other sheets, the usual
functions, @formulajs/formulajs for the rest), recalculation, data validation, and
the operations every change goes through. ExcelJS and @formulajs/formulajs (both MIT)
are added for the next steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Shares the board extraction with the deck build (template-extract.mjs). Fixed pages keep
their art and text boxes, rows of cells become tables, and flowing pages become blocks
in the look's styles. Adds the document model, the page layout and table totals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
ExcelJS reads and writes values, formulas, styles, merges, sizes, frozen panes,
validation, conditional formatting and pictures. Charts live in a very hidden sheet
so they come back in Glance, with a picture of each placed for Excel. The check lists
formula errors, broken references, numbers typed as text, entries validation doesn't
allow and placeholders left in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
RedtRocks and others added 15 commits October 21, 2026 16:13
…nd Word conversion

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
…and all 84 guests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
…ed tables' rows

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Typing fast into a cell kept only the first key, and every edit was
committed twice (Enter, then blur), so Undo seemed to do nothing. Ctrl+Z
and Ctrl+Y now work from the grid, the Edit menu's Undo is enabled for
sheets, and the 'open it in Excel' bar no longer shows on a sheet Glance
edits. Titles drawn over a banner in seven templates were lost; the
builder now puts floating text into cells and leaves out the band behind it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Keeps both sides: documents and the plan-first guide. A new document
made with the AI now plans first on the Outline screen, like a deck.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Keeps both sides: spreadsheets join decks and documents in the tools,
menus, commands, File -> New and the docs. A spreadsheet made with the
AI plans first on the Outline screen. package-lock.json regenerated
with npm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Registers guide contexts for open documents (gdocSelection) and
spreadsheets (sheetSelection, with each picked cell's rules from
validationHint), and fixes sheetSelection to report the tab id. The
Outline screen offers document and spreadsheet templates as looks and
applies the one picked. The sheet grid's rule hint goes through t().
The document-writing and spreadsheet-building skills name the real
tools and ops, and the web welcome button covers every kind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Comment on lines +59 to +60
return readFileSync(file, 'utf8')
.replace(/<script[\s\S]*?<\/script>/g, '')

function boardHtml(file) {
return readFileSync(file, 'utf8')
.replace(/<script[\s\S]*?<\/script>/g, '')
Comment on lines +32 to +33
return readFileSync(file, 'utf8')
.replace(/<script[\s\S]*?<\/script>/g, '')
/** The board's HTML without the design tool's scripts, and with the local fonts instead of Google's. */
export function boardHtml(file) {
return readFileSync(file, 'utf8')
.replace(/<script[\s\S]*?<\/script>/g, '')
Comment thread src/core/sheet/model.ts
if (!isFinite(n)) return '#NUM!'
if (Number.isInteger(n) && Math.abs(n) < 1e11) return String(n)
const abs = Math.abs(n)
if (abs !== 0 && (abs >= 1e11 || abs < 1e-9)) return n.toExponential(5).replace(/\.?0+e/, 'E').replace('E+', 'E+').replace(/e/, 'E')
RedtRocks and others added 14 commits October 22, 2026 07:59
A new blank document opens with its title ready to type, empty blocks show a
hint, clicking below the text adds a paragraph there, Enter starts a new
paragraph and Backspace removes an empty one. Clicking Slides in File > New
with nothing typed makes a blank deck instead of starting the AI. The
Spreadsheet card no longer picks up the web version's bottom sheet style.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh
… to the first column

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh
When the in-app AI reaches the limit of Glance's tools, a request asks for
a kind of file Glance can't make, or the person taps Do more with <company>,
Glance gives the job to the company's own ACP agent in a folder under its
app data and opens the result with a Made by bar. Downloads from the AI
websites in the sidebar save to Downloads and open in Glance; Do more on
<site> opens a pre-filled new chat. ADR 0020, PRIVACY, AI-APPS, CHANGELOG.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh
… lines

The CV page's first Experience entry wrapped to four lines in Chromium and ran
into the next entry, because sample text always kept the design's size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JXvo1FTmUxCdQr2fZL9uqr
Up at the start of a block and Down at its end move to the block before or
after; Backspace at the start joins a paragraph onto the one before and
Delete at the end pulls the next one in; Enter puts the caret at the start of
the new paragraph; Ctrl+Z in a box with nothing typed yet undoes the last
change to the document or deck.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh
Arrow keys finish a cell typed over and move on; Shift+Enter and Shift+Tab
move up and left; Ctrl+arrows jump to the edge of the data; Home, Ctrl+Home
and Ctrl+End; Ctrl+A selects the data; Ctrl+X cuts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh
…at the end, Delete acts on the slide you see

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh
Formatting toolbar above the formula bar (number formats, decimals, font,
bold/italic/underline, colours, borders, alignment, wrap, merge, sort, filter,
chart and Sum). Tabs show the name without the extension, a coloured kind
icon and an unsaved dot, with the full name on hover.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh
Text blocks open as a rich box in the page's own font and paper, so marks show
as they are typed. B, I, U, link and bulleted-list buttons light up with the
caret; Insert gathers the block buttons. Enter on an empty last list item ends
the list. Keys typed while the next block opens are kept, and Enter in a dialog
no longer lands in the field behind it. Underlined runs now render on the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh
… show the hand cursor

Spreadsheet templates sat in their own section under every tab, so they looked
like part of Documents. They now have a Spreadsheets tab next to Slides and
Documents, sharing the purpose tabs. Buttons, tabs, menu items, links and
checkboxes show the pointer cursor app-wide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L1VkfJrYaEGkxa6MECKHLh

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants