Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
830 commits
Select commit Hold shift + click to select a range
1da0543
Give diagrams a description and draw them as vectors in print and export
XrxcGH Oct 15, 2026
b182fb4
Leave the earlier copy alone on a plain Export; Update the copy repla…
XrxcGH Oct 15, 2026
f84b766
Size the ENEX element cap to the app's attachment ceiling; grant the …
XrxcGH Oct 15, 2026
164195d
Check that every bundled asset and vendored crate has an attribution row
XrxcGH Oct 15, 2026
5a676fb
Add two-way task sync with Microsoft To Do and Google Tasks
XrxcGH Oct 15, 2026
667d79a
Add Send to Dropbox, Box, and a WebDAV server, and an ADR for iCloud …
XrxcGH Oct 15, 2026
a670aeb
Add Sync pen settings across devices, and wire the new commands, stri…
XrxcGH Oct 15, 2026
747fc6a
Merge origin/beta into feat-accounts-media
XrxcGH Oct 15, 2026
2aca4c3
Embed one paragraph and include embedded text in exports
XrxcGH Oct 15, 2026
2b60bde
Snap irregular closed outlines to editable freeform polygons, with a …
XrxcGH Oct 15, 2026
9b61131
Format and lint the vendored metafile crate; test EMF pictures in Pow…
XrxcGH Oct 15, 2026
9b689e5
Let the history retention setting reach the core
XrxcGH Oct 15, 2026
3d7e1d0
Write page properties into page.md front matter
XrxcGH Oct 15, 2026
d564838
Empty Trash and Delete forever
XrxcGH Oct 15, 2026
ba1b9ec
Delete history for a page, section, or notebook
XrxcGH Oct 15, 2026
e21f580
Unmount the properties bar after React finishes rendering
XrxcGH Oct 15, 2026
7b0fc36
Bring in page.md edits from other apps, and open page.md elsewhere
XrxcGH Oct 15, 2026
10c5949
Rename a notebook's folder with the notebook
XrxcGH Oct 15, 2026
e54d185
Change the notes folder from Settings > Storage
XrxcGH Oct 15, 2026
bc52413
Use const in the task sync test
XrxcGH Oct 15, 2026
e72bd2c
Add Zotero citations and bibliographies in the page
XrxcGH Oct 15, 2026
354da86
Speak Zotero's word-processor protocol from the shell
XrxcGH Oct 15, 2026
5a0b1ca
Draw ink and pictures in page gallery thumbnails
XrxcGH Oct 15, 2026
f319a09
Add the print crate and the commands that send a PDF to a printer
XrxcGH Oct 15, 2026
0495b11
Print to a printer from the print dialog
XrxcGH Oct 15, 2026
1339cc3
Write in text fields with the pen, add the delegated ink trail, and s…
XrxcGH Oct 15, 2026
64770e8
Add the laser pointer and fading ink to Present as slides
XrxcGH Oct 15, 2026
e7e3d44
Fuzz the importers and the search indexer
XrxcGH Oct 15, 2026
1dd1495
Keep the fuzz seed lines within the length limit
XrxcGH Oct 15, 2026
94a0d2c
Keep the palm known limits as they were, store the pen goldens as tex…
XrxcGH Oct 15, 2026
ef35832
Move is_app_url above create's doc comment
XrxcGH Oct 15, 2026
cf977d1
Import PDF files as pages to write on, with note space and handouts
XrxcGH Oct 15, 2026
cd4a254
Check notebook: broken links, page.md mismatches, real repairs with Undo
XrxcGH Oct 15, 2026
0b0bb98
Bundle Readability in the clipper and offer opennote://clip links in …
XrxcGH Oct 15, 2026
490a333
Add shares to the open page or Quick notes, and document Share to Ope…
XrxcGH Oct 15, 2026
7271817
Offer the opennote PATH choice in setup, link App permissions from Pr…
XrxcGH Oct 15, 2026
d9b2fc8
Add Insert > From phone: a QR code and a short-lived LAN HTTPS listen…
XrxcGH Oct 15, 2026
b97f461
Save a mind map as SVG, PNG, or PDF and build it with the pen
XrxcGH Oct 15, 2026
7f2a067
Add a clippy ratchet against new unwrap, expect, and panic in shipped…
XrxcGH Oct 15, 2026
26813f8
Keep the crash pointer behind the features' public modules
XrxcGH Oct 15, 2026
8f0cc8d
Record the shape benchmark baseline, stop sloppy rectangles snapping …
XrxcGH Oct 15, 2026
184dab6
Add a live collection block that updates as pages change
XrxcGH Oct 15, 2026
46eedcd
Test the shell and page QoL entry points
XrxcGH Oct 15, 2026
deca539
Cross-check exports and table formulas against pinned independent rea…
XrxcGH Oct 15, 2026
ec04035
Keep the cross-check workflow and corpus test within CHECKS
XrxcGH Oct 15, 2026
95114d4
Search archived pages, name the heading of a match, and look in trans…
XrxcGH Oct 15, 2026
37cf2ee
Import .doc, .rtf, .xls, .xlsb, and .ods files
XrxcGH Oct 15, 2026
c49b3fe
Fuzz the legacy-format readers
XrxcGH Oct 15, 2026
909e7c3
Offer older Office files in Import behind interop.legacyFormats
XrxcGH Oct 15, 2026
104d54e
Tell the voices apart in a transcript (A1-5)
XrxcGH Oct 15, 2026
2d04d5b
Dictate into the page with a spoken-punctuation parser (A2-24)
XrxcGH Oct 15, 2026
55855f3
Show live captions while a recording runs (A2-25)
XrxcGH Oct 15, 2026
f828698
Turn handwritten math into an equation (A1-28)
XrxcGH Oct 15, 2026
3e87d74
Insert embeds on an empty page, add UI tests for embeds and connector…
XrxcGH Oct 15, 2026
810d7e7
Say in the docs what the intel features do now
XrxcGH Oct 15, 2026
a00adfc
Describe the sync command in the import and export help
XrxcGH Oct 15, 2026
218a9fa
Extract ink and blocks, with one Undo and a history entry for extract…
XrxcGH Oct 15, 2026
19dc3ba
Bring the print wording within the prose checks
XrxcGH Oct 15, 2026
fe6d565
Offer weekday and monthly repeats, harden the palette helper, add stu…
XrxcGH Oct 15, 2026
3ae5972
Trim the vendored metafile notice and test metafile import in the app
XrxcGH Oct 15, 2026
7b2fbd4
Make POWER(0,0) a number error like Excel and record the other two di…
XrxcGH Oct 15, 2026
91c3b0a
Merge origin/beta into feat-tools-study
XrxcGH Oct 15, 2026
2f8b15f
Lock entry: a stamped, read-only page
XrxcGH Oct 15, 2026
4204cf7
Select text, highlight, dim PDFs in the dark theme, and clean up scans
XrxcGH Oct 15, 2026
1232563
Put a model engine behind the rule-based writing and answer engines (…
XrxcGH Oct 15, 2026
c1ef49b
Add Translate with language packs and formatting kept (A3-25, partial)
XrxcGH Oct 15, 2026
cde472f
Format the intel files the earlier commits left unformatted
XrxcGH Oct 15, 2026
fafb88d
Play recordings in web page exports and highlight the notes written w…
XrxcGH Oct 15, 2026
dda2d30
Put the pen library in the Width menu so the Draw bar keeps its pens …
XrxcGH Oct 15, 2026
11ea6c3
Ship the bundled fonts' license notices, check npm-bundled fonts for …
XrxcGH Oct 15, 2026
d81be70
Drag the corners of a scan by hand or move them with the arrow keys
XrxcGH Oct 15, 2026
92fa13b
Test Make handouts in the UI
XrxcGH Oct 15, 2026
9fff350
Speak Zotero's HTTP integration protocol, which its source shows, ins…
XrxcGH Oct 15, 2026
40637aa
Grant print_printers and print_submit once
XrxcGH Oct 15, 2026
f3493ca
Satisfy Clippy and update the detection test for older formats
XrxcGH Oct 15, 2026
542bd2b
Link the app manifest into every exe, so the shell's unit tests start
XrxcGH Oct 15, 2026
6b36f49
Derive the ENEX element cap from the attachment ceiling and check it …
XrxcGH Oct 15, 2026
f3e70e6
Merge origin/beta into feat-ink
XrxcGH Oct 15, 2026
fdb94cd
Merge origin/beta into feat-intel
XrxcGH Oct 15, 2026
ee5091f
Lint and test the recording player's export helpers
XrxcGH Oct 15, 2026
a28a30a
Close the print lane's gaps: notices, license check, CUPS stub test, …
XrxcGH Oct 15, 2026
fd5a892
Merge origin/beta into feat-storage-protect
XrxcGH Oct 15, 2026
256c1f7
Offer Export as Word from a page's Export menu
XrxcGH Oct 15, 2026
d20d5ed
Bring OneNote ink and attached files over as strokes and files
XrxcGH Oct 15, 2026
8c04b01
Merge origin/beta into feat-pages-search
XrxcGH Oct 15, 2026
5b2127f
Resume partial update downloads and graduate the metered-network and …
XrxcGH Oct 15, 2026
cc141aa
Merge remote-tracking branch 'origin/beta' into feat-qa-flags
XrxcGH Oct 15, 2026
f99524f
Fix the ink-shapes spec for the More menu and wait for the stroke ind…
XrxcGH Oct 15, 2026
23c812d
Use another off flag in the command tests after the installer flag wa…
XrxcGH Oct 15, 2026
c5dbe5a
Add the native engines crate with whisper.cpp as a speech backend (A1-3)
XrxcGH Oct 15, 2026
ca55f6a
Turn study tape into blanks with an answer key when printing or expor…
XrxcGH Oct 15, 2026
d1a174b
Document tape blanks in the study help
XrxcGH Oct 15, 2026
ec2d030
Open the Export dialog on Word from a page's Export as Word, and test…
XrxcGH Oct 15, 2026
07df5cc
Keep Dropbox, Box, and WebDAV copies up to date in the background, an…
XrxcGH Oct 15, 2026
982c492
Add the language model program, the model catalog with packs, and che…
XrxcGH Oct 15, 2026
8b0d957
Share one command registry across the local API, opennote, and MCP
XrxcGH Oct 15, 2026
f0367ea
Document the command registry, read-back tools, file roots, and authors
XrxcGH Oct 15, 2026
264f267
Count WebDAV among the connectors in the connector tests
XrxcGH Oct 15, 2026
b16b07e
Add ONNX translation and embedding engines with fixtures (A3-23, A3-25)
XrxcGH Oct 15, 2026
5d4a582
Split the page drawer into small steps and pass the repo checks
XrxcGH Oct 15, 2026
ba37b7d
Merge remote-tracking branch 'origin/beta' into feat-platform-api
XrxcGH Oct 15, 2026
78d4833
Protected sections in the core: sealed files, opened only in memory
XrxcGH Oct 15, 2026
036c16d
Keep an agent's author label from posing as another app
XrxcGH Oct 15, 2026
398bda3
Import OneNote section files and notebook packages
XrxcGH Oct 15, 2026
1b5db35
Let Copy MCP config name the assistant in page history
XrxcGH Oct 15, 2026
1e79d78
Add a UI test for Insert > From phone
XrxcGH Oct 15, 2026
d6cb9c7
Name the new opennote file folders as a breaking change
XrxcGH Oct 15, 2026
2ec59e5
Wire the language model, translation packs, and meaning model into th…
XrxcGH Oct 15, 2026
e70e7e2
Merge origin/beta into feat-pdf-interop
XrxcGH Oct 15, 2026
6ac4023
Add an E2E smoke spec for the local API in the real app
XrxcGH Oct 15, 2026
422586d
Put Import PDF after the Home tab's New buttons, last in the share group
XrxcGH Oct 15, 2026
f8307b9
Cap a OneNote package at 256 MB and let Cancel stop its unpacking
XrxcGH Oct 15, 2026
347ece5
Test OneNote import reaching the review, and the advice when the flag…
XrxcGH Oct 15, 2026
4215b83
Bring the lane's earlier files within the checks' error limits
XrxcGH Oct 15, 2026
f8e9461
Password-protected sections: protect, unlock, lock again, and Windows…
XrxcGH Oct 15, 2026
7758040
Open in another editor on macOS and Linux
XrxcGH Oct 15, 2026
0b65b85
Test dictation, captions, translate, models, and math pen on the web …
XrxcGH Oct 15, 2026
3c30a27
Keep protected pages' flashcards and Upcoming items out of browser st…
XrxcGH Oct 15, 2026
6a2fc07
Fake protected sections in the web build and test them end to end
XrxcGH Oct 15, 2026
8bd3c3e
Split the protect spec's opening comment into shorter sentences
XrxcGH Oct 15, 2026
d06d25e
Split the model downloads and the extension calls into smaller files,…
XrxcGH Oct 15, 2026
b1656d6
Test translation and meaning vectors through the shell with the nativ…
XrxcGH Oct 15, 2026
8991fea
Keep the open equation's actions visible and make the LaTeX specs sta…
XrxcGH Oct 15, 2026
1c5da40
Add DirectML for translation and meaning vectors as an opt-in build f…
XrxcGH Oct 15, 2026
cc75352
Keep the Draw tab's pens on the bar at 1440 px so the ink specs find …
XrxcGH Oct 15, 2026
2bb9048
Make the privacy and search specs ready for the extra network uses an…
XrxcGH Oct 15, 2026
bee40fb
Merge origin/fx-import-attach into beta
XrxcGH Oct 15, 2026
5e570f1
Merge origin/fx-windows into beta
XrxcGH Oct 15, 2026
1ba3551
Merge origin/fx-core-hang into beta
XrxcGH Oct 15, 2026
8596db2
Merge origin/fx-export into beta
XrxcGH Oct 15, 2026
d994791
Merge origin/fx-study-ink into beta
XrxcGH Oct 15, 2026
02aff46
Merge origin/fx-privacy-hotkey into beta
XrxcGH Oct 15, 2026
cc14f75
Share the window openings between bridge clones
XrxcGH Oct 15, 2026
349f37f
Merge origin/fm-platform-storage into beta
XrxcGH Oct 15, 2026
431b21f
Merge origin/fm-import-export into beta
XrxcGH Oct 15, 2026
f093c58
Merge origin/fm-ink-a into beta
XrxcGH Oct 15, 2026
2281ded
Merge origin/fm-ink-b into beta
XrxcGH Oct 15, 2026
67858bc
Merge origin/fm-ui-search-audio into beta
XrxcGH Oct 15, 2026
3c0a421
Merge origin/fm-study-math into beta
XrxcGH Oct 15, 2026
1908f7a
Give the tree events test's page the encrypted field
XrxcGH Oct 15, 2026
26da463
Merge origin/graphics-audit into beta
XrxcGH Oct 15, 2026
32c9063
Merge origin/feat-paper-snap into beta
XrxcGH Oct 15, 2026
a8e5769
Merge origin/feat-platform-api into beta
XrxcGH Oct 15, 2026
e7cadb4
Merge origin/feat-storage-protect into beta
XrxcGH Oct 15, 2026
e839864
Merge origin/feat-pdf-interop into beta
XrxcGH Oct 15, 2026
2106492
Merge origin/feat-intel into beta
XrxcGH Oct 15, 2026
48931e5
Merge origin/feat-ink into beta
XrxcGH Oct 15, 2026
6e5ea6f
Merge origin/feat-accounts-media into beta
XrxcGH Oct 15, 2026
542ca13
Merge origin/feat-pages-search into beta
XrxcGH Oct 15, 2026
f538468
Merge origin/feat-tools-study into beta
XrxcGH Oct 15, 2026
679a5bb
Merge origin/feat-qa-flags into beta
XrxcGH Oct 15, 2026
5273700
Merge origin/st-print into beta
XrxcGH Oct 15, 2026
8f095be
Merge origin/st-metafile into beta
XrxcGH Oct 15, 2026
ecaa46a
Merge origin/st-zotero into beta
XrxcGH Oct 15, 2026
2f32f9c
Merge origin/st-legacy-readers into beta
XrxcGH Oct 15, 2026
e89a2ed
Merge origin/st-ink-shape into beta
XrxcGH Oct 15, 2026
c8cc51a
Merge origin/st-quality into beta
XrxcGH Oct 15, 2026
9e2ba25
Wire cross-lane hooks after the Beta 5 merges
XrxcGH Oct 15, 2026
07631f9
Fix lint: search barrel export, error cause
XrxcGH Oct 15, 2026
38529c5
Checks: American spellings
XrxcGH Oct 15, 2026
04a4d60
Wireframes: size labels for the bundled fonts too, undo checks fixes …
XrxcGH Oct 15, 2026
fca8ffd
Checks: serial commas and rewording, article rules for usable, https,…
XrxcGH Oct 15, 2026
ee99e1b
Checks: contents lists, string wording, checker fixes for acronym phr…
XrxcGH Oct 15, 2026
67fcbd6
wip-checks
XrxcGH Oct 15, 2026
14732b2
Checks: wrap long lines, split long sentences, justified suppressions…
XrxcGH Oct 15, 2026
30aaada
Fix cross-lane test failures: highlight key refinement runs from the …
XrxcGH Oct 15, 2026
c40e39c
Update component tests for the merged lanes: flags, menu order, drawi…
XrxcGH Oct 15, 2026
9378788
Update menu and command bar tests for the merged lanes
XrxcGH Oct 15, 2026
7eaf7ff
Fix Rust test drift after the merges: first-edit version, attachment …
XrxcGH Oct 15, 2026
23620ac
Restore the FlagDef import, justify the tree menu test group
XrxcGH Oct 15, 2026
ccb6eb6
Give a local API connection slot back when its request thread fails t…
XrxcGH Oct 16, 2026
e52dc60
Forget a page's transcript and handwriting text when its section is e…
XrxcGH Oct 16, 2026
8a272d8
Leave a page's deck alone while the read of the deck store has failed
XrxcGH Oct 16, 2026
940583a
OneNote reader: one identification table per object group, no copy pe…
XrxcGH Oct 16, 2026
96ab99f
Let pages of an unlocked protected section start their in-memory journal
XrxcGH Oct 16, 2026
a03bac1
Lock protected sections from the main window only, on an app-wide idl…
XrxcGH Oct 16, 2026
f7c865a
Check Work offline and safe mode before every cloud transcription piece
XrxcGH Oct 16, 2026
89f42da
End a Zotero session when its page goes away, add a cancel command, a…
XrxcGH Oct 16, 2026
30ec3b7
OneNote reader: read shared run formats, heading styles, and tag defi…
XrxcGH Oct 16, 2026
b374d37
Ask about one change per app at a time, and refuse a notebook or sect…
XrxcGH Oct 16, 2026
f72b795
Pin the speech models to one Hugging Face commit and test that every …
XrxcGH Oct 16, 2026
296b17f
Count wrong pairing-code tries per sender, so a web page can't spend …
XrxcGH Oct 16, 2026
fc236fa
Refuse restoring a version in place over a locked entry
XrxcGH Oct 16, 2026
215d5c8
Say that an exit past a busy core loses unsaved edits of unlocked pro…
XrxcGH Oct 16, 2026
85651b6
OneNote import: borrow picture bytes, read pages one at a time, cap c…
XrxcGH Oct 16, 2026
26d852c
Hand a Canvas upload's redirect back instead of refusing it as a fore…
XrxcGH Oct 16, 2026
2ca5f81
Refuse webhook hosts in hex or octal IPv4 form and names that resolve…
XrxcGH Oct 16, 2026
9ed3fa7
Check that page.read and page.append name a page in the app backend (…
XrxcGH Oct 16, 2026
c9e8dd4
Format the API crate
XrxcGH Oct 16, 2026
f7a9dcb
Forget media text when a section is purged, not when a notebook is cl…
XrxcGH Oct 16, 2026
2259fdf
interop_reveal: refuse .. steps under a granted folder (R3-4)
XrxcGH Oct 16, 2026
6b1d3d6
OneNote import: check the picture budget before copying, keep picture…
XrxcGH Oct 16, 2026
0283c2d
Format the picture budget check
XrxcGH Oct 16, 2026
3638511
Merge remote-tracking branch 'origin/int-R2-storage-protect' into beta
XrxcGH Oct 16, 2026
a36969d
Merge remote-tracking branch 'origin/int-R3-untrusted-input' into beta
XrxcGH Oct 16, 2026
d18bb96
Merge remote-tracking branch 'origin/int-R4-features' into beta
XrxcGH Oct 16, 2026
ebd4ee7
Set the version to 0.1.0-beta.5; carry the dialog, toast and tool-win…
XrxcGH Oct 16, 2026
bac3537
Fix the UI suite for Beta 5: stable screenshots, unique landmark ids,…
XrxcGH Oct 16, 2026
2d9bfb5
Make Draw > Ink to shape switch off every kind of shape snapping (W2-1)
XrxcGH Oct 16, 2026
4851b4a
Name the freeform shape so snapping one no longer throws (W2-3)
XrxcGH Oct 16, 2026
8af0b6e
Recognise imported PDF pages without a lock; do not highlight the sam…
XrxcGH Oct 16, 2026
b206f8a
Search through the local API within the grant's notebooks, so the lim…
XrxcGH Oct 16, 2026
22d703d
Typed #word followed by a space becomes a page tag (W4-1)
XrxcGH Oct 16, 2026
9bd0879
opennote new --file refuses a refused or missing file instead of addi…
XrxcGH Oct 16, 2026
a7188db
The opennote tool takes the listener proof from the profile's own key…
XrxcGH Oct 16, 2026
f560142
Keep a transcript saved before its block draws (W4-2)
XrxcGH Oct 16, 2026
2d058c9
Webhook dialog says why an address on this PC or network is refused i…
XrxcGH Oct 16, 2026
300e145
Connect prompt: Allow shows as unavailable with no notebook picked (W…
XrxcGH Oct 16, 2026
dc32ee9
'Bring in notes when setup is done' opens the import window after set…
XrxcGH Oct 16, 2026
3e6dba5
A new file card or picture never lands on a block already there (W4-3)
XrxcGH Oct 16, 2026
8668ece
Local API read, inspect and export write tables as Markdown pipe tabl…
XrxcGH Oct 16, 2026
1507bbb
Setup accepts a notes folder beside or below the exe; only the exe's …
XrxcGH Oct 16, 2026
ccfcb7a
Snap a narrow trapezoid, a slanted parallelogram and a hand-drawn hou…
XrxcGH Oct 16, 2026
9fd00fb
Import report names footnote text as what isn't imported, not 'the no…
XrxcGH Oct 16, 2026
45d7eac
Import dialog lists older Office files and OneNote files when their i…
XrxcGH Oct 16, 2026
bfa5ee2
Format the Ink to shape switch and its test
XrxcGH Oct 16, 2026
21ad9e8
Audio: round lengths, step the position slider by seconds, report the…
XrxcGH Oct 16, 2026
396111c
Graph canvas keeps its height; canvas arrow labels draw over cards (W…
XrxcGH Oct 16, 2026
d73dd79
A link's context keeps the marks at its ends, such as the closing ]] …
XrxcGH Oct 16, 2026
61ae99c
Folder import names the Office files of another kind it leaves out, i…
XrxcGH Oct 16, 2026
a18cb5f
Import window shows the check's reasons when nothing can be imported,…
XrxcGH Oct 16, 2026
e70ac47
The linked pages pane leaves room beside the page; a restored scroll …
XrxcGH Oct 16, 2026
e9f6c7e
Pasting or dropping an .emf or .wmf file adds a picture through the s…
XrxcGH Oct 16, 2026
59a4d71
The read aloud bar no longer covers the page title (W4-11)
XrxcGH Oct 16, 2026
9e1095f
Name the Look in choice for what it searches: descriptions and text r…
XrxcGH Oct 16, 2026
ad2e118
Replace previews and Ask excerpts end between words, with an ellipsis…
XrxcGH Oct 16, 2026
01b0d5e
A notebook opened from outside the tree, such as Import's Open notebo…
XrxcGH Oct 16, 2026
578cd2e
Replace previews and Ask excerpts end between words, with an ellipsis…
XrxcGH Oct 16, 2026
79c6b9a
Expect a parallelogram 18 degrees off square to snap (W2-2)
XrxcGH Oct 16, 2026
e6f0bca
Keep Ctrl+Z on the shown page when focus fell to nothing (W2-4, W2-5)
XrxcGH Oct 16, 2026
024ad3d
Follow the page view through undo and redo in ink groups, links and l…
XrxcGH Oct 16, 2026
4ae048f
Name selects by their label alone; a lone connector card is its own h…
XrxcGH Oct 16, 2026
9976de1
Entry lock: the stamp banner floats over the page instead of behind i…
XrxcGH Oct 16, 2026
b7549b1
Format
XrxcGH Oct 16, 2026
b92b908
Open a link on handwriting by clicking or tapping it with Select and …
XrxcGH Oct 16, 2026
8562564
Refresh the graph and connectors baselines (W4-8, W4-14)
XrxcGH Oct 16, 2026
fe2d936
A refused move into or out of a password-protected section says so, i…
XrxcGH Oct 16, 2026
6158241
Refuse a pen set past the twelfth, and keep a pen's width across pen …
XrxcGH Oct 16, 2026
407ad6a
Format the walk fixes with rustfmt
XrxcGH Oct 16, 2026
bbae6d5
Collect like terms when simplifying: 2x+3x+x is 6x (W2-10)
XrxcGH Oct 16, 2026
ae2d61b
Put the caret on a new line after typing $$x^2$$ (W2-11)
XrxcGH Oct 16, 2026
1a970d2
Refuse a calculated column formula that reads the column it fills (W2…
XrxcGH Oct 16, 2026
83c14b3
Narrow a new column so a table that fitted its page still fits (W2-13)
XrxcGH Oct 16, 2026
83ce7c9
Leave hidden ink layers out of the ink.svg sidecar (W2-16)
XrxcGH Oct 16, 2026
6b9df3f
Offer Insert graph and Insert equation on the Insert tab before the p…
XrxcGH Oct 16, 2026
01c3005
Keep the new comments and headers within the line and sentence limits
XrxcGH Oct 16, 2026
70ac175
UI suite: the import dialog lists the new formats, and an opened impo…
XrxcGH Oct 16, 2026
f301780
Reword the notes-folder check's comment for the prose checks
XrxcGH Oct 16, 2026
f2cc723
Merge remote-tracking branch 'origin/w5-ink-undo-math-tables' into beta
XrxcGH Oct 16, 2026
eb53e93
Merge remote-tracking branch 'origin/w5-search-audio-pdf-pageview' in…
XrxcGH Oct 16, 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.
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@
*.jpg binary
*.ico binary
*.woff2 binary
# Files saved by Word and Excel, kept byte for byte.
crates/interop/tests/data/legacy/* binary
130 changes: 95 additions & 35 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ on:
# caller's event, so a release run is a push here and runs CHECKS on all files.
workflow_call:

# Every action is pinned to a full commit SHA, with the version in a comment. The release workflow runs these jobs
# in the same run as its build and signing, so they could upload artifacts to it. workflow.test.ts checks the pins.
#
# Every job only reads the repository. A called workflow can narrow the caller's permissions but never widen
# them, so the release workflow's own read-only grant for this call still works. Uploading the debug build
# as a run artifact uses the runner's own token, not GITHUB_TOKEN, so no job needs more than this.
Expand All @@ -25,16 +28,21 @@ jobs:
# Normally 1 to 3 minutes. A run that passes its limit is stuck, so it ends and says so.
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
fetch-depth: 0
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: npm
- name: Install tools
run: npm ci
# The PDF tests print Japanese words and check every character reaches the PDF's text layer. Windows has a
# Japanese font; Ubuntu runners have none, so Chrome draws empty boxes that carry no text.
- name: Install a Japanese font (Ubuntu)
if: runner.os == 'Linux'
run: sudo apt-get update -q && sudo apt-get install -y -q --no-install-recommends fonts-noto-cjk
- name: Design tokens are up to date
run: npm run tokens:check
- name: Type-check, lint, and format-check
Expand All @@ -44,8 +52,8 @@ jobs:
- name: CHECKS on changed files (pull requests)
if: github.event_name == 'pull_request'
run: node checks/cli.ts --base origin/${{ github.base_ref }}
- name: CHECKS on all files (pushes)
if: github.event_name == 'push'
- name: CHECKS on all files (pushes and release dry runs)
if: github.event_name != 'pull_request'
run: node checks/cli.ts --all

components:
Expand All @@ -58,10 +66,10 @@ jobs:
# Normally under 2 minutes.
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: npm
Expand All @@ -72,7 +80,7 @@ jobs:
- name: Keep the failure screenshots
# Vitest saves a screenshot of the page for each failed test.
if: failure()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: component-failures-${{ matrix.os }}
path: app/.vitest/attachments
Expand All @@ -85,10 +93,10 @@ jobs:
# Normally about 5 minutes.
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: npm
Expand Down Expand Up @@ -119,7 +127,7 @@ jobs:
run: npx playwright test --config tests/ui/playwright.config.ts
- name: Keep the Playwright report
if: failure()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: playwright-report
path: |
Expand All @@ -134,10 +142,10 @@ jobs:
runs-on: windows-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: npm
Expand All @@ -147,29 +155,57 @@ jobs:
run: npm run perf:typing
- name: Keep the numbers
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: perf-typing
path: tests/perf/typing/results
retention-days: 30

native-engines:
# whisper.cpp, ONNX Runtime, and the language model program need CMake, a C++ compiler, and libclang, so the other
# jobs leave them out. This one builds and tests them on Windows, where the release builds them.
runs-on: windows-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # v1
with:
toolchain: stable
components: clippy
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
- name: Clippy
env:
LIBCLANG_PATH: C:\Program Files\LLVM\bin
run: |
cargo clippy -p opennote-intel-engines --all-targets --features whisper-cpp,onnx -- -D warnings
cargo clippy -p opennote-llm --all-targets --features llama -- -D warnings
- name: Tests
env:
LIBCLANG_PATH: C:\Program Files\LLVM\bin
run: |
cargo test -p opennote-intel-engines --features whisper-cpp,onnx
cargo test -p opennote-llm --features llama

windows-app:
# Rust checks and a test build of the desktop app on Windows, the first target platform.
runs-on: windows-latest
# Normally about 11 minutes with a cold cache.
timeout-minutes: 35
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: npm
- uses: dtolnay/rust-toolchain@stable
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # v1
with:
toolchain: stable
components: clippy, rustfmt
- uses: Swatinem/rust-cache@v2
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
- name: Install tools
run: npm ci
- name: Build the interface (the Rust app embeds it)
Expand All @@ -178,8 +214,18 @@ jobs:
run: cargo fmt --all -- --check
- name: Clippy
run: cargo clippy --workspace --all-targets -- -D warnings
- name: Clippy ratchet (no new unwrap, expect, or panic in shipped code)
# Existing uses are counted per file in checks/data/clippy-ratchet.json. A count may go down, never up.
run: node checks/clippy-ratchet.ts
- name: Rust tests
run: cargo test --workspace
- name: The notes contract suite against the app's notes bridge and the core
# The suite runs the notes harness example over stdin and stdout.
shell: bash
run: |
cargo build -p opennote --example notes_harness
export OPENNOTE_NOTES_HARNESS="$PWD/target/debug/examples/notes_harness.exe"
npx vitest run --config app/vitest.config.ts --project unit app/src/services/notes/core
- name: Core lints and tests with every feature
run: |
cargo clippy -p opennote-core --all-targets --all-features -- -D warnings
Expand All @@ -193,7 +239,7 @@ jobs:
- name: Test build of the app (ci profile, with the test endpoints the E2E tests use)
run: npx tauri build --no-bundle --features test-endpoints -- --profile ci
- name: Keep the test build
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: opennote-e2e-exe
path: target/ci/opennote.exe
Expand All @@ -207,28 +253,30 @@ jobs:
# session holds the runner for GitHub's six-hour default.
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: npm
- uses: dtolnay/rust-toolchain@stable
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # v1
with:
toolchain: stable
- name: Install tools
run: npm ci
- name: Cache tauri-driver
uses: actions/cache@v4
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ~/.cargo/bin/tauri-driver.exe
key: tauri-driver-2.1.0-${{ runner.os }}-${{ runner.arch }}
- name: Cache msedgedriver
uses: actions/cache@v4
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: tests/e2e/.drivers
key: msedgedriver-${{ runner.os }}-${{ runner.arch }}-${{ github.run_id }}
restore-keys: msedgedriver-${{ runner.os }}-${{ runner.arch }}-
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: opennote-e2e-exe
path: target/e2e
Expand All @@ -252,7 +300,7 @@ jobs:
- name: Keep the E2E logs
# A step that times out is canceled, not failed, and its logs are the ones worth reading.
if: failure() || cancelled()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: e2e-logs
path: tests/e2e/logs
Expand All @@ -264,23 +312,33 @@ jobs:
# Normally about 10 minutes with a cold cache.
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@stable
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # v1
with:
toolchain: stable
components: clippy, rustfmt
- uses: Swatinem/rust-cache@v2
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
- name: Clippy for the core, the kill harness, and the benchmarks
run: >-
cargo clippy -p opennote-core -p opennote-crashtest -p opennote-perf
--all-targets --all-features -- -D warnings
- name: Core tests with every feature
run: cargo test -p opennote-core --all-features
- name: Print crate tests, with stand-in lp and lpstat scripts
run: cargo test -p opennote-print
- uses: taiki-e/install-action@1168f6810a3cb30a3514bf5756a3b7f0422c6df8 # v2.87.28
with:
tool: cargo-deny
- name: Licenses of every crate the build uses
run: cargo deny check licenses
- name: Benchmark harness tests
run: cargo test -p opennote-perf
- name: Fuzz targets compile
run: cargo check --manifest-path crates/core/fuzz/Cargo.toml
run: |
cargo check --manifest-path crates/core/fuzz/Cargo.toml
cargo check --manifest-path crates/interop/fuzz/Cargo.toml
- name: No work package stubs are left (pull requests into main)
if: github.event_name == 'pull_request' && github.base_ref == 'main'
run: |
Expand All @@ -295,15 +353,17 @@ jobs:
# Normally about 5 minutes with a cold cache.
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: npm
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # v1
with:
toolchain: stable
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
- name: Install tools
run: npm ci
- name: Rust fixture tests
Expand All @@ -317,10 +377,10 @@ jobs:
# Normally under 1 minute.
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-python@v5
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: '3.x'
- name: Reference reader tests
Expand Down
66 changes: 66 additions & 0 deletions .github/workflows/crosscheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: crosscheck

# A second opinion on OpenNote's exports and table formulas, from independent readers. They are built from pinned
# revisions of open-source projects (tests/crosscheck/pins.json).
# - wordcraft-cli reads DOCX.
# - gridcraft-cli reads XLSX and evaluates formulas.
# - deckcraft-cli reads PPTX.
# - pdfcraft-cli reads PDF, with its accessibility check and PDF/A preflight.
#
# This job never blocks a merge. Those projects are alpha software and not ground truth, so a difference means
# "look" and shows up as a warning. Nothing from them ships with OpenNote. See docs/CHECKS.md, "Cross-checks".
on:
workflow_dispatch:
schedule:
- cron: '41 3 * * 1'
pull_request:
paths:
- 'crates/interop/src/export/**'
- 'crates/interop/src/docx/**'
- 'app/src/features/pages/pdf/**'
- 'app/src/features/tables/engine/**'
- 'tests/crosscheck/**'
- '.github/workflows/crosscheck.yml'

permissions:
contents: read

jobs:
crosscheck:
runs-on: ubuntu-latest
# A failure of the job itself (a tool that did not build) must not turn a pull request red.
continue-on-error: true
# The first build of the four tools takes about 25 minutes. A run that passes the limit is stuck.
timeout-minutes: 60
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: npm
- uses: dtolnay/rust-toolchain@02cb101ec7c40f2c49e1d9714d64511d8e1b74de # v1
with:
toolchain: stable
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
- name: Install tools
run: npm ci
- name: Build the cross-check tools from their pinned revisions
run: npm run crosscheck:install
- name: Make the corpus of exports
run: node tests/crosscheck/corpus.ts
- name: Check the exports with the other readers
run: node tests/crosscheck/run.ts --json crosscheck.json
- name: Compare table formulas with gridcraft-cli
run: npm run crosscheck:formulas
- name: Keep the corpus and the report
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: crosscheck
path: |
tests/crosscheck/.corpus
crosscheck.json
if-no-files-found: ignore
retention-days: 14
Loading
Loading