Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
910 commits
Select commit Hold shift + click to select a range
8ab58a5
feat(sheets): hide cells from the model, and stop the trace tools pri…
tokg-venv Oct 23, 2026
79ecbc9
fix(docx-engine): restore the resolve-props re-exports that #2122's m…
tokg-venv Oct 23, 2026
28cee5c
fix(sheets): restyle existing tables from the Home gallery (#2164)
widechaos Oct 24, 2026
ec85e4d
feat(xlsx-gateway): a note can carry a picture (#2165)
tokg-venv Oct 26, 2026
6d031eb
feat(sheets): put a picture into a note (#2166)
tokg-venv Oct 26, 2026
32fac8a
feat(sheets): stdDev, stdDevp, var and varp join the pivot Summarize …
tokg-venv Oct 26, 2026
c5c9e9a
fix(sheets): superscript and subscript raise and lower the text (#2214)
tokg-venv Oct 26, 2026
917f765
build(xlsx-engine): bump calamine to 0.37 for corrected xls formula c…
aniruddhaadak80 Oct 26, 2026
9db1955
fix(docs): the outline view's fold handles fold (#2183)
tokg-venv Oct 26, 2026
72a78d4
fix(docs): the floating position of newly inserted images survives th…
tokg-venv Oct 26, 2026
64667ad
fix(slides): a save that dies mid-stream leaves the previous deck int…
tokg-venv Oct 26, 2026
adeae73
feat(slides): an editing ribbon for the slide master — insert text bo…
tokg-venv Oct 26, 2026
be34ed1
feat(html): the AI can search and generate images (#2180)
tokg-venv Oct 26, 2026
f82e691
fix(html): justify joins the alignment controls, and the panel stops …
tokg-venv Oct 26, 2026
74c9482
feat(shell): OpenAI's GA Decisions API as a decision-model route (#2190)
tokg-venv Oct 26, 2026
6c6ffc8
feat(ai-provider): Kimi K3.1 Pro as the Kimi flagship (#2189)
tokg-venv Oct 26, 2026
b59216e
chore(i18n): drop sixteen dead string keys (#2197)
tokg-venv Oct 26, 2026
d95315c
docs(readme): document the capabilities merged since the 10-13 snapsh…
tokg-venv Oct 26, 2026
174ffd0
fix(markdown): guard md-asset URL decoding in unresolveImageSrc (#2204)
aniruddhaadak80 Oct 26, 2026
efbd5f9
fix(electron-utils): return null for malformed percent data-URL paylo…
aniruddhaadak80 Oct 26, 2026
8c345f1
fix(docs): escape caption labels in the SEQ field matcher (#2206)
aniruddhaadak80 Oct 26, 2026
c5baaf7
fix(shell): the AI PDF menu icon shows up again at 100% DPI (#2133) (…
aniruddhaadak80 Oct 26, 2026
7030bc7
feat(markdown): footnotes — [^label] references and [^label]: definit…
tokg-venv Oct 26, 2026
97a7fc6
feat(docs): bullets, numbering and indent inside textbox and shape ed…
tokg-venv Oct 26, 2026
5977c74
fix(docs): a merged group crossing a page keeps its rows at content h…
tokg-venv Oct 26, 2026
95a8df5
feat(pdf): a comments panel that lists every note across the document…
tokg-venv Oct 26, 2026
7d067d4
feat(pdf): add and edit hyperlinks (Edit > Link) (#2192)
tokg-venv Oct 26, 2026
8cd5de9
feat(pdf): match-case and whole-word in the search bar (#2181)
tokg-venv Oct 26, 2026
fe0810b
fix(docx-engine): a heading survives the save in a document without h…
tokg-venv Oct 26, 2026
ee57643
feat(markdown): create the note an unresolved wiki link names (#2179)
tokg-venv Oct 26, 2026
6eb8e8a
feat(markdown): words and characters in the status bar (#2198)
tokg-venv Oct 26, 2026
36b2613
fix(pptx-ops): trim hex color inputs in table style validation (#2173)
aniruddhaadak80 Oct 26, 2026
cac6681
fix(xlsx-gateway): trim sparkline color input (#2174)
aniruddhaadak80 Oct 26, 2026
7f58e4a
shell: let the home sidebar be resized by dragging its edge (#2169) (…
DuBearte Oct 26, 2026
591b418
shell: reopen the last session's documents at launch (#2162) (#2187)
DuBearte Oct 26, 2026
5c1c41e
feat(slides): A4/A3 paper sizes, portrait and a custom slide size (#2…
DuBearte Oct 26, 2026
13cd6ea
feat(markdown): ==highlight== joins the inline marks (#2200)
tokg-venv Oct 26, 2026
e038aaa
shell: a setting to turn off the automatic update checks (#2127) (#2188)
DuBearte Oct 26, 2026
11051a9
feat(sheets): support encrypted workbooks and password changes (#2136)
barathrajd Oct 26, 2026
c8bfff6
Sync snapshot (2026-10-26) (#2222)
merrick-2002 Oct 26, 2026
43e09bf
feat(sheets): Select Data and chart-type switching for combo charts (…
tokg-venv Oct 27, 2026
4573d0e
feat(sheets): save pivot-bound charts as PivotCharts (#2230)
tokg-venv Oct 27, 2026
84821c6
feat(sheets): What-If data tables (one and two variables) (#2229)
tokg-venv Oct 27, 2026
a9ed90a
fix(markdown): serve cross-folder wiki picture embeds from the vault …
aniruddhaadak80 Oct 27, 2026
15aa93e
fix(sheets): the copied range's border stops moving when nobody is wa…
tokg-venv Oct 27, 2026
dc406e8
test(shell): arm the resume-download failure timer after the first ch…
aniruddhaadak80 Oct 27, 2026
118e5ec
fix(html2docx): trim hex color input in isLightShading (#2242)
aniruddhaadak80 Oct 27, 2026
4ad0abc
fix(pdf2docx): trim hex color inputs in shape helpers (#2234)
aniruddhaadak80 Oct 27, 2026
7f376ec
fix(docx-engine): trim input in stripHash (#2236)
aniruddhaadak80 Oct 27, 2026
e267d1b
feat(ai-provider): add Runcrate as a model provider (#2217)
heydryft Oct 27, 2026
a459e2b
feat(sheets): persist filters on Excel tables (#2221)
tokg-venv Oct 27, 2026
29b3eaf
feat(sheets): the remaining eight Show Values As modes (#2225)
tokg-venv Oct 27, 2026
6566d7d
fix(docs): keep the table width grid when deleting columns (#2238)
aniruddhaadak80 Oct 27, 2026
8ca0a60
fix(markdown): the wiki graph header can receive presses, and Escape …
aniruddhaadak80 Oct 27, 2026
f5548b4
fix(docs): make deleteTableColumn a plain Command so typecheck passes…
merrick-2002 Oct 27, 2026
04e51f0
feat(markdown): aliased wiki links display only their alias (#2244)
tokg-venv Oct 27, 2026
daf5eac
fix(markdown): block refs land on their block when the target file ha…
tokg-venv Oct 27, 2026
1c2eb43
feat(markdown): a tags sidebar — every #tag in the vault, with its no…
tokg-venv Oct 27, 2026
8c17059
feat(pdf): Bates numbering — sequential page identifiers on every pag…
tokg-venv Oct 27, 2026
028d67e
feat(markdown): block ids — copy a link to any block, written where O…
tokg-venv Oct 27, 2026
d14d574
fix(pdf2docx): trim hex color inputs in shape/workbook helpers (#2261)
aniruddhaadak80 Oct 27, 2026
c5e36f8
fix(pptx-render): trim hex color inputs in chart/scene helpers (#2262)
aniruddhaadak80 Oct 27, 2026
2eaf41e
fix(docx-engine): trim hex color input in chart color resolution (#2263)
aniruddhaadak80 Oct 27, 2026
44948bb
fix(docx-engine): trim hex color input in parse-drawing-geometry (#2265)
aniruddhaadak80 Oct 27, 2026
db057cc
feat(pdf): editable bookmarks — add, rename and delete in the outline…
tokg-venv Oct 27, 2026
c21f2fb
feat(sheets): passwords on allow-edit ranges (#2202)
tokg-venv Oct 27, 2026
f69a32e
feat(sheets): read and write x14 extended data validation (#2224)
tokg-venv Oct 27, 2026
91eaac9
feat(shell): propose a file name when the reader asks for one (#2156)
tokg-venv Oct 27, 2026
28e9c10
fix(i18n): add the Turkish strings for the range-password and bookmar…
merrick-2002 Oct 27, 2026
f847a29
fix docs tracked save reload (#2279)
widechaos Oct 28, 2026
8222ec7
fix(markdown): a pasted [[link]] or ![[embed]] is live at once, not o…
tokg-venv Oct 28, 2026
16d8f23
feat(pdf): squiggly underline, caret and polygon annotations (#2245)
tokg-venv Oct 28, 2026
615fb2d
feat(slides): name a deck when the reader asks for one (#2158)
tokg-venv Oct 28, 2026
4449b62
feat(pdf): baked OCR text — auto-recognized pages become searchable o…
tokg-venv Oct 28, 2026
ec2ff64
fix(sheets): say so when the Filter toggle declines (#2270)
tokg-venv Oct 28, 2026
b1ad6e2
feat(markdown): name a document when the reader asks for one (#2159)
tokg-venv Oct 28, 2026
061b8ca
feat(docs): name a document when the reader asks for one (#2161)
tokg-venv Oct 28, 2026
3c2eaf1
fix(sheets): keep session range password hashes when the dialog is re…
merrick-2002 Oct 28, 2026
c37892f
fix(docx-engine): trim hex color input in theme color resolution (#2264)
aniruddhaadak80 Oct 28, 2026
9efb2cd
feat(mcp): insert pictures into the visible docs document (#2267)
aniruddhaadak80 Oct 28, 2026
15c9a70
feat(skills): install into the shared ~/.agents directory, with a row…
tokg-venv Oct 28, 2026
6f96d3c
feat(html): name a document when the reader asks for one (#2157)
tokg-venv Oct 28, 2026
da7290c
feat(sheets): name a workbook when the reader asks for one (#2160)
tokg-venv Oct 28, 2026
039d743
test(mcp): pin insert_picture in the HTTP surface's expected tool lis…
aniruddhaadak80 Oct 28, 2026
ff930f0
feat(pdf): compare — text-level diff against a picked document, page …
tokg-venv Oct 28, 2026
7d1ffc4
fix(slides): stop sending inline media and full decks after slide edi…
HThanh-how Oct 28, 2026
b239d2e
feat(pdf): compare reports identical past-cap pages as equal, not tru…
aniruddhaadak80 Oct 28, 2026
4865d33
fix(markdown): wrap long tokens in table cells so wide tables fit the…
lizen Oct 29, 2026
9ddf1f7
feat(markdown): the [[ suggester lists a note's headings and block id…
tokg-venv Oct 29, 2026
fd8bdfa
fix(sheets): add_chart accepts a dataRange of formula cells (#2297)
tokg-venv Oct 29, 2026
d7a3160
feat(docs): rotate floating shapes and set their outline width (#2266…
tokg-venv Oct 29, 2026
51c3e2a
fix(sheets): workbooks whose cellXfs omit the optional xfId survive a…
tokg-venv Oct 29, 2026
78798a9
fix(sheets): the outline gutter sleeps when nothing changes (#2303)
tokg-venv Oct 29, 2026
c1ee40f
feat(pdf): reduce file size — re-compressed streams and downsampled i…
tokg-venv Oct 29, 2026
6e575cb
feat(sheets): spelling check for workbooks (#2227)
tokg-venv Oct 29, 2026
65dbea7
feat(pdf): a calibrated measure tool — draw a line, read the real len…
tokg-venv Oct 29, 2026
dce3808
fix(skills): the copies the shared .agents row replaced are cleared, …
tokg-venv Oct 29, 2026
d939f30
fix(docs): whole-paragraph compare revisions ride the paragraph mark,…
tokg-venv Oct 29, 2026
075a027
fix(sheets): the headless PDF export prints every sheet, with formula…
tokg-venv Oct 29, 2026
0b3f28c
fix(pdf): keep the stem of generated PDF names containing a colon on …
aniruddhaadak80 Oct 29, 2026
bac5878
feat(sheets): carry pictures, merges, widths and heights out of legac…
tokg-venv Oct 29, 2026
6c69b97
feat(pdf): an attachments panel — embedded files listed, added, expor…
tokg-venv Oct 29, 2026
d3b29b1
chore: fix the lint and format items left by #2300, #2299 and #2288 (…
merrick-2002 Oct 29, 2026
b613c30
fix(docs): pictures move, resize and reselect like Word; floating run…
ThallesCosta-dev Oct 29, 2026
2548276
fix(assets): keep the stem of asset names with a drive-like colon on …
aniruddhaadak80 Oct 29, 2026
a538d04
fix(sheets): import workbooks whose relationships use absolute OPC ta…
tokg-venv Oct 29, 2026
6e7a890
fix(pdf): open password-protected documents — decrypt the streams bef…
tokg-venv Oct 30, 2026
ac88081
feat(docs): the selection chrome turns with the shape, and header/foo…
tokg-venv Oct 30, 2026
7ec2c52
feat(ai): export the mind map card as SVG alongside the PNG (#2327)
tokg-venv Oct 30, 2026
04bea7b
feat(docs,slides): AI file naming in the macOS File menu (#2321)
tokg-venv Oct 30, 2026
b1c470b
fix(docs): a page break stays put when the text next to it is edited …
ThallesCosta-dev Oct 30, 2026
1e7158a
feat(pdf): export pages as JPG alongside the PNG export (#2328)
tokg-venv Oct 30, 2026
a4b54d0
feat(slides): export pages as JPG alongside the PNG export (#2330)
tokg-venv Oct 30, 2026
df9a64c
feat(ai-provider): add CloudGPU as a model provider (#2310)
mrhy7176 Oct 30, 2026
36a509e
Sync snapshot (2026-10-30) (#2341)
merrick-2002 Oct 30, 2026
55d4b3f
fix(docs): keep gap headers aligned with markup columns (#2412)
catPaw-s Nov 2, 2026
9498902
fix(docs): preserve paragraph layout across structural edits (#2411)
catPaw-s Nov 2, 2026
8a941f9
fix(cli): persist trailing section revision decisions (#2344)
widechaos Nov 2, 2026
2c411ef
fix(cli): keep soft line breaks in docs read block text (#2400)
tokg-venv Nov 2, 2026
cdca400
feat(docs): typed custom properties and Word-like docProps on create …
tokg-venv Nov 2, 2026
7d09c63
test(docs): destroy the editors tests create (#2348)
tokg-venv Nov 2, 2026
fc64fdb
test(docs): lock the remaining #524 byte-confinement fixes (#2352)
tokg-venv Nov 2, 2026
9b393be
fix(docx): a save strips orphaned move-range markers (genoffice#2337 …
tokg-venv Nov 2, 2026
07390ae
fix(docx): preserve cached header and footer field results (#2333)
widechaos Nov 2, 2026
295216a
test(docx-engine): cover MathType equation previews (#2335)
tokg-venv Nov 2, 2026
3a45808
fix(docx): WMF text honours TA_UPDATECP like the EMF path already doe…
tokg-venv Nov 2, 2026
5adbd0a
fix docs CJK font slots for reported family names (#2392)
widechaos Nov 2, 2026
acf8fe9
feat(docs): report and unwrap nested content controls; report inline …
tokg-venv Nov 2, 2026
ced1518
test(xlsx-gateway): pin that a save leaves the connection parts alone…
tokg-venv Nov 2, 2026
6bea0dc
feat(sheets): Data › Queries & Connections, a read-only list of the w…
DuBearte Nov 2, 2026
c937e6a
feat(mind-map): share the mind map core and add a left-right layout (…
tokg-venv Nov 2, 2026
a2c7f44
feat(docs): switch the mind map between the top-down and left-right l…
tokg-venv Nov 2, 2026
5affb83
feat(linux): add KDE Dolphin Create New templates on deb/rpm (#2403)
tokg-venv Nov 2, 2026
884a6ac
fix(shell): center the Ask-your-knowledge-base step badges (#2401)
tokg-venv Nov 2, 2026
e08e839
fix(slides): keep setText paragraphs together and rebuild moved text …
tokg-venv Nov 2, 2026
98a0877
feat(sheets): the mouse wheel scrolls an overflowing ribbon sideways …
DuBearte Nov 2, 2026
ce27b6e
fix(shell): give the AI file-naming call room for a reasoning preambl…
tokg-venv Nov 2, 2026
39b69aa
feat(docs): a comment can carry a picture (#2376)
tokg-venv Nov 2, 2026
97da867
feat(mcp): fill_template and read_docx_properties (#2409)
tokg-venv Nov 2, 2026
6168013
feat(docs): open .hwp and .hwpx as converted .docx copies (#2404)
larrabee-kor Nov 2, 2026
146b3a5
feat(markdown): switch the mind map between the top-down and left-rig…
tokg-venv Nov 2, 2026
1ae7709
fix(sheets): say when a sheet is showing formulas instead of values (…
tokg-venv Nov 2, 2026
8cdfaa7
fix(print): macOS silent print jobs go through CUPS instead of Chromi…
tokg-venv Nov 2, 2026
c73df0f
fix(pdf): one broken page no longer blanks a large document's open (#…
tokg-venv Nov 2, 2026
3aa6f07
feat(sheets): compute live values for external-workbook links (#2319)
tokg-venv Nov 2, 2026
c7c35e5
fix(cli): recalculate dependent formula caches after sheet apply (#2312)
tokg-venv Nov 2, 2026
5eef8fc
fix(xlsx-engine): read zip entry names as Result under zip 9 (#2414)
merrick-2002 Nov 2, 2026
59d1119
fix(docs): header pictures move and resize like Word; dropped picture…
ThallesCosta-dev Nov 2, 2026
746333e
feat(cli): genoffice sheet links — list, update and break external li…
tokg-venv Nov 2, 2026
1fb433f
feat(shell): download updates quietly and install them on quit (#2399)
tokg-venv Nov 2, 2026
0484c11
feat(docs): remove_parts — strip customXml and web-extension parts fo…
tokg-venv Nov 2, 2026
d1ecc15
fix(docs): DOCX to PDF — SECTIONPAGES, custom-style TOC leaders, page…
pblsketch Nov 2, 2026
6074d30
fix: follow-ups to today's merges (hwp table cap, comment pictures, p…
merrick-2002 Nov 2, 2026
29c1856
feat(mcp): sheet_links — inspect and maintain a workbook's external l…
tokg-venv Nov 2, 2026
5a84068
fix: review findings on recently merged PRs (drop-page bounds, reply …
merrick-2002 Nov 2, 2026
3f24ed5
fix pdf open retaining bytes after worker transfer (#2415)
widechaos Nov 2, 2026
70ef73e
feat(doc2docx): stage 1 of legacy .doc import — OLE2/CFB + FIB + CLX …
tokg-venv Nov 2, 2026
d4820cb
feat(doc2docx): stage 2 — CHPX/PAPX formatting model for legacy .doc …
tokg-venv Nov 2, 2026
0599cce
feat(doc2docx): stage 3a — .docx writer for the formatting model (#2375)
tokg-venv Nov 2, 2026
b43d24c
feat(doc2docx): stage 3b — STSH stylesheet parsing and style resoluti…
tokg-venv Nov 2, 2026
97e9a59
feat(doc2docx): stage 3c-1 — section geometry and headers/footers (#2…
tokg-venv Nov 2, 2026
6c03d87
feat(doc2docx): stage 3c-2 — table (TAP) reconstruction and w:tbl wri…
tokg-venv Nov 2, 2026
781c1d3
feat(doc2docx): stage 3c-3 — inline pictures and w:drawing output (#2…
tokg-venv Nov 2, 2026
e624321
feat(doc2docx): stage 3c-4 — lists/numbering and HYPERLINK fields (#2…
tokg-venv Nov 2, 2026
4e22782
feat(cli): convert legacy .doc/.dot to .docx in-process (#2386)
tokg-venv Nov 2, 2026
1972b66
fix(file-parse): reject UTF-32BE text attachments (#2416)
Zhangs-11 Nov 2, 2026
ffe5097
fix(file-parse): ignore historical DOCX formatting properties (#2418)
Zhangs-11 Nov 2, 2026
440af0b
feat(docs): open legacy .doc/.dot as converted .docx copies (#2387)
tokg-venv Nov 2, 2026
8efb3bf
tests(docs): refresh the anchor-geometry golden for the merged header…
merrick-2002 Nov 2, 2026
abc6474
fix(file-parse): respect DOCX numbering and outline resets (#2419)
Zhangs-11 Nov 2, 2026
a2075fa
test(docs): refresh stale anchor and Linux visual baselines (#2427)
Zhangs-11 Nov 2, 2026
f57fea4
fix(file-parse): preserve speaker notes across equivalent XML spellin…
Zhangs-11 Nov 2, 2026
d2a01b3
fix(file-parse): resolve XLSX metadata through workbook relationships…
Zhangs-11 Nov 2, 2026
aacdba3
fix(file-parse): translate shared formula references (#2421)
Zhangs-11 Nov 2, 2026
4259809
fix(file-parse): preserve date-only values near midnight (#2423)
Zhangs-11 Nov 2, 2026
a824e64
fix(file-parse): decode escaped XLSX cell text (#2422)
Zhangs-11 Nov 2, 2026
985c2b7
test(shell): format the docx family open list (#2429)
merrick-2002 Nov 2, 2026
d0180c9
feat(markdown): let printed tables start in place and split between r…
lizen Nov 2, 2026
a7db5e0
Keep Docs Save As available when its default directory is unusable (#…
widechaos Nov 2, 2026
1a0fcec
Sync snapshot (2026-11-02) (#2437)
merrick-2002 Nov 2, 2026
f60d688
fix(docs): balloon mode changes repaginate so deletion balloons appea…
merrick-2002 Nov 2, 2026
022adef
feat(shell): an All tab on the skills catalog and localized skill des…
tokg-venv Nov 3, 2026
61c0241
fix(docs): keep untouched tables byte-identical in the save plan (#2405)
tokg-venv Nov 3, 2026
36f0b06
feat(docs): label-sheet and envelope output for the mail merge (#2374)
tokg-venv Nov 3, 2026
3a10477
feat(sheets): external links panel — list, update values, locate sour…
tokg-venv Nov 3, 2026
c8463c2
fix(pdf): large files reach the renderer in 8 MiB slices, not one IPC…
tokg-venv Nov 3, 2026
5288c38
fix(docx): keep folder entry dates from the source package (#2443)
tokg-venv Nov 3, 2026
e13d7e5
fix(file-parse): read ruby base text without the phonetic guide in do…
Mohith26 Nov 3, 2026
c9c7a5d
feat(ai-provider): add SiliconFlow, PPIO and Command Code as model pr…
tokg-venv Nov 3, 2026
3b59889
fix(docx): the resource sweep prunes only what this save broke (#2447)
tokg-venv Nov 3, 2026
e9ec17c
fix(sheet): parse every cellXf when <cellXfs> mixes self-closing and …
Junesgone Nov 3, 2026
52e7b30
fix(sheets): shape the external-links listing for the host schema (#2…
merrick-2002 Nov 3, 2026
e1f50e9
test(docs): a seeded round-trip fuzz suite for the DOCX save pipeline…
tokg-venv Nov 3, 2026
77cf942
feat(pdf): macOS silent prints spool the original PDF through lp (#2359)
tokg-venv Nov 4, 2026
3c7c0cf
fix(docs): label-only compact style cards, full-size overflow menu (#…
tokg-venv Nov 4, 2026
d208e71
refactor(i18n): one table for the ribbon words docs and slides share …
tokg-venv Nov 4, 2026
224adb4
refactor(ui): shared AI-panel width persistence and attachment echo (…
tokg-venv Nov 4, 2026
da042b9
refactor(ui): one Escape path for dropdown dismissal, shared hook for…
tokg-venv Nov 4, 2026
a890ba1
feat(sheets): a note's picture shows under its popup (#2446)
tokg-venv Nov 4, 2026
4e2a46b
feat(ai): per-model thinking effort, resolved into each family's own …
tokg-venv Nov 4, 2026
53b459f
feat(docx): build a real SmartArt diagram (data/layout/style/drawing …
tokg-venv Nov 4, 2026
e62e711
fix(shell): drop the duplicated "try it" blocks from Settings - Integ…
tokg-venv Nov 4, 2026
d56918e
feat(slides): the print dialog offers a printer, copies and duplex (#…
tokg-venv Nov 4, 2026
2a4b025
feat(ppt2pptx): stage 1 of legacy .ppt import — editable text (#2444)
tokg-venv Nov 4, 2026
0c0f766
feat(xlsx-gateway, electron-utils): refresh a workbook's web and text…
tokg-venv Nov 4, 2026
2b679be
fix(pdf2docx): PowerPoint export keeps lines repeated on every page (…
NoeFaucher Nov 4, 2026
62deaba
fix(pdf2docx): every page-tracking number in a running header becomes…
NoeFaucher Nov 4, 2026
5b53ada
fix(pdf): new annotations carry the user as author, as a text string …
NoeFaucher Nov 4, 2026
7d76483
fix(sheets): a sorted formula keeps pointing at its own row (#2465)
NoeFaucher Nov 4, 2026
8169db8
fix(sheets): delete rows and columns whose own formulas refer only to…
NoeFaucher Nov 4, 2026
8ad8dc9
fix(pdf): the macOS lp print route sends the granted file path (#2483)
merrick-2002 Nov 4, 2026
18249ee
docs: run GenOffice on ChromeOS via Crostini (#2475)
tokg-venv Nov 4, 2026
de9f5a5
test(docs): hostile-input fuzz for the DOCX import surface (#2477)
tokg-venv Nov 4, 2026
5f15c9c
test(docs): section and header/footer knobs for the round-trip fuzz c…
tokg-venv Nov 4, 2026
9df55a8
fix(docs): a Chinese IME no longer jumps the caret past a bracket (#2…
tokg-venv Nov 4, 2026
87bc032
feat(cli): register the genoffice MCP server for DeepSeek Harness (ds…
tokg-venv Nov 4, 2026
37f4e27
feat(ai-provider): Stability AI and FLUX image providers, refreshed i…
tokg-venv Nov 4, 2026
44937f2
fix(docx): a nested child field's PAGE no longer classifies the paren…
tokg-venv Nov 4, 2026
5e9d110
feat(ai-search): add SearchApi as a web and image search provider (#2…
gabsferreira Nov 4, 2026
f944ec8
fix(sheets): the save refreshes every formula cache the engine comput…
tokg-venv Nov 4, 2026
7a21662
build(shell): config support for an arm64 Linux release target (#2474)
tokg-venv Nov 4, 2026
238a1fb
fix(sheets,cli): workbook-wide edit flag for the save's cache compari…
merrick-2002 Nov 4, 2026
0991986
fix(markdown): resolve all wanted keys, guard empty segments, scan fo…
aniruddhaadak80 Nov 4, 2026
479b545
refactor(legacy): the shared OLE2 opener moves into its own package (…
tokg-venv Nov 4, 2026
4b55db9
Sync snapshot (2026-11-04) (#2503)
merrick-2002 Nov 4, 2026
25dd2d5
docs(readme): the November feature wave reaches all 22 language pages…
tokg-venv Nov 5, 2026
3cef1bf
fix(docs): insert the gallery page number as a PAGE field (#2499)
MidsummerYU Nov 5, 2026
7dc82a6
fix(sheets): CSV export, PDF export and Print wait for the formula re…
MidsummerYU Nov 5, 2026
52d7048
feat(sheets): break and change-source for external links (#2350)
tokg-venv Nov 5, 2026
e2f2d23
feat(pdf): the print dialog offers a printer's driver options (#2360)
tokg-venv Nov 5, 2026
f8c1700
fix(sheets): external-link usage scan answers in the links envelope; …
merrick-2002 Nov 5, 2026
4cfbbb0
fix(pdf): keep lines a wrap cannot explain out of one text block (#2501)
MidsummerYU Nov 6, 2026
2072e5b
feat(sheets): persist slicers and timelines across save (#2226)
tokg-venv Nov 6, 2026
51a8ed4
fix(sheets): keep new table parts at worksheet level (#2511)
widechaos Nov 6, 2026
cf62903
fix(xlsx-gateway): materialize shared formula groups a row or column …
NoeFaucher Nov 6, 2026
76cc2e4
fix(sheets): a sort keeps the shared formula group it cuts (#2514)
NoeFaucher Nov 6, 2026
2febb45
fix(pdf): annotation author follows the Settings user name (#2515)
NoeFaucher Nov 6, 2026
427445a
fix(pdf2docx): PowerPoint export keeps each page's text on its own sl…
NoeFaucher Nov 6, 2026
e8c662f
fix(i18n): standardize Brazilian Portuguese localization (#2519)
tonmarcondes Nov 6, 2026
ffbd48f
feat(slides,cli): a legacy .ppt opens as a converted .pptx copy (#2509)
tokg-venv Nov 6, 2026
39374eb
fix(sheets): slicer restore reads the pivot cache definitions; slicer…
merrick-2002 Nov 6, 2026
1c314f0
fix(sheets): a sort right after opening shifts its formulas (#2524)
MidsummerYU Nov 6, 2026
d5ebe83
fix(slides): find macOS 26 downloadable fonts; measure fallback glyph…
gloomydumber Nov 6, 2026
ae0d862
fix(branding): replace remaining user-facing GenOffice strings with H…
Nov 6, 2026
af2165f
Merge upstream GenOffice main (v0.10.x, ~900 commits) into HermesOffice
Nov 6, 2026
1b353c4
fix(pdf): restore token-based night-mode background lost in upstream …
Nov 6, 2026
f32fdc1
fix: restore byte-flow attachments and adapt e2e to upstream guards
Nov 6, 2026
42b2297
chore(docs): annotate upstream emitter lines for inline-rules check
Nov 7, 2026
1bc9886
test(e2e): bound firstWindow and instrument codex-history stages
Nov 8, 2026
6b18838
test(e2e): clear firstWindow watchdog timer after race settles
Nov 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*.docx binary
*.xlsx binary
*.pptx binary
*.ods binary
*.pdf binary
*.png binary
*.ico binary
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Security vulnerability
url: https://github.com/genspark-ai/hermesoffice/security/advisories/new
url: https://github.com/criptogus/HermesOffice/security/advisories/new
about: Please report security issues privately, never as a public issue.
112 changes: 109 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,17 @@ jobs:
with:
workspaces: apps/sheets/native/xlsx-engine

# electron's postinstall downloads its binary from GitHub Releases on every
# fresh install; a cache hit skips the download (and its 5xx flakes)
- name: Cache electron binaries
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/.cache/electron
# own prefix: the build workflows' electron-* entries also hold
# ~/.cache/electron-builder, and a saved key is never updated
key: electron-bin-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
restore-keys: electron-bin-${{ runner.os }}-

- name: Install dependencies
run: npm ci

Expand Down Expand Up @@ -88,6 +99,78 @@ jobs:
fi
npm run check:theme-colors

# Inline text-layout decisions (script tests, face predicates, CJK ranges,
# compat reads) stay in apps/docs/src/renderer/text-layout/, not in the emitters.
- name: Check inline text-layout rules
env:
FORMAT_BASE_REF: ${{ github.event.pull_request.base.sha || github.event.before }}
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
FORMAT_BASE_REF=$(git rev-parse HEAD^1)
fi
npm run check:inline-rules

# Line-metric numbers (fonts.css size-adjust/overrides, knownLineFactor)
# must cite the Word measurement they came from.
- name: Check font-metric provenance
env:
FORMAT_BASE_REF: ${{ github.event.pull_request.base.sha || github.event.before }}
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
FORMAT_BASE_REF=$(git rev-parse HEAD^1)
fi
npm run check:font-metrics-provenance

# fonts.generated.css / line-factors.generated.ts must match the measurement
# manifest; metric values are never hand-written outside it.
- name: Check generated font metrics
env:
FORMAT_BASE_REF: ${{ github.event.pull_request.base.sha || github.event.before }}
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
FORMAT_BASE_REF=$(git rev-parse HEAD^1)
fi
npm run check:generated-fonts

# docs/word-truths-index.json and the coverage doc must match the fixtures;
# a recently dated truths section needs a fixture or a prose-only marker.
- name: Check Word truths coverage
run: npm run check:word-truths

# skills/*/SKILL.md ship to users' agent directories; a body change
# without a metadata.version bump would never be offered as an update.
- name: Check skill versions
env:
FORMAT_BASE_REF: ${{ github.event.pull_request.base.sha || github.event.before }}
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
FORMAT_BASE_REF=$(git rev-parse HEAD^1)
fi
npm run check:skill-version

# Whole-tree, not changed-files: every one of the manual's 21 languages
# has to match the English article's structure. A language that quietly
# falls behind is exactly what no reviewer sees, and it is invisible in a
# diff — the change that causes it looks like an ordinary translation.
- name: Check manual language coverage
run: npm run check:help-langs

# Added lines only: Han text outside locale tables, review-tool tags,
# feedback-ledger ids, sample-corpus ids, internal PR numbers, personal
# paths/e-mails, credentials, NUL bytes (tools/check-public-hygiene.mjs).
- name: Check public-repo hygiene
env:
FORMAT_BASE_REF: ${{ github.event.pull_request.base.sha || github.event.before }}
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
FORMAT_BASE_REF=$(git rev-parse HEAD^1)
fi
if [ -f tools/check-public-hygiene.mjs ]; then
node tools/check-public-hygiene.mjs
else
echo "public-hygiene gate not present in this checkout; skipped"
fi

# Keep tracked code comments and contributor-facing documentation
# English-only; functional CJK strings and AI prompt examples are allowed.
- name: Check comments/docs are English-only
Expand All @@ -108,10 +191,22 @@ jobs:
- name: Check committed fixtures match the generator
run: git diff --exit-code -- fixtures/generated

# CLI XLSX tests run before the Sheets workspace tests in npm test.
- name: Prepare Sheets engine and fixtures for CLI tests
# pptx-engine's OOXML schema gate validates saved decks with xmllint
# (tools/ooxml-validate); the runner image is not guaranteed to have it.
- name: Install xmllint
run: sudo apt-get update && sudo apt-get install -y --no-install-recommends libxml2-utils

# `sheet apply`'s dependent-cache audit lives in the Rust xlsx-sidecar, and
# the CLI suite skips its sidecar-backed tests (`it.skipIf(!sidecar)`) when
# the binary is missing. Only the sheets package's test script builds it,
# and the root `test` script runs @hermesoffice/cli before @hermesoffice/sheets —
# so build the sidecar up front or CI's pass proves nothing about the
# audit. The cargo cache above holds the target dir, so this is cheap.
- name: Build xlsx-sidecar (the CLI audit tests run against it)
run: |
npm run native:build -w @hermesoffice/sheets
# the sidecar-gated CLI tests read the generated compatibility fixture
# (gitignored, normally produced by the sheets gate below)
npm run fixtures -w @hermesoffice/sheets

- name: Test
Expand Down Expand Up @@ -150,6 +245,17 @@ jobs:
with:
workspaces: apps/sheets/native/xlsx-engine

# electron's postinstall downloads its binary from GitHub Releases on every
# fresh install; a cache hit skips the download (and its 5xx flakes)
- name: Cache electron binaries
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/.cache/electron
# own prefix: the build workflows' electron-* entries also hold
# ~/.cache/electron-builder, and a saved key is never updated
key: electron-bin-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
restore-keys: electron-bin-${{ runner.os }}-

- name: Install dependencies
run: npm ci

Expand Down Expand Up @@ -197,7 +303,7 @@ jobs:

- name: Upload E2E artifacts on failure
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: e2e-artifacts
path: |
Expand Down
5 changes: 5 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ coverage/
package-lock.json
apps/*/build/
apps/shell/build/THIRD-PARTY-NOTICES.txt
packages/font-metrics/word-faces.json
apps/docs/src/renderer/fonts/stand-in-boxes.json
apps/docs/tests/fixtures/font-metrics/
apps/docs/src/renderer/fonts/fonts.generated.css
apps/docs/src/renderer/line-factors.generated.ts

# Local-only acceptance drivers are intentionally outside CI.
scripts/drivers/driver.*.mjs
Expand Down
21 changes: 21 additions & 0 deletions NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,27 @@ checkout.
Bundled fonts and their licenses are documented in
apps/docs/src/renderer/fonts/README.md.

Downloadable fonts

Any app can offer additional font families, at the reader's request, from the
build-injected font mirror. Those families are not in the bundle and so are not
in that README; the catalogue is
packages/electron-utils/src/font-catalog.ts, and every family there carries its
SPDX licence id in a `license` field, checked against a permissive allowlist by
packages/electron-utils/tests/font-store.test.ts.

All of them are licensed under the SIL Open Font License, Version 1.1
(https://openfontlicense.org), which permits the bundling and redistribution
this application performs. The families are: Open Sans, Roboto, Lato,
Montserrat, Poppins, Inter, Source Sans 3, Oswald, Raleway, Nunito,
Merriweather, Playfair Display, Work Sans, Rubik, Noto Sans JP, Noto Sans KR,
Noto Sans SC, Noto Sans TC, Nanum Gothic, Noto Serif SC, Noto Serif TC,
Noto Serif JP, Noto Serif KR, Nanum Myeongjo.

Each downloaded file is verified against the sha256 recorded in the catalogue
before it is installed, and the catalogue states each family's size so an app
can ask before fetching tens of megabytes.

Unicode Character Database

apps/pdf/src/shared/radicals.ts contains a generated mapping derived from
Expand Down
10 changes: 5 additions & 5 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# GenOffice Privacy
# HermesOffice Privacy

Last updated: August 26, 2026

GenOffice opens, edits, and saves documents locally. Document editing does not
upload files to GenOffice. AI features require a network connection and send
HermesOffice opens, edits, and saves documents locally. Document editing does not
upload files to HermesOffice. AI features require a network connection and send
requests only when you use them.

## Usage analytics
Expand Down Expand Up @@ -49,12 +49,12 @@ email address.
Events are sent to Google Analytics 4 using the Measurement Protocol over
HTTPS. As the HTTPS recipient, Google necessarily sees the connection's public
IP address and transport metadata, and may use them for coarse geolocation and
security or spam-abuse processing. GenOffice does not add an IP address to the
security or spam-abuse processing. HermesOffice does not add an IP address to the
event payload.

## Data not collected by analytics

GenOffice analytics never sends:
HermesOffice analytics never sends:

- document content
- file names
Expand Down
19 changes: 14 additions & 5 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,22 @@ If you find a way for a layout script to reach anything beyond the injected
primitives (network, storage, IPC channels not reachable by design, or the
main process), that is a vulnerability — please report it.

## Threat Model: Rendering AI-Generated HTML (slides export)
## Threat Model: Rendering AI-Generated HTML

The HTML-to-pptx export pipeline renders AI-generated HTML in a hidden
`BrowserWindow`. That window is treated as hostile content: full renderer
Three pipelines render AI-generated or untrusted HTML in a hidden
`BrowserWindow`. Every window is treated as hostile content: full renderer
lockdown (`sandbox: true`, `contextIsolation: true`, `nodeIntegration: false`),
no preload script, no IPC surface — the main process drives it exclusively
through `executeJavaScript` and destroys it under a watchdog timeout.
no preload script, no IPC surface. The slides hidden windows only load the
app's own renderer and print HTML (PDF export, print, headless export); the
AI-HTML-to-pptx conversion runs inside the slides renderer, never in a hidden
window. The HTML app's DOCX export and the docs altChunk conversion drive their
windows exclusively through `executeJavaScript` under a watchdog timeout
(`Promise.race` against a fixed timeout, then `destroy()`), so a page whose
scripts never yield cannot strand the hidden window. HTML→DOCX
conversion renders the page with scripts enabled and does not sanitize the
markup before conversion — the output is a document, not a sandbox escape;
report it as a vulnerability if you find a way from the converted page into
the main process.

## Out of Scope

Expand Down
3 changes: 2 additions & 1 deletion apps/docs/electron.vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default defineConfig({
'@hermesoffice/docx-engine',
'@hermesoffice/electron-utils',
'@hermesoffice/font-metrics',
'@hermesoffice/xlsx-gateway',
],
}),
],
Expand All @@ -44,7 +45,7 @@ export default defineConfig({
plugins: [react()],
resolve: { alias: localAlias },
server: {
// Overridable so multiple genoffice dev instances can coexist (default 5173).
// Overridable so multiple hermesoffice dev instances can coexist (default 5173).
port: Number(process.env.DOCS_DEV_PORT) || 5173,
strictPort: Boolean(process.env.DOCS_DEV_PORT),
},
Expand Down
15 changes: 8 additions & 7 deletions apps/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,21 @@
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.0.4",
"electron": "^43.3.0",
"electron": "^43.8.3",
"electron-builder": "^26.0.12",
"electron-vite": "^5.0.0",
"jsdom": "^28.0.0",
"marked": "^17.0.6",
"officecrypto-tool": "^0.0.19",
"opentype.js": "^2.0.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"typescript": "^5.9.3",
"vite": "^7.3.1",
"vitest": "^4.1.11"
"vite": "^7.3.7",
"vitest": "^4.1.12"
},
"author": "GenOffice",
"author": "HermesOffice",
"build": {
"appId": "com.genoffice.docs",
"appId": "com.hermesoffice.docs",
"productName": "HermesOffice Docs",
"electronVersion": "43.3.0",
"artifactName": "AIDocx-${version}-${arch}.${ext}",
Expand Down Expand Up @@ -96,6 +95,8 @@
"electron-updater": "^6.8.9",
"pdf-lib": "^1.17.1",
"pdfjs-dist": "^6.2.108",
"@hermesoffice/pptx-render": "*"
"@hermesoffice/pptx-render": "*",
"@hermesoffice/xlsx-gateway": "*",
"@hermesoffice/agent-core": "*"
}
}
51 changes: 4 additions & 47 deletions apps/docs/src/main/atomic-write.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,7 @@
import { randomBytes } from 'node:crypto'
import { rename, unlink, writeFile } from 'node:fs/promises'
import { basename, dirname, join } from 'node:path'

/** Transient Windows codes: antivirus/indexer briefly locks the rename target. */
const RETRYABLE_RENAME_CODES = new Set(['EPERM', 'EACCES', 'EBUSY'])
const RENAME_RETRIES = 4

const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))

/**
* Same-dir temp file + rename, so a crash mid-write can't truncate the target.
* Rename-over-existing fails transiently on Windows under Defender/indexer
* locks: retry with backoff, then fall back to an in-place write — losing
* atomicity for that one save beats failing a save the previous plain
* writeFileSync would have completed.
*/
export async function atomicWriteFile(filePath: string, data: Buffer): Promise<void> {
const tmp = join(
dirname(filePath),
`.${basename(filePath)}.${randomBytes(6).toString('hex')}.tmp`,
)
try {
await writeFile(tmp, data)
for (let attempt = 0; ; attempt++) {
try {
await rename(tmp, filePath)
return
} catch (err) {
const code = (err as NodeJS.ErrnoException).code ?? ''
if (!RETRYABLE_RENAME_CODES.has(code) || attempt >= RENAME_RETRIES) throw err
await sleep(50 * 2 ** attempt)
}
}
} catch (err) {
try {
await unlink(tmp)
} catch {
/* tmp never created */
}
if (RETRYABLE_RENAME_CODES.has((err as NodeJS.ErrnoException).code ?? '')) {
await writeFile(filePath, data)
return
}
throw err
}
}
/// Imported from its own electron-utils subpath rather than the package
/// barrel: the barrel drags Electron-only modules into headless bundles, and
/// tests that mock the barrel would otherwise have to mock this helper too.
export { atomicWriteFile } from '@hermesoffice/electron-utils/atomic-write'

/** 'PK\x03\x04' local-file-header check — cheap docx/zip sanity test. */
export function looksLikeZip(bytes: Buffer): boolean {
Expand Down
Loading
Loading