Rutba Office
Download

Timeline

Every release, in order

31 releases in 14 days, from the first download on 8 September 2026 to 1.25.0 on 21 September 2026. Each is described in the notes written the day it shipped, not summarised afterwards.

Every release is a beta and says so. An installed copy finds the next one on its own and tells you in the window you are working in; nothing on this page needs you to come back and look.

31

releases since the first

14

days from the first to the latest

9

apps in the one download

794

engine tests behind the latest

  1. 21 September 2026

    1.25.0Latest21 September 2026

    A link on a slide's words; paragraphs sorted in Rutba Word; formatting cleared from a shape.

    TouchedRutba WordPresentation

    What changed

    • Insert → Link
    • Home → Clear all formatting
    • Home → Sort
    The full notes for 1.25.0

    Presentation

    • Insert → Link. A web address on the selected shape's words — every run, each keeping its look — written as PowerPoint writes one, an External relationship on the slide and hlinkClick on the runs; drawn underlined in Office's link blue; Ctrl+click on the shape follows it, and the shape says so when the pointer rests on it. Editing the words keeps the link, which an edit used to drop. Ctrl+K opens it. The button was greyed out.
    • Home → Clear all formatting. The selected shape's words keep only their links; bold, size, colour, font and the rest go, so the words fall back to what the placeholder and the theme give them. The paragraphs' own level, bullet and alignment stay. The button was greyed out.

    Rutba Word

    • Home → Sort. The selected paragraphs A to Z or Z to A — numbers in their order, case set aside — each moving whole with its look; the whole document when nothing is selected, as Word offers. A table's rows are the table's to sort. The button was greyed out.

    Proven, not promised

    • One engine test puts an address on a two-run box, finds every run pointing at the slide's External relationship with its look kept, reads the address back through a save, edits the words as the window does and finds the link kept, and takes it off. Two window checks put an address on the pasted box from the ribbon, find it drawn and offered to follow, and read the run and the relationship in the saved file (clip).
    • Two engine tests sort four paragraphs both ways with a heading keeping its style and 9 before 10, undo each step, sort the whole body from a collapsed caret, leave one paragraph alone, and refuse a run with a table in it. Two window checks sort the fixture's two paragraphs A to Z from the ribbon, read the order on the page and in the saved file, then put them back (look).
    • One engine test formats and links a two-paragraph box, clears it, and finds the words, the link and the paragraph properties kept with nothing else, in the model and in the file. Two window checks make the pasted box bold, clear it from the ribbon, and read the plain, linked runs in the saved file (clip).

    The release on GitHub, with its installers

    1.24.021 September 2026

    A picture from a file shows and can be deleted; a multilevel list in Rutba Word; find and replace across a presentation.

    TouchedRutba WordPresentation

    What changed

    • Home → Multilevel list, and the indent buttons on a list
    • Insert → Pictures draws the picture, and Delete takes it out
    • Home → Find
    The full notes for 1.24.0

    Rutba Word

    • Home → Multilevel list, and the indent buttons on a list. The multilevel list numbers 1., 1.1., 1.1.1., each level carrying the numbers above it; Increase and Decrease indent move a list paragraph a level rather than a step, so a numbered list nests 1. a. i. and a bulleted one changes its bullet, as Word's do. New list definitions are written with Word's nine levels, so there is somewhere to go; a paragraph in no list still moves its own indent. The button was greyed out.
    • Insert → Pictures draws the picture, and Delete takes it out. A picture chosen from the file dialog was written as the digits of its byte array — the engine took a Buffer or base64 text and got neither — so it drew as nothing; it is written whole now, and .bmp and .webp are accepted along with png, jpeg and gif. A picked picture had no way out: Delete or Backspace now takes it, and its block when the block held nothing else, in one undo step.

    Presentation

    • Home → Find. The words typed, Find lists every shape they are on across the deck with a count; a match clicked goes to its slide and selects the shape; Replace all rewrites them everywhere, run by run so each keeps its look, a field's text left alone, and says how many. Ctrl+F opens it. The Editing group was greyed out.

    Proven, not promised

    • Two engine tests number five paragraphs, nest two of them to 2.1. and 2.1.1., read the nine-level definition and the level back from the file; then nest a numbered list to a. and i., a bulleted one to its hollow bullet, and move a plain paragraph's indent. Three window checks press Multilevel list on two paragraphs and Increase indent on the second, find 1. and 1.1. on the page, then read the saved paragraph and definition, and put the paragraphs out of the list again (look).
    • Two engine tests list every shape a word is on with counts, case aside or minded, then replace it across two slides and a footer, find a bold run and an italic one keeping their look, a slide-number field keeping its text, and the replacements in the saved file. Six window checks type a phrase, case-exact, find it with the title of slide 1 first while on slide 2, click the match and land on the title, replace it across the deck with the count said and the lower-case words left alone, read the saved file, and put the words back (find).
    • Two engine tests insert a picture as the byte array the dialog hands over and find the file's own bytes in the part and on the page, take it out with its block and undo; then accept bmp and webp, refuse tiff, and take a picture out of a paragraph of words leaving the words. Two window checks find the drawn picture decoded from the file's own bytes and delete it from the keyboard.

    The release on GitHub, with its installers

    1.23.021 September 2026

    Word gets page borders, a watermark and line numbers; a slide gets the Format Painter, the footer band and shadows.

    TouchedRutba WordPresentation

    What changed

    • Design → Page Borders
    • Design → Watermark
    • Layout → Line Numbers
    • Home → Format Painter
    • Insert → Header & Footer, Date & Time, Slide Number
    • Shape Effects
    The full notes for 1.23.0

    Rutba Word

    • Design → Page Borders. A menu of boxes — a thin, thick, double or dashed line — and none. Written as w:pgBorders in the section, after the margins where the schema puts it, measured 24 pt in from the page edge as Word measures its own; drawn on every sheet in print layout and around the flow otherwise; printed by the PDF, where a double border is now two lines for paragraphs as well. The button was greyed out.
    • Design → Watermark. DRAFT, CONFIDENTIAL, SAMPLE, DO NOT COPY, URGENT, any words of your own, or none. Written as Word writes its own — a WordArt shape, silver, rising across the page, first in the header — so Word shows it; the page and the PDF already drew one that a file brought in, and now draw one the suite made. A header's own words stay under it and can still be changed. The button was greyed out.
    • Layout → Line Numbers. None, continuous, restarting on each page, or every fifth line: a number beside every line of the body down the left margin, as a contract or a manuscript wants. Written as w:lnNumType in the section after the page borders; drawn beside the lines the page actually has, so a paragraph split across pages counts right; printed by the PDF beside the lines the paginator laid. The button was greyed out.

    Presentation

    • Home → Format Painter. Click a shape, press it, click another: the second takes the first's fill, outline and font — the fill and outline into its own properties, the font onto every run of its words — and the painter is put down, as PowerPoint's is after one shape. Esc puts it down early; the button stays pressed while it is armed. It was greyed out.
    • Insert → Header & Footer, Date & Time, Slide Number. One dialog: the date (kept current, or fixed words), the slide number and the footer's words, on this slide with Apply or every slide with Apply to All. Written as PowerPoint writes them — the three footer placeholders, the number and an automatic date as fields — placed where the layout or master places them, or along the bottom where PowerPoint's own templates put them. The number follows the slide when slides move. All three buttons were greyed out.
    • Shape Effects. A shadow under the selected shape — bottom right, below, right, top left, all round — or none, from the ribbon's menu and the Format pane. Written after the outline in the shape's own properties as PowerPoint writes it, read back, and drawn on the stage and in every thumbnail. It was greyed out.

    Proven, not promised

    • Two engine tests write the box, find it after the margins, read the sides back, keep them through a save, print the four lines 24 pt in from the edges, clear and undo it; then write a heavier double frame measured from the text, find the printed line at the margin less the space, and read a side another program wrote as nil as no side. Two window checks pick Box — thin line and find the frame 32 px in on the sheet, then read the saved section (look).
    • Two engine tests put a watermark on a document with no header and find the header, its reference and Word's shape made for it, read the words, colour and rotation back, keep them through a save, replace, escape, remove and undo; then put one over a header with words and change the words without losing the shape. Two window checks pick DRAFT and find it silver and turned on the page, then read the saved header (look).
    • Two window checks give a pasted box a fill and an outline, arm the Format Painter on it, click the slide's title, and find the look on the title and in the saved file (clip).
    • Two engine tests write the footer, the number and the date onto a slide with no layout to place them and find them along the bottom, the number a field saying the slide's place and following it when the slide moves, new words replacing old in the same placeholder and blanks taking it off; then a fixed date as plain words and the number on every slide through a save. Five window checks open the dialog from Slide Number with the number ticked, type the footer, Apply to All, find both on every slide and drawn on the stage, read the saved file, then reopen the dialog on slide 2 with its own settings and take the footer off that slide alone (footer).
    • One engine test writes a shadow after the outline, reads it back in pixels and degrees, keeps it under a fill write, and turns it off with the empty effect list that silences a style's shadow. Two window checks put a shadow under the pasted box from the ribbon, find it drawn, and read it after the outline in the saved file (clip).
    • One engine test writes the numbering after the page borders, reads it back, prints six numbered lines, changes it to every fifth line with a gap in twips, clears and undoes it, and reads Word's own default for a file that says nothing about restarting. Two window checks pick Continuous and find 1, 2, 3 down the margin with a gap before the text, then read the saved section (look).

    The release on GitHub, with its installers

    1.22.021 September 2026

    Sheets come and go from the tabs, the Data and Formulas tabs fill in, a slide's text does everything the box can, and a Word paragraph takes shading, borders and a page colour.

    TouchedRutba WordWorksheetsPresentation

    What changed

    • Home → Layout and Reset
    • Strikethrough, character spacing, change case and highlight
    • Align text, Text direction and Columns
    • Home → Shading and Borders
    • Design → Page Colour
    • Sheets can be added, renamed and deleted

    and 4 more in the notes

    The full notes for 1.22.0

    Presentation

    • Home → Layout and Reset. Layout puts the slide on another of the deck's layouts from a menu, as the Designs pane does; Reset puts moved placeholders back where the layout has them. Both were greyed out.
    • Strikethrough, character spacing, change case and highlight. The four Font controls are live: Strikethrough toggles, AV offers very tight to very loose, Aa rewrites the letters (sentence, lower, UPPER, Each Word), and the highlight offers four colours or none. Written as PowerPoint keeps them and drawn on the stage — the line through the words, the colour behind them. Caps and super/subscript a slide already had survive an edit now too.
    • Align text, Text direction and Columns. The box's own three: the words sit at the top, middle or bottom of the box, run horizontally or turned up or down, and fill one, two or three columns, one to its foot before the next. Written on the body as PowerPoint keeps them, drawn on the stage the same way. The three buttons were greyed out.

    Rutba Word

    • Home → Shading and Borders. A colour behind the paragraph from six light shades or none, and a rule under, over, beside or all round it. Written as Word keeps them (the paragraph's own shading and borders, in schema order), painted at once, printed and exported to PDF the same way. The two buttons were greyed out; shading and borders in a file were drawn on screen only.
    • Design → Page Colour. A colour behind every page, from the same six light shades or none, on screen, in print and in the PDF, and kept as Word keeps it — before the body, with the setting that makes Word show it. The button was greyed out.

    Worksheets

    • Sheets can be added, renamed and deleted. A + at the end of the tabs adds a sheet, named the way Excel names one; a tab's menu renames it, with every formula and defined name that reads the sheet following the new name, or deletes it after asking, since that cannot be undone. Until now a workbook kept exactly the sheets it opened with.
    • Data → Text to Columns and Remove Duplicates. Text to Columns splits each cell of one selected column on a comma, tab, semicolon or space into the cells to its right, as Excel does (and refuses a wider selection with a sentence). Remove Duplicates takes the selection, or the block round the cell, drops every row that repeats an earlier one, leaves a header the block has alone and closes the rest up. Each is one undo step. Both buttons were greyed out.
    • Data → Sort by several columns. A dialog with up to three levels, each a column of the block and A to Z or Z to A; the first decides and the next break its ties, blanks last either way, stable, one undo step. The A→Z and Z→A buttons sort by the active column as before.
    • Formulas → Trace Precedents, Trace Dependents, Remove Arrows. Blue arrows on the grid from the cells a formula reads to it (a range as a box), or from a cell to every formula that reads it; references to other sheets or by name are counted in a note rather than drawn. Remove Arrows clears them. The three buttons were greyed out.
    • Formulas → Create from Selection. A name for each column of the block, from its header — spaces and punctuation to underscores, a leading digit and a cell-like name made valid the way Excel does — live in formulas at once and kept in the file. The button was greyed out.

    Proven, not promised

    • Three engine tests add a sheet (the part, its content type, the relationship, the entry with the next sheetId, undone part and all), rename one and find the formulas and names following, and remove one leaving no entry, relationship or part. Three window checks press +, rename the new tab through its menu, delete it after the dialog, and read the file after each step (links).
    • Two engine tests write strikethrough, spacing, caps, a superscript and a highlight and read them back after a save, and move a placeholder, reset the slide and find it back where the layout has it with no geometry of its own in the file. Two window checks press Strikethrough and read the line drawn, and put the slide on another layout from the Home tab (RUTBA_VERIFY_ONLY=bullets).
    • One engine test anchors, turns and splits a body and reads the three back after a save, finds the stage turning the words, and finds the twelfth line of a two-column body drawn in the second column. One window check picks Middle and Rotate all text 270° and reads both on the body and the turn on the stage (bullets).
    • Two engine tests write a paragraph's shading and two borders, find them in schema order, read them back after a save, take them off again and undo. Two window checks pick Light yellow and Bottom border on the first paragraph, read the paint, save, and read the paragraph properties back from the file (RUTBA_VERIFY_ONLY=look, capture word-look.png).
    • One engine test writes a page colour as the document's first child with the setting that shows it, reads it back after a save, clears it and undoes. Two window checks pick Light blue on the Design tab, read the page painted, save and read the element back before the body (look).
    • Three engine tests split a column and refuse two, remove repeated rows from a block with a header and from rows chosen by hand, and undo each in one step. Three window checks type a,b,c and a repeated row through the document ops, split the one from the Data tab, remove the other, read the block closed up, save and read both back (links).
    • One engine test sorts by two keys, the first descending, and finds the ties broken by the second and blanks last. One window check sorts the block by two columns through the dialog and reads the rows in order (links).
    • Two engine tests trace precedents (a cell each, a range as one box, a reference elsewhere counted) and dependents (through a range too). Two window checks type a formula, press Trace Precedents, read two arrows ending at the formula, and press Remove Arrows (links).
    • One engine test names five columns from a header row, finds the names made valid, live in a formula and kept through a save. One window check presses Create from Selection on the block, saves, and reads the names back from the file (links).

    The release on GitHub, with its installers

    1.21.021 September 2026

    A cell's words move in and turn, the Page Layout tab writes the file, and a slide keeps its look.

    TouchedWorksheetsPresentation

    What changed

    • Home → Increase indent, Decrease indent
    • Home → Text orientation
    • Page Layout writes the file
    • Page Layout → Breaks
    • Insert → Header & Footer
    • Bullets, numbering, list levels and line spacing

    and 2 more in the notes

    The full notes for 1.21.0

    Worksheets

    • Home → Increase indent, Decrease indent. The two arrows move a cell's words in and out by one of Excel's indent units a press, each cell from its own indent, and never below none. Written as Excel keeps an indent — in the cell's alignment, beside a left alignment when the cell had none. Centring a cell drops its indent, as in Excel. The buttons were greyed out; an indent in a file was drawn and none could be given.
    • Home → Text orientation. Angle anticlockwise, Angle clockwise, Vertical text, Rotate text up, Rotate text down, and Horizontal text to put it back: the words turn on screen and on the printed page, the row growing to hold them, and the file carries Excel's own rotation so Excel shows the same. The button was greyed out before.
    • Page Layout writes the file. Margins, Orientation and Size on the Page Layout tab now write the sheet's own page setup — the one the print dialog and Excel start from — where until now they changed a note in the window that nothing read, so a landscape chosen there printed portrait. Print Titles repeats the top rows on every page (a row, two, three, or the selected rows from row 1), and Scale to Fit sets Width and Height to one page or automatic, and Scale to a percentage; all the rows down one page is new to the engine. The tab says what the file has now.
    • Page Layout → Breaks. Insert page break puts one above the row and left of the column of the cell (only one of them at the sheet's edge, as Excel does), Remove takes it off at the cell, Reset takes them all away; the tip counts them. The file keeps them as Excel does, and the print dialog's page count and the printed pages start a page at each. The Margins presets on the tab are the print dialog's own three now, so a Normal chosen on the tab is Normal in the dialog.
    • Insert → Header & Footer. What prints at the top and the foot of every page, with Excel's codes (&P page, &N pages, &A sheet, &F file, &D date, &T time; &L, &C and &R start the left, centre and right parts) and quick picks that add them. Kept in the file as Excel keeps them, so Excel prints the same; the three parts print left, centre and right. The button was greyed out, and the print dialog had no field for either.

    Presentation

    • Bullets, numbering, list levels and line spacing. The five Home tab controls are live: Bullets and Numbering give a paragraph its bullet or take it away, the arrows step its list level, and Line spacing offers 1, 1.15, 1.5 and 2. Written as PowerPoint keeps them, so it shows the same.
    • A slide keeps its look when edited. A format press used to rebuild every paragraph from its level and alignment alone, so a slide's own bullets, numbering and spacing vanished; and editing the words sent each line back plain, so a bulleted list edited once lost its bullets and its bold words. Now the writer keeps what the reader read, and each edited line keeps the paragraph it replaces and the look of its first run.
    • Cut, Copy and Paste move a shape between slides. A selected shape copies or cuts (the buttons, Ctrl+C, Ctrl+X) and pastes on whichever slide is on screen (Paste, Ctrl+V), a little right and down, with a fresh id and, for a picture, the slide pointed at the same bytes. The three buttons were greyed out.

    Proven, not promised

    • Ten engine tests set an indent and read it beside the left alignment, step two cells from their own indents and stop at zero, keep a right alignment's indent and drop a centred cell's, write each of the five orientations and read them back after a save, take a rotation off, and undo both with the style table.
    • Three window checks press Increase indent twice on A2 and read the words move in by nine pixels a press, pick Rotate text up and read the words standing on end with the row grown, save, and read the indent and the rotation back from the file (RUTBA_VERIFY_ONLY=links).
    • One engine test fits all the rows on one page down and reads that back from the file. Two window checks pick Landscape, Repeat row 1 and Width → 1 page from the Page Layout tab, read the page setup change each time, save, and read the three back from the file (links).
    • One engine test breaks a report at row 60 and counts a page more, writes a row break and a column break, reads them back in schema order, and resets them. Two window checks put a break at A3, read the sheet printing on two pages, save, and read the brk back from the file (links).
    • One engine test writes a header and a footer, reads them back in schema order, prints the three parts with the sheet name in the centre and the page count at the foot, and finds a footer-less file prints no foot. Two window checks type both into the dialog from the Insert tab, read them back from the page setup, save, and read them from the file (links).
    • One engine test writes a bulleted, a numbered and a bullet-less paragraph with spacing, finds them in the slide XML in schema order, reads them back, and rewrites them bold with the bullets intact. Four window checks press Bullets on a text box and read the glyph drawn, step the level and pick 1.5, save, and read all three back from the file (RUTBA_VERIFY_ONLY=bullets).
    • One engine test copies a title onto another slide and a picture whose media resolves there after a save. Four window checks copy a text box, paste it on slide 2 and read it back with the same words, cut it, paste again, save and read it from the file (clip).

    Under the hood

    • setFormat({ indent, indentBy, rotation }) in applyFormat beside align, valign and wrap; formatOf and the frame's cells carry indent and rotation; the grid and the print page turn the words alone, not the cell.

    The release on GitHub, with its installers

    1.20.021 September 2026

    A picture goes into a worksheet, and the selection becomes the print area.

    TouchedWorksheets

    What changed

    • Page Layout → Print Area
    • Insert → Pictures
    The full notes for 1.20.0

    Worksheets

    • Page Layout → Print Area. Set print area makes the selection what prints, kept in the file as Excel keeps it — the sheet's own print-area name — so the print dialog, and Excel, start from it; Clear print area takes it away. The button was greyed out; the print dialog alone could set one.
    • Insert → Pictures. A picture from a file goes in at the cell, at its own proportions with its longer side no more than 320 px, drawn at once over the cells. The file carries it as Excel keeps a picture — a media part, the sheet's drawing part with a one-cell anchor at the cell and a relationship to the bytes — so Excel shows it too. One undo step, the parts going with it. The button was greyed out before; pictures in files were drawn and none could be added.

    Proven, not promised

    • Two engine tests put a picture at a cell and read the media part, the anchor at the cell at its size, the relationship, the content type and the frame's drawing, from the file as well; a second picture, the undo that takes one away with its part, and a refused type.
    • Three window checks put a picture at D6 through the op the button dispatches, read it drawn over the cell at its size from its own bytes, save, and read the media part and the anchor back from the file (RUTBA_VERIFY_ONLY=sheetpic). Two select B2:C3 with Shift and the arrows, set it as the print area from the Page Layout tab, read it back from the page setup, and clear it (links).

    Under the hood

    • SheetView.insertPicture({ name, contentType, data, widthPx, heightPx }) over ensureSheetDrawing/appendDrawingAnchor and the shared drawingAnchorXml picture anchor; op insertPicture; the window reads the picture's pixels to size it.

    The release on GitHub, with its installers

    1.19.021 September 2026

    A floating text box prints beside the words, and a block of cells becomes a table.

    TouchedRutba WordWorksheets

    What changed

    • Format as Table
    • A floating text box prints beside the words
    The full notes for 1.19.0

    Worksheets

    • Format as Table. Home → Format as Table, or Insert → Table, makes the selection — or, from one cell, the block of data round it — a table: a header row, banded rows if you ask, and a style Excel knows by name (light, medium, dark). The header row and the banding are painted at once, in this window's own palette, as tables from files already were; a header cell with nothing in it is given its column's name, as Excel does. The file carries it as Excel keeps a table — the table part with its columns and autofilter, the sheet pointing at it — so Excel shows the table too. One undo step.

    Rutba Word

    • A floating text box prints beside the words, as it has shown on screen: a pull quote or a sidebar anchored at the left or the right is placed at its paragraph's top on that side, the lines beside it laid out shorter for as far down as it reaches, in print and PDF. It was drawn under its paragraph as a block. A box that would leave the lines no room stays under the words.

    Proven, not promised

    • Three engine tests make a table from one cell and from a selection, read the part, the rels, tableParts and the paint, name empty and repeated header cells, number a second table, refuse a clash and undo one.
    • Two window checks press Home → Format as Table, read the header row and the banding painted, save, and read the table back from the file (RUTBA_VERIFY_ONLY=links).
    • One engine test anchors a box at the right and at the left, reads it as a float with the lines beside it shorter and none running into it, and prints it.

    Under the hood

    • paginate.js places a floatbox fragment (side, top, size, fill, line, laid paragraphs) and adds it to the page's floats; pdf.js draws it through drawTextBox at the float's place.

    The release on GitHub, with its installers

  2. 20 September 2026

    1.18.020 September 2026

    A footnote sits at the foot of its page on screen, and a sheet of pictures prints as it shows.

    TouchedRutba Word

    What changed

    • A paragraph of only pictures prints them side by side
    • A footnote sits at the foot of the page its reference lands on
    The full notes for 1.18.0

    Rutba Word

    • A paragraph of only pictures prints them side by side, as many to a row as fit the column, each row whole and placed by the paragraph's alignment — as the screen has drawn them since 1.17.1 and as Word does. A sheet of four scanned cards prints two by two on one page rather than one under another across two. Under words a picture is still a row of its own.
    • A footnote sits at the foot of the page its reference lands on, on screen as it has in print: under the body, above the bottom margin, under a short rule. The footnotes were one block at the end of the document, however many pages it ran to. The layout pass now reserves room at a page's foot for the notes referenced on it, so the body stops above them; a paragraph split across pages keeps each note with the line that references it; and a note whose reference moves follows it. In web, draft, read and outline layout the notes stay under the body; endnotes still end the document.

    Proven, not promised

    • The window check that inserts a footnote reads it at the foot of the page, and a new one reads it on the reference's sheet, below the body's last line, on the bottom margin, with the hidden measuring copy hidden.
    • An engine test prints four cards in a paragraph of their own two to a row on one page, and the same cards under words one to a row.

    Under the hood

    • pages.js measures .wd-notes-measure .wd-note[data-note], keeps a reserved height per page, answers notes (note id → page) and counts a change in it as a layout change; PageNotes draws each page's notes in .wd-pagenotes, a flex column aligned to the foot of the body area; a footnote reference carries data-kind and data-id.

    The release on GitHub, with its installers

    1.17.120 September 2026

    A paragraph of pictures splits between its picture lines, and pictures in a paragraph of their own sit side by side.

    TouchedRutba WordWorksheets

    What changed

    • A paragraph of pictures no longer runs over the page's edge
    • Pictures in a paragraph of their own sit side by side
    • Print places the pictures a page at a time
    • A character typed briskly into a cell is never lost
    The full notes for 1.17.1

    Rutba Word

    • A paragraph of pictures no longer runs over the page's edge. A scanner writes its scans into one paragraph — four cards, two to a line — and a paragraph was split only at a line a character begins; a line of pictures has none, so the paragraph stayed whole and its second line was drawn across the gap between the sheets (owner, 2026-09-20, after 1.17.0: "it still is the same"). The pictures under a paragraph's words now continue its address space — the text's length, then a picture's index — so a split can land between two picture lines, the part on the next page drawing the pictures from that line on. The rule that never leaves one line alone on the next page gives way when the paragraph heads its page or is taller than one, where the alternative was running over the edge.
    • Pictures in a paragraph of their own sit side by side, as Word draws inline pictures: as many to a line as fit, placed by the paragraph's alignment. Under words a picture is still a block beneath them. The empty line that stood above a paragraph's pictures is gone.
    • Print places the pictures a page at a time: the ones that fit go down on the page and the rest head the next, each still whole.

    Worksheets

    • A character typed briskly into a cell is never lost. The first key starts the edit and the editor is drawn a frame before it takes focus; a character arriving in that frame went to the grid, which had no use for it. It is text now, like the ones that arrive while the edit is still beginning.

    Proven, not promised

    • One engine test prints a paragraph of four pictures two to a page, none scaled, none cut.
    • Two window checks open a paragraph of six scans of a card, read two to a line, the first two under the heading and the other four on the next page, none crossing a sheet's edge, and put the caret into the second part without an error (RUTBA_VERIFY_ONLY=cards). The real-input check that types "4321" into a cell at 60 ms a key is the one that caught the lost character.

    Under the hood

    • A part carries data-length and data-tail, each picture data-image; pages.js splits and pulls back through offsetAtLine; the caret in a part that holds only pictures goes to the end of the words.
    • paginate.js places images fragments in batches that fit the page.

    The release on GitHub, with its installers

    1.17.020 September 2026

    Frozen panes stay on screen, a picture never crosses a sheet's edge, and a note goes on a cell.

    TouchedRutba WordWorksheets

    What changed

    • Frozen panes stay on screen
    • A note goes on a cell
    • A picture never crosses a sheet's edge
    The full notes for 1.17.0

    Worksheets

    • Frozen panes stay on screen. The frame has carried the frozen rows and columns in every viewport since panes could be frozen; the window drew them at their own place, so a frozen heading row scrolled away with the rest. Now the frozen rows sit under the column headings, the frozen columns beside the row headings, the corner at both, their headings with them — layers that stick, the way the headings already do. A press on a pinned cell selects it; the cell editor opens in whichever layer holds the cell.
    • A note goes on a cell. Shift+F2, the Review tab's Note button or the cell's menu open a dialog for the words and the author (remembered for the next note; an unsigned one is signed with your account's name). On a noted cell the same dialog shows the note and offers Delete. A note is one undo step, and the file carries it as Excel keeps one: the comments part, the VML box Excel draws the words in, and the sheet pointing at both. A box Excel drew for another note is left as it was.

    Rutba Word

    • A picture never crosses a sheet's edge, on screen or in print. A picture taller than the page's inside — a scanned card, portrait, at the column's width — was placed whole at the head of a page and the sheet's edge cut it; it is drawn to fit the inside now, its proportions kept. And a picture whose bytes arrived after the pass that placed its paragraph grew where the pass had left it, over the edge when the paragraph sat near the foot; its arrival now lays the pages out again.

    Proven, not promised

    • Three engine tests hold a note's parts, relationships, content types and box, a replaced note, a removed one and the undo; one holds the print paginator to a picture that fits the page.
    • Three window checks freeze at B2, scroll away and read the pinned row, column, corner and headings where they should be and nothing over them (RUTBA_VERIFY_ONLY=freeze); three put a note on through the dialog, save through the ribbon, read the file back and take the note off (links); two open a letter with a picture at a page's foot and one taller than a page and read each inside one sheet (fit).

    Under the hood

    • SheetPart.setLegacyDrawing, Workbook.comments/setComment/removeComment, parseComments/commentsXml; SheetView.setNote/removeNote, the frame's note; ops setNote/removeNote.
    • The grid's headings name both coordinates: an absolutely positioned heading with no top of its own took its static place, which the pinned wrapper in flow had moved down.

    The release on GitHub, with its installers

    1.16.020 September 2026

    A large workbook scrolls at once, the launcher's recent list scrolls, and an update says so — before, during and after.

    TouchedWorksheetsLauncherUpdates

    What changed

    • A frame on a sixty-thousand-row sheet is 30 ms
    • The rows above stay where they are
    • A hidden row the file also gave a height
    • The recent list scrolls
    • A right-click on a recent file
    • After

    and 2 more in the notes

    The full notes for 1.16.0

    Worksheets: a large workbook scrolls

    • A frame on a sixty-thousand-row sheet is 30 ms, from a third of a second, and 50 ms where the file gave every row a height, from three seconds; the first frame after opening is 55 ms, from four. Three things paid for it. The frame grew Excel's "current region" round the cursor on every scroll step — a walk of every row of the table — and nothing in the window read it; it is asked for when wanted. Every row offset walked every custom height in the file for every cell of every frame; the exceptions are indexed once and an offset is one binary search. And the window asked for a frame on every animation frame of a scroll, a dozen queued behind the first; one is on its way at a time, and a scroll that arrives meanwhile asks once more when it lands.
    • The rows above stay where they are. Ten rows are drawn beyond the edge in both directions — a wheel notch is five — so scrolling up shows rows before the next frame lands, and the frame lands before the next notch.
    • A hidden row the file also gave a height took that height in the offsets while drawing at none, so every row below it sat too low. It takes nothing now.

    The launcher

    • The recent list scrolls. It was clipped to the room left under the tiles: a flex item that hides its overflow shrinks below its content, so the last row in reach was cut in half and there was nothing to scroll. It takes what is left of the window and scrolls inside it.
    • A right-click on a recent file offers Open, Show in folder, Remove from the list and Clear the list. Enter in the search opens the first match.

    An update says so

    The suite has found and installed its updates on its own since 1.13 and said so in a card; the owner's copy still updated in silence, because the install happens on quit and the next launch looked exactly like the last one.

    • After: the first window of a new version says which version it is now and which it was, and What's new opens the release's own notes — bundled with the build, so a copy with the network switched off reads the notes the release page carries. OK puts the card away in every window; the notes stay under the app menu.
    • During: every window's status bar counts the download ("Updating 42%") and says "Update ready" once it is downloaded; the chip brings back a card put away with Not now. On Windows the taskbar button shows the download's progress.
    • Before: unchanged. One request to GitHub's release feed every six hours, nothing about you or your files, and off means no request at all.

    Proven, not promised

    • Four engine tests hold the geometry index (sixty thousand heights, a hidden row with a height, the index dropped on a change) and the frame's speed on a twenty-thousand-row table; two read the notes into blocks.
    • The update block of the application checks drives the states by hand in a Rutba Word window and reads the status chip counting, the chip bringing a put-away prompt back, the arrival card naming both versions, What's new showing the bundled notes, and Close marking the arrival seen through the service (RUTBA_VERIFY_ONLY=update).

    Under the hood

    • SheetGeometry keeps its row and column exceptions in tracked collections and builds a sorted index with running corrections on first use after a change; viewport() takes overscanCols beside overscan.
    • SheetView.regionAround() replaces the frame's region.
    • The update service records updates.lastRun and updates.arrived, and the contract gains update.seen and app.removeRecent; the bundle writes whatsnew.json from docs/releases/v<version>.md.

    The release on GitHub, with its installers

    1.15.020 September 2026

    A floating picture prints where it sits, a worksheet's links and notes come alive, and Help opens a page that exists.

    TouchedRutba WordWorksheetsMail

    What changed

    • A link is read with its target
    • Ctrl+K, the Link button on Insert, or the cell's menu
    • A cell with a note wears Excel's red corner
    • Get mail is F5
    • Help opens a page that exists
    The full notes for 1.15.0

    Rutba Word: print and PDF wrap round a floating picture

    A picture anchored at the left or the right has floated there on screen since 1.11, the words wrapping round it. Print and PDF drew it as a block under its paragraph. Now the paginator keeps the floats on each page with the band they take and the side they take it on, lays the lines beside a picture shorter — for as far down as it reaches, and into the paragraphs after it — and places the picture at the paragraph's top on its side; the PDF writer draws it there. A picture that will not fit goes whole onto the next page with its paragraph. A centred or right-aligned picture drawn as a block keeps its side. A floating text box still rides under its paragraph.

    The gaps document had said the print paginator ignored a table's grid; it has read the grid since the grid was parsed, and the document now says so.

    Worksheets: hyperlinks and notes

    • A link is read with its target — an address, or a place in the workbook — drawn in the accent and underlined, with a tip that says where it goes. Ctrl+click follows it: an address opens outside the suite, a place (C12, Sheet2!B4, a name) is gone to, the other sheet first if it names one.
    • Ctrl+K, the Link button on Insert, or the cell's menu puts a link on a cell: an address (a bare domain or an email is read as one) or a place, and a screen tip. On a linked cell the same dialog offers to change or remove it. A link is one undo step, and the file carries it as Excel writes one — an external relationship for an address.
    • A cell with a note wears Excel's red corner and tells the note on hover, author first; the status bar counts the sheet's notes and says where the active cell's link goes. A workbook that carried notes used to show "[object Object]" as their tooltip. Writing a note is still to come.

    Mail

    • Get mail is F5, the key every mail client fetches on. Ctrl+R was bound to both Get mail and Reply, and one key cannot do both.

    office.rutba.io

    • Help opens a page that exists. Every Help tab in the suite has opened office.rutba.io/help since the tabs existed; the site had no such page. It now says how the suite works and what to press: opening, saving and recovery; the keys every app shares and the ones each app binds; each app with its formats; how a release arrives; where to say when something is wrong.

    Proven, not promised

    • Three engine tests hold the hyperlinks block and its relationship through a save, a replace, a removal and an undo; one holds the floating picture's lines beside it and the picture in the PDF.
    • Six application checks open a workbook made for the run with a note and a link, read the corner, the tip and the underline, follow the link to the other sheet, put a link on a cell through the dialog, save and read the file back through the engine, and take the link off. The address link is never clicked under the checks (RUTBA_VERIFY_ONLY=links).
    • The viewer check's clips are now forty VP8 frames encoded with WebCodecs in one of the suite's own windows and muxed into a minimal WebM in the main process, the same on every machine; MediaRecorder captured nothing whenever another window was open, which failed the full run and passed alone. The Presentation fill check waits for the redraw it reads.

    Under the hood

    • wrapFirstLine in @rutba/drawing breaks one line at a time so a paragraph's lines can differ in width; the paginator's layoutAround uses it, and each line carries its offset and width to the PDF writer.
    • SheetPart.hyperlinks/setHyperlink/removeHyperlink and Workbook.hyperlinks/setHyperlink/removeHyperlink; OoxmlPackage.addRelationshipTo takes { external: true }.
    • The thumbnail queue no longer drops a job whose request was abandoned: a second request for the same file shared the job and inherited the abandonment.

    The release on GitHub, with its installers

    1.14.020 September 2026

    Rutba Pictures on a large folder: instant, steady, and drawn only where you look.

    TouchedPictures

    What changed

    • A tile is a thumbnail now, never the file
    • A clip's tile is a frame of it, not a live player
    • Only what you can see is drawn
    • Moving on never shows an empty frame
    • Chips count the folder by kind
    The full notes for 1.14.0

    Pictures: a folder of thousands, at the speed of a folder of fifty

    The viewer crawled on a big folder with clips among the pictures, and stuttered as tiles came and went. Four causes, all gone:

    • A tile is a thumbnail now, never the file. The platform makes a small JPEG of each file once — the Windows shell, which knows videos, HEIC and whatever else the machine has a codec for — and Rutba Office keeps it on disk, keyed by the file's path, size and modification time. The second visit to a folder costs a directory read. A folder of five hundred photographs no longer decodes five hundred photographs to draw five hundred squares.
    • A clip's tile is a frame of it, not a live player. Every video tile was a <video> element holding a decoder, and Chromium suspended and resumed them as the grid scrolled — the stutter. The platform's frame is used when it has one; when it has none (a WebM on Windows without the codec pack, anything on Linux) the window draws a frame of the clip itself, one clip at a time, and hands it to the platform to keep.
    • Only what you can see is drawn. The grid and the filmstrip draw the rows in view and a little either side; the rest is held as empty room, so the scrollbar is the scrollbar of the whole folder and a folder of five thousand costs what a folder of fifty costs. Newest requests are answered first, so the tiles in front of you arrive before the ones you scrolled past.
    • Moving on never shows an empty frame. The picture on the stage stays until the next one has decoded, and the next two either way are decoded before you ask for them. The details panel stays where it is while the next file is read, so nothing on screen jumps.

    The folder has the whole window

    • With nothing open, the folder fills the window: pictures, clips, sounds, PDFs and the folders inside it, each folder a tile you click to enter, and Up (or Backspace) to come back. One click opens a file; Escape, or the folder button, goes back to the grid.
    • Chips count the folder by kind — All, Pictures, Videos, Audio, PDF — and pressing one shows only that kind. The order can be by name, newest or oldest first, largest first, or by kind. Tiles come in three sizes. All of it is remembered on this machine.
    • A picture opens on a dark stage whatever the theme, with a filmstrip under it and, if you want it, the folder's grid beside it. A zoomed picture is dragged about with the mouse.
    • A phone's sideways photograph is turned the right way up once, by the decoder, rather than by the decoder and then again by the viewer — a quarter of everyone's holiday was upside down.
    • Trash moves on to the next file rather than back to the grid, so a folder can be weeded in one pass.

    Proven, not promised

    • Fourteen application checks open a generated folder of three hundred pictures, two clips, a sound file, a PDF and a folder inside it, and read back what the window did: how many tiles were drawn of how many, that every tile is the platform's thumbnail and none a live video, that the frames arrive small, that a clip the platform has no thumbnail for gets one drawn by the window and kept, the chips, the order, the sizes, the folder inside, the sideways photograph turned once, sixteen samples across a Next with a decoded picture in every one, and a filmstrip drawn only where it can be seen. RUTBA_VERIFY_ONLY=viewer runs them alone.
    • Eight engine tests hold the viewer's arithmetic — the order, the counts, which rows are in view, which neighbours to fetch — and the thumbnail cache's key, its newest-first queue, and a frame handed in.

    Under the hood

    • rutba://thumb/<path>?s=256 is a fourth host on the scheme, answered by packages/office-shell/src/electron/thumbs.js; a window hands a frame in through thumbs.put, new in the contract.
    • The file host now says Access-Control-Allow-Origin: *, so a window may read back a canvas it drew from a file — the window can already read any file through the bridge, so nothing new is allowed.
    • The viewer's arithmetic lives in renderer/apps/pictures/library.js with no window in it; the frame grab in pictures/frames.js.
    • Pictures opened with a folder's path shows the folder.

    The release on GitHub, with its installers

  3. 14 September 2026

    1.13.014 September 2026

    You are told when a release is waiting, in the window you are working in.

    TouchedUpdates

    What changed

    • A release the check finds is announced at once
    • Not now
    The full notes for 1.13.0

    Updates: found, announced, one click away

    An installed copy has looked for a newer release since 1.7 — shortly after it starts and every six hours, one request to GitHub's release feed carrying nothing about you — and downloaded it in the background to install when you quit. What it did not do was say so anywhere you would see: a small chip in the launcher, and nothing in the window you actually work in. A copy that updates in silence is a copy whose owner never learns what changed.

    • A release the check finds is announced at once, in every window: a card at the bottom right saying which version is available and how far the download has got. When it is downloaded the card says the release is ready to install and offers Restart and update, which quits, installs and comes back — the only way an update is ever applied while you are working, and only when you ask. If you carry on, it still installs when you quit.
    • Not now puts that version away — in the window at once, and everywhere for a day, after which it asks again, because a copy that is never quit never installs on quit. A newer release is a new question, whatever was put away before; and asking for a check yourself (About → Check now) always gets an answer.
    • The launcher's chip and the About panel say the same thing in the same words, so nothing on the screen contradicts anything else.

    Proven, not promised

    • Five application checks drive the prompt in a Rutba Word window with the states the service publishes: found and downloading with the percentage, ready with its button, put away and staying away, a newer release asked about anyway, and the prompt measured on screen rather than only found in the tree. RUTBA_VERIFY_ONLY=update runs them alone.
    • tools/update-test.ps1 — the fourth check before a release is called done — installs the previous release, launches it, waits for its own updater to find and download this one, reads the prompt through UI Automation and reads the version the installer leaves behind. 1.11.0 updated itself to 1.12.0 this way on the day 1.12.0 was published; 1.12.0 is proved against this release the same way.

    Under the hood

    • The update service publishes snoozed and snoozedVersion with its state and gained snooze({ version }); a manual check clears a snooze. The snooze itself (apps/desktop/main/update-snooze.js) is one version for one day, and is unit-tested.
    • The shared frame (renderer/shell.js) carries the prompt, so every app has it without knowing; the check harness receives the shell's broadcast and the update service so it can publish states without a network.

    The release on GitHub, with its installers

    1.12.014 September 2026

    The ruler, and a table's borders, in Rutba Word — moved by hand.

    TouchedRutba Word

    What changed

    • The paragraph at the caret
    • Tab stops
    • The margins
    • Table columns
    • Grips on the borders
    The full notes for 1.12.0

    Rutba Word: a ruler that moves things

    The ruler above the page was a picture of the margins. It is now the one in Word: centimetres counted from the left margin, the margins shaded, and on it every marker a hand reaches for.

    • The paragraph at the caret shows its first-line indent (the top marker), its hanging indent (the bottom one), the left-indent box under it that moves both together, and the right indent. Drag any of them and a dashed guide runs down the page with a readout in centimetres; let go and the paragraph — or every paragraph in the selection — is written that way. The first line dragged left of the rest becomes a hanging indent, as it does in Word, and a left indent dragged to the margin is written as an explicit zero, so it beats a style that indents.
    • Tab stops. The paragraph's own stops, or its style's, sit on the ruler as the small left, centre, right and decimal marks. Click the ruler to add one of the type the box at the far left shows (click the box to change it); drag a stop to move it; drag it off the ruler to remove it. The last one removed cancels the style's stops too, so they do not come back.
    • The margins. Drag the edge of either shaded margin and the section's page margin follows — the same setting the Layout tab's Margins menu writes, to the pixel of where it was dropped.
    • Table columns. With the caret in a table the ruler shows its column edges as grey boxes; drag one and the two columns either side of it change, the table keeping its width — Word's own rule for an inside border — and the last edge widens the last column and the table with it. The file keeps the grid and every cell's width together, so Word, Excel and this suite measure the table the same.

    The ruler is on by default; the View tab's Ruler button puts it away.

    Rutba Word: tables drawn as the file draws them, and resized on the page

    • A table's columns were drawn as the browser saw fit, every table stretched to the text width. Each column now takes the share of the table the file's grid gives it, and the table the width the file gives it: a share of the text width, a fixed width, or the grid's own sum. A merged cell spans the columns it merges; a row the file sizes is drawn that tall.
    • Grips on the borders. With the caret in a table, rest on any column edge or row bottom and the pointer says it can be dragged. A column edge moves the two columns beside it as the ruler does; a row's bottom edge sets the row's height, written as a floor the way Word writes it, so a cell that needs more still gets it.

    Under the hood

    • The document reader hands the page each top-level table's grid, width, cell spans and row heights, carried by the paragraphs in it; the writer gained setTableColumnWidths (several columns at once, and a fixed table width brought up to date with the grid) and setTableRowHeight.
    • Paragraph formatting takes four absolute indents (leftTwips, firstLineTwips, hangingTwips, rightTwips) and the paragraph's tabs, each written into its schema slot; a paragraph that only clears stops reads back an empty list rather than its style's.
    • The fixture builder makes a table with columns of a given width.
    • Twelve application checks drive the ruler and the grips with real pointer events: the first-line marker dragged and the drawn text indent read back, a stop added by a click and removed by a drag off the ruler, a column border and a row border dragged on the page and the cell measured, the margin edge dragged and the page's padding read, and the file reopened with all of it. RUTBA_VERIFY_ONLY knows the block as ruler. Four engine tests cover the writers and the reader.

    The release on GitHub, with its installers

    1.11.014 September 2026

    Shapes you move by hand, pictures the words wrap round, tooltips of our own and a zoom slider.

    TouchedRutba WordWorksheetsPresentationPictures

    What changed

    • Every shape on the slide can be taken hold of
    • A Format pane
    • Quick Styles
    • Tooltips of our own
    • A zoom slider
    The full notes for 1.11.0

    Presentation: shapes move, resize and recolour by hand

    • Every shape on the slide can be taken hold of. A click selects it and shows eight handles; a drag moves it; a handle resizes it — a corner keeps a picture's proportions, and Shift keeps any shape's; the arrow keys nudge it a pixel (ten with Shift) and Delete removes it. The box follows the pointer as a dashed outline and the engine is told once, on release, so the drawing never lags the hand. Until now only shapes with words had a hit area, and nothing moved except through the Arrange menu.
    • A Format pane on the right — from Shape Fill, Shape Outline, the right-click menu or the View tab — sets the fill from the theme's ten colours, a standard row or any colour, or takes it away; and the outline's colour, weight and dashes, or takes that away. Each press is one write into the shape's own properties, in the order the file format wants, so PowerPoint reads it back exactly.
    • Quick Styles on the Home tab: filled in an accent, outlined in the same accent darkened — the theme's own looks, six of them.
    • The right-click menu on a shape now offers Format, Bring to front and Send to back beside Edit text and Delete.

    Rutba Word: a picture floats where the file puts it

    A picture or a text box in the file's anchor sat in a paragraph of its own whatever the file said. It now floats where the file puts it and the words wrap round it: square, tight and through wrap at the left or right become a float inside the paragraph, top-and-bottom and centred sit between the words, behind and in front sit under or over them. The page layout counts a float that hangs below its paragraph. Click a picture to pick it, then on the Layout tab Wrap Text (in line, square, top and bottom, behind, in front) and Position (left, centre, right) move it, and the file keeps the answer — the picture itself is untouched.

    Print and PDF still draw a floating picture as a block under its paragraph; the engine's paginator wraps to one width. That is next.

    Rutba Word: pictures resize by hand

    Click a picture and it wears four corner handles; drag one and the picture grows or shrinks, keeping its proportions, the words re-wrapping round it as it goes. The engine writes the size into the file on release; the picture stays picked, so the next drag or Wrap Text choice needs no second click.

    Worksheets: the fill handle

    The small square at the bottom-right corner of the selection, as in Excel: drag it down or across and a dashed box follows; on release the cells it passed over are filled from the selection — a value copied, a formula's references moved — and become the selection. Ctrl+D and Ctrl+R did this already; the handle is how most people reach for it.

    The frame

    • Tooltips of our own. Rest on any ribbon button and a small chip says what it does and its shortcut, in the suite's look, in both themes. The browser's grey box no longer appears.
    • A zoom slider at the right of the status bar in Rutba Word, Worksheets and Presentation: minus, slider, plus, and the level as a button that puts it back to 100% — or, for a deck, fits the slide to the window again.

    Under the hood

    • The deck engine gained setShapeStyle; the document reader reads a wp:anchor in full (anchorLayout) and the writer moves a picture between wp:inline and wp:anchor (setImageLayout).
    • Twenty-five application checks were added: the first line measured against a floating picture after each move; a shape dragged, resized and nudged with real pointer and keyboard events and its geometry read back; the Format pane's swatches, No outline and a 3 pt weight read back and seen in the drawing; a picture's corner handle dragged and its size read from the file; the fill handle dragged two rows; a tooltip shown and hidden; the slider zooming the window and the slide. The harness reads a button's tip as well as its title. RUTBA_VERIFY_ONLY knows the new blocks: float, polish, shapes, fill, pics.

    The release on GitHub, with its installers

  4. 10 September 2026

    1.10.010 September 2026

    Pages on screen in Rutba Word, layers and designs in Presentation, and a worksheet's columns you can drag.

    TouchedRutba WordWorksheetsPresentation

    What changed

    • The flow is laid onto sheets
    • Each sheet carries its own header and footer
    • The status bar says "Page 3 of 10"
    • Layers
    • Designs
    The full notes for 1.10.0

    Rutba Word lays its pages out

    A document was one endless sheet. A report of ten pages ran off the bottom of the first page and kept going over the desk, and a page break — the paragraph property, the Ctrl+Enter — did nothing anyone could see. That was the difference between a viewer and a word processor, and it is closed.

    • The flow is laid onto sheets. After every edit the drawn page is measured, and each block that would cross a page's bottom is moved to the top of the next page. A paragraph of many lines is split at the line that no longer fits and continues on the next page — with at least two lines on each side, which is Word's widow and orphan control. A table splits at a row. A heading goes over with the paragraph that follows it. An explicit page break heads a fresh page.
    • Each sheet carries its own header and footer, with its own page number: a PAGE field says which sheet it is on, and the count is the count. The first-page and even-page bands of a section go where the section says.
    • The status bar says "Page 3 of 10", following the caret.
    • The browser lays the lines out, so the browser is asked where they fell. That is the one answer that agrees with what is drawn; the engine's own paginator, which measures with a width table, still lays out print and PDF. A split paragraph is still one paragraph with one index; typing at the head of its second part lands where it should.

    This is the app the owner asked to be called by its full name: it is Rutba Word in the launcher, the title bar, the Apps menu and the messages, so nobody mistakes it for the other one.

    Presentation has a Layers pane and a Designs pane

    Two panes on the right, opened from the View tab (and from Arrange on the Home tab, and Layouts on the Design tab), closed with their own cross.

    • Layers lists the slide's shapes top-most first, the way a selection pane does. A click selects the shape on the stage; the arrows bring it forward or send it backward, Front and Back take it all the way; the eye hides it (it stays in the file, undrawn, as PowerPoint keeps hidden shapes); a double-click renames it, and the name is the one PowerPoint shows. The drawing order is the file's own: the shape's XML moves among its siblings and nothing else changes.
    • Designs shows the deck's own layouts as a gallery, each drawn as the boxes its placeholders make, with the current slide's layout marked. A click puts the slide on that layout — its placeholders then inherit that layout's geometry and text style wherever they state none of their own — and + New starts a slide on it, after the current one.

    Worksheets: drag a heading's edge

    Column resizing "did not work" because there was nothing to drag. The edge of a column heading is now a handle: drag it and a guide line follows the pointer, release and the column is that wide. Row headings likewise. A double-click on a column's edge fits it to its widest text; on a row's, puts the row back to the default height.

    Under the hood

    • The document engine's frame carries pageBreakBefore, keepNext and keepLines, read from the file; the builder can write all three.
    • The deck engine gained reorderShape, setShapeHidden, renameShape, layoutList, layoutOf and applyLayout, and insertSlide takes the layout it should use. A scene built on a slide's old layout is dropped when the layout changes.
    • The application checks grew by seventeen: six open a ten-page report and read the layout back (every block inside a page, the break heading a page, a paragraph split at a line and a table at a row, the page count, the caret in a split paragraph, a page break typed at the front adding a page); four drag headings with real pointer events; seven drive the two panes and read the deck back. RUTBA_VERIFY_ONLY=pages,grips,panes runs named blocks alone; RUTBA_VERIFY_CAPTURE=<dir> photographs them.

    Known limits

    • A block taller than a page's text area — one table row, one picture — runs into the gap between sheets rather than being cut.
    • Footnotes are drawn at the end of the document on screen; print and PDF put them at the foot of the page that refers to them.
    • The pages on screen and the pages in print can differ by a line here and there: two measurers, two answers. Print is the engine's.

    The release on GitHub, with its installers

    1.9.010 September 2026

    The look: a header in the app's colour, a ribbon that fits, and a frame that reads as one product.

    What changed

    • The header wears the app's colour
    • Tabs are pills
    • The ribbon is a card
    • The ribbon fits
    • Calendar and Contacts have their colour
    The full notes for 1.9.0

    The frame

    Every window is drawn by the suite, not the platform, and the frame has been redrawn so that the nine apps read as one product and are told apart at a glance.

    • The header wears the app's colour. A wash of the accent — blue for Word, green for Worksheets, red for Presentation — sits behind the title bar and fades out by the middle, the way it does in the windows people spend their day in, without the saturated band. The app mark is a small tile of the same colour with a sheen and a shadow; the document's name is centred and weighted; the window controls are rounded chips.
    • Tabs are pills. The active tab is a raised white pill in the app's colour; the rest are quiet text. No underline, no box.
    • The ribbon is a card. The groups float in a rounded card under the tabs, with a hairline and a shadow, and nothing else on the row.
    • The ribbon fits. Word's Home tab was 2,372 pixels of groups laid out in a single row, with a scrollbar under it that read as a fault. The small buttons now stack in two rows beside the tall ones — Cut and Copy over Format Painter, the font boxes over Bold, Italic and Underline, bullets over alignment — as Office lays them out, and the Home tabs of Word, Worksheets and Presentation fit a normal window. Where a tab is still wider than the window, a chevron on that side says so and the wheel scrolls it sideways; there is no bar.
    • Calendar and Contacts have their colour. The theme had never named one for either, so their launcher tiles were blank and their windows wore Word's blue. Every app's colour is now named in one place, and the launcher tiles, template chips and recent-file marks all take it from there rather than from a list of their own.

    The rest of the window

    • A worksheet's formula bar is a bar: the name box and the formula field are boxes on the chrome, and the field lights up when it has the focus.
    • A document's page sits on a desk — a close shadow for the edge, a wide one for the lift.
    • Dialogs have a foot that reads as a foot, with the secondary buttons bordered and the primary one raised; menus have roomier rows and an accent tint under the pointer; the selected row of a list carries a short accent mark; empty states have a softer tile.
    • The launcher opens on a wash of the accent behind the welcome; the app tiles lift a little under the pointer.
    • All of it in the dark theme too, with the wash, the card and the pills tuned for it. RUTBA_SMOKE_THEME=dark npm run smoke photographs every window in the dark theme, which is how it was checked.

    Verified

    • 165 application checks unchanged: the buttons the checks press are the same buttons in the same groups, in rows.
    • 10 window captures, light and dark, read by eye before the release.

    The release on GitHub, with its installers

    1.8.110 September 2026

    Files Office itself wrote, opened and judged; charts on slides; an .ods that keeps its names, merges and formats; the installer proven before it is published.

    TouchedWorksheetsPresentationMail

    What changed

    • SUBTOTAL
    • An .ods keeps what it says
    • Dates in the machine's order
    • Charts on slides are drawn
    • A password-protected file is refused as one
    The full notes for 1.8.1

    Judged against what Office writes

    The suite's fixtures were small and well formed. This release adds the other kind: a workbook, a document and a deck written by Excel, Word and PowerPoint themselves, through tools/make-rich-fixtures.ps1, as OOXML and as OpenDocument from the same content — charts, shapes, gradients, pictures, cross-sheet formulas, named ranges, every number format, conditional formats, sparklines, a table with a total row, a table of contents, three kinds of list, footnotes, endnotes, comments, fields, tracked changes, an equation, a landscape section, a watermark, WordArt, animations, speaker notes. tests/rich-fixtures.test.js opens each through the same service the windows use and holds the engine to Excel's own cached results. Eighty-one real files from two public sample sites went through the real windows as well: 84 of 87 shown, three refused in a sentence, none with a console error. What all that found is below.

    Worksheets

    • SUBTOTAL. Every table Excel writes ends in SUBTOTAL(109, …), and every such total row read #NAME? here. Function numbers 1–11 and 101–111 are all answered.
    • An .ods keeps what it says. A named range — $$GrandTotal in the file — reached the engine as #VALUE!; merged cells and number formats were dropped, so 7,518 showed as 7518 and 11.4% as 0.1138. Named ranges, merges, the number, percentage, currency, date and time styles, dates, times and booleans now all arrive.
    • Dates in the machine's order. Excel's built-in date format 14 is documented as mm-dd-yy and shows the system's short date; a British workbook's 10 September read as 09-10-26 here. It follows the machine now, as does format 22.
    • The Worksheets checks wait for a menu to open rather than pausing a fixed fifth of a second, which under load was not always enough.

    Presentation

    • Charts on slides are drawn. A chart frame was an unsupported graphic; a corpus deck with six chart slides showed six empty frames. The frame's chart part is read the way a worksheet's is and drawn by the same chart kit, on the slide and in its thumbnail.

    Opening files

    • A password-protected file is refused as one. An encrypted .docx opened as an empty page, and an encrypted .pptx was refused as "a document, not a presentation" — both are compound files holding the encrypted package, whatever their name. Each now says it is password-protected and what to do. A compound file that is none of Word, Excel or PowerPoint 97-2003 is refused too rather than shown empty.

    The installer, proven

    1.8.0's installer opened with "Cannot find package '@rutba/contacts'": the two new packages were not declared as the desktop application's dependencies, so the archive left them out, and every check passed because every check ran inside the repository, where Node finds them anyway. Both are declared, a test reads every import and requires a declaration, the install test lives in the repository and reads what an installed copy shows when it fails to open, and TESTING.md says the order — the packaged smoke from outside the repository, the install test, then the tag and the publish. The published 1.8.0 was rebuilt and proven before it went out.

    Mail

    • A file of accounts sets them up at once — from the Add account and Import mail dialogs, or --import-accounts=<file> on the command line with --accounts=a,b, --sync and --quit. Set up against five real mailboxes on three domains, every one signed in on both servers and fetched its inbox.

    Known, and named in docs/GAPS.md

    The fixtures also showed what is still not read: an .ods's charts and shapes and an .odp's pictures, shapes and tables (OpenDocument drawings), Office Math equations, and tracked changes shown as changes rather than in their accepted form.

    Verified

    • 696 engine tests, with the rich fixtures, SUBTOTAL, the OpenDocument names and formats, the machine's short date and the encrypted-file refusal pinned.
    • 165 application checks, 9 editing checks, 10 window captures; the gate in under three minutes, run alone.
    • The packaged smoke from a copy outside the repository, and the install test, before publishing.

    The release on GitHub, with its installers

    1.8.010 September 2026

    Calendar and Contacts, two more apps on the shell; a meeting in a message answered from the message; twenty accounts set up from one file.

    TouchedMailCalendarContacts

    What changed

    • Month, week, day and agenda
    • .ics in and out
    • @rutba/calendar
    • A book
    • @rutba/contacts
    • An invitation in a message is answered from it

    and 3 more in the notes

    The full notes for 1.8.0

    Calendar

    Mail was here and a calendar was not: a meeting arrived as an attachment nothing opened, and there was nowhere to keep it. There is a Calendar now, on the same shell as the rest, with its own tile, its own window and its own icon on .ics.

    • Month, week, day and agenda, a small month beside them for moving about, and the calendars in the sidebar with a colour each, shown or hidden. An event is a title, a start and an end or an all-day date, a place, a repeat and notes; an edit to a repeating event says whether it means this one or all of them.
    • .ics in and out. A file opened in the app shows its events and offers to keep them — nothing is added until it is asked — and a calendar is exported as one. An invitation (METHOD:REQUEST) is recognised as one, kept as an event, and answered with a reply in the file's own form.
    • @rutba/calendar, the engine behind it: iCalendar read and written — folding, escaping, durations, date-times with and without a zone; recurrence rules expanded into occurrences — daily, weekly, monthly and yearly with INTERVAL, COUNT and UNTIL, BYDAY with and without ordinals, BYMONTHDAY, BYMONTH and BYSETPOS, EXDATE removing instances, RDATE adding them and a RECURRENCE-ID replacing one — with a sentence that says what a rule means; and time zones, including the Windows names Outlook writes, resolved to offsets.

    Contacts

    • A book, kept in the profile: a list, a card, an editor, search. A .vcf or a CSV opened in the app shows its cards and offers them; Add keeps them, and an address already in the book is merged rather than doubled. Export writes vCards.
    • @rutba/contacts: vCard 2.1, 3.0 and 4.0 read and written — quoted-printable soft breaks joined only where the property says so, so a base64 photo no longer swallows the line after it — and the CSV shapes Outlook and Google export.

    Mail, with both

    • An invitation in a message is answered from it. A message carrying a calendar part shows the meeting in the reading pane — the title, when, who is asking — with Accept, Tentative and Decline. The answer keeps the event and opens a reply to the organizer with the answer attached, so the sender's calendar learns it the way it would from any other client. A reply that arrives shows what the attendee said; any other calendar part offers Add to calendar.
    • Addresses complete from the book. To, Cc and Bcc complete from Contacts first and then from the people mail has seen, with the keyboard.
    • A sender is kept in one click, from the reading pane.
    • Mail opens with a message to write when Contacts or the calendar asks it to: Send mail on a card, or the reply to an invitation with the file attached.

    Accounts from a file

    Adding an account has been an address and a password since 1.7.1. Adding twenty is a file now. A JSON file of accounts, the loose way other clients write one — address, password, host and ports, or imap and smtp objects — is read by the app: each entry is tried before it is kept, as the dialog does; an address already set up is left alone; the ports decide the security when nothing says. Add account and Import mail both offer the file. On the command line, --import-accounts=<file> sets them up before the first window, --accounts=a,b picks addresses from it, --sync fetches each new inbox and --quit leaves without opening a window — how an administrator's file becomes a working Mail without a dialog per address. The answer names addresses and outcomes and never a password, and the file is not changed.

    Set up this way against five real mailboxes on three domains, every one signed in on both servers and fetched its inbox.

    The shell

    • .ics opens in Calendar and .vcf in Contacts — from the launcher, from a double-click, from the command line — each with an icon of its own; the installer registers both.
    • Two more tiles on the launcher, two more windows the smoke photographs, two more taskbar identities.
    • A check run's mail seed used to be imported into the developer's own profile by an early runner; fifteen copies were found there this release and taken out. Every run has had a profile of its own since 1.7.0.

    Verified

    • 688 engine tests, with iCalendar, recurrence, time zones, vCard and CSV pinned.
    • 165 application checks, off the desktop, now including a .vcf opened as its cards and kept, a card typed in and shown, an invitation shown and accepted with the reply addressed and attached, Compose completing an address, a sender kept, and a file of accounts set up once and not twice.
    • 10 window captures, Calendar and Contacts among them. The whole gate in about two and a half minutes.

    The release on GitHub, with its installers

  5. 9 September 2026

    1.7.19 September 2026

    Adding a mail account is an address and a password; OpenDocument written back; a grid that keeps up with the keys, and more than one selection.

    TouchedWorksheetsMail

    What changed

    • Every open Worksheets window kept the main process busy, for as long as it lived
    • More than one selection
    • The selection keeps up with the keys
    • TEXT() speaks every format code the grid does
    • 29 February 1900
    The full notes for 1.7.1

    Mail: an address and a password

    Adding an account asked for the incoming server, the outgoing server and two ports, and guessed them from the domain when it could. Now it asks for the address and the password, and finds the rest the way every mail program people find easy does — in every way there is, at once, in a few seconds:

    • a table of the providers most people use;
    • the domain's MX records, which name Google, Microsoft 365, Yahoo, Zoho, Fastmail or iCloud when a company's mail is hosted there;
    • the SRV records a domain publishes for its own servers (RFC 6186);
    • autoconfig — the domain's own, its .well-known path, then Mozilla's public database;
    • Microsoft's autodiscover, which answers for any mailbox on Microsoft 365;
    • and a knock on the conventional names — imap., mail., smtp., the bare domain — on each port that matters, to hear whether something answers and says IMAP or SMTP. A name that answers outranks a name that is guessed, whatever its source; nothing is sent to any of them but the one line that asks for an upgrade, so no server sees a password from here.

    The dialog shows what it found and whether it answered, opens "What was checked" to the step-by-step account, and offers the browser sign-in when the provider wants one — the moment a Gmail or Outlook.com address is typed, before the search has run — including a company domain hosted at Google or Microsoft 365, which no address pattern can know. Advanced is always one click away, never the only way in, and its fields carry the answer: the username when it is not the address, the two servers, the ports, and the security of each as TLS, STARTTLS or none, so a wrong guess is a correction rather than a form from scratch. Add account signs in before it keeps anything; an account that cannot sign in is not added, and the failure opens the fields it needs. An account imported from another program on the computer goes through the same checks, so what was carried over is confirmed rather than trusted. A check run asks only the table, never the network; the search is pinned with every lookup injected.

    A plain port is upgraded with STARTTLS before a password is sent, on the test and on every message sent, or not used.

    OpenDocument, written

    The installer had told Windows for a year that this suite was the editor of .odt, .ods and .odp, and Ctrl+S on any of them refused. They are written now. A file that came in as OpenDocument goes out as OpenDocument, holding what this suite models: a document's headings, paragraphs, lists, tables and run formatting; a workbook's values, formulas and the value types a cell needs to stay a date, a percentage or a boolean; a deck's text boxes, pictures and speaker notes, in place. Formulas cross into the file's own spelling and back — =SUM(Sheet2!A1:B2, 3) is of:=SUM([$Sheet2.A1:.B2]; 3) on disk — and a formula read from somebody else's .ods now reaches the engine in the engine's dialect rather than the file's. The archive starts with a stored mimetype, as readers check. Save as offers all three.

    Worksheets

    • Every open Worksheets window kept the main process busy, for as long as it lived. The grid stretched to its own canvas, the canvas was sized to cover the grid plus a margin, and the size observer asked for a wider frame each time — eight times a second, 1,088 pixels wider every time, with an idle window and nobody touching it. Each frame drew more columns than the last. With several sheets open the main process was never idle again, every window's replies queued behind it, and the whole suite felt slow; a profile of the main process over a full check run showed ninety-nine percent of its time drawing Worksheets frames. Two words of CSS — a zero minimum width on the flex items — end it: an idle window now makes no request at all. A check opens a workbook, waits, and requires the grid to stay inside the window and stop growing.
    • More than one selection. Ctrl+click adds a cell, a range, a column or a row to what is selected; Shift grows the current rectangle and keeps the others; a plain click or arrow drops them, as a spreadsheet does. The name box reads A1:B2,D4:D5, the status strip counts across all of them, formatting and clearing apply to all of them, and typing goes where the last click was. Ctrl+A selects everything.
    • The selection keeps up with the keys. An arrow key used to be its own round trip and its own full frame — a hundred milliseconds and a quarter of a megabyte on an eighteen-million-cell workbook — and a held key queued one per repeat, so the grid fell behind the key and caught up seconds after it was released. Two changes: a move that scrolls nothing is answered with the selection and the active cell's fields, not the frame (3 ms and a kilobyte on the same workbook); and moves that arrive while a frame is on its way are sent together when it lands, one frame per reply however fast the keys.

    The formula language

    • TEXT() speaks every format code the grid does. It handled thousands separators and fixed decimals and gave anything else back as a plain number, so TEXT(A1,"dd/mm/yyyy") — one of the most common formulas in a real workbook — showed a serial. The grid's formatter moved in beside the engine, where TEXT can reach it: dates, times, percentages, fractions, currency, exponents, colour and sign sections. Two of those the grid itself had never drawn: a cell formatted as a fraction showed digits round a slash, and one in scientific notation showed the number twice round a literal E. Both draw as Excel draws them now, padding spaces and engineering exponents included.
    • 29 February 1900. Excel's calendar has a day that never happened — serial 60 — and every file Excel wrote counts it. DATE(1900,2,29) answered 61 here and DAY(60) answered 1; they answer 60 and 29 now, and WEEKDAY uses Excel's arithmetic rather than the almanac, so a workbook's weekdays agree with Excel's for every serial, not only from March 1900 on.

    Verified

    • 673 engine tests, with the OpenDocument round trips, the multi-range selection, the selection-only reply, the mail-server search, the phantom day and every format code pinned.
    • 151 application checks, off the desktop, now including Ctrl+click adding a selection with Bold painting both, the account dialog finding a provider and carrying it into Advanced, a Save as .odt that reopens as OpenDocument, and an idle Worksheets window that settles.
    • The whole gate in two minutes; the same gate took thirty-one minutes before the frame loop was found, and the main process is now idle ninety-four percent of the time through the checks.

    The release on GitHub, with its installers

    1.7.09 September 2026

    Beta, said plainly; every real file opened for real; and the opening problems that found.

    What changed

    • Every document ever opened stayed in memory
    • A truncated deck showed a blank window for as long as you waited
    • A tender with 274 tabs took seven seconds to answer
    • A fifteen-megabyte deck took five seconds to show its first slide
    • A refusal said "not a zip archive: no end-of-central-directory record"
    • An Office owner file was called a stopped download

    and 22 more in the notes

    The full notes for 1.7.0

    The owner used the suite on their own files and found problems opening documents and problems of usability that none of the checks had caught. This release is the answer to that: the suite is marked beta, a new check opens every file in a folder in the real application, and what that check found in the first two hundred files is fixed here.

    Beta

    Every release is now published as a pre-release, the window title says "(beta)", the launcher says so beside the version, and the README says so above the downloads. An installed copy follows the beta releases. Nothing about the software changed by being called beta; what changed is that the name now matches the state.

    The corpus check

    npm run verify:corpus opens every file in the folders it is pointed at in the real application, one window at a time — the same main process, the same service, the same bundle — and records for each: shown (and how long it took), refused with the application's own reason, hung, crashed, or skipped. Console errors are kept with the file even when it opened. The report names the failures, the files that opened but complained, the slowest twenty, and the numbers per format. It runs in a profile of its own, so a thousand files do not become a thousand recent entries. TESTING.md says where it sits among the other checks and what each can and cannot see.

    The first run, over 1,532 files of public tenders, found the following.

    What it found, and what was done

    • Every document ever opened stayed in memory. Nothing closed a document session when its window closed, so a session of many files grew without end; a hundred and forty files in, the main process stalled for two minutes on a small JPEG. A session now belongs to the window that opened it and goes when the window does.
    • A truncated deck showed a blank window for as long as you waited. The Presentation window's error return sat above one of its hooks, so a file the engine refused made React throw instead of drawing the message. The return is below the last hook now, and a check opens a file of junk in each document app and expects the sentence.
    • A tender with 274 tabs took seven seconds to answer. Each tab stop was measured on its own, and each measurement forced the browser to lay the thousand-paragraph page out again. The measurements are batched: one reset, one layout, one write per commit. 1.8 seconds, and typing no longer re-measures the page.
    • A fifteen-megabyte deck took five seconds to show its first slide. The outline parsed every slide with its layout and master to find the titles, then every thumbnail was drawn, all before the window could paint. The outline now reads titles off the XML; the open model draws the five thumbnails nearest the slide shown and the window asks for the rest after its first paint; and a thumbnail leaves out a vector map with a hundred thousand points. One second.
    • A refusal said "not a zip archive: no end-of-central-directory record". It now says the file is not a complete .pptx and may be a download that stopped early, with the engine's message in brackets for a bug report.
    • An Office owner file was called a stopped download. Word, Excel and PowerPoint keep a 162-byte file beside every open document, named after it with ~$ in front, and leave it behind after a crash; a Downloads folder began with four. Opening one now says what it is and names the document to open instead.
    • Closing a deck's editor left its presenter window up, failing every call it made. The presenter shows the deck its editor holds open; with the editor gone, so is the deck. The show now ends with its editor.
    • The photo viewer read a whole picture to learn its size. It reads the first quarter megabyte, where the size and the EXIF live.

    Across the first two hundred files of the second run the median time to first paint fell from three seconds to one, and the slowest file from 7.6 seconds to 2.5. The full run — 1,532 files — then showed 1,390 of 1,394 opening, the four that did not being one zero-byte document, one text file sniffed as an email (fixed below), and two copies of the workbook below.

    The big files, which the owner asked for by name

    • A 46 MB workbook of eighteen million plain values took 135 seconds and 2.7 GB, and then gave up. Two causes. The calculation model copied every cell into itself for a sheet with not one formula; a formula-free sheet past twenty thousand rows now stays in its part and is read through on demand (an edit overlays it, a cleared cell stays cleared, a formula on another sheet still sums it). And the sheet view kept a map of every cell's style — which a JavaScript map cannot hold past 16.7 million entries; past a size the styles are read as cells are asked for. The workbook opens in eight seconds.
    • A specification of 3,200 paragraphs and 2,400 table cells took eight seconds to paint though the engine had it in half a second: the window mounted every block before the first paint. The first screens mount at once and the rest follows in idle slices while the person reads.
    • The 31.8 MB manual, the 20 MB decks and the 6.5 MB Barbican workbook open in one to six seconds; the many-page documents in the corpus (up to 3,211 blocks) in under two.
    • A second corpus, the owner's own Downloads folder of 1,008 files — 278 PDFs, 605 photographs, 52 workbooks, 32 CSVs, decks, documents, videos and sound — showed every file but the four owner files above, with no console error: a median of 0.9 seconds, nine in ten inside 1.5, and the slowest, a workbook, in 4.2.

    Usability, from the owner's own report

    • In Worksheets, after Enter in the formula bar the arrow keys moved the caret in the bar and the selection did not move. Enter, Tab and Escape now finish with the bar and hand the keys back to the grid, as Excel does.
    • In Word, typing faster than the engine answered put the letters out of order. Every keystroke is cancelled in the browser and sent to the engine with the caret read from the page. Until the engine's answer was painted, that caret was stale — the browser never made the insertion — so the next letter landed before the last: "Typed." came back "ye.dpT" at sixty milliseconds a letter on a loaded machine, and in a long document a slower pace does it. That is what "the editor did not respond properly" looks like from the keyboard. A caret exactly where the editor last sent or placed it is not resent now; the engine's own caret, already past whatever is in flight, is used. tests/word-caret.test.js pins the rule and the reversal it prevents.
    • The application checks now drive the windows with real mouse and keyboard input — a click aimed by the column and row headers, a drag across text, a click on a ribbon button — and read the engine to see where it landed, instead of clicking elements from inside the page. That is how the formula-bar fault was found, and it is what will find the next one.
    • A text file that begins like an email opens as a text file.
    • A refusal from the engine itself is now the plain sentence too.

    Every kind of file wears its own icon

    After "make Rutba Office the default", every document, workbook and deck wore the suite's one mark, and a folder of mixed files read as one kind of file. Each family now has its own icon — the app's colour and the app's own glyph on a page, the arrangement people know from Office — so a document looks like a document and a workbook like a grid before the name is read. Word, Worksheets, Presentation, Pictures, Video and Mail each have one, and PDF has its own.

    The windows follow. On Windows every app window now carries its app's tile and its own taskbar identity, so a Word window and a Worksheets window sit under different icons, each app can be pinned to the taskbar on its own, and a pinned entry opens that app. Before, every window wore the suite's one mark and they all grouped together. The launcher keeps the suite's mark.

    The application checks, broadened

    • A broken file in each document app: the sentence, the reason, no spinner, no exception.
    • Journeys: Escape closes the Go To dialog and moves nothing; Escape closes the Speaker Notes dialog and keeps the notes; Ctrl+F1 folds the ribbon and folds it back; each window at its minimum size shows its content without a sideways scroll and keeps its status bar; the launcher lists the files the run opened.
    • Real input, in Worksheets: a click selects the cell it lands on, the arrows move the selection, typing fills the cell, Enter moves down, Bold from the ribbon paints the cell, and Enter in the formula bar hands the keys back to the grid. In Word: a click into the page and typing, Ctrl+B on a selection, a real drag across a paragraph and a real click on Italic, each read back from the engine.
    • The run's windows sit off the desktop: to the right of every display, out of the taskbar, never activated. Two runs had been ended by hand, and a run must never take the keyboard from whoever is working. A window closed by anything but the run is reported as such, with the time.
    • A ribbon button is waited for rather than expected after a fixed pause, and the mail strip likewise; both had missed on a loaded machine.
    • The Bold check clicks a shape that has text; the border check accepts any border on a scaled display; the mail block waits for its rows.

    Built alongside: printing, page setup, rich text, recovery

    The gap list (GAPS.md) was written from the code the same day, and its first entries were built before this release closed.

    • Printing. Nothing here could print: Word's button called a command that was never defined, Worksheets' asked for a PDF and was refused. Now every window has Ctrl+P and a dialog that says how many pages before it prints anything — and how much it had to shrink them — with the printers this machine can reach, copies, paper, orientation and margins. Where the pages are cut is worked out beside the engines and tested there; the page itself is Chromium's. Worksheets adds the sheet or the workbook, fit-to-width or fit-to-page, the print area, repeated rows, gridlines and headings; Presentation adds full-page slides, notes pages, or a handout of one to nine. Export as PDF goes through the same door for all three, so a workbook and a deck can be exported at all, and what is printed and what is exported cannot drift apart.
    • Page setup lives in the workbook. Paper, orientation, margins, scaling, the print area, the repeated rows, gridlines, headings and centring are read from and written to the file where Excel keeps them, so they reach whoever opens it next. Writing them right needed the sheet's tail written in the order the schema gives, and print areas matched by sheet as well as by name.
    • Rich text, written. The installer had claimed the suite edits .rtf while Ctrl+S refused. Words, font, size, weight, slant, underline, strike, colour, alignment, list level and tables go out and come back.
    • Unsaved work outlives a crash. A changed document is copied into the profile — every half minute, or every few minutes for a workbook that takes seconds to serialise, since the interval follows what the last copy cost — and the launcher offers what a crash took back by name, with the time and where it belonged. Saving or closing removes the copy.
    • The formula language: array constants ({1,2;3,4}), LET, and a reference to an empty cell that is nothing rather than a zero — COUNT of a blank is 0 and AVERAGE of one is #DIV/0!, as in Excel.
    • Worksheets' Enter commits what was typed, not what the last render saw: a keystroke sixty milliseconds before Enter used to be lost.

    What reviewing this release found

    The work above was read back through, run, and then run against files made to be awkward. What that found is fixed here too.

    Two of them stopped the release outright. Window creation used Electron's app object without importing it, and the reference sat outside the try that guards it, so every window but the launcher threw: the first gate run over this work passed 3 of its 35 blocks. And the association list carries the owning app so the installer can give each type that app's icon — electron-builder validates every association against its own schema and refuses a property it does not know, so npm run dist could not start.

    The rest were older than this release:

    • Export as PDF threw, every time. The document PDF writer answers an object — the buffer and the page count — and the service handed the object itself to Buffer.from. The unit tests destructure the answer, so they never saw it, and no window check exports. Worksheets and Presentation have no PDF writer at all; their buttons said the export "is done from the window", and nothing in any window does it. They now say what they can write instead.
    • The HTML export wrote the document's own characters as markup. A paragraph reading "5 < 6 & 7 > 4" came back as "5 4", and a document containing a script tag produced a page that runs it. The reader was the other half: one replace of every tag with a space, so a page arrived as a single paragraph with its entities spelled out and its stylesheet in the text.
    • A range past the last used cell answered with the last row that holds something. Ranges are clipped to the used area so a whole-column reference does not walk a million rows; the clip pulled the end of a range back before its start, and the rule that normalises a backwards range then landed it on the boundary. On a sheet ending at row 5, =SUM(D7:D9) returned D5. Wrong numbers, quietly.
    • A reference to an empty cell counted as a zero. =COUNT(A1) on a blank answered 1, and =AVERAGE(A1) answered 0 where Excel answers #DIV/0!.
    • A UTF-16 text file was refused as an MP3. FF FE is the mark Notepad writes for "Unicode" and PowerShell writes whenever it redirects; it is also a valid MPEG frame sync. Every UTF-16 text file on Windows was unopenable.
    • A document under a workbook's name hung the window — thirty seconds of blank, then nothing. The window now says which kind it edits, and a file of another kind is refused by name in a third of a second.
    • A file the decoder refuses left the media window empty for ever, and a picture that would not decode showed a frame with nothing in it and a toast that fades. All three picture and media windows say what happened now.
    • The disk failing reached people as error codes. Saving over a file Word still had open said "EPERM: operation not permitted".
    • The first letter typed into the formula bar was dropped. Beginning an edit is a round trip, and until it returned the bar fell back to the cell's old contents — so "hello" arrived as "ello" whenever the machine was busy enough. The same race the grid had already been given a flag for.
    • A workbook with no sheets, and a relationship with no target, each threw from inside an engine rather than being refused: found by tools/fuzz-open.js, which damages good files at random and opens them until something answers with anything other than a sentence. Four and a half thousand damaged files now do.

    And the checks that missed them: the corpus run counted a picture that never decoded as shown; the editing run used the developer's own profile; the smoke run photographed the machine's real pictures folder; a check run that threw before its first window hung for ever instead of failing; and all three window harnesses read a console-message shape Electron has deprecated, so the day it is dropped they would go quietly blind.

    Verified

    • 654 engine tests.
    • 145 application checks, off the desktop, with real mouse and keyboard input.
    • The corpus: 1,532 public-tender files, then a 1,008-file Downloads folder of the owner's own; the numbers are above, the file names stay on the machine.

    The release on GitHub, with its installers

  6. 8 September 2026

    1.6.18 September 2026

    One copy of Rutba Office on a machine, whichever way it was installed.

    The full notes for 1.6.1

    The installer replaces, never sits beside

    The Windows installer now keeps one copy of the suite on a machine. Before it installs, it finds every registered copy — installed for this user or for all users, in whichever directory it went to — and runs that copy's own uninstaller silently, keeping documents and settings where they are. Then it installs. The same happens when an installed copy updates itself.

    Before this, the installer replaced the previous copy in the scope it was installing to and only that one: a per-user install could land beside an all-users install from an earlier day, and Windows listed two.

    Two smaller things came with it:

    • An entry whose uninstaller has gone — the folder deleted by hand — is removed from Apps & Features rather than left there, in either scope.
    • A copy that cannot be removed (the suite still running, a cancelled elevation) stops the install with a message, rather than installing beside it. The one promise is that it never ends with two.

    The portable build installs nothing and is not counted.

    Verified

    • On a machine with 1.4.0 installed for this user, the 1.6.1 installer run silently left one entry in Apps & Features, 1.6.1, in the same directory, and the installed copy opened all eight windows clean.
    • With the installed folder removed by hand and the entry left behind, the installer forgot the entry and installed afresh into the same directory.
    • Engine tests and application checks unchanged from 1.6.0 (609 and 119); the release gate was run again before this went out.

    The release on GitHub, with its installers

    1.6.08 September 2026

    Pictures and shapes on a slide, drawings on a sheet, and the suite keeps itself current.

    TouchedRutba WordWorksheetsPresentationPicturesUpdates

    What changed

    • Insert → Pictures
    • Sized from its own header
    • Shapes
    • Connectors
    • Braces and brackets
    • Letter spacing

    and 3 more in the notes

    The full notes for 1.6.0

    1.5.0 gave Presentation PowerPoint's ribbon and left two of its buttons honest and grey: Pictures, and Shapes. Both are live now. And a second company's files — a profile deck, a product document, a pricing sheet, a delivery diagram — were opened beside Microsoft's own rendering of each, and what differed was fixed, engine by engine.

    Automatic updates, on

    An installed copy now checks GitHub's release feed on its own: twenty-five seconds after launch and every six hours, one request carrying nothing about the person or the machine. A newer release downloads in the background and installs the next time the suite is quit; nothing is installed while anyone is working. About → Check for updates automatically turns it off, and off means no request at all. A suite that ships a release a day and never says so leaves every installed copy on the version it came with, defects and all; this is the fix for that.

    Pictures on a slide

    • Insert → Pictures puts a picture from this device onto the current slide: PNG, JPEG, GIF or BMP. The bytes go into the package as a media part, the slide gets a relationship to it, and the slide gets a p:pic whose blip names the relationship — the three things PowerPoint insists on — with the extension's content type declared once, as Office declares it, not as an override per picture.
    • Sized from its own header. The service reads the width and height out of the first bytes, as the photo viewer does for a folder of two thousand, and fits the picture to the slide keeping its aspect. A small picture keeps its own size; a tiny one gets a hand's width to resize from.
    • Selected as soon as it lands, in the thumbnail and the sorter at once.

    Shapes on a slide

    • Shapes, on Home and on Insert, is a menu of fifteen preset geometries in PowerPoint's own names — Rectangle, Rectangle: Rounded Corners, Oval, Isosceles Triangle, Right Triangle, Diamond, Parallelogram, Trapezoid, Pentagon, Hexagon, Octagon, Star: 5 Points, Arrow: Right, Chevron, Line — each drawn as its geometry.
    • Written the way PowerPoint writes a shape it has just drawn: preset geometry, a solid fill in the theme's first accent, a line in the same accent darkened by half, a text body anchored to the middle. A theme change recolours it. It lands in the middle of the slide, selected; the Font and Paragraph groups act on its text, Arrange nudges and deletes it.

    Drawings on a sheet

    A diagram drawn in Excel — boxes, arrows, braces, connectors — opened as an empty grid with its captions. The engine had read the drawing part since charts were built; the window never painted it.

    • Every shape, picture and chart on a sheet is now drawn over the cells, in the cells' own coordinates, at the size its author drew. (A connector one pixel wide and a column tall was being widened to eighty and drawn as a diagonal.)
    • Connectors are read — they were "unknown" — and run corner to corner of their box, flipped as the box says; a bent connector turns half way.
    • Braces and brackets are drawn as strokes with no body.
    • A shape that states no fill and no line of its own takes them from the theme through its style references, as Excel does: an arrow Excel filled in the first accent was transparent here. A scheme colour with a shade child no longer reads the shade's number as the colour.
    • A rotated shape turns about its centre; a brace laid on its side under a box is drawn on its side.

    Worksheets

    • CEILING.MATH and FLOOR.MATH, and the _xlfn. prefix Excel writes in front of any function newer than 2007 is the file's, not the function's: a pricing sheet that showed #NAME? in four cells shows its numbers.

    Presentation, measured against PowerPoint

    • Letter spacing on a run is drawn; a site address set wide is wide.
    • Faces with no lowercase — Bebas Neue is on every second deck — set their text in capitals, and fall back to a condensed face on a machine without them. The capitals are the design.
    • Bullets stored for Wingdings or Symbol are drawn as the character they look like: "§" in Wingdings is a small square, and was a "§".
    • A wrapped line is matched back onto its source word by word, so a line with a double space in it keeps its last character: "7LP UK" ended "U", and "Info@zeptosystems.com" ended "Info@ze".

    Word, measured against Word

    • A run that says colour auto is black, whatever colour its style says — a pasted heading was blue here and black in Word.
    • Contextual spacing ("don't add space between paragraphs of the same style") is honoured: a list sits tight while it keeps its space from the prose around it.
    • A list's marker hangs to the left of the text by the level's hanging indent: the bullet at a quarter inch, the text at a half, as Word draws it. And the bullet is the character the numbering stored, mapped through the same symbol-font table as the slides.

    The checks

    • Nine engine tests: a picture round-trips with its bytes, its part, a default content type and no override; a shape round-trips with the theme accent, its line, centred text and its geometry; CEILING.MATH the 2013 way; a connector's flips, a brace's path, a style reference's fill, a rotation; colour auto, contextual spacing and the hanging marker on a page; the symbol-font bullets.
    • Two application checks: a picture sent through the document service lands on the slide, drawn and in its thumbnail; Home → Shapes → Oval puts an oval on the slide, filled, selected, drawn as an ellipse.
    • The harness itself: its windows open on a second display when there is one, because twenty windows on the display somebody is working at get closed by hand, and closing them takes the checks with them; the border check accepts any border, since Chromium floors a 1px border to 0.571px on a 175% display; the mail block waits for its rows instead of pausing a fixed time that was enough only on an idle machine; the Bold check clicks a shape that has text.

    Verified

    • 609 engine tests.
    • 119 application checks.

    The release on GitHub, with its installers

    1.5.08 September 2026

    Presentation gets PowerPoint's ribbon, and opens the decks people actually send.

    TouchedPresentationPictures

    What changed

    • Custom geometry
    • Fit to window
    • Thumbnails
    • A 15 MB deck opens at once
    • Home
    • Slide Show

    and 2 more in the notes

    The full notes for 1.5.0

    1.4.0 gave Worksheets Excel's ribbon; this release does the same for Presentation — Home, Insert, Draw, Design, Transitions, Animations, Slide Show, Record, Review, View and Help, every group PowerPoint has, with a PDF tab where PowerPoint has Acrobat. And, as with Word, the page was measured against the real thing: a company's own decks (45 files, up to 15 MB) opened beside the PDFs PowerPoint had exported of them.

    What the slide shows now

    • Custom geometry. A shape drawn with its own outline — a banner with a diagonal cut, a slash, a swoosh — is read into a path and drawn as one, scaled onto the shape. Every such shape was a rectangle before.
    • Fit to window. The slide is drawn at its own size and scaled to fit the stage; a 1280-px slide in a 1000-px stage used to run off the right edge, logo and all. View → Zoom sets a level, Fit to Window returns.
    • Thumbnails. The slide pane shows a picture of every slide, and the new Slide Sorter shows them all at once.
    • A 15 MB deck opens at once and stays quick: a slide is parsed once per version of its XML, its pictures are held once per session, and a keystroke on one slide redraws that slide and nothing else. Before, every operation parsed all nineteen slides three times over.

    The Presentation ribbon

    • Home. New Slide by layout, Duplicate, Delete; the Font group works on the selected text box — click one, then Bold, Italic, Underline, size, the size steps, font, colour; the Paragraph group's alignments; Arrange (delete, nudge).
    • Slide Show. From Beginning, From Current Slide, Use Presenter View.
    • View. Normal, Outline View, Slide Sorter, Notes Page (the notes editable under the slide), Reading View (the show in the window); Ruler, Gridlines, Guides and the notes strip; Zoom levels and Fit to Window; Colour, Greyscale and Black and White; New Window; Full Screen.
    • Review. Speaker Notes. Help. Help, Feedback, Show Training, What's New, Keyboard Shortcuts. PDF. Export as PDF.
    • Everything else PowerPoint has — Pictures, Shapes, Tables, Charts, Links, Comments, Header & Footer, Themes and variants, every transition and animation, Record, ink, master views, Macros — is drawn where PowerPoint draws it, disabled, with a title that says why. Transitions and animations already in a deck survive a round trip untouched; authoring them is not built, and the ribbon says so instead of pretending.

    The ribbon collapses — and Pictures gives the picture the room

    Every ribbon now has the chevron Office has at the strip's end (or Ctrl+F1): it folds the ribbon to its tabs alone, and while folded a tab click peeks the groups over the content — the content does not move — until a command is pressed or the pointer goes down elsewhere. Pictures uses it: with a picture open the ribbon is folded and the stage keeps almost nothing back, so the picture has the height of the window, the top especially. Opening the ribbon back out is remembered.

    Honest about the rest

    Legacy .ppt (the binary format) is not read; Word reads .doc, and the audit now records the gap. Pictures on a slide are the next thing the deck writer needs, and the highest on its list.

    Verified

    • 599 engine tests (two new: a custom path scaled onto its shape, an arcTo turned into an arc).
    • Application checks for every PowerPoint tab, the disabled controls' explanations, Slide Sorter, Gridlines, and Bold on a selected text box reaching the file.

    The release on GitHub, with its installers

    1.4.08 September 2026

    Worksheets gets Excel's ribbon.

    TouchedWorksheets

    What changed

    • Home
    • Insert
    • Formulas
    • Data
    • Review
    • View

    and 2 more in the notes

    The full notes for 1.4.0

    1.3.x gave Word every tab Microsoft Word has. This release does the same for Worksheets: Home, Insert, Draw, Page Layout, Formulas, Data, Review, View, Automate and Help, every group Excel has in each, laid out where Excel lays it out. What the engine can do is wired; what it cannot is drawn in its place, disabled, with a title that says exactly why — so a person arriving from Excel finds every button where they expect it and is never left guessing whether a feature exists.

    What is new on the ribbon

    • Home. Format Painter, font size up and down, eleven border presets, Merge & Centre, Increase and Decrease Decimal (General becomes 0.0, 0.00 becomes 0.000), Cell Styles — Excel's own: Heading 1–3, Title, Total, Good, Bad, Neutral, Input, Calculation, Check Cell, Note, Warning Text, Currency, Percent, Comma — Insert/Delete/Format menus (row height, column width, AutoFit, protect, lock), Fill Down and Fill Right (Ctrl+D, Ctrl+R), Clear Contents / Clear Formats, Sort & Filter, Find & Select with Go To (Ctrl+G) by cell reference or defined name.
    • Insert. PivotTable, shapes, six chart kinds, the filter, Text Box, Symbol, Define Name.
    • Formulas. Insert Function — every function the engine has, in Excel's categories (Financial, Logical, Text, Date & Time, Lookup & Reference, Math & Trig, Statistical, Information) with a search; picking one starts =NAME( in the cell. The list is the engine's own catalogue, held in lock-step with the functions by a test, so nothing offered can evaluate to #NAME?. Three functions are new for it: IRR, RATE and DATEDIF (all six of Excel's units). Use in Formula lists the workbook's names. Show Formulas (Ctrl+`) shows every formula instead of its result. Calculate Now.
    • Data. From Text/CSV, Refresh All, sort, filter, Data Validation, What-If Analysis (Goal Seek, Data Table), the CSV/TSV/PDF exports.
    • Review. Workbook Statistics, Protect Sheet, lock and unlock cells, conditional formatting and validation.
    • View. Gridlines, Headings and Formula Bar toggles; Zoom levels; New Window; Freeze Panes as a menu — at the selection, top row, first column, unfreeze; Full Screen.
    • Page Layout. Margins, Orientation and Size (kept for the PDF export), gridlines and headings.
    • Help. Help, Feedback, Keyboard Shortcuts, About.

    A workbook that would not open

    A tender's requirements workbook — 24 sheets, 2.44 million cells, all but a few thousand of them formatted blanks — took eleven minutes to open. Building the calculation model asked the file for every cell by reference, and each ask re-parsed the cell's whole row: quadratic in a sheet's width. The model is now built by walking each row once, skipping a blank before its attributes are looked at; the same workbook opens in six seconds and holds a third of the memory. Workbook.cells(sheet) is the walk, and a unit test keeps a 24,000-cell sheet under a second.

    Text spills, as it does in Excel

    Text wider than its cell now spills into empty neighbours — right for left-aligned text, left for right-aligned, both ways for centred — and stops at the first cell with something in it. Numbers never spill, nor wrapped or merged text. The same tender's instruction sheet is centred text over empty columns, and it read as clipped fragments before.

    Honest about the rest

    Draw (ink), Themes, Print Area and print titles, Scale to Fit, Sparklines, Slicers, cell comments, cell hyperlinks, Text to Columns, Flash Fill, Remove Duplicates, Consolidate, outlining and subtotals, formula auditing arrows, Page Break Preview, Automate scripts and Macros are all drawn where Excel draws them, disabled, each with its reason. Macros will stay that way: a spreadsheet that runs code it received in an email is how ransomware starts.

    Verified

    • 590 engine tests.
    • 108 application checks: every Excel tab draws its groups and every disabled control explains itself; Gridlines, Headings and Formula Bar toggle what they name; Freeze top row freezes it; Cell Styles → Good paints the cell Excel-green (rgb 198, 239, 206); Increase Decimal turns General into 0.0; Go To moves the selection; Insert Function starts =SUM(.

    The release on GitHub, with its installers

    1.3.18 September 2026

    Footnotes and endnotes: inserted, reworded, deleted, undone.

    What changed

    • References → Insert Footnote / Insert Endnote
    • Rewording
    • Deleting
    • Undo
    The full notes for 1.3.1

    1.3.0 showed a document's footnotes. This release lets you write them — the second most common reason (after track changes) a document had to go back to Word.

    What is new

    • References → Insert Footnote / Insert Endnote. A dialog takes the words; a raised number appears at the caret and the note under the body (an endnote at the end), numbered by where its reference falls — insert one earlier and every later number moves, as in Word.
    • Rewording. Double-click a note to change its words; the number and the reference stay where they are.
    • Deleting. The reference is one character of the text, the way Word counts it, so Backspace removes it and the note leaves the page with it.
    • Undo steps back through all of that, notes part included: undoing the first footnote a document ever had restores an empty part, not an orphan.
    • The paragraph carrying a reference stays editable — type around the number freely. Before, a paragraph with a footnote was read-only, because the rebuild could not carry the reference; now the reference is a run of its own and the rebuild writes it back.
    • A document with no footnotes part gets one written the way Word writes it, with the separator entries Word expects at ids −1 and 0, its content type and its relationship.

    Verified

    • 590 engine tests (one new, walking the whole lifecycle: insert, type beside, reword, delete, undo four steps, endnote part creation).
    • 100 application checks: the References button, the dialog, the number on the page and the words under the body.

    The release on GitHub, with its installers

    1.3.08 September 2026

    The release where Word opens the documents people actually send.

    TouchedRutba Word

    What changed

    • The document's own fonts, sizes and colours
    • Tabs
    • Cover pages and tables of contents
    • Text boxes
    • Headers and footers
    • Footnotes and endnotes

    and 3 more in the notes

    The full notes for 1.3.0

    1.2.0 made every button work. This release is about what is on the page when a real document is opened — a tender, a contract, a questionnaire — measured the only honest way: the same file opened in Microsoft Word and in Rutba, both photographed, the differences fixed one at a time. The corpus behind it is 474 .docx files from public procurement: 473 open now (the last one is not a zip archive), none takes longer than five seconds, and a 32 MB manual that used to take 92 seconds opens in three.

    What was missing from the page, and is drawn now

    • The document's own fonts, sizes and colours. Every document was drawn in Calibri, black, one size, because the stylesheet was read for pagination and never for painting — and fonts named through the theme (which is how Word names nearly all of them) were not read at all. The page now paints each paragraph from its resolved style: face, size, colour, bold, italic, caps, alignment, spacing before and after, line spacing, indents, shading, tab stops — with the theme's heading and body faces resolved, and direct formatting on a paragraph or run beating the style, as in Word.
    • Tabs. No tab had ever reached the page: the text reader kept only what sat inside <w:t>, and a tab never does. Form lines ran their label into their value ("DATED[dd/mm/yyyy]"). Tabs are read, sized to the paragraph's own stops or its style's (left, centre, right and decimal, with dot, hyphen and underscore leaders), and a tab typed into a paragraph is written back as the element Word expects. Line breaks inside a paragraph are kept too, and a run of spaces is a run of spaces.
    • Cover pages and tables of contents. Word puts both in a content control at the top of the body, and the reader treated every control as opaque — so the Leicestershire LMS tender opened on its second page. A body-level control's paragraphs are on the page now, read-only (the engine cannot rebuild a control, so the caret is kept out of one rather than allowed to make edits that vanish).
    • Text boxes. A cover page is mostly text boxes: the title block, the contact details, the abstract. They are drawn in flow under the paragraph that anchors them, at the file's size, with the shape's fill (theme colours included, tints applied) and outline, their paragraphs painted exactly like the body's. Before, a text box's words were sometimes shown as body paragraphs and the paragraph carrying the box was lost.
    • Headers and footers are drawn in the page margins, greyed the way Word greys them, with the page-number field resolved; double-click one to edit it. A title page shows the first-page band — and nothing at all when the file defines none, which is how a cover page has no running header.
    • Footnotes and endnotes. The reference is drawn as a raised number in the body, numbered by where it falls, and the notes sit under the body with their own numbers. Paragraphs carrying a reference are read-only, so an edit can never orphan a note.
    • Paragraph shading and borders, including a style's — the shaded title band, the rule under a heading.
    • Hyperlinks are blue and underlined; superscript and subscript are painted (and can now be applied from the ribbon: x² and x₂ are buttons, not promises).
    • Watermarks. "DRAFT" across every page is the header's WordArt; its words are read and drawn behind the body.

    What the page shows that print does not, yet

    The printed pages and the PDF export are laid out by the paginator, which places pictures and tables but not, yet, text boxes, footnotes or the watermark — those are on the screen and not on paper. Inserting a footnote, editing inside a content control or a text box, and a table of contents that updates itself are not built; the ribbon says so on each button.

    Performance

    • Opening a 3,000-paragraph contract took 25 seconds per frame: the frame asked the file for each paragraph's alignment again, per paragraph, per keystroke. It reads what the paragraph already carries; the frame takes 380 ms.
    • A table whose header row repeats on every page sent the paginator into a loop that ran the machine out of memory (4 GB) on an 81 KB document. It lays the table out in 144 ms now, and a runaway guard means no document can do that again.
    • The document service no longer paginates on every keystroke — the editor draws from blocks and never read the pages.

    The Word ribbon

    Every tab Microsoft Word has — Home, Insert, Draw, Design, Layout, References, Mailings, Review, View, Help — with every group. What is wired is wired to the engine; what is not is disabled with a title that says why, so the ribbon never pretends. New this release: the Navigation Pane, the ruler, formatting marks, the five view modes, Focus mode, zoom, Symbol, Date & Time, Change Case, the Format Painter, Cover Page, Blank Page, Table of Contents from the headings, Next/Previous Footnote and Show Notes, Document Properties, keyboard shortcuts, the tracked-changes list, and x²/x₂.

    How this is verified now

    • 589 engine tests (12 new, on a purpose-built fixture with a cover page in a content control, a themed text box, tab stops, shading, a border, theme fonts, character styles, footnotes out of id order, a first-page header and a watermark).
    • 99 application checks that press the real buttons — every Word tab, the navigation pane, the marks, the view modes, Symbol, Date & Time, Change Case, the style box, the table of contents, superscript — and one that measures the page is centred in the window, because it was not: the app's one grid column grew to the ribbon's 2,372 px and the page was centred in that.
    • Two tools for the comparison itself: tools/compare-word.ps1 asks Microsoft Word to export a document as PDF (one Word per document, three minutes each, an unblocked copy so Protected View cannot wedge it), and tools/pdf-pages.ps1 rasterises PDF pages with Windows' own renderer, so a page of Word's can be put beside a page of ours with nothing installed.

    The release on GitHub, with its installers

    1.2.08 September 2026

    The release where every button was pressed.

    What changed

    • Insert → Picture
    The full notes for 1.2.0

    1.1.0 shipped ribbons whose buttons did not work. Not "worked badly" — Word's font, size, colour, indent and style controls each sent a key the engine does not listen for, so they pressed and did nothing. Worksheets could not be formatted from its toolbar, and a click on an empty cell selected nothing. The checks did not catch any of it, because they drove the engines through operations and never clicked a button. This release fixes what was broken and changes how the suite is verified so it cannot ship that way again.

    What was wrong, and is fixed

    Word

    • Every font, size, colour, highlight, indent, spacing and style control now reaches the engine — and the page paints the result. A colour never showed before (the painter read a key the engine does not send); 12 pt drew at two-thirds size (pixels for points); centred, justified and indented paragraphs applied to the file and painted nowhere.
    • Pressing Bulleted list crashed the page. It makes a list now.
    • A table inserted from the ribbon looked like a stack of plain lines. It is drawn as a table, every cell still editable.
    • Insert → Picture called a command that no longer existed. It opens a file, puts the picture in the document, and — the part that was also missing — draws it on the page. Charts and shapes ride the same path and are drawn too.
    • Page size, orientation and margins use the engine's own names, so they work.

    Worksheets

    • Clicking an empty cell selects it. The engine deliberately does not emit empty cells (a sheet is mostly empty), so a click on blank grid landed on nothing; the grid now finds the cell under the pointer from its geometry.
    • Bold, italic, underline, font, size, colour, fill, borders, alignment, wrap and number formats all paint. The cell painter read flat keys the engine never sends; it reads the engine's own shape now.
    • Borders send edges; the chart menu offers only kinds the engine draws; the shape menu offers only shapes that exist.

    Everything else

    • A toolbar press no longer takes focus from the editor, so the selection a button acts on is still the active one. Dropdowns still take focus, because a dropdown that cannot take focus cannot open.
    • Video: the scrubber set the playhead and then read it straight back from the media element before the seek had landed — so Split and Trim cut at 0, which is no cut. Fixed, with the playhead no longer snapping back mid-drag.
    • Presentation: a "Shape" that inserted a text box is gone; the Design tab holds the deck's real size and the three layouts instead of disabled placeholders.

    How this is verified now

    npm run gate still runs 577 engine tests, 9 editing checks and 8 window captures — and now 86 application checks, 35 of which select words on the real page, press the real ribbon buttons and menus, fill in the real dialogs, and read what the page paints:

    • bold drawn at weight 700, 18 pt drawn at 24 px, red drawn as rgb(224, 49, 49)
    • a paragraph centred, a list made, a heading applied, a table inserted and drawn as one, a page turned landscape, a picture inserted and drawn, undone and redone
    • a click on empty C7 selecting C7, typing filling it, bold painting bold, a fill painting amber, borders painting a border, the Freeze dialog freezing the top row
    • a slide added from the menu, a text box placed, notes saved, the slide deleted; the picture viewer rotated and advanced; the image editor's rotate, flip and reset; a clip split at the playhead
    • a message composed, sent to the outbox with an undo, taken back and reopened

    Each of those found something on its first run. None of them can be passed by an engine that works behind a button that does not.

    Also in this release

    Everything from 1.1.0 — the mail client that names the trackers in a message, sign-in to Gmail and Outlook.com, rules that show their working, a search index, a Markdown editor that gives a README back unchanged, presenter view, and the one honest request outward. See the 1.1.0 notes.

    Downloads

    | File | For | |---|---| | Rutba-Office-1.2.0-win-x64.exe | Windows installer | | Rutba-Office-1.2.0-portable.exe | Windows, no installation |

    macOS and Linux builds are produced by the same configuration and will follow.

    The Windows builds are not code-signed, so SmartScreen will warn on first run. That warning is telling you the truth: the publisher is unverified. Check the file against this page, or build it yourself — the source is here.

    The packaged installer in this release was smoke-tested as a packaged installer, not as a development tree. Free, and licensed AGPL-3.0-or-later with a commercial option.

    The release on GitHub, with its installers

    1.1.08 September 2026

    Everything in 1.0.0, and the parts that were built but had no button.

    TouchedMail

    What changed

    • Hyperlinks and tables
    The full notes for 1.1.0

    Mail is a mail client now

    It tells you who is watching. Every client blocks remote images. None of them say what was blocked or whose it was. This one names the tracking networks in a message, counts the pixels, and tells a 1×1 beacon apart from the sender's own logo — computed from the message already on your disk, with no network call of any kind. It shows SPF, DKIM and DMARC as the receiving server recorded them, so a forged bank mail is visibly forged before you read it. And where a sender offers RFC 8058 one-click unsubscribe, leaving the list is a button.

    Sign in to Gmail and Outlook.com. Both stopped accepting passwords for mail programs — Google in 2022, Microsoft in 2024 — so a client without this cannot add the two mailboxes most people have. The sign-in happens in your browser, never in a window this application draws, with PKCE and a loopback redirect. Only a refresh token is kept, in the operating system's keystore.

    Conversations, a unified inbox across every account, multi-select with the actions that only make sense in bulk, quick filters, a reading pane that moves, and two views a client that owns its own store can offer and a thin IMAP front end cannot: every attachment in one place, and everyone who writes to you.

    Rules — and unlike anyone else's, they show what they would do to the folder in front of you, live, before they do anything.

    Search is an index rather than a scan: from:, subject:, has:attachment, is:unread and quoted phrases. 20,000 messages searched in under 10 ms.

    Undo send and scheduled send. Every message waits a few seconds before it leaves, and those seconds are yours. The queue survives a restart, and three failed attempts put your words back in Drafts rather than losing them.

    It finds the mail you already have — Outlook, Thunderbird, Apple Mail and Windows Mail stores on this computer, offered with their account settings, not just their messages.

    A Markdown editor you can point at a repository

    Word opens GitHub-flavoured Markdown and gives it back unharmed. Front matter, task lists, table alignment, reference links, footnotes, setext headings and fenced code all survive. 264 of 268 real .md files round-trip byte for byte; the four exceptions have genuinely unbalanced emphasis. Word cannot open Markdown at all, and LibreOffice loses the structure.

    .md and .markdown are claimed as file types, so Rutba Office can be the program they open with.

    The ribbons caught up with the engines

    Worksheets could not make a cell bold — not because the engine could not, but because nothing called it. The same was true of freeze panes, sheet protection, conditional formatting, data validation, goal seek, what-if tables, named ranges, filters, find-and-replace and pivot tables. All built, all unreachable. Now: Home, Insert, Formulas, Data, Review, View.

    Word gained Home, Insert, Layout, References, Review, View — hyperlinks, comments, headers and footers, page size, orientation, margins, a style list read from the document, and a word count that reports reading time honestly.

    Presentation gained Home, Insert, Design, Slide Show, View, and two things it simply could not do: add a slide (a new deck could not grow past its first one) and write speaker notes.

    Presenter view

    A second window for the other screen: your notes, the next slide, how long you have been talking and what the time is. B blanks the audience screen. The two windows agree through one place in the application, so they cannot drift apart mid-talk.

    Other things

    • A full-screen button in every window, and F11.
    • A "open files with Rutba Office" panel that says honestly what each platform will and will not let an application do, rather than claiming success and changing nothing.
    • The image viewer plays video and animated images in the same surface, with an auto-advance navigator that waits for a video to finish.
    • Hyperlinks and tables in generated documents.

    One request outward, and it is stated

    An update check against GitHub, and one announcement check a day against office.rutba.io. The announcement carries the version and the operating system and no identifier of any kind — what is counted at the other end is "a copy opened somewhere", never you. Both are listed in About and both switch off in one press. There is deliberately no setting that reports without showing you something back.

    Your documents, your mail, and what you do with them never leave this computer.

    Downloads

    | File | For | |---|---| | Rutba-Office-1.1.0-win-x64.exe | Windows installer | | Rutba-Office-1.1.0-portable.exe | Windows, no installation |

    macOS and Linux builds are produced by the same configuration and will follow.

    The Windows builds are not code-signed, so SmartScreen will warn on first run. That warning is telling you the truth: the publisher is unverified. Check the file against this page, or build it yourself — the source is here.

    Verified

    npm run gate: 577 engine tests, 9 editing checks, 53 application checks and 8 window captures — 73 seconds, all green. The application checks run against a generated mailbox in a profile of their own, so they pass or fail on the code rather than on whatever happened to be on the machine. The packaged installer in this release was smoke-tested as a packaged installer, not as a development tree.

    Free, and licensed AGPL-3.0-or-later with a commercial option.

    The release on GitHub, with its installers

    1.0.08 September 2026

    The first release: seven apps in one download, working with the network switched off.

    The full notes for 1.0.0

    Mail reads Outlook .pst and .ost, .olm, mbox, .eml and .msg alongside live IMAP. Word, Worksheets and Presentation run on an OOXML engine that rewrites only the parts of a file it deliberately edited. Pictures, Image and Video carry no ffmpeg and no native binaries.

    577 engine tests, 18 application checks and 9 editing checks, all run against the real windows and the packaged binary.

    The release on GitHub, with its installers

The next one arrives on its own

Install it once. Every release after that is found, downloaded and offered to you by the copy you already have.

One family

The rest of Rutba

One account across all of it. Sign in once and the products know each other.

OFFICE-TIMELINE · 7fabfcc