- β
- β
- October 24, 2026
-
π crosspoint-reader/crosspoint-reader v2.0.0rc release
CrossPoint 2.0.0
What a busy month. A lot of new features landed in CrossPoint, and we're eager to hear what you think.
New devices
This release adds support for four ESP32-S3-based devices: the Metalio E-Ink 4, the EEGO A4 (standard and Lite versions), and the BOOX Picco. If you're thinking of buying one, you'll find links at https://crosspointreader.com/devices. That page uses our affiliate links, so buying through it helps support CrossPoint.
SD card plugins
CrossPoint now supports plugins installed on the SD card. A plugin can add book catalogs and downloads to the reader, or tools to the device's web interface. To show the Plugins entry on Home, enable Plugins under Settings β Connectivity.
Plugins are not apps that run arbitrary code on the reader. On-device plugins use the screens and operations the firmware already provides, such as sign-in, catalogs, downloads, and supported reading events. They can't replace the reading engine, install hardware drivers, or add unsupported document formats.
Some plugins include JavaScript, but that code runs in a browser on your phone or computer, so the browser page has to stay open while it works. For example, a browser plugin can turn articles or RSS feeds into an EPUB, which you then read on the device.
The plugin system will stay focused on reading and book services. It won't become a platform for on-device games, calculators, notepads, writing apps, web browsers, or PDF rendering. Those remain outside CrossPoint's scope, plugins included.
Bluetooth page turners
Bluetooth page turners now work on all devices. Go to Settings β Connectivity β Bluetooth Page Turner to scan for a remote, pair it, and map its buttons. Short and long presses can trigger different actions: page turns, chapter navigation, the reader menu, and clipping selection.
Highlights and clippings
You can now select text in EPUBs, highlight passages, and save excerpts as clippings. On button devices, use the reader menu. On touch devices, hold a word and drag the selection handles. Selected text also works for dictionary lookup, including multi-word phrases. If you turn on Sync Clippings, clippings can sync through a compatible CrossPoint Sync server.
EPUB formatting and reading controls
EPUB rendering now handles more of what books actually contain: drop caps, small caps, mixed text sizes, borders, and shaded blocks. Tables take column content, cell padding, and borders into account. Headings stay attached to the text that follows them, and paragraph indentation has its own setting. EPUBs can also show non-interlaced GIF images, covers included.
Noto Serif is now optional
To free up space for all of this, Noto Serif moved from a built-in font to an optional SD card font. If you use it, install
NotoSerifthrough Manage Fonts before or after upgrading. Without it, a Noto Serif selection falls back to Noto Sans.
Libron also available for direct download from the font manager.Everything else
- OPDS, the catalog format used to browse and download books, now supports version 2.0 alongside existing catalogs.
- The device web interface has a new look and more consistent dialogs.
- Settings are grouped into a cleaner layout that's easier to extend.
- Touch devices get swipe-to-delete in the file browser and a few other places.
- Azerbaijani is now available as a UI language.
We also added a device comparison page to the website, for anyone who wants a CrossPoint device but can't decide which one: https://crosspointreader.com/device-comparison.
What's Changed
- fix: update keyboard layout and look by @uxjulia in #3755
- test: include in library builder storage stub by @suhsoohong in #3765
- feat: navigate lists on button press by @Uri-Tauber in #3754
- fix: Footnote selection with power button by @Uri-Tauber in #3766
- docs(dictionary): recommend unzipping .dict.dz files on devices without PSRAM. by @brianhuster in #3768
- perf: remove ButtonNavigator allocation churn by @serialx in #3698
- refactor(reader): unify TXT and Markdown rendering via EPUB pipeline by @brianhuster in #3704
- fix: let Back leave File Transfer during a slow HTTP upload by @martinqnguyen in #3732
- feat: settings checkbox by @Uri-Tauber in #3773
- perf: keep FAT sectors in a separate SdFat cache by @serialx in #3685
- feat: Add configurable EPUB paragraph indentation by @meat-holic in #3727
- chore: clean dead code by @Uri-Tauber in #3805
- feat: SD card based plugin system by @itsthisjustin in #3114
- fix: reopen on the viewed page after following a link by @suhsoohong in #3764
- fix: Remove BQ27220 battery current USB detection for X3 by @itsthisjustin in #3809
- chore: change "Footnotes" label to "Links and footnotes" by @Uri-Tauber in #3808
- fix: Add per-book content key storage and plugin isolation by @itsthisjustin in #3824
- fix: keep reopened books from pinning the heap by @serialx in #3830
- fix(bidiutils): canonicalize reversed tuple in emission path by @Uri-Tauber in #3834
- fix: stop books with thousands of chapters aborting the index build by @martinqnguyen in #3733
- fix: keep SD-font kerning and ligatures in edge cases by @serialx in #3838
- fix: stop dropping log lines at the low-power clock by @serialx in #3737
- fix: hold the power mode mutex while switching to low-power by @martinqnguyen in #3847
- perf: avoid list navigation callback allocations by @serialx in #3848
- feat: Add support for Metalio E-Ink 4 device by @itsthisjustin in #3825
- fix: lend the framebuffer to the chapter build's image dimension probe by @osakanataro in #3802
- fix(webdav): GET sends one byte per file, since HalFile wrapped FsFile by @rfordinal in #3410
- perf: skip unused Arduino SDK libraries by @Uri-Tauber in #3857
- fix: add plugin-manager to return-selection mapping by @Uri-Tauber in #3864
- fix: stable tip positions in keyboard activity by @Uri-Tauber in #3863
- fix: Center button hints using the actual text height by @Uri-Tauber in #3865
- fix: preserve paragraph continuity across soft flushes by @brianhuster in #3875
- fix: scope Git version to sources that use it by @Uri-Tauber in #3860
- feat: Add vector font (.ttf/.otf) upload support in webserver by @itsthisjustin in #3717
- feat: render redaction blocks without a special font by @uxjulia in #3882
- fix: load the X3 battery capacity into its BQ27220 fuel gauge by @martinqnguyen in #3730
- perf: stop SD-font caches from splitting the heap while reading by @serialx in #3831
- feat: eego a4 support by @Uri-Tauber in #3887
- feat(kosync): add server profiles and extended metadata by @jadehawk in #3804
- perf: Batch page-position reads by @Uri-Tauber in #3899
- docs: clarify non-Latin UI fallback isn't CJK-specific by @YuunJiee in #3873
- fix: show popup for kosync server type selector by @jadehawk in #3905
- chore: refactor agents guidelines by @Uri-Tauber in #3890
- feat: JPEG file viewer by @Uri-Tauber in #3918
- fix(KOSync): resolve upload XPaths for text outside
<p>/<li>by @brendanlefebvre in #3923 - feat: complete Azerbaijani translation and add Ζ/Ι glyph support by @kheyyam in #3842
- fix: add currency, letterlike, minus to latin-ext by @stefanvanburen in #3801
- feat: add ability to clip/highlight text for EPUBs by @uxjulia in #3589
- fix: add non-CJK GUI fallback font support by @YuunJiee in #3484
- feat(dict): support looking up multiple tokens using clipping feature by @brianhuster in #3932
- fix(kosync): advertise percentage progress support by @mehalter in #3219
- fix: Metalio E-Ink 4 powers off fully when it sleeps by @eszter007 in #3944
- fix: say why an OPDS feed fetch failed by @MrcRjs in #3872
- chore: yet more refinment of agents guidelines by @Uri-Tauber in #3951
- fix: Sub-chapter contents navigation by @Uri-Tauber in #3946
- style: refresh device web UI by @cdmoro in #3950
- fix: update SDK to resolve X3 anti-aliasing freeze by @serialx in #3960
- feat: Swipe to delete by @Uri-Tauber in #3712
- fix: prevent FilesPage modal from closing when selecting text by @Crestwave in #3931
- perf(zip): scan the central directory in one read per entry by @hamaluik in #3955
- docs: list Paper Mono in frontlight guide by @muness in #3968
- feat: Add custom HTTP headers for OPDS and KOReader Sync by @sergmetelin in #3016
- feat: Add "Footnotes and links" option to long press menu button by @pmiossec in #3851
- fix: wrap plugin event disclosures to fit screen by @lpla in #3837
- fix: normalize web upload filenames to NFC by @serialx in #3961
- feat: offer Libron in Manage Fonts downloads by @phucisstupid in #3971
- docs: clarify scope for reusable downstream primitives by @kivarun in #3821
- fix(layout): allow breaking line after hyphens, dashes by @brianhuster in #3883
- fix: dictionary back overflow bug by @Uri-Tauber in #3987
- fix: Respect content area insets and corner radius in UI by @itsthisjustin in #3986
- fix: Add WiFi TX power limit configuration by @itsthisjustin in #3993
- feat: hide dictionary entry when none configured by @pmiossec in #3990
- fix: add sleep screen confirmation by @Uri-Tauber in #3994
- test: run standalone UI regressions with CTest by @phucisstupid in #3991
- fix: refresh Library after plugin book installs by @georborodin in #3997
- fix(time): Use RTC for plugin time by @dasJ in #3879
- feat: Adds OPDS 2.0 support by @itsthisjustin in #3629
- feat: add global plugin system toggle and optional plugin hub bootstrap by @jadehawk in #3877
- fix: keep cumulative spine sizes in book.bin instead of RAM by @martinqnguyen in #3784
- feat: Bluetooth page turner (one module owns the BLE radio) by @martinqnguyen in #3785
- feat: Settings grouping by @digitaltembo in #3862
- refactor: Implement dialogs, consistent promps, polish js logic by @cdmoro in #3984
- fix: recognize AES-256-CBC manifests by @jadehawk in #4016
- feat: move NotoSerif to optional SD font by @Uri-Tauber in #4022
- fix: preserve CSS styles under low memory by @serialx in #4032
- feat: Improve epub rendering by @itsthisjustin in #3891
- docs: explain IPA in dictionary pronunciations by @jokot in #4034
- fix: flush pending word before a block opens by @jokot in #4030
- fix: prevent font-size crash in the Text panel by @serialx in #4041
- fix: XTCH books missing from library, XTC books show filename and unknown author by @eszter007 in #4023
- refactor: remove unused checkbox icon helper by @phucisstupid in #4059
- refactor: remove unused zlib header helper by @phucisstupid in #4057
- refactor: remove unused rectangle touch helper by @phucisstupid in #4058
- refactor: remove unused image existence helper by @phucisstupid in #4060
- fix: keep the BLE radio off in a book when no remote is chosen by @martinqnguyen in #4074
- feat: support static GIF images in EPUBs by @lpla in #2299
- feat: Add support for BOOX Picco device by @itsthisjustin in #3947
- fix: avoid restoring stale home cover pixels by @lpla in #4076
- fix: defines incomplete-type owner lifecycles out of line by @lpla in #2643
New Contributors
- @suhsoohong made their first contribution in #3765
- @martinqnguyen made their first contribution in #3732
- @meat-holic made their first contribution in #3727
- @rfordinal made their first contribution in #3410
- @brendanlefebvre made their first contribution in #3923
- @kheyyam made their first contribution in #3842
- @stefanvanburen made their first contribution in #3801
- @mehalter made their first contribution in #3219
- @MrcRjs made their first contribution in #3872
- @Crestwave made their first contribution in #3931
- @hamaluik made their first contribution in #3955
- @muness made their first contribution in #3968
- @sergmetelin made their first contribution in #3016
- @pmiossec made their first contribution in #3851
- @phucisstupid made their first contribution in #3971
- @kivarun made their first contribution in #3821
- @georborodin made their first contribution in #3997
- @digitaltembo made their first contribution in #3862
- @jokot made their first contribution in #4034
Full Changelog :
1.6.5...2.0.0rc -
π r/Harrogate Leeds Utd rss
Are the Harrogate Whites meeting anywhere tomorrow?
submitted by /u/gregthesailor
[link] [comments] -
π roboflow/supervision supervision-0.31.2 release
v0.31.2 β Pascal VOC boxes that match the devkit
A bug-fix release: Pascal VOC boxes now follow the devkit convention, and a batch of crashes on edge-case inputs is gone.
- Pascal VOC export and import use the devkit's box indices, so Detectron2 and other readers see the boxes you wrote.
- Gemini 2.5 and 3.5 masks survive boxes that leave the 0-1000 range instead of failing the whole response.
- Crop and icon annotators draw on grayscale scenes.
- Half-precision box centers stay finite instead of turning into
inf. - JSON sinks, dataset exports and the video reader stop losing data when something goes wrong.
Drop-in upgrade, with one catch: box-only Pascal VOC objects written by earlier versions now load one pixel larger on the right and bottom edges. The migration guide below shows how to fix them.
β¨ Spotlights / highlights
Pascal VOC boxes follow the devkit
DetectionDataset.as_pascal_vocandfrom_pascal_vocnow treat<bndbox>indices as 1-based and inclusive, shifting onlyxminandyminby one, which is what Detectron2 and other devkit readers expect. Export also rounds corners to the nearest pixel instead of truncating them, so a YOLO box thatfrom_yololoads with float noise no longer grows a pixel. Box-only objects written by 0.31.1 and earlier carry an extra +1 inxmaxandymax; objects exported from masks already used the devkit maxima. (#2748, #2780)# `dataset` holds one box [10, 20, 40, 60] dataset.as_pascal_voc( images_directory_path="images", annotations_directory_path="annotations" ) # <bndbox>: xmin=11 ymin=21 xmax=40 ymax=60 (0.31.1: xmax=41 ymax=61) # a YOLO box loaded as [0, 0, 37.0000001, 29.0000001]: 1 1 37 29 (0.31.1: 1 1 38 30)Gemini masks survive boxes outside the 0-1000 range
Detections.from_vlmwithVLM.GOOGLE_GEMINI_2_5orVLM.GOOGLE_GEMINI_3_5raisedValueErroras soon as abox_2dcoordinate went above 1000 or below 0, even by one, and you lost every detection in the response. The mask is now cropped to the part of its box inside the image, a box wholly outside gets an all-false mask, and boxes inside the image produce the same masks as before. (#2793)import supervision as sv # one item: {"box_2d": [500, 500, 1001, 1001], "label": "cat", "mask": "data:image/png;base64,..."} detections = sv.Detections.from_vlm( sv.VLM.GOOGLE_GEMINI_3_5, result, resolution_wh=(1000, 800) ) detections.mask.shape, int(detections.mask.sum()) # ((1, 800, 1000), 200000) # 0.31.1: ValueError: could not broadcast input array from shape (400,501) into shape (400,500)Crop and icon annotators on grayscale scenes
CropAnnotatorandIconAnnotatorused to raiseIndexErrororValueErroron scenes shaped(H, W)or(H, W, 1), or given as a Pillow"L"image. Crops now keep the scene's channel layout, and icons are drawn as their gray luminance, blended by their alpha channel. (#2788)import numpy as np import supervision as sv scene = np.zeros((100, 100), dtype=np.uint8) scene[20:60, 20:60] = 200 detections = sv.Detections( xyxy=np.array([[20, 20, 60, 60]], dtype=float), class_id=np.array([0]) ) sv.CropAnnotator().annotate(scene.copy(), detections).shape # (100, 100) (0.31.1: IndexError: tuple index out of range)Half-precision boxes that stay finite
sv.scale_boxesandDetections.get_anchors_coordinatesnow compute box centers without overflowingfloat16: a box from 40000 to 60000 used to report aninfcenter.DetectionsSmootheralso compares oriented-box corner distances infloat64, which stopsfloat16and narrow integer coordinates from overflowing; integer coordinates beyond2**53still lose low-order pixels in thefloat64average. (#2787, #2785)import numpy as np import supervision as sv detections = sv.Detections( xyxy=np.array([[40000, 40000, 60000, 60000]], dtype=np.float16) ) detections.get_anchors_coordinates(sv.Position.CENTER).tolist() # [[49984.0, 49984.0]] (0.31.1: [[inf, inf]])π Migration guide
One behavior change needs your attention: the Pascal VOC box convention. No public symbol was added, renamed or removed in this release, and nothing is deprecated.
Pascal VOC
<bndbox>indices affectssv.DetectionDataset.as_pascal_vocandsv.DetectionDataset.from_pascal_voc. Before 0.31.2, export added 1 to all four corners of a box-only object and truncated, and import subtracted 1 from all four. From 0.31.2, both follow the devkit's 1-based, inclusive indices: onlyxminandyminare shifted by one, and export rounds to the nearest pixel. Export rounds every corner to a whole pixel and the loader returnsfloat32coordinates, so check precision-sensitive boxes after a round trip. Files from different versions don't round-trip. (#2748, #2780)Box
[10, 20, 40, 60]| Written<bndbox>| Read back by 0.31.2
---|---|---
written by 0.31.1 |xmin=11 ymin=21 xmax=41 ymax=61|[10, 20, 41, 61]
written by 0.31.2 |xmin=11 ymin=21 xmax=40 ymax=60|[10, 20, 40, 60]- Box-only objects (no
<polygon>) in files written by 0.31.1 or earlier now load one pixel larger on the right and bottom edges. To restore the original boxes, subtract 1 from<xmax>and<ymax>of those objects only, or re-export the dataset from its source with 0.31.2. Objects exported from masks, which carry a<polygon>, already used the devkit maxima, so leave their files alone: their masks load as before, while their boxes now end one pixel further right and down. - Files exported by 0.31.2 match what Detectron2 and other devkit readers expect, so workarounds for the old extra +1 in
xmaxandymaxcan go.
π Notable changes
β οΈ Breaking Changes
- Pascal VOC box extents β
as_pascal_vocandfrom_pascal_vocfollow the devkit's 1-based, inclusive<bndbox>indices and export rounds corners to the nearest pixel. Box-only objects written by earlier versions load one pixel larger on the right and bottom edges, so check the migration guide before reading old VOC datasets. (#2748, #2780)
π§ Fixed
Datasets and file I/O
- Dataset exports finished without an error even when an image could not be written, leaving image files missing; detection dataset exports and
ClassificationDataset.as_folder_structurenow raiseOSErrorwith the destination path. (#2772) JSONSink.write_and_close()raisedValueError: I/O operation on closed file.when called inside awithblock, because the block's exit calls it again; it's now a no-op once the file is closed, likeCSVSink.close(). (#2771)JSONSink.appendkept references to its input, so reusing NumPy buffers or editing nested metadata changed rows that were already appended; it now snapshots the data. (#2781)- NumPy boolean scalars are now written as JSON booleans in JSON files. (#2783)
Detections and VLM
Detections.from_vlmwith the Gemini 2.5 and 3.5 connectors failed on any item whosebox_2dleft the 0-1000 range; its mask is now cropped to the image. (#2793)Detections.select()raised an indexing error on selected rows that share a scalar value indata; scalar NumPy values are now preserved. (#2769)sv.mask_iou_batchnow treatsCompactMaskinputs like dense masks: mismatched image shapes raiseValueError, unsupported overlap metrics are rejected even when bounding-box pre-filtering finds no pair, and exact NMS thresholds make the same decision for both. (#2767)sv.scale_boxesandDetections.get_anchors_coordinatesoverflowed toinfforfloat16boxes with large coordinates. (#2787)DetectionsSmoothercould overflow or tie onfloat16and large integer coordinates when aligning oriented-box corners; integer coordinates beyond2**53still lose low-order pixels in thefloat64average. (#2785)
Annotators and video
CropAnnotatorandIconAnnotatorraisedIndexErrororValueErroron grayscale scenes. (#2788)get_video_frames_generatorleft its video capture open when range validation or the initial seek failed; it now releases the capture and logs any secondary release error without replacing the original error. (#2782)
π Contributors
Welcome to our first-time contributors: ε’ζ彬, SHLOK SINGH, zurrll, Huashuo Lei, moyunliuyin, Wentao Tong and LEE, WEI-HONG!
- Avanish Garg (@avanish-garg) β kept Gemini 2.5 and 3.5 masks when a box leaves the 0-1000 range.
- Mohammad Hijjawi (@MohammadHijjawi97) β made
CropAnnotatorandIconAnnotatorwork on grayscale scenes. - ε’ζ彬 (@lu123bing) β fixed
infbox centers for half-precision boxes. - A Aswanth Raj (@aswanth-07) β fixed overflow in
DetectionsSmoothercorner alignment. - Kaushik Reddy Lingireddy (@Lingikaushikreddy) β rounded Pascal VOC corners instead of truncating them.
- moyunliuyin (@moyunliuyin) β aligned Pascal VOC export and import with the devkit's box extents.
- Junghwan (@shaun0927) β fixed
JSONSink.appendbuffer reuse and released video captures when setup fails. - Huashuo Lei (@wpyaoxueros) β fixed
Detections.select()with scalar data. - Wentao Tong (@tongwentao) β made dataset exports raise when an image cannot be written.
- kevin (@kevin9327) β fixed
JSONSink.write_and_close()after the file is closed. - Devulapalli Naga Sri Vaishnavi (@Vaishnavi220506) β aligned
CompactMaskIoU with the dense-mask contract. - @zurrll β saved NumPy booleans as JSON booleans.
- SHLOK SINGH (@buildwithshlok) β added type checking to the annotators tests.
- LEE, WEI-HONG (@AuricTW) β added a
cross_productdoctest. - Jirka Borovec (@Borda) β prepared the release.
Automated contributions: Dependabot, Copilot, Claude, pre-commit.ci
Full changelog :
0.31.1...0.31.2 -
π r/Harrogate Whatβs the new build estate off Sanders Walk like to live on? rss
I know Claro road can be a bit busy but this is on the edge of it and the proximity to town and the stray look great. I donβt really know that area that well compared to around Hornbeam park.
submitted by /u/Umberlific
[link] [comments] -
π OmniNull/OmniWM Canary 20261024-0439 (2f49ed7c) release
Automated canary build of
main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.
- Commit:
2f49ed7c3a03 - Base tag:
canary-20261023-0937-39929994137-1
Changes since canary-20261023-0937-39929994137-1
2f49ed7Merge pull request #975 from dappermint/feat/hidden-bar-inline-itemsf35618eMerge pull request #971 from hezhizhen/codex/input-source-regression-tests665c864feat(hidden-bar): show hidden items inline in the bar36bcd78Merge pull request #974 from OmniNull/dependabot/npm_and_yarn/website/npm_and_yarn-9cae7cad90736ffbftest(shell): await queued input source refresh after stopping2404244build(deps): bump astrode43c42Merge pull request #972 from hezhizhen/codex/localize-shell-choice-labels94cef1bMerge pull request #973 from dappermint/fix/shell-timed-render-pacingb9f4ed4test(shell): cover deferred input source refreshes49e30e5fix(shell): pace timed renders by the feed secondsc2048b6fix(shell): localize built-in choice labels9a41498Merge pull request #968 from hezhizhen/codex/localize-shell-option-titlesd44316cMerge PR #970: Read the input source after the change notification2c07492fix(shell): skip a queued input source read after listening stops2d1bd27fix(shell): read the input source after the change notification8f5e27bClose the TOML example in the components configuration guidec7533ceMerge PR #966: Scroll in batches the surface can keep up with7e92c8eMerge PR #964: Pin the remaining actions to commit SHAsf7a3d48test(shell): simplify option title localization coverage9bd82c5fix(shell): localize built-in widget option titles9cf93a6Merge PR #962: Make root scripts declare HTTP hosts and allow plain HTTP only on loopback4cf64cftest(shell): scroll in batches the surface can keep up with9435b2eci: drop the stored checkout token in website and scope greetings permissions99d2f28docs(shell): put the root capabilities key above the option tablesfff3f78ci: pin the remaining actions to commit shas86572bffix(shell): make root scripts declare http hosts and allow plain http only on loopback
- Commit:
-
π smol-machines/smolvm smolvm v1.32.1 release
What's Changed
- chore(nix): bump flake to 1.32.0 by @github-actions[bot] in #1972
- Let a pause pin later layers after one cannot be linked, instead of failing to create the pin directory again. by @BinSquare in #1973
Full Changelog :
v1.32.0...v1.32.1 -
π smol-machines/smolvm smolvm v1.32.0 release
What's Changed
- chore(nix): bump flake to 1.31.5 by @github-actions[bot] in #1964
- Add dispatch programs that run Amp's self-hosted orbs as smol machines, on your own host or on smol cloud by @BinSquare in #1948
- Bump libkrun to f9c80369 so branches and restores of nested-virtualization machines keep their KVM nested state. by @BinSquare in #1961
- Mount and unmount host directories on a running machine without a restart by @BinSquare in #1963
- Bump libkrun to 93b8d977 so a directory mounted again serves the files the guest already looked up by @BinSquare in #1968
- Never resolve a restored checkpoint's credential bindings from this host's environment by @BinSquare in #1966
- Attach a --disk in the format it had when attached, so a guest cannot turn it into a qcow2 image backed by a host file by @BinSquare in #1967
- Bump libkrun to 6d17e582 so a macOS guest cannot hard-link a symlink into a host file by @BinSquare in #1969
- Refuse to attach a directory that overlaps one already attached, naming the guest path that holds it by @BinSquare in #1970
- Bump smolvm to 1.32.0 by @BinSquare in #1971
Full Changelog :
v1.31.5...v1.32.0 -
π HexRaysSA/plugin-repository commits sync repo: +7 releases, -5 releases rss
sync repo: +7 releases, -5 releases ## New releases - [ida-bochs-binaries](https://github.com/hexrayssa/ida-bochs-binaries): 2.0.1, 1.0.6 - [ida-mcp](https://github.com/hexrayssa/ida-mcp): 20261023.0.2, 20261023.0.1, 20261022.0.1 - [ida-nexus](https://github.com/hexrayssa/ida-nexus): 0.14.1, 0.14.0 ## Changes - [ida-mcp](https://github.com/hexrayssa/ida-mcp): - removed version(s): 0.9.0, 0.10.1, 0.10.0 - [ida-nexus](https://github.com/hexrayssa/ida-nexus): - removed version(s): 0.8.1, 0.8.0 -
π backnotprop/plannotator v0.28.30 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.29 | Plan review opens on OpenCode 2, a DOMPurify security update, closing a review stops the agent everywhere
v0.28.27 | Jump to open questions, files side by side or full screen, image zoom in the Inbox, empty To field, text size for plan review and annotate
v0.28.26 | Action items and reply drafts in the Inbox, one decision button for plan review, Enter to save a comment, a custom code font
v0.28.25 | Re-ask open questions, delivery ticks on the list, a count of new messages on the tab, right-click a thread, click Inbox to refresh
v0.28.24 | A new look for the Inbox, Send now, tag agents, comment on an agent's message, much smaller reads for agents, links in HTML pages
v0.28.23 | Inbox replies reach sessions with background subagents, dictated text no longer goes missing, π Looks good reaches the agent, notifications that never fail silently
v0.28.22 | π Looks good, full view for files, one viewer for a thread's images and files, every session prints its URL,PLANNOTATOR_BROWSER=noneopens nothing
v0.28.21 | Message an agent from the Inbox, video attachments, Open in for attachments, Code / Tests / Generated in code review, writes from other websites refused
v0.28.20 | Inbox search (βK), real folder names for projects, data files open in the code view, word-only replies leave questions open
v0.28.19 | Ask this session in T3 Code, folder sessions load shared stylesheets and images, the agent note asked once per agent, Copy connect prompt
v0.28.18 |plannotator inboxconnects your agents, agents are told when to use the Inbox, rendered Markdown in code review, Inbox Settings in sections
v0.28.17 | The Inbox on iPads and narrow windows, the reply bar no longer cuts off "Keep open", a Pi crash on/reloadfixedWhat's New in v0.28.30
An Artifacts view in the Inbox, comments on part of an image, diagrams in code review, and Ask AI that keeps its conversation across documents in annotate. 9 PRs, one from a first-time contributor, @mvanhorn.
Plannotator Inbox
Artifacts
A thread's header has an Artifacts button that shows every file, image and guided review in the thread as one grid, newest first. A tile opens the file in the viewer beside the grid, and stepping in the viewer keeps thread order.
Split or Unified diffs in guided reviews
A guided review in the Inbox has a Split | Unified tab on its first file. The choice applies to every file in the review. Phones always show one column.
Re-ask from the open-questions list
Re-ask moved into the "N open questions" list and now works for a single question too.
Smaller changes
- Action items use the thread's text size , so the card no longer looks larger than the messages and question cards around it. #2123
Plannotator
Comment on part of an image
In annotate and plan review, open an image from the document, switch to Region and drag a box to comment on that part of it. The agent gets the image, its line in the file, the box in the image's own pixels, and your comment.
Diagrams in code review
Mermaid and Graphviz diagrams in a Markdown file's Read and Changes views are now drawn, and so is the diagram in a guide overview. The diagram engine loads only when a review has one, so a review without diagrams loads nothing extra.
Ask AI keeps its conversation in annotate
Moving between files in a folder session, opening a linked document, or going back no longer clears the Ask AI conversation. Each question still carries the document it was asked about.
Smaller changes
- Updates are checked about once an hour instead of once a day, so a new release shows up sooner. It is still one small request at most per hour. #2112
- The update toast says what Update does : it installs in the background and the review keeps working. #2106
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Inbox: Artifacts view for a thread by @backnotprop in #2122
- Inbox: action items at the thread's text size by @backnotprop in #2123
- Comment on part of an image by @backnotprop in #2117
- feat: preserve Ask AI chat across annotate document navigation by @mvanhorn in #2103
- Inbox: Split | Unified tab in guided reviews by @backnotprop in #2119
- Inbox: Re-ask from the open-questions list, and for one question by @backnotprop in #2113
- Update toast: say what Update does by @backnotprop in #2106
- Check for updates hourly instead of daily by @backnotprop in #2112
- Code review: draw diagrams, loaded only when needed by @backnotprop in #2110
New Contributors
Community
- @mvanhorn: kept the Ask AI conversation across annotate navigation (#2103)
- @zane668: asked for comments on part of an image and for Ask AI to keep its history in folder sessions (#2100, #1001)
- @kshurukhin: asked for unified diffs in the Inbox (#2107)
- @barreiroleo: asked for Mermaid diagrams in code review (#2096)
Full Changelog :
v0.28.29...v0.28.30 -
π Andrew Healey's Blog Decompiling Fast Food Tycoon 2: Drawing the World rss
How a 2001 business sim rendered its rich and detailed cities.
-
- October 23, 2026
-
π IDA Plugin Updates IDA Plugin Updates on 2026-10-23 rss
-
π smol-machines/smolvm smolvm v1.31.5 release
What's Changed
- Compare a branch source's VM binary with the one this engine boots VMs with, so embedding SDKs can branch again by @BinSquare in #1959
- Stage the file a symlinked --image archive points at, so the guest can read it by @BinSquare in #1958
- chore(nix): bump flake to 1.31.4 by @github-actions[bot] in #1957
- Rename Licenses.md to THIRD-PARTY-NOTICES.md so GitHub detects the Apache-2.0 license by @BinSquare in #1960
- Bump smolvm to 1.31.5 by @BinSquare in #1962
Full Changelog :
v1.31.4...v1.31.5 -
π exe.dev Hunting Bugs? Look at Commits rss
If youβre looking for bugs, youβll get better results if you focus the agentsβ attention.
The usual loop is roughly:
for f in files: "please look for important bugs, using $f as a starting point"But I've found this to be more effective:
for c in commits: "please analyze $c for important bugs; validate that they still exist at HEAD" -
π r/Harrogate Basketball - adult sessions rss
Anyone know of anything like this that has coaching/drills as well as gameplay?
I realise the obvious answer is "join a team", just keen to hear what's out there that offers coaching as well.
submitted by /u/Adorable_Echo1153
[link] [comments] -
π backnotprop/plannotator v0.28.29 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.27 | Jump to open questions, files side by side or full screen, image zoom in the Inbox, empty To field, text size for plan review and annotate
v0.28.26 | Action items and reply drafts in the Inbox, one decision button for plan review, Enter to save a comment, a custom code font
v0.28.25 | Re-ask open questions, delivery ticks on the list, a count of new messages on the tab, right-click a thread, click Inbox to refresh
v0.28.24 | A new look for the Inbox, Send now, tag agents, comment on an agent's message, much smaller reads for agents, links in HTML pages
v0.28.23 | Inbox replies reach sessions with background subagents, dictated text no longer goes missing, π Looks good reaches the agent, notifications that never fail silently
v0.28.22 | π Looks good, full view for files, one viewer for a thread's images and files, every session prints its URL,PLANNOTATOR_BROWSER=noneopens nothing
v0.28.21 | Message an agent from the Inbox, video attachments, Open in for attachments, Code / Tests / Generated in code review, writes from other websites refused
v0.28.20 | Inbox search (βK), real folder names for projects, data files open in the code view, word-only replies leave questions open
v0.28.19 | Ask this session in T3 Code, folder sessions load shared stylesheets and images, the agent note asked once per agent, Copy connect prompt
v0.28.18 |plannotator inboxconnects your agents, agents are told when to use the Inbox, rendered Markdown in code review, Inbox Settings in sections
v0.28.17 | The Inbox on iPads and narrow windows, the reply bar no longer cuts off "Keep open", a Pi crash on/reloadfixed
v0.28.16 | The Inbox on a phone, a doorbell for new questions, Mark read, step through a thread's files, replies when the asking session endedWhat's New in v0.28.29
A patch release: plan review now opens on OpenCode 2, a DOMPurify security update, and two skill fixes. (v0.28.28 was never published; its release was stopped by the security check this update fixes.)
Plannotator
Plan review works on OpenCode 2
On OpenCode 2, the plan agent wrote its plan into the chat and never sent it for review. OpenCode 2 adds its own Plan mode note telling the model to discuss the plan in the conversation, and Plannotator didn't recognize that wording. Plannotator now replaces the note, so the plan agent calls
submit_planand the review opens. Tested on OpenCode 2.0.19 and 2.1.2. OpenCode 1 is unchanged.Smaller changes
- Closing a review without feedback stops the agent on every agent, not only Claude Code. Closing is not approval. #2099, closing #2097
- The visual-explainer skill asks before installing its third-party dependency. #2099, closing #2098
- DOMPurify 3.4.17 fixes a critical sanitizer advisory (GHSA-cg2g-xh64-v4q7). Mermaid's copy is updated too. #2104
- Guided Reviews can carry an overview with an optional diagram (guide format version 2). Nothing creates one yet; this is groundwork. Existing guides are unchanged. #2095
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Guide builder and overview (guide format v2) by @backnotprop in #2095
- Skills: a closed session stops; ask before installing visual-explainer by @backnotprop in #2099
- OpenCode 2: recognize the new Plan mode reminder so submit_plan runs by @backnotprop in #2102
- deps: DOMPurify 3.4.17 (GHSA-cg2g-xh64-v4q7) by @backnotprop in #2104
Community
- @Duo-Huang: found and traced plan review not opening on OpenCode 2 (#2101)
- @zane668: the closed-session and visual-explainer skill issues (#2097, #2098)
Full Changelog :
v0.28.27...v0.28.29 -
π backnotprop/plannotator v0.28.28 release
chore: bump version to 0.28.28
-
π OmniNull/OmniWM Canary 20261023-0937 (28ded16c) release
Automated canary build of
main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.
- Commit:
28ded16c88ef - Base tag:
canary-20261022-0439-39721295344-1
Changes since canary-20261022-0439-39721295344-1
28ded16Merge pull request #959 from dappermint/fix/toolchain-cache-recovery810a195ci: start from a clean toolchain when its cache restore fails0e0bf3cMerge PR #958: Add Fluxer community chat links9f35cdfdocs: add fluxer community chat links4450248Update SwiftFormat to 0.64.19bfd535Merge pull request #921 from dappermint/test/qa-suite-hardening4eba57fstyle(hidden-bar): drop the trailing comma swiftformat 0.63 rejects931a291Merge pull request #957 from hezhizhen/codex/fix-hidden-native-cross-displayc532780test(hidden-bar): stop depending on the finder extension settingba39913test(shell): give bundled widget renders a 1 s cpu budget2b4cf58test(shell): wait for the bar before counting its widgets18427datest(support): let until name the condition it waited for958bbfdfix: discard deferred native moves for hidden windows22b8f6cTranslate the new swipe-edge and cross-display drag settings92ca342Merge pull request #952 from brdoney/swipe-edge-behaviorb7b10ddMerge pull request #933 from hezhizhen/codex/native-titlebar-cross-display47d8df0Merge pull request #949 from brdoney/fill-left-reserve-space6b608a4Merge pull request #956 from brdoney/fix-nil-layer-borderdc5117eMerge pull request #951 from hezhizhen/codex/fix-notification-api-referencea89d802fix(shell): draw no border when a widget sets a width without a colordafebd0Update fill-left reserve docs and reuse the overlapping casec24495eAdd configurable workspace swipe behavior at the edges56dd4a4fix(docs): include notification types in the Luau referencebc403f5fix: retain deferred native drag correction obligations44459e7fix: ignore managed frames during native cross-display adoptionf71c0a6feat: opt in to native title-bar moves across displays9fc6374Merge pull request #940 from hezhizhen/codex/fix-wallpaper-region-crop672f8ffReserve workspace bar space in Fill Left of Notch modecf3599eMerge PR #945: Check widget option declarations and add Nocturne options97b8aaatest(shell): match whole option names in the declaration checkefb89c7fix: crop full-window wallpaper captures before region fallback80dca94feat(shell): declare scratchpad, calendar and weather options for nocturne37f7889test(shell): check bundled widgets declare the options they readf8cddb7Merge pull request #941 from dappermint/fix/touch-count-provider-rewrapddc5e5cMerge origin/main while preserving notification support10455b5Merge pull request #943 from rickythefox/feat/942-focus-rankd61a7d3Dismiss notifications through their native Close actionbacd0e5Add native notification actions and capture diagnostics2ebfb50feat(ipc): expose window focus history via query windows0aa1470Match Notifications to OmniShell styles4953efeAdd retained notifications to OmniShell31d4e80fix(input): stop the touch count provider growing on every read
- Commit:
-
π smol-machines/smolvm smolvm v1.31.4 release
What's Changed
- chore(nix): bump flake to 1.31.3 by @github-actions[bot] in #1949
- Boot a pack prepared on a machine's storage from that storage instead of its source image's archive, and keep .wh. files in a pack's only layer by @BinSquare in #1950
- Refuse to branch a source still running the engine from before an upgrade by @BinSquare in #1952
- Keep agent unit tests off the storage disk of the machine they run on by @BinSquare in #1955
- Grow RAM live on CLI-started machines when no cgroup limit is in the way by @BinSquare in #1956
- Bump smolvm to 1.31.4 by @BinSquare in #1954
Full Changelog :
v1.31.3...v1.31.4 -
π backnotprop/plannotator v0.28.27 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.26 | Action items and reply drafts in the Inbox, one decision button for plan review, Enter to save a comment, a custom code font
v0.28.25 | Re-ask open questions, delivery ticks on the list, a count of new messages on the tab, right-click a thread, click Inbox to refresh
v0.28.24 | A new look for the Inbox, Send now, tag agents, comment on an agent's message, much smaller reads for agents, links in HTML pages
v0.28.23 | Inbox replies reach sessions with background subagents, dictated text no longer goes missing, π Looks good reaches the agent, notifications that never fail silently
v0.28.22 | π Looks good, full view for files, one viewer for a thread's images and files, every session prints its URL,PLANNOTATOR_BROWSER=noneopens nothing
v0.28.21 | Message an agent from the Inbox, video attachments, Open in for attachments, Code / Tests / Generated in code review, writes from other websites refused
v0.28.20 | Inbox search (βK), real folder names for projects, data files open in the code view, word-only replies leave questions open
v0.28.19 | Ask this session in T3 Code, folder sessions load shared stylesheets and images, the agent note asked once per agent, Copy connect prompt
v0.28.18 |plannotator inboxconnects your agents, agents are told when to use the Inbox, rendered Markdown in code review, Inbox Settings in sections
v0.28.17 | The Inbox on iPads and narrow windows, the reply bar no longer cuts off "Keep open", a Pi crash on/reloadfixed
v0.28.16 | The Inbox on a phone, a doorbell for new questions, Mark read, step through a thread's files, replies when the asking session ended
v0.28.15 | Long Inbox threads fold to what is new, "Skipped N questions" replies, Inbox list and sidebar fixesWhat's New in v0.28.27
A jump list for a thread's open questions, files side by side or full screen, image zoom everywhere, text size for plan review and annotate, and a run of fixes from your reports.
Plannotator Inbox
Jump to open questions
When a thread has questions you haven't answered, a button in its foot says how many. It lists them, and choosing one opens its message and takes you to the card.
Side by side or full screen, remembered
An open file has a Side by side | Full screen switch in its header. The Inbox remembers the one you picked.
Zoom and pan images
Images in the Inbox zoom with a trackpad pinch or Ctrl/β + wheel, pan by dragging, and switch between Fit and 2Γ on a double-click. β β still step to the next file while zoomed, and a comment's drawing stays on the image at any zoom.
Action items as a checklist
An agent's action items show as one checklist card: tick each off, open it for the details, and see "2 of 3 done" at a glance.
Smaller changes
- New messages start with To empty , so a message can't go to the wrong agent. The last agent you used is listed first. #2089
- Attached files always show in the Clean look. #2092
- A thread's draft status sits to the right of its buttons. #2083
- Agent icons come in one set of sizes , and tooltips are borderless and quicker to appear. #2078, #2079
- Phone sheets have rounder top corners. #2076
Plannotator
Text size
Settings β Display β Text size makes plan review and annotate text smaller or larger.
Zoom images
The image viewer zooms with the mouse wheel or a pinch and pans by dragging. Actual size now really shows the image at its own size.
Smaller changes
- The tab title and header name the open file in annotate. #2075, closing #2061
- Comment Edit and Delete buttons show on screens without hover (Chrome on some Linux setups, touch screens). #2065, closing #2062
- HTML pages you annotate can open alert, confirm and prompt dialogs. #2071, closing #2063
- Mermaid labels in Chinese, Japanese and Korean no longer wrap their last character onto a new line. #2072, closing #2064
- Ask AI answers show tables. #2070, closing #2069
- Back from a linked document returns to where you were reading. #2084, closing #2082
- Links with an underscore are linked in full , not cut off at the first
_. #2088 - Pi and Oh My Pi: after updating Plannotator while Pi is running, you're now told to restart, instead of seeing a confusing error. #2087, closing #2085
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Show comment actions on devices without hover by @backnotprop in #2065
- Show images at their real size in the lightbox by @backnotprop in #2068
- fix(ui): render markdown tables in Ask AI answers by @backnotprop in #2070
- fix(html): let annotated pages open alert, confirm and prompt by @backnotprop in #2071
- fix(ui): wrap Mermaid labels at 140 px by @backnotprop in #2072
- Text size for plan review and annotate by @backnotprop in #2073
- Wheel and pinch zoom in the image lightbox by @backnotprop in #2074
- feat(editor): name the open file in the tab title and the header by @backnotprop in #2075
- Phone sheets: 12 px top corners by @backnotprop in #2076
- Inbox: action items as a checklist by @backnotprop in #2077
- Inbox: agent marks on one size scale by @backnotprop in #2078
- Tooltips: borderless float at 150 ms by @backnotprop in #2079
- Inbox: name the side-by-side view and remember it by @backnotprop in #2080
- Inbox: draft status on the right of the thread's buttons by @backnotprop in #2083
- fix: Back from a linked document keeps the reader's place by @backnotprop in #2084
- test: close the sidebar peek before the toolstrip probe by @backnotprop in #2086
- fix(pi): say to restart when Plannotator was updated under a running host by @backnotprop in #2087
- fix(ui): keep underscores inside bare URL autolinks by @backnotprop in #2088
- feat(inbox): start a new message with To empty by @backnotprop in #2089
- feat(ui): Viewer belowTitle slot for hosts by @backnotprop in #2090
- feat(inbox): open questions button in the thread foot by @backnotprop in #2091
- fix(inbox): attached files always use the Clean look by @backnotprop in #2092
- Zoom and pan in the Inbox image viewer by @backnotprop in #2093
Community
Most of this release came from your reports. Thank you:
- @zane668: the file name in the tab title (#2061), Mermaid labels wrapping in Chinese, Japanese and Korean (#2064), image actual size and zoom (#2067, #2081), and Back losing your place (#2082)
- @ppommer: text size (#2066) and tables in Ask AI (#2069)
- @ralwing: comment buttons on screens without hover (#2062)
- @PassionZale: dialogs in annotated HTML pages (#2063)
- @JasonLandbridge: the error after updating under a running Pi (#2085)
Full Changelog :
v0.28.26...v0.28.27 -
π New Music Releases O.A.R. - Three Tinted Windows rss
O.A.R. - a new release is available:
- 2026-10-23: Three Tinted Windows (Album)
Amazon: Canada | Deutschland | France | United Kingdom | United States
Visit muspy for more information.
-
π New Music Releases Polyphia - BE NOT AFRAID rss
Polyphia - a new release is available:
- 2026-10-23: BE NOT AFRAID (Album)
Amazon: Canada | Deutschland | France | United Kingdom | United States
Visit muspy for more information.
-
- October 22, 2026
-
π IDA Plugin Updates IDA Plugin Updates on 2026-10-22 rss
IDA Plugin Updates on 2026-10-22
Activity:
- binsync
- 901af52d: fix(ui): keep host view focus after Open/New dialog errors; reject emβ¦
- ida-settings
- mcrit-plugin
- 75e83537: Merge pull request #59 from familiary/refactor/core-presentation
- 9ee44127: Merge pull request #58 from familiary/feature/ghidra-plugin
- e351304b: Address the Ghidra review follow-ups: console Reset, bridge compile, β¦
- d2f040bc: Merge feature/ghidra-plugin into refactor/core-presentation
- 40772287: Fix the Ghidra review findings: CFG colors, rejected labels, spinner β¦
- 8b2097ce: Escape YARA wildcards for the report's architecture
- 41f28926: Count Block Scope's headline functions like its families and samples
- 770d70f3: Share the match views' logic between the Qt widgets and Ghidra
- a49b6061: Tint Ghidra matches with transient markers, fix the GUI runner deadlock
- binsync
-
π smol-machines/smolvm smolvm v1.31.3 release
What's Changed
- chore(nix): bump flake to 1.31.2 by @github-actions[bot] in #1937
- Allow nested branches 256 generations deep instead of 32 by @BinSquare in #1938
- Speed up first macOS pack imports with reusable storage seeds by @BinSquare in #1939
- Fix Smolfile init steps running twice during cached machine run by @NickyHeC in #1945
- Show init output when cached machine run fails by @NickyHeC in #1946
- Let --allow-udp open chosen UDP destinations, also under an egress interceptor by @AlixANNERAUD in #1941
- Bump smolvm to 1.31.3 by @BinSquare in #1947
Full Changelog :
v1.31.2...v1.31.3 -
π @HexRaysSA@infosec.exchange Hex-Rays has completed its acquisition of HexAI. The HexAI team has joined mastodon
Hex-Rays has completed its acquisition of HexAI. The HexAI team has joined Hex-Rays to bring IDA technology into its agentic platform for cybersecurity research.
Read more: https://hex-rays.com/blog/hex-rays-completes-acquisition-of- hexai
-
π exe.dev Give Your Agents Less Internet rss

Without the Internet, agents are useless. With the Internet, they're dangerous.
One approach is to allow Internet access, but through carefully controlled sippy straws. Let through only requests to destinations that you trust and deny all of the rest.
exe now makes this easy.
TL;DR: Run
ssh exe.dev egress YOUR-VM integrations, or click the Network Access button on a VM's detail page. This will limit YOUR-VM's outbound internet access to any specific integrations you have attached to that VM.Exe integrations provide VMs access to other services, injecting credentials at the network edge so that secrets stay off the VM.

Controlled Ingress, Controlled Egress
Exe manages both ingress and egress. Incoming connections are private by default; you choose who can access your VM.
Outgoing connections are open by default, with integrations providing credentials for connected services. Now you can restrict outbound traffic to just those integrations, giving agents access to the services they need while blocking the rest of the internet.
How It Works
Egress filtering happens at a network packet level. Anything higher level than that is subject to an end run by agents: they have memorized DNS and they can find proxies to convert traffic from one shape to another. We run our own DNS servers to prevent DNS request smuggling. And when you switch egress to integrations-only, we disable server-side web tools on requests sent through our LLM gateway.
People used to say things like "I'm sure it's not secure against a nation- state attacker." Frontier models are the new nation-states. But unlike nation- states, we can pen test ourselves using actual frontier models.
The agents found a bunch of escapes, all through clever use of server-side tools from Anthropic and OpenAI. There were a surprising number of them. Models are clever and persistent. Andβwhen multiple are running on a single VM concurrentlyβhappy to claim credit for the discoveries of others. (Hereβs to you, Grok.)
As a result, we closed that entire pathway for requests using our LLM gateway. The rest of our system survived the trial by fire. We believe that we have closed all escape routes straightforwardly discoverable by current models. We will continue to probe in-house as new models are released and harden as needed.
Threat Model
Turning off general-purpose Internet access does make your VM more secure, but this is intended to protect against accidents, not an APT.
Also, it remains incumbent on you to think carefully about what an agent could do via the integrations you have attached. Are they usable as proxies for other purposes? Every read request from your agent is a write to someone elseβs logs; are those writes acceptable? Put another way, your trust envelope now includes those external services.
The traditional startup advice is to offer painkillers, not vitamins. Consider this to be Xanax; running agents should not fill you with anxiety that one mistake on their part will have disastrous consequences.
Advanced Mode
Our integrations give you high level access controls: connect to this Postgres server, connect to GitHub, connect to this website. If you want more control, consider setting up a proxy VM for yourself. Then set up a peer integration that allows your controlled VM to talk to your proxy VM. The proxy VM can then run arbitrary software to inspect requests and filter, augment, or forward them.
There are no problems that cannot be solved with another layer of indirection except needing an infinite number of layers of indirection.
Sample Transcript
Create a new VM:
$ ssh exe.dev new --name=no-net Creating no-net using image boldsoftware/exeuntu... Coding agent https://no-net.shelley.exe.xyz App (HTTPS proxy β :8000) https://no-net.exe.xyz SSH ssh no-net.exe.xyzIt has full internet access:
$ ssh no-net.exe.xyz curl -fsS https://exe.dev Agent docs: https://exe.dev/llms.txt Human docs: https://exe.dev/docsLimit its internet access to integrations only:
$ ssh exe.dev egress no-net integrations Set egress policy for "no-net" to integrationsNow the same request is rejected:
$ ssh no-net.exe.xyz curl -fsS https://exe.dev curl: (6) Could not resolve host: exe.devCreate an integration that provides access:
$ ssh exe.dev integrations add http-proxy --name inception --target https://exe.dev --no-auth Added integration inception To use this integration, attach it to a VM first: integrations attach inception vm:<vm-name> Usage from a VM: curl https://inception.int.exe.xyz/Attach it to our VM:
$ ssh exe.dev integrations attach inception vm:no-net Attached inception to vm:no-netAccess works via the integration:
$ ssh no-net.exe.xyz curl -fsS https://inception.int.exe.xyz/ Agent docs: https://exe.dev/llms.txt Human docs: https://exe.dev/docs -
π Hex-Rays Blog Hex-Rays Completes Acquisition of HexAI to Expand Its Agentic Platform Offering for Cybersecurity Research rss
-
π The Pragmatic Engineer The Pulse: Anthropic builds its own source control system rss
Hi, this is Gergely with a bonus, free issue of the Pragmatic Engineer Newsletter. In every issue, I cover Big Tech and startups through the lens of senior engineers and engineering leaders. Today, we cover one out of four topics from last week 's issue of The Pulse . Full subscribers received the article below seven days ago. If you 've been forwarded this email, you can subscribe here .
Interesting information from Anthropic about why the company moved off Git and built its own custom source control system. From their engineering blog (emphasis mine):
"At Anthropic, coding is no longer the bottleneck to building systems or doing research. Claude is able to autonomously iterate on research loops, micro-optimize complex programs, and build new services from the ground up at a speed and scale we haven't seen before. The bottleneck, now, is all of the developer infrastructure built for human scale: source control, builds, and CI.
In May 2026, Anthropic averaged around 2,500 code changes merged per day; as of September, we merged over 30,000 per day. We don't expect this rate of growth to slow down anytime soon; the latent demand for merging code is practically infinite, and every bottleneck we remove immediately leads to a further increase in the amount of code we produce."
Anthropic
saw PRs merged per day snowball 10x in less than 4 months ' time. Source:
AnthropicThat's a 12x increase in PRs in a four-month period! Interestingly, just a year ago, I shared how I had gathered Google was preparing for a similar tenfold increase across its broader infrastructure. From the deepdive published in July 2025:
"Google is preparing for 10x more code to be shipped. A former Google Site Reliability Engineer (SRE) told me: 'What I'm hearing from SRE friends is that they are preparing for 10x the lines of code making their way into production.'
If any company has data on the likely impact of AI tools, it's Google. 10x as much code generated will likely also mean 10x more code reviews, deployments, feature flags and source control footprint."
Back to Anthropic, a few things about the company are different from many other tech businesses:
- Use of a monorepo. Like most large tech companies, Anthropic has a massive monorepo, where the working copy itself is 25GB in size.
- 25 million git checkouts per day, just for CI! All ~3,000 staff extensively use parallel Claude agents - typically 10-15 per engineer - so a lot of pull requests are created; somewhere in the region of 30,000 per day. All these PRs trigger a massive number of checkouts, mostly from the CI system.
- Nearly all clients are always online. Git was built on the assumption that clients go offline at various times, and that when they come back up, they need to catch up with branches and merge their changes into the repo. However, when clients are always connected to the corporate internet - like at Anthropic - this assumption no longer holds. Design decisions to accommodate offline clients mean inefficient checkouts and more data transferred than necessary.
- Hard to horizontally scale git. Scaling git is done by running git mirrors: replicating git repositories across several mirror nodes. A primary git server accepts the writes, pushes out to all mirrors, and clients fetch from various mirrors. Anthropic ran hundreds of git mirrors, but found that once their repo outgrew the mirrors' disk capacity, they could no longer scale the repo.
So, Anthropic created a new source control system, which is called**** 'Scion' internally. It's closed source, and Anthropic has shared the high- level design principles and data structures used, but no code details. The problem with having your own source control system (and moving off Git and GitHub) is that GitHub's code review system is lost! So, Anthropic also had to build a new code review and code management system, which they call 'Antique.'
I reached out to the team building Scion and Antique to learn more about how Scion works. Here's what they told me:
Technical details
The design of Scion is pretty simple: stand up "server" nodes (that contain the whole repository), store changesets inside of Google Spanner (Google's distributed, highly available database) and blobs (large files) in the highly durable Google Cloud Storage:
Scion's
architecture, at a high levelI asked Nick G - one of the authors of the original blog posts - about additional details and here's what he told me:
- Rust : the language that Scion's server and client are written in.
- Go + React: Antique, Anthropic's new code review and code management platform has its backend in Go and frontend written in React. It works nicely with Scion.
- More resilient replication strategy : by default, Google Spanner offers multi-zone replication with three replicas. Anthropic has increased the number of replicas (they didn't tell me the exact number, but an educated guess could be five or more replicas), and switched to multi-region replication. All these changes make sense, given how critical code is and that it 's sensible to reduce the likelihood of losing any data - even at the cost of higher write latencies.
- Backups : on top of replication, Anthropic keeps full backups of the database and soft deletes on the blob storage where file contents live. Spanner's point-in-time recovery also lets Anthropic restore from a bad write. Smart!
Scaling is an interesting topic. I asked Nick if the system autoscales or scales manually. He told me:
"Every component can autoscale, but so far it hasn't needed to, even as our merge volume grew more than 10x this year. The data is content-addressed and never changes once it's stored, so the caching tiers do most of the work."
A team of seven engineers builds and maintains all of this :
- Four worked on the core Scion server and client
- Three were split between building code search, merge queues, etc.
100% of Anthropic 's monorepo has moved off Git. This was no small feat to pull off! Nick gave me more details about the migration:
"The migration was not simple, but Claude was instrumental in getting it done. It's also 'self-healing' in a way: if we get all the important use cases migrated and have something like 99% coverage, we can just force the cutover and Claude can help us fix anything that actually mattered.
100% of our monorepo is off of git. A few smaller repos that were never in the monorepo are migrating now, and they're much simpler.
All of our community resources continue to live on GitHub: skills, plugins, Claude Code's public repo, etc. And last week we launched OSS Scanner, which gives open-source projects free security audits using our strongest models (inspired by Google's OSS- Fuzz)."
Big Tech moved off Git long ago
My take is that Anthropic has "Big Tech problems" much earlier than most of Big Tech had to tackle them. Anthropic employs around 3,500 staff, but their coding output - thanks to each person using around 10 agents all the time - is closer to that of a tech company with 35,000-70,000 staff! That's a Meta or Google-sized company by the number of engineers.
Google and Meta have long since moved off Git because it did not scale for them.
Google built its own version control that took inspiration from Perforce. Git itself was created by Linus Torvalds in 2005, seven years after Google was founded. So git was not an option for Google to use in the early years: the company chose Perforce instead. It was around 2011-2012 that Google had ran into scaling issues with Perforce and built its own source control system called 'Piper.' It's also a centralized version control model and still works well enough for the search giant. It's no surprise to know that Piper was inspired by Perforce, and Google built Piper to be more performant for their use cases than Perforce was. We covered more on Google 's internal stack in the deepdive Inside Google 's Engineering Culture .
Meta found that git and other systems could not scale as needed, and so built 'Sapling.' Meta initially moved over to Mercurial, and then custom- built and open sourced Sapling for itself. As the company shared at the time:
"Sapling began 10 years ago [around 2012] as an effort to make Meta's monorepo scale in the face of ever-increasing engineering growth. Publicly available source control systems were not, and still are not, capable of handling repositories of this size. Instead of moving away from the monorepo and sacrificing engineering velocity, we decided to build the source control system we needed.
Along the way we realized there were also large opportunities to increase developer velocity by improving the source control experience. By investing in new UX, we've made it possible for even new engineers to understand their repository and do things that were previously only possible for power users."
Sapling itself is more of a client-server architecture. From the documentation:
"Sapling started from Mercurial as a distributed source control system, it then transitioned to a client-server architecture to solve the challenges. The server can utilize distributed storage and pre-build various kinds of indexes to provide more efficient operations.
While Sapling is less "distributed", we tried to make the difference transparent to the user. For example, our lazy commit graph implementation does not require extra commands to "deepen" the graph. The user sees the full history.
That said, we do drop support of pulling from a lazy repo. Commit cloud covers these use-cases."
Did Anthropic secretly rip off Sapling 's and Mononoke server
I asked Anthropic why it doesn't open source Scion. Nick G's reply:
"Mostly bandwidth! Even a no-support code drop takes a lot of work to do well. We have a small team building and running Scion. While the principles we used to build it are durable, the underlying code changes very frequently. For example, we're still removing git-compatibility layers we only needed for the migration. We'd rather put that time into sharing what we learned, and as the post says, into working with GitHub, GitLab and the OSS community on scaling git.
To emphasize that point: most teams don't need to leave git! But we think there are things git could benefit from, mainly change sets, derived data, and the checkout protocol. Our goal was to inspire conversation and collaboration around those ideas."
The explanation, on one end, makes sense. On the other, Meta themselves also emphasized how most teams don't need to leave git, and still open sourced Sapling for anyone to use, or take inspiration from.
One key component of Sapling is Monoke: the also open source server meant to scale up accepting thousands of commits every hour, across millions of files, written in Rust.
Could have Anthropic avoided open sourcing Scion, because it might have shown how much they copied from existing open source projects? The creator of Monoke wrote a post accusing of the Anthropic team of ripping off Monoke -- and the Bonsai data model -- writing:
"This [Scion] was a ripoff. My post yesterday was trying to be as charitable as possible given what I knew, and in particular that the similarity to Mononoke was mostly unintentional and the lack of credit was the result of not doing due diligence. However, after publishing the post I privately received confirmation that Scion intentionally and blatantly ripped off Mononoke, and in particular that there was overlap in personnel. There is no chance that this was an unintentional homage. This is something I had a hunch about but was not comfortable saying yesterday, given what I knew back then.
The resemblance is much deeper than just the notion of derived data. Some people pointed out that derived data is just an index, which is a well-known concept. I want to clarify that derived data was merely the most striking resemblance. It goes much deeper than that, and extends to the entire data model, as well as a number of the structures built around it."
Anthropic did not give credit to Monoke in their original post, and only added a small attribution after the complaint.
To be clear, the point of open source is that you can do what you want with the software without much limitations (save for what the license contains): but it's poor form that it took a public complaint for Anthropic to admit that the clever data structure they presented in their blog post heavily derived for an existing and open source data strucutre.
Will central VCs stay a niche, or expland beyond Big Tech?
Big Tech has preferred centralized version control systems (VCS), and I wonder how niche of a trend central VCSs will remain. As we've seen since well before AI, some of the largest tech companies dropped git because they did not like the performance degradation from offline support they no longer need.
My question is that even with agents, how many companies will see git "break" similarly to how it has at Anthropic? When this happens, how many will find git's mirroring functionality inadequate for their own needs?
There's a new batch of vendors positioning themselves as git-compatible version control solutions built for AI scale: Entire, founded by GitHub's last CEO, Thomas Dohmke (a current podcast season sponsor), Cursor Origin by SpaceX, and Code Storage by The Pierre Company. At the same time, GitHub itself seems to be investing a lot more in making its platform more reliable and scalable.
My hunch is that very few companies will go through the trouble of building yet another source control system. In this way, Anthropic reminds me a bit of Google, which has been known to build custom internal systems which are not publicly available, to address the company's internal needs. This can be disorienting for Google engineers after they leave the company and find they've become out of touch with industry-standard tools.
Read the full issue of The Pulse this is from, or check out this week 's The Pulse. This week's issue covers:
- Do we need to rethink software security because of AI? Half a dozen of high-profile security incidents and breaches on a single day: and many of them are connected to AI (or sped up because of it). Attackers are gaining unfair advantages with AI, and defenders will have to react.
- Is Anthropic 's new version control system "a rip off"? The creator of Mononoke (an open source, high throughput version control server) accused Anthropic for ripping off their design, and not giving credit, presenting their work like it was novel. Not a good look on the AI lab.
- Industry Pulse. Saudi Arabia made a "problematic" offer to pay alleged OpenAI spy's bail, Shopify builds tooling for self-healing software, Foursquare's sale disappoints, Claude Code gets a major speed boost with gzip, and more.
- Predictions on the future of software development. Some bold predictions from software engineer and Amp cofounder Thorsten Ball, like how open source doesn't make sense in its current form anymore.
-
π r/Harrogate Anyone know of any work/laptop friendly cafes? rss
Or shall I just stick with Starbucks or Nero
Obviously not for taking the piss but for sitting with a laptop for 2 hours at a time maybe
submitted by /u/sophietheadventurer
[link] [comments] -
π Console.dev newsletter Sponsor: Falconer rss
Monitor your docs like your code. Falconer finds and fixes doc issues before they mislead agents.
-
π Console.dev newsletter Pele rss
Mermaid diagram render.
What we like: Renders Mermaid syntax to SVG. Colors and fonts are customizable through CSS. Zero dependencies. Responsive layouts and very fast render times (under 1ms).
What we dislike: Doesnβt support all diagram types or Mermaid plugins.
-
π Console.dev newsletter KiviDB rss
Redis/Valkey alternative.
What we like: Redis-compatible protocol, including search, vectors, and Lua scripting. Commands run on every core rather than one thread. Claims faster performance than Redis, including better p99 latency. Runs on a different port by default. Written in Rust.
What we dislike: Licensed under AGPL.
-
π Console.dev newsletter Sponsor: BuildKite rss
Better CI
-
π backnotprop/plannotator v0.28.26 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.25 | Re-ask open questions, delivery ticks on the list, a count of new messages on the tab, right-click a thread, click Inbox to refresh
v0.28.24 | A new look for the Inbox, Send now, tag agents, comment on an agent's message, much smaller reads for agents, links in HTML pages
v0.28.23 | Inbox replies reach sessions with background subagents, dictated text no longer goes missing, π Looks good reaches the agent, notifications that never fail silently
v0.28.22 | π Looks good, full view for files, one viewer for a thread's images and files, every session prints its URL,PLANNOTATOR_BROWSER=noneopens nothing
v0.28.21 | Message an agent from the Inbox, video attachments, Open in for attachments, Code / Tests / Generated in code review, writes from other websites refused
v0.28.20 | Inbox search (βK), real folder names for projects, data files open in the code view, word-only replies leave questions open
v0.28.19 | Ask this session in T3 Code, folder sessions load shared stylesheets and images, the agent note asked once per agent, Copy connect prompt
v0.28.18 |plannotator inboxconnects your agents, agents are told when to use the Inbox, rendered Markdown in code review, Inbox Settings in sections
v0.28.17 | The Inbox on iPads and narrow windows, the reply bar no longer cuts off "Keep open", a Pi crash on/reloadfixed
v0.28.16 | The Inbox on a phone, a doorbell for new questions, Mark read, step through a thread's files, replies when the asking session ended
v0.28.15 | Long Inbox threads fold to what is new, "Skipped N questions" replies, Inbox list and sidebar fixes
v0.28.14 | Agents can replace an earlier question, comment on a guided review in the Inbox, issue numbers link to the repositoryWhat's New in v0.28.26
Action items and reply drafts in the Inbox, one decision button for plan review, Enter to save a comment, a custom code font, and many fixes. 35 PRs, 9 of them from 8 outside contributors, 5 of whom are first-timers.
Plannotator Inbox
Action items
An agent can ask you to go do something: run a command, sign in somewhere, check a page. It shows as a card in the thread with Done , Can't do it and Add note , and your answer goes back to the agent.
Reply drafts
What you type in a reply box is kept per thread. It comes back when you reopen the thread, after a reload, and after a restart. A thread with an unsent draft is marked Draft in the list.
Replies to a busy agent go in on their own
If the agent is in a long turn, the line under your reply shows how long it has waited, and after 5 minutes the reply goes into the running turn by itself, as if you'd pressed Send now.
Smaller changes
- A Send skips a question only when you press Skip. Questions you leave alone stay open. #2058
- Answers you pick while writing a reply show in the reply box right away. #2051
- A skipped question keeps its note in the reply. #2034
- Several Inbox tabs share one connection to the Inbox. #2057
- Subjects stay on one line , and stray tool-call text never becomes a title. #2053
- A thread that fails to load tries again and says so. #2054
- Faster over your tailnet : the window is sent compressed. #2042
- Long issue numbers link as issues , not colour swatches. #2040
- Restart help leads with
/reload-plugins. #2035 - Works behind a local reverse proxy (nginx, Caddy). #2060
Plannotator
One decision button for plan review
Plan review's header now works like annotate and code review. With nothing to send it shows Approve. Once you add comments it becomes Send Feedback. Other choices, such as Request changes or Approve with notes, are under the arrow.
Enter to save a comment
Turn on Settings β General β Enter saves a comment , and Enter saves while Shift+Enter adds a new line. It's off by default.
Your own code font
Settings β Display β Code Font β Customβ¦ takes the name of any font on your machine for code review.
Start a new Ask AI chat
A New chat button clears the Ask AI panel and starts fresh, in plan review, annotate and code review.
Jump between changes in code review
N and P jump to the next and previous change. Commenting from the gutter now covers every line you selected, not just the one you clicked.
Smaller changes
- A code review an agent waits on hears your Approve (Claude Code). #2047
- Annotate picks up a file changed on disk in its version diff. #2049
- A plan reviewed across midnight keeps its versions. #1681 by @aomalov
- Images in a folder session load from the open document's folder. #2033 by @xiaofeilovecoding
- Sidebar shortcuts stay visible next to the Agent TUI. #1019 by @leoreisdias
- A
file.ts:42link opens at line 42. #1909 by @Totopo27 - Triple-click no longer highlights into the next line. #1408 by @dca123
- Ticking a Guided Review section marks its files viewed. #2044
- Very large diffs from git textconv are never drawn. #2041
- Pi: review opened and closed events, and long checklists keep the next item in view. #2050
- OpenCode: the agent-switch choice is saved, and Ask AI no longer hangs. #2045, #1413 by @danowicz
- Claude Code Team/Enterprise: a plan is approved once, not twice. #2043
- The install script works on machines without
gh. #1995 by @viniciusestevam
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- feat(review): custom code font support by @backnotprop in #855
- feat(annotate): keep sidebar shortcuts visible with Agent TUI by @leoreisdias in #1019
- Fix triple-click highlight bleed into the next line by @dca123 in #1408
- fix(ai): keep OpenCode Ask AI subscribed before prompting by @danowicz in #1413
- fix(review): full-range gutter annotations and next/prev hunk jump by @FNDEVVE in #1550
- fix(plan): keep the version chain when a review spans midnight by @aomalov in #1681
- fix(ui): scroll and highlight referenced line in code file popout by @Totopo27 in #1909
- Installers: resolve latest from the releases/latest redirect when the API fails by @viniciusestevam in #1995
- Inbox Board (1/3): card records and the card call by @backnotprop in #2026
- Inbox: reply drafts and the Draft label by @backnotprop in #2028
- fix: resolve folder images from the active document by @xiaofeilovecoding in #2033
- Inbox: keep a skipped question's note in the reply by @backnotprop in #2034
- Inbox: lead with /reload-plugins, fold the manual restart by @backnotprop in #2035
- CI: pin Linux runners to ubuntu-24.04 by @backnotprop in #2036
- Inline markdown: digit-only #refs link as issues, not colour swatches by @backnotprop in #2040
- Review: never render a textconv diff past the size cap by @backnotprop in #2041
- Inbox: serve the window compressed over the tailnet by @backnotprop in #2042
- Claude Code mod: one plan approval when the plugin guard skips the mod's hook by @backnotprop in #2043
- Guided Review: ticking a section marks its files viewed by @backnotprop in #2044
- OpenCode: remember the agent-switch choice in config.json by @backnotprop in #2045
- Ask AI: start a new chat by @backnotprop in #2046
- Code review: gate, so a bare Approve reaches the agent by @backnotprop in #2047
- Comments: opt-in Enter to save by @backnotprop in #2048
- Annotate: a disk change shows in the version diff by @backnotprop in #2049
- Pi: session events and a checklist that keeps the next item in view by @backnotprop in #2050
- Inbox: answers picked while writing a reply show live in the reply box by @backnotprop in #2051
- Tests: fix main's DOM allowlist failure by @backnotprop in #2052
- Inbox: one-line subjects; leaked tool-call text never shows as a title by @backnotprop in #2053
- Inbox: read a thread again when its first read fails, and say so by @backnotprop in #2054
- Plan review: one adaptive decision control by @backnotprop in #2055
- Inbox: Undelivered replies show their wait and go in by themselves after 5 minutes by @backnotprop in #2056
- Inbox: tabs share one event connection by @backnotprop in #2057
- Inbox: a Send skips a question only when you press Skip by @backnotprop in #2058
- Inbox: action items an agent needs you to go do by @backnotprop in #2059
- fix(inbox): allow loopback x-forwarded-for from local reverse proxies by @Totopo27 in #2060
New Contributors
- @viniciusestevam made their first contribution in #1995
- @xiaofeilovecoding made their first contribution in #2033
- @aomalov made their first contribution in #1681
- @danowicz made their first contribution in #1413
- @Totopo27 made their first contribution in #1909
Contributors
- @FNDEVVE: full-range gutter comments and hunk jumps in code review.
- @leoreisdias: sidebar shortcuts beside the Agent TUI.
- @dca123: the triple-click highlight fix.
- @Totopo27: line-accurate code links, and the Inbox behind a local reverse proxy.
- @aomalov: reported and fixed plans that lost their versions at midnight.
- @danowicz: the OpenCode Ask AI hang.
- @xiaofeilovecoding: folder images from the open document.
- @viniciusestevam: reported and fixed the installer without
gh.
Thanks to everyone who reported issues or asked for features in this release:
- @solalbaudoincs (#1867), @akaralar (#851), @clauxx (#1934), @alexanderkreidich (#991), @andrew-corlann (#1543), @levyashvin (#1057), @kekel87 (#1907), @ppommer (#1981)
- @RobertoArtiles (#1784), @PassionZale (#2006), @viniciuskneves (#2037), @michaelmior (#1412), @jumski (#1589), @sergdort (#1390), @oronbz (#1786), @ericknyoto (#2007), @zane668 (#2032), @timmo001 (#1932)
Full Changelog :
v0.28.25...v0.28.26 -
π pydantic/monty v1.3.0 - 2026-10-21 release
What's Changed
- Decode file URLs in WASM and browser test aliases by @Pybsama in #1007
- test: check packed WASM declarations in smoke tests by @Pybsama in #1004
- Fix
re.match()andre.fullmatch()for(?x)patterns that end in a comment by @Likheet in #1046 - close further missing dunder gaps by @davidhewitt in #1074
- tidy up some looseness in the
HeapReader::protectAPI by @davidhewitt in #1076 - perf: avoid intermediate string id allocation on keyword call dispatch by @gabrielhsc95 in #1080
- Match CPython's odd padding split in
str.centerandbytes.centerby @RaphaelFakhri in #1085 - experiment with making bytecode from builtins by @davidhewitt in #841
- implement
PyValueabstraction to avoidInternStr/Strdiffs etc by @davidhewitt in #1050 - Bound AST depth before the type checker walks it by @rewitt94 in #930
- bump deps for CA compromise by @davidhewitt in #1096
- release: 1.3.0 by @davidhewitt in #1097
- fix npm smoke test by @davidhewitt in #1099
New Contributors
- @Pybsama made their first contribution in #1007
- @RaphaelFakhri made their first contribution in #1085
Full Changelog :
v1.2.0...v1.3.0 -
π smol-machines/smolvm smolvm v1.31.2 release
What's Changed
- chore(nix): bump flake to 1.31.0 by @github-actions[bot] in #1917
- Never lower a branch source's memory ceiling below what its cgroup still holds by @BinSquare in #1921
- chore(nix): bump flake to 1.31.1 by @github-actions[bot] in #1923
- Fix flaky branchpoint lease test by @BinSquare in #1918
- Let machine monitor flags override the Smolfile health settings by @RaphaelFakhri in #1920
- Give a new disk volume the image's ownership and bind nested volumes after their parents by @BinSquare in #1870
- ci: run every Linux job on smol machines by @BinSquare in #1916
- Change ports live on machines without virtio-net through a vsock port forwarder by @BinSquare in #1875
- Add Chinese, Japanese and Korean READMEs by @BinSquare in #1871
- Pass the guest path to ns-file and stage on scratch for streamed container uploads by @Vishv07 in #1925
- Isolate filesystem unit tests from the CI runner overlay by @BinSquare in #1927
- agent: unit tests never resolve paths through the machine they run on by @BinSquare in #1926
- Checkpoint a source frozen as a branch base without resuming it, so its branches can move to another node by @BinSquare in #1928
- Keep cache disk bases within a byte budget, evicting the least recently used by @BinSquare in #1930
- Bump smolvm to 1.31.2 by @BinSquare in #1929
- Put /tmp on disk, regrow /dev/shm after a RAM grow, match GitHub runner limits and LANG by @BinSquare in #1931
- Record why a machine's VMM ended, OOM kill and seccomp included by @BinSquare in #1884
- Fix inherited disk-chain compaction by @BinSquare in #1933
- Move a live-published host port to another guest port without rebinding it, and close removed ports before the change returns by @BinSquare in #1935
- Unpack a .smolmachine once per pack on macOS and clone it for each machine, and let no create leave its data behind when it fails or its client disconnects by @BinSquare in #1934
- Keep a machine's disk durability across checkpoint restore and let machine update change it by @BinSquare in #1932
- Answer a branch at the disk chain limit with 409 instead of 500 by @BinSquare in #1936
New Contributors
- @github-actions[bot] made their first contribution in #1917
- @RaphaelFakhri made their first contribution in #1920
Full Changelog :
v1.31.0...v1.31.2 -
π OmniNull/OmniWM Canary 20261022-0439 (8ecdfbff) release
Automated canary build of
main. It is signed and notarized like a release but skips the owner review, so treat it as unstable.See the canary guide to install, update, or return to stable. For everyday use, download the latest stable release.
- Commit:
8ecdfbff1327 - Base tag:
canary-20261020-1054-39408104600-1
Changes since canary-20261020-1054-39408104600-1
8ecdfbfMerge pull request #938 from dappermint/fix/command-palette-shortcuts20204d2Merge pull request #937 from dappermint/fix/live-wallpaper-capture6f734a5Merge pull request #936 from dappermint/perf/idle-1019ae50decMerge branch 'main' into perf/idle-1019223c61eMerge pull request #935 from dappermint/perf/input-1019f1adb34fix(palette): match shortcuts by key position on non-qwerty layoutsca21cc4fix(wallpaper): keep live wallpaper captures already clipped to the display480451btest(input): check captured drags still reach main, keep the forward private91a3049fix(wallpaper): keep the crop at the display size for fractional window origins0e9b55dtest(shell): assert both backdrop filters survive a fill only repaint49a3955fix(wallpaper): capture live wallpapers drawn above the desktop levelc20322eMerge upstream/main into perf/idle-101976364c3Merge upstream/main into perf/input-1019d2a6d2fMerge pull request #934 from OmniNull/dependabot/npm_and_yarn/website/npm_and_yarn-63f9813d79e81e6f1build(deps): bump vite707d37dKeep settled tab rail moves on SkyLight after animation moves0b5fa2bSkip tab rail relayout when its size is unchanged2b75644Check screenshot selection once per pointer-validated focus handoff19980a7Merge pull request #931 from dappermint/test/stabilise-shell-ui-tests6af545ctest(shell): wait for the drawer package before toggling its popoutfaa6219fix(surface): ignore registrations whose window was deallocated39bcaaaPass query options instead of a window count to SkyLight queries7de1437Render launcher icons in the system icon stylebdeeddbSkip clipboard items that macOS excludes from history5b1beb0Read window fullscreen state in the admission attribute batch1059fa2Query a dragged window's identity off the main connection2736ce5Merge pull request #927 from CallMeLaNN/fix-zsh-completion55a2737docs: initialize compinit before evaluating zsh completions023b7b3test: cover zsh completion eval registration and autoload paths4b0d1f4test: wrap long completion harness linesd1f28f2test: call zsh completer explicitly in completion harnesses2aeb8d9Merge pull request #914 from hezhizhen/codex/dwindle-native-live-resize8b1b400fix: use AX fallback for final native resize framesbf662abperf: avoid duplicate native resize renders on release7f33a6cfix: avoid world commits for rejected native resizes416f198feat: resize Dwindle neighbours during native edge dragseaf668cfix: zsh completions for eval based on official doc9481efetest(shell): cover fill-only repaint keeping backdrop filters4c18d61perf(input): stop captured drags from blocking on the main threada792655perf(idle): cut idle wakeups and redundant layer work
- Commit:
-
π Ampcode News Self-Hosted Orbs rss
You can now self-host orbs. You provide the compute and Amp turns it into orbs.
If you have compute that can
- quickly start new machines
- put them to sleep and resume them equally fast
- keep them around for a long time
- scale them to zero, so no one has to worry about having a lot of them sleeping
then you are now able to replicate the orb experience within your own infrastructure.
How It Works
You run
amp orb providerinside your infrastructure. Theorb providerthen reaches out to Amp and waits for requests to spawn, pause, or delete orbs. Like this:
How you satisfy those requests is up to you, because
amp orb providerwill dispatch the requests for orb operations (spawnto create or resume orbs,pause, anddelete) to a program that you provide, like so:$ amp orb provider ./dispatch.shIn that program, you can do whatever works best for your infrastructure. Here are some illustrative examples:
#!/usr/bin/env bash # dispatch.sh set -euo pipefail case "$ORB_OPERATION" in spawn) docker start "$ORB_ID" 2>/dev/null || docker run --platform linux/amd64 -d --name "$ORB_ID" \ "$ORB_IMAGE" sleep infinity docker exec -d --env ORB_TOKEN "$ORB_ID" amp orb bootstrap ;; pause) docker stop "$ORB_ID" ;; delete) docker rm -f "$ORB_ID" ;; esacInstall the E2B CLI and the
e2bpackage, setE2B_API_KEY, and build a template:echo 'FROM us-central1-docker.pkg.dev/amp-prod-0/amp-orb/amp-orb:latest' \ > e2b.Dockerfile e2b template create amp-orbs --dockerfile e2b.Dockerfile \ --cpu-count 4 --memory-mb 8192 --ready-cmd true export E2B_TEMPLATE=amp-orbs#!/usr/bin/env node // dispatch.mjs import { Sandbox } from 'e2b' const { ORB_OPERATION, ORB_ID, ORB_TOKEN, AMP_URL, E2B_TEMPLATE, } = process.env const metadata = { orbId: ORB_ID } const [existing] = await Sandbox.list({ query: { metadata, state: ['running', 'paused'] }, }).nextItems() if (ORB_OPERATION === 'spawn') { const timeoutMs = 60 * 60 * 1000 const sandbox = existing ? await Sandbox.connect(existing.sandboxId, { timeoutMs }) : await Sandbox.create(E2B_TEMPLATE, { metadata, timeoutMs, lifecycle: { onTimeout: 'pause' }, }) const envs = { ORB_TOKEN } if (AMP_URL) envs.AMP_URL = AMP_URL const bootstrap = await sandbox.commands.run('amp orb bootstrap', { user: 'user', envs, background: true, timeoutMs: 0, }) await bootstrap.disconnect() } else if (ORB_OPERATION === 'pause' && existing) { await Sandbox.pause(existing.sandboxId) } else if (ORB_OPERATION === 'delete' && existing) { await Sandbox.kill(existing.sandboxId) }#!/usr/bin/env bash # dispatch.sh set -euo pipefail export PATH="/usr/local/bin:/opt/homebrew/bin:$PATH" # "$ORB_IMAGE" is the Amp orb image. ids=$(container list --all --quiet) exists() { grep -Fxq "$ORB_ID" <<<"$ids"; } case "$ORB_OPERATION" in spawn) if exists; then container start "$ORB_ID" else container run --detach --init --rosetta \ --platform linux/amd64 --cpus 4 --memory 8G \ --name "$ORB_ID" "$ORB_IMAGE" sleep infinity fi # A bare --env NAME copies the value from the host. container exec --detach --env ORB_TOKEN --env AMP_URL \ "$ORB_ID" amp orb bootstrap ;; pause) if exists; then container stop "$ORB_ID" fi ;; delete) if exists; then container delete --force "$ORB_ID" fi ;; *) exit 1 ;; esac#!/usr/bin/env python3 # dispatch.py import os import modal # Needs `pip install modal` plus MODAL_TOKEN_ID and MODAL_TOKEN_SECRET. APP = "amp-orbs" app = modal.App.lookup(APP, create_if_missing=True) snapshots = modal.Dict.from_name("amp-orb-snapshots", create_if_missing=True) orb_id = os.environ["ORB_ID"] try: sandbox = modal.Sandbox.from_name(APP, orb_id) except modal.exception.NotFoundError: sandbox = None match os.environ["ORB_OPERATION"]: case "spawn": if sandbox is None: # Modal has no pause, so resume from the last snapshot. snapshot = snapshots.get(orb_id) if snapshot: image = modal.Image.from_id(snapshot) else: image = modal.Image.from_registry(os.environ["ORB_IMAGE"]) sandbox = modal.Sandbox.create( "sleep", "infinity", app=app, name=orb_id, image=image, cpu=4, memory=(16384, 16384), timeout=24 * 60 * 60, ) # Modal execs run as root; point bootstrap at the image user's home. bootstrap = "setsid amp orb bootstrap </dev/null >/dev/null 2>&1 &" sandbox.exec( "bash", "-c", bootstrap, env={ "ORB_TOKEN": os.environ["ORB_TOKEN"], "AMP_URL": os.environ.get("AMP_URL"), "HOME": "/home/user", "USER": "user", }, ).wait() case "pause": if sandbox: image_id = sandbox.snapshot_filesystem(timeout=120).object_id snapshots[orb_id] = image_id sandbox.terminate() case "delete": if sandbox: sandbox.terminate() snapshots.pop(orb_id, None)#!/usr/bin/env node // dispatch.mjs import { APIError, Sandbox, Snapshot } from '@vercel/sandbox' const { ORB_OPERATION, ORB_ID, ORB_IMAGE, ORB_TOKEN, AMP_URL } = process.env const credentials = { token: process.env.VERCEL_TOKEN, teamId: process.env.VERCEL_TEAM_ID, projectId: process.env.VERCEL_PROJECT_ID, } if (ORB_OPERATION === 'spawn') { const sandbox = await Sandbox.getOrCreate({ ...credentials, name: ORB_ID, // Copy Amp's image to VCR, then set ORB_IMAGE to its VCR URL. image: ORB_IMAGE, resources: { vcpus: 4 }, timeout: 60 * 60 * 1000, persistent: true, snapshotExpiration: 0, keepLastSnapshots: { count: 1, expiration: 0, deleteEvicted: true }, }) const setup = await sandbox.runCommand({ cmd: '/bin/bash', args: ['-c', 'hostname localhost && mkdir -p /vercel/sandbox'], sudo: true, }) if (setup.exitCode !== 0) throw new Error(await setup.stderr()) await sandbox.runCommand({ cmd: '/usr/bin/setpriv', args: [ '--reuid=user', '--regid=user', '--init-groups', '--', '/usr/bin/env', `ORB_TOKEN=${ORB_TOKEN}`, ...(AMP_URL ? [`AMP_URL=${AMP_URL}`] : []), 'HOME=/home/user', 'USER=user', '/bin/bash', '-lc', 'exec amp orb bootstrap', ], sudo: true, detached: true, }) } else if (ORB_OPERATION === 'pause' || ORB_OPERATION === 'delete') { try { const sandbox = await Sandbox.get({ ...credentials, name: ORB_ID, resume: false, }) if (ORB_OPERATION === 'delete') { if (sandbox.status === 'running') await sandbox.stop() for await (const saved of await sandbox.listSnapshots()) { if (saved.status !== 'created') continue const snapshot = await Snapshot.get({ ...credentials, snapshotId: saved.id, }) await snapshot.delete() } await sandbox.delete() } else if (sandbox.status === 'running') await sandbox.stop() } catch (error) { if (!(error instanceof APIError && error.response.status === 404)) { throw error } } }#!/usr/bin/env python3 # dispatch.py import os from uuid import uuid4 from daytona import ( Daytona, DaytonaNotFoundError, CreateSandboxFromImageParams, Resources, SessionExecuteRequest, SandboxState, ) daytona = Daytona() operation = os.environ['ORB_OPERATION'] try: sandbox = daytona.get(os.environ['ORB_ID']) except DaytonaNotFoundError: sandbox = None if operation == 'spawn': if sandbox is None: sandbox = daytona.create(CreateSandboxFromImageParams( name=os.environ['ORB_ID'], image=os.environ['ORB_IMAGE'], os_user='user', resources=Resources(cpu=4, memory=8, disk=10), auto_stop_interval=0, auto_delete_interval=-1, ), timeout=240) elif sandbox.state != SandboxState.STARTED: sandbox.start() env = {key: os.environ[key] for key in ('ORB_TOKEN', 'AMP_URL') if key in os.environ} sandbox.update_env(env, unset=['AMP_URL']) session = str(uuid4()) sandbox.process.create_session(session) sandbox.process.execute_session_command(session, SessionExecuteRequest( command="bash -lc 'exec amp orb bootstrap'", run_async=True, )) elif operation == 'pause' and sandbox: if sandbox.state == SandboxState.STARTED: sandbox.stop() elif operation == 'delete' and sandbox: sandbox.delete()#!/usr/bin/env bash # dispatch.sh set -euo pipefail # Pause/resume currently requires access enabled by exe.dev support. status=$(ssh exe.dev ls "$ORB_ID" --json | jq -r --arg id "$ORB_ID" '.vms[] | select(.vm_name == $id) | .status') case "$ORB_OPERATION" in spawn) if [[ -z "$status" ]]; then ssh exe.dev new --name="$ORB_ID" --image="$ORB_IMAGE" \ --cpu=2 --memory=8G --no-email elif [[ "$status" == paused ]]; then ssh exe.dev resume "$ORB_ID" fi { printf 'export ORB_TOKEN=%q\n' "$ORB_TOKEN" if [[ -n "${AMP_URL:-}" ]]; then printf 'export AMP_URL=%q\n' "$AMP_URL" fi cat <<'BOOTSTRAP' sudo -u user --preserve-env=ORB_TOKEN,AMP_URL bash -lc \ 'cd "$HOME"; nohup amp orb bootstrap </dev/null >.amp-bootstrap.log 2>&1 &' BOOTSTRAP } | ssh "$ORB_ID.exe.xyz" bash -s ;; pause) if [[ "$status" == running ]]; then ssh exe.dev pause "$ORB_ID" fi ;; delete) if [[ -n "$status" ]]; then ssh exe.dev rm "$ORB_ID" fi ;; esacUse Amp's Helm chart to run orbs on GKE, EKS, or AKS. Under the hood, it runs
amp orb providerwith a supplied dispatch program that handles spawning, pausing, and deleting orbs. You don't need to write a dispatch script yourself.- Create a custom orb provider in your Amp workspace and copy its token.
- Prepare a dedicated cluster with worker nodes and snapshot storage. Paused orbs are saved to storage and can resume on another worker node.
- Download the Kubernetes setup files.
The ZIP includes
gke.md,eks.md, andaks.mdwith the setup and Helm commands for each cloud, plus Terraform examples. Use the instructions for your cloud to install the chart and test your first orb.
These examples use Amp's pre-built
ORB_IMAGE, which includes the Amp CLI and other dependencies. You can use a different Linux image as long as you can startamp orb bootstrapin it (and it has the dependencies for other features). That process connects the orb to Amp so Amp can set up the environment and run the agent's tools.Once you have your dispatch program, go to your workspace settings (individuals can create a workspace for free), add a Custom Orb Provider, copy the token, and run
amp orb provider:$ chmod +x dispatch.sh $ export AMP_ORB_PROVIDER_TOKEN="<copied-token>" $ amp orb provider ./dispatch.shOnce that runs, open ampcode.com or the Amp macOS or iOS applications and create a new thread. Expand Orb and choose your provider under Self-Hosted.

And then submit your prompt. Amp will send a request to your provider to spawn an orb, clone your repository, run your setup files, and start the agent.
And thus begins, as they say, orbin' time. Self-hosted.
You Probably Shouldn't Self-Host Orbs
All that said: you probably shouldn't self-host orbs.
We built self-hosted orbs for enterprises that can't use the orbs we host, because regulations might restrict where their code runs, because they need access to internal networks, or because they need custom hardware attached.
If you're on an Enterprise plan, let us know and we'll help you set it up.
That's why the interface is so open: we want to support all the infrastructure our enterprise customers might have, as long as it meets the qualitative requirements above (fast-to-start, resumable machines that scale to zero, etc.). But that also means we only support our end of the contract, not every possible piece of infrastructure you can plug in.
Pricing
Self-hosted orbs are free for individuals and teams. Enterprises will be charged standard orb pricing starting October 29. Until then, self-hosted orbs are free for every workspace.
Getting Started
For more information on self-hosted orbs and how to run self-hosted orbs on Kubernetes, see the documentation.
-
- October 21, 2026
-
π IDA Plugin Updates IDA Plugin Updates on 2026-10-21 rss
IDA Plugin Updates on 2026-10-21
New Releases:
- oh-my-dump Oh My Dump v1.0.17 for IDA Pro 9.x
- oh-my-pi v18.12.6
- oh-my-pi v18.12.5
- pyrrha v2.1.0βHackLu version: Imports and Thunks
Activity:
- capa
- 2bdf7a47: Sync capa rules submodule
- ida-cli
- 1a885505: Isolate reused runtime evidence and serialize helper test observations
- da5b7d90: Normalize the launch grant root through system symlink prefixes
- 219fd999: Remove obsolete absence-settlement descriptions and dead scan helper
- 5dde33db: Witness complete journal retirement before releasing the late worker
- a173256b: Preserve authorization fences after confirmed shutdown in cleanup guiβ¦
- 72b01ed6: Correct the documented five-patch chain enumeration
- 28571682: Record the actual late-worker denial exit code in regression evidence
- 3537f5e6: Add an exact helper-signed before-Rust-ACK W1 test barrier
- d3d5c37b: Reject legacy absence-only facts at the target journal boundary
- 917f8e07: Cover unreadable argv with a complete live process status
- 6b6d4231: Prove late workers cannot open after revocation and document upgrade β¦
- 8e9c4efc: Remove the obsolete elapsed exec margin from launch settlement
- 338ea084: Settle unclaimed launches using atomic revocation instead of process β¦
- 8964f207: Gate SDK worker IDB access on a durable revocable launch permit
- 51179df8: Document feasibility and durable launch authorization design
- adb16e4f: Align bridge entrance refusal retry advice with recovery metadata
- ae36b935: Restrict bridge-loss retries to whole-request entrance refusals
- 7b238081: Let the unarmed bridge-loss test settle before the next case opens
- 142be433: Let a daemon with a lost Nexus bridge leave by itself and let the CLIβ¦
- 55bb8c87: Settle a signed launch whose owner never existed after the bridge wasβ¦
- ida-domain
- 2e956294: Publish to PyPI with PEP 740 attestations (#140)
- ida-nexus
- a5fe4f0a: Merge pull request #72 from HexRaysSA/feat/attribute-error-suggestions
- idalib
- 48e57f76: fix: require
Function,Segment, andCFunctionto be dropped befβ¦
- 48e57f76: fix: require
- mcrit-plugin
- oh-my-dump
- ef5c3544: Merge pull request #5 from nevergiveupcpp/chore/codeowners
- aa1ea5c9: chore: add code owners
- 746e06bb: Merge pull request #4 from nevergiveupcpp/ci/node24-actions
- ea489431: ci: update actions to node 24
- c757dc98: Merge pull request #3 from nevergiveupcpp/build/multiplatform-support
- 534968dd: chore: bump version to 1.0.17
- 08426719: docs: update installation and configuration reference
- 0404f7ac: build: add linux, macos and windows arm64 support
- 42f38960: fix: resolve export filter type name collision
- pyrrha
- ca62056a: all: bump version
- 938fbb59: fix(tests): fix export parameter in fs-cg
- 1e196af4: fix: realign the backend-free test suite with dev
- b9ee8715: tests: update decomp tests to check last features
- f0ea1ce5: tests: update test_fw to test for inheritance mapping for cpp fw
- 94fe53a4: mapper: remove thunk from decomp mapper and move imports into a dedicβ¦
- ec397228: mappers: remove cache system in intercg_mapper
- 301bd45b: tests: update decomp tests to check last features
- fa350f9d: mappers: do not decompile imported funcs
- c3b93e3c: fix(main): options
- 63c312fe: fix(cli): add missing debug flag
- 158e80f3: cli: refactorize and improve documentation
- 9ed490ec: fix(tests): adapt expected results to add new cpp binaries
- d3f42a91: fix(tests): add new symlinks to expected results
- 8032f12f: fix(ci): gitlab ci was not detecting correctly version given by a tag
- 912f9c31: test(cli): cover C++ binaries in the fs-cg tests
- df1f0eb2: fix(mappers): PLT stubs no longer shadow the functions they forward to
- 79910ae4: feat(backend): expose thunk targets and import status
-
π earendil-works/pi v1.4.0 release
New Features
- Image input for classifiers : codemode
models.classify()acceptsimagesfor TypeSafe's Jev and Cloudflare's Clef models ontypesafe,cloudflare-workers-ai, and OpenRouter. See Use classifier models and Codemode. - Models Configuration reference : every provider, model, model override, and compatibility field of
models.json, generated from its schema. See Models Configuration. - Summaries without a fixed output cap : compaction and branch summaries use the model's output limit, so long reasoning no longer makes them fail. See Compaction.
- Codemode waits for a free worker : parallel scripts and in-process subagents queue instead of failing, and
PI_CODEMODE_MAX_WORKERSraises the limit. See Codemode limits. - Rex terminal support : OSC 8 hyperlinks, truecolor, and inline images.
Added
- Added a Models Configuration reference generated from the
models.jsonschema, listing all provider, model, model override, and compatibility fields (#10790) - Codemode
models.classify()now acceptsimagesfor TypeSafe's Jev and Cloudflare's Clef models ontypesafe,cloudflare-workers-ai, and OpenRouter, and lists Clef Omni and Jev 1.14 on Workers AI. - Provider-level
compatinmodels.jsonnow also applies to classifier models, with the System One fieldsimageInputandsendImageOptInHeaderfor proxies that serve another service's classifiers. Extension classifier models acceptcompattoo. - Added
MiniMax-M3.1-Flashto theminimaxandminimax-cnproviders, with thinking levels low through max (#11121) - Added support for the Rex terminal: OSC 8 hyperlinks, truecolor, and inline images (#11131, #11150 by @petrroll, #11183 by @nihaals)
Changed
- Provider attribution headers now come from pi-ai's client identity. Extensions'
before_provider_headershandlers no longer see the OpenRouter, NVIDIA NIM, and OpenCode attribution headers; returningnullfor one still removes it. Cloudflare requests send pi's detailedUser-Agentinstead ofpi-coding-agent, as do GitHub release checks for tool downloads, and OpenCode requests sendx-opencode-clientwhenever attribution is enabled, not only with a session. generateSummary()andgenerateSummaryWithUsage()now ignore theirreserveTokensparameter. Summary requests use the model's output limit instead.- Changed the default GitHub Copilot model from
gpt-5.4, which Copilot retired, togpt-6.1-sol. - Changed the default NVIDIA model to
nvidia/nemotron-3.5-super-vl-120b-a12b(#10910 by @cv) - Changed the default Xiaomi model to
mimo-v2.6-profor thexiaomiand Xiaomi Token Plan providers, sincemimo-v2.5-proleft the catalog. - Grok 4.3 and Grok 4.5 on the
xaiprovider now offer thexhighthinking level. - Sign in with ChatGPT: ChatGPT Business workspace usage-limit errors are not retried and tell the user to ask their workspace admin to increase the limit.
Fixed
- Fixed compaction and branch summaries failing with "generation hit the token cap" when reasoning used most of the fixed summary output limit. Summaries now use the model's output limit, and
compaction.reserveTokensonly controls when compaction starts (#9512, #9075). - Fixed
models.schema.jsonmissing descriptions for provider and model fields, so editors showed no hints for them (#10790) - Fixed
pi updatefailing with "Managed install marker is missing or invalid" whenmanaged-install.jsonstarts with a UTF-8 BOM, which Windows PowerShell 5.1 adds when it rewrites the file. - Fixed HTML export showing literal asterisks for Markdown bold and italic next to CJK punctuation (#3353, #10154)
- Fixed the terminal staying in mouse-tracking, focus-reporting, Kitty keyboard, and alternate-screen modes when pi exits without its normal terminal teardown, which flooded the shell prompt with escape sequences (#11170)
- Fixed concurrent extension
select/confirm/input/editordialogs and inlinecustom()components in interactive mode: a second dialog replaced the first and the first promise never settled; closing the visible dialog now shows the previous one again (#11166, #9909) - Fixed pasting in the shell hanging after copying text in pi and suspending it with Ctrl+Z on Linux: the background
wl-copy/xclip/xselprocess that keeps serving the clipboard was suspended along with pi (#11179) - Fixed codemode scripts failing immediately when both codemode workers are busy, for example with parallel codemode calls or in-process subagents. Scripts now wait up to 60 seconds for a free worker, and
PI_CODEMODE_MAX_WORKERSraises the limit of two workers (#11184) - Fixed extensions failing to load when importing
@earendil-works/pi-ai/models(e.g. forclampThinkingLevel) by exposing the subpath through the extension loader aliases and virtual modules (#11156) - Fixed
mcp.jsonfiles that start with a UTF-8 BOM failing to parse, which skipped all their MCP servers and madepi mcp add/pi mcp removefail (#11191) - Fixed
/compact <instructions>ignoring the instructions when summarizing the start of a turn that compaction splits. When the split turn was the only new content since the last compaction, the instructions were ignored entirely (#11058) - Fixed resumed sessions and
/treenavigation leaving extension tools inactive when the branch recorded its tools before they were registered, such as tools from extensions installed after the session started. Extension tools the branch never added or removed are now active unless they are registered withdefaultActive: false(#11062, #11075) - Fixed sessions breaking after recovery from a response cut off at the output limit: the truncated tool call was omitted but its tool results were kept, so providers rejected every later request (#11227, #11233 by @petrroll)
- Fixed the
greptool followingRIPGREP_CONFIG_PATH, where options such as--fixed-stringssilently changed regex searches into literal ones. The tool now runsrg --no-config(#11203, #11230 by @petrroll) - Fixed Windows shell detection rejecting runnable Microsoft Store shell aliases (#9504 by @petrroll)
- Fixed Windows shell detection missing PowerShell outside
PATHand the legacy WSLbash.exelauncher when Windows is not installed inC:\Windows. pi now checks%ProgramFiles%\PowerShell\7,%SystemRoot%\System32\WindowsPowerShell\v1.0, and%SystemRoot%(#9501 by @petrroll) - Fixed GitHub Copilot sessions with large request bodies, such as many images, failing with HTTP 413
failed to parse requestinstead of compacting and retrying (#11016 by @petrroll) - Fixed the
openai-codexprovider offeringgpt-5.5andgpt-5.3-codex-spark, which always fail for ChatGPT accounts (#11173 by @lucasmeijer) - Fixed whitespace-only tool output (for example a bare
\r\nfrom bash) making OpenAI Completions, OpenAI Responses, and Google requests fail with a 400 (#8720) - Fixed automatic retry not triggering for more gateway upstream failures,
stream disconnected before completionerrors relayed by Codex CLI proxies, and transient Google Vertex OAuth token refresh failures, and retrying errors because of digits inside request ids or byte counts (#10920, #11057, #10996) - Fixed OpenAI Responses models losing the prompt cache on every deferred tool load after a tool was removed (#10940)
- Fixed Cloudflare Workers AI classifier pricing: Clef Flash costs $0.038 and Jev $0.042 per million input tokens instead of Jev being listed as free.
- Fixed an unclosed
$$display-math block swallowing or corrupting every Markdown table after it (#11159) - Fixed Markdown bold and italic not rendering next to CJK punctuation (#10730 by @theBucky)
- Fixed
@file autocomplete returning no results for queries containing regex metacharacters such as[or((#10972)
- Image input for classifiers : codemode
-
π Quarkslab's blog State of Post-Quantum Cryptography implementations rss
Introduction
One of the internship offers of the 2025-2026 season aimed to test Post- Quantum Cryptography (PQC) implementations with an internal differential fuzzing tool. As such, a list of targets had to be defined, and a state-of- the-art review of the featured PQC algorithms in popular open-source cryptographic libraries was done. Before presenting these implementations, let's first do a quick reminder on PQC.
Post-Quantum Cryptography
Cryptographic algorithms are based on problems that have historically been hard to solve with classical computers. However, among these problems, integer factorisation and the discrete logarithm problem can be solved efficiently by quantum computers, via Shor's algorithm. Although current quantum computers show progress, they are not yet capable of breaking the intended cryptographic algorithms. The main concern and motive for imminent replacement of quantum vulnerable algorithms is the "Harvest now, decrypt later" threat. An adversary can store sensitive data that was encrypted with quantum vulnerable algorithms, and decrypt it once quantum computers are able to.
As a result, new cryptographic algorithms had to be designed, such that their security relies on problems that are not efficiently solvable by quantum algorithms. These new algorithms form what we call Post-Quantum Cryptography (PQC). In 2016, the US National Institute of Standards and Technology (NIST) launched a competition to standardize PQC algorithms, open to researchers from all over the world. They announced the first round of algorithms in 2022, with three signature schemes and one Key Encapsulation Mechanism (KEM). A new phase resulted in the selection of a second KEM, while an additional process to standardize more signature schemes continues.
Post-Quantum migration timelines have been set by government agencies such as ANSSI and NSA. Major tech companies such as Google are planning for full post- quantum replacement as early as 2029. If you are interested in the PQC transition process, check out this blogpost by Angele Bossuat which explains Signal's PQC upgraded ratcheting mechanism.
Post-Quantum algorithms
To choose which algorithms to include for the fuzzing campaign, we focused on the ones standardized by NIST, as well as some others that were implemented for practical use.
Key Encapsulation Mechanisms
The Harvest now, Decrypt later threat specifically targets classical key exchange schemes. In consequence, PQC algorithms were designed for a cryptographic scheme called Key Encapsulation Mechanism (KEM). In this asymmetric scheme, Alice possesses a key pair and Bob wants to establish a shared secret with Alice. Bob uses Alice's public key to compute a ciphertext and a shared secret. This first step is called Encapsulation. Bob then sends Alice the ciphertext, and Alice performs the second step called Decapsulation. In this step Alice derives the shared secret from the ciphertext, using her private key.
Diagram of a KEM from FIPS 203.
The first KEM standardized by NIST is the Module-Lattice-Based Key- Encapsulation Mechanism (ML-KEM), specified in FIPS 2031. Its security relies on the Module Learning With Errors (MLWE) problem, a lattice-based problem with a particular polynomial ring setting. Its encryption and decryption mechanism is reminiscent of the ElGamal encryption scheme, utilizing randomness and replacing the discrete logarithm part with an MLWE instance.
Since some of the post-quantum algorithms are relatively new, the possibility of discovering a way to classically break them is non-negligible. As a result, NIST decided to standardize a second KEM based on a different problem. This backup algorithm to ML-KEM is called Hamming Quasi-Cyclic (HQC)2. Its security relies on the Quasi-Cyclic Syndrome Decoding problem, based on error- correcting codes.
There are other PQ KEM algorithms that were not standardized by NIST. Two of them are also lattice-based algorithms. The first one is FrodoKEM3. Its security is based on the standard Learning With Errors (LWE) problem. The main difference with ML-KEM is the absence of the polynomial ring structure. While the polynomial ring structure grants ML-KEM performance optimizations compared to standard LWE schemes, it also leverages additional hardness assumptions. This is the main motive behind the use of FrodoKEM, which is strongly considered by European government agencies.
Part of the N-th degree Truncated polynomial Ring Units (NTRU) Prime project, Streamlined NTRU Prime (SNTRUP)4 is another lattice-based KEM. The NTRU Prime project aims to reduce the attack surface of NTRU lattice-based schemes by using a different polynomial ring structure.
One more code-based algorithm was targeted, Classic McEliece5. It is the oldest code-based cryptosystem (1978). Its security relies on the standard Syndrome Decoding problem, which does not have a quasi-cyclic structure unlike HQC. It was not chosen by NIST for standardization due to its large public and private keys, leading to a costlier key generation, as explained in NIST IR 85456. However, it performs better for encapsulation and decapsulation. This can be advantageous in contexts where a single key pair is reused multiple times. Note however that due to recent advancement in its cryptanalysis, Germany's Office for Information Security (BSI) advises against using Classic McEliece.
Another way to reduce the risk associated with the novelty of PQC algorithms and implementations is to use a hybrid scheme. This type of scheme combines a traditional and mature pre-quantum algorithm with a post-quantum one. It benefits from both the proven security of the former against classical attackers, and the conjectured security of the latter against quantum attackers. For example, in a KEM context, a shared secret key from each algorithm is generated. These two keys are then combined into one by using a Key Derivation Function (KDF). The security of a hybrid scheme also relies on the security of the hybridization technique used. Hybrid schemes are recommended by ANSSI for their PQC migration plan7. I chose to study the hybrid algorithm called X- Wing8. This algorithm combines the X25519 elliptic curve key exchange with ML-KEM, more precisely its ML-KEM-768 parameter set.
Digital Signatures
Module-Lattice-Based Digital Signature (ML-DSA), specified in FIPS 2049, was standardized by NIST along with ML-KEM. Its security also relies on the MLWE problem. Just like its KEM counterpart, its structure is similar to a previous discrete logarithm based scheme. Here ML-DSA is reminiscent of Schnorr signatures. They both follow the Fiat-Shamir paradigm, turning a zero-knowledge proof non- interactive by utilizing randomness and hash functions.
Fast-Fourier Transform over NTRU-Lattice-Based Digital Signature Algorithm (FN-DSA) was one of the three signature schemes selected at the third round of the NIST competition. It is based on the Gentry, Peikert, and Vaikuntanathan (GPV) framework10, instantiated over NTRU lattices and a new technique called Fast Fourier sampling. While the other selected algorithms have already been standardized, FN-DSA's standardization is still ongoing. As such, current implementations of the algorithm may not be compatible with the final standardized version. In consequence this algorithm was not targeted for the fuzzing campaign.
Another set of post-quantum signature algorithms is what we call hash-based signatures. Their security relies on the one-way assumption of hash functions. They are what we call Few-Times Signatures schemes (FTS), meaning they have a limited amount of signatures possible. They use One-Time Signatures (OTS) and Merkle trees' structure to convert them into an FTS scheme.
We distinguish two types of hash-based signature algorithms, the stateless ones and the stateful ones. Stateful algorithms require maintaining a state. They must keep track of which OTS key pairs have been used. This can be a drawback in specific contexts such as distributed systems. However, stateful algorithms tend to have better performance and signature sizes than stateless ones. In NIST SP 800-20811, NIST recommended the use of two stateful algorithms. Leighton-Micali Signature system (LMS), specified in RFC 855412, is the first one. It uses Leighton-Micali One-Time Signatures (LM-OTS), based on Winternitz OTS schemes. The other recommended stateful algorithm is the eXtended Merkle Signature Scheme (XMSS) specified in RFC 839113. Its main difference with LMS is the use of another Winternitz OTS variant called WOTS+, where bitmasks are used.
The third signature algorithm selected in the competition, and later standardized by NIST, is Stateless Hash-Based Digital Signature Algorithm (SLH-DSA), specified in FIPS 20514. It is based on two other few-times signatures, FORS and XMSS. Its use of a very large number of FORS key pairs and a hypertree of XMSS Merkle trees allows it to have a stateless property.
Implementations
OpenSSL
Founded in 1998, the OpenSSL project maintains a library that provides implementations of Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols, relying on their own implementations of cryptographic algorithms. It is most notably used by web servers for their secure HTTP connections. Written in C, OpenSSL has been forked to form other widely used open source cryptographic libraries. In 2025, they started featuring the following self-implemented Post-Quantum algorithms.
- ML-KEM, standardized FIPS 203 version.
- ML-DSA, standardized FIPS 204 version.
- SLH-DSA, standardized FIPS 205 version.
- LMS, standardized RFC 8554 version. Only the verification function is implemented. The author specifies that the stateful property is problematic for software implementations, and should rather be used for hardware ones.
BoringSSL
In 2014, Google decided to fork OpenSSL to build a cryptography library that specifically meets their needs. Before 2014, Google were using OpenSSL, but their accumulated number of patches in different copies of the library pushed them to create their own. BoringSSL is the current SSL library for Chrome, Android, and other apps and programs. BoringSSL announced their own post- quantum implementations when the first algorithms were standardized by NIST.
- ML-KEM, standardized FIPS 203 version.
- ML-DSA, standardized FIPS 204 version.
- SLH-DSA, only two parameter sets out of twelve are available (
SLH-DSA-SHA2-128sandSLH-DSA-SHAKE-256f). Other missing features from standardized version are internal vectors, pre-hash vectors, key generation from a seed, and deterministic signing. - X-Wing, version 02 of the RFC draft8.
wolfSSL
wolfSSL is a C library that implements SSL/TLS. It is designed for embedded systems which confers its portable, small, and fast attributes. Its cryptography is provided by the wolfCrypt library. Founded in 2004, it has been included in a variety of applications and devices such as smart automobile devices, mobile phones or credit card scanners. Their post-quantum support was originally based on the liboqs library. However, they replaced this integration with their own implementations, aiming for a reduction in code size and easier maintenance.
- ML-KEM, standardized FIPS 203 version, along with x86_64 and ARM optimizations.
- FrodoKEM, as specified in the draft15.
- ML-DSA, standardized FIPS 204 version, along with x86_64 and ARM optimizations.
- SLH-DSA, standardized FIPS 205 version.
- LMS, standardized RFC 8554 version.
- XMSS, standardized RFC 8391 version.
liboqs
liboqs is a collection of implementations of post-quantum algorithms written in C. It was created in 2018 as part of the Open Quantum Safe (OQS) project, which aims to support the PQC transition. It provides a common API for these algorithms as well as a test harness and benchmarking routines.
- ML-KEM, standardized FIPS 203 version. Imported from PQ Code Package's mlkem-native implementation 16. Liboqs also features a GPU-optimized implementation from NVIDIA cuPQC17.
- HQC, imported from the reference implementation18.
- FrodoKEM, imported from PQCrypto-LWEKE, the reference implementation19.
- Streamlined NTRU Prime, imported from the implementation used in OpenSSH20, itself based on the reference implementation21.
- Classic McEliece, imported from the PQClean library22.
- ML-DSA, standardized FIPS 204 version. Imported from PQ Code Package's mldsa-native implementation 23. Liboqs also features a GPU-optimized implementation from NVIDIA cuPQC17.
- SLH-DSA, standardized FIPS 205 version. Imported from PQ Code Package's slhdsa-c implementation24.
- LMS, imported from the RFC 8554 reference implementation25, by Cisco Systems.
- XMSS, imported from the RFC 8391 reference implementation26.
Libsodium
Forked from the NaCl library in 2013 and maintained by Frank Denis, libsodium provides a wide range of cryptographic implementations. Written in C, its API prioritizes ease of integration. It is used in a wide variety of software, from communication platforms such as Discord or Wire, to cryptocurrencies like Zcash and text editors like Vim. Libsodium recently started featuring PQC in 2026 with the following algorithms:
- ML-KEM, standardized FIPS 203 version, based on the reference implementation. Only the ML-KEM-768 parameter set is featured.
- X-Wing, as specified in 8.
AWS-LC
AWS-LC is the general purpose cryptography library maintained and used by Amazon Web Services. It started around 2020 as a fork of BoringSSL. They announced fully deployed and production ready post-quantum implementations after NIST's first standardization process. PQC is notably integrated in their TLS implementation.
- ML-KEM, standardized FIPS 203 version. Implementation imported from PQ Code Package's mlkem-native.
- ML-DSA, standardized FIPS 204 version. Implementation imported from PQ Code Package's mldsa-native.
OpenSSH
Developed since 1999 by OpenBSD, OpenSSH is the most widely used tool for the SSH remote login protocol. It relies on various cryptographic algorithms implemented in their portable library written in C. OpenSSH features two hybrid key agreement protocols, each one combining an ECDH instance with respectively the following PQC algorithms:
- ML-KEM, standardized FIPS 203 version. Implementation from Cryspen's Libcrux library written in Rust. The Rust code was translated to C using Eurydice, a Rust to C compiler. Only the ML-KEM-768 parameter set is featured.
- SNTRUP, reference code is used. It is the same implementation liboqs currently uses.
pqm4
The pqm4 library is a benchmarking and testing framework that started in 2018 from the PQCRYPTO project, funded by the European Commission through the Horizon 2020 program. This library targets the ARM Cortex-M4 family of microcontrollers. It imports implementations from the PQClean library, but it also provides implementations with specific optimizations written in assembly for Cortex-M4. Here are listed the implementations that feature the M4 optimizations.
- ML-KEM, standardized FIPS 203 version.
- FrodoKEM, available in the Round3 release.
- SNTRUP, available in the Round3 release.
- ML-DSA, standardized FIPS 204 version.
Nettle
Nettle is a cryptographic library created in 2001 and developed by Niels Moller. It provides self-developed low level implementations of cryptographic algorithms, with a simple and general API to fit a variety of applications. Being a GNU package since 2009, it is used in several software such as GnuTLS. Since February 2026, Nettle features post-quantum cryptography with the following algorithm:
- SLH-DSA, standardized FIPS 205 version.
Lean Crypto
Started in 2022 by Stephan Mueller, the leancrypto library exclusively provides self-developed PQC implementations in C. It targets constrained environments such as embedded systems, bare-metal environments, and Linux kernels. For example, the Shim bootloader, used by Linux, supports post- quantum cryptography for secure boot through LeanCrypto.
- ML-KEM, standardized FIPS 203 version. Derived in parts from reference implementation.
- HQC, derived in parts from PQClean's implementation.
- ML-DSA, standardized FIPS 204 version. Derived in parts from reference implementation.
- SLH-DSA, standardized FIPS 205 version. Derived in parts from reference implementation.
Libgcrypt
Libgcrypt is the cryptographic library provided for GnuPG, a PGP software. But its usage is independent of GnuPG. It was first released in 2001 and is written in C. It has featured post-quantum cryptography since 2024. Their post-quantum implementations derive from the reference implementations of each algorithm.
- ML-KEM, standardized FIPS 203 version, based on reference implementation.
- Classic McEliece, based on reference implementation.
- Streamlined NTRU Prime, based on reference implementation.
- ML-DSA, standardized FIPS 204 version, based on reference implementation.
SymCrypt
Started in 2006, SymCrypt is Microsoft's core cryptographic library, written in C. Originally intended for symmetric cryptographic operations, it has since 2015 been the primary cryptography library for all algorithms in Windows and other Microsoft products and services. In 2024 it started incorporating their own PQC implementations.
- ML-KEM, standardized FIPS 203 version.
- ML-DSA, standardized FIPS 204 version.
- SLH-DSA, standardized FIPS 205 version. Code is not available in public git repository.
- LMS, standardized RFC 8554 version.
- XMSS, standardized RFC 8391 version.
TrustCore SDK
TrustCore SDK is a library that provides cross-platform security tools such as certificate-based authentication, encryption, and secure communications. Founded in the early 2000s, it was acquired in 2022 and made open-source by DigiCert, a certificate authority. Its usage targets IoT applications, embedded software, and safety-critical systems. TrustCore started integrating self-developed post-quantum implementations in 2025.
- ML-KEM, standardized FIPS 203 version.
- ML-DSA, standardized FIPS 204 version.
- SLH-DSA, standardized FIPS 205 version.
RustCrypto
The RustCrypto project provides pure Rust implementations of cryptographic algorithms. It is widely used across Rust frameworks. For example, Rustls, the most popular Rust TLS implementation, features a RustCrypto provider. Though not yet audited, RustCrypto has various PQC implementations.
- ML-KEM, standardized FIPS 203 version.
- FrodoKEM, as specified in 27.
- HQC, as specified in 2.
- ML-DSA, standardized FIPS 204 version.
- SLH-DSA, standardized FIPS 205 version.
- LMS, standardized RFC 8554 version.
- XMSS, standardized RFC 8391 version.
- X-Wing, version 06 of the RFC draft8.
Libcrux
Libcrux is a cryptographic library developed in Rust by Cryspen (now pereq) since 2023. Many of their implementations use formally verified code from the HACL* project28. As for PQC, they entirely implement algorithms in Rust and formally verify their implementations with their tool called Hax29. Libcrux is most notably used by Signal for their Sparse Post-Quantum Ratchet (SPQR) protocol.
- ML-KEM, standardized FIPS 203 version.
- ML-DSA, standardized FIPS 204 version.
- X-Wing, version 06 of the RFC draft8.
Crypto (Go)
The Go programming language includes a crypto package which contains self- developed cryptographic implementations in Go. Developed since the creation of Go in 2007 at Google, this standard library is used across many applications based in Go. It first introduced support for PQC in 2024.
- ML-KEM, standardized FIPS 203 version.
- ML-DSA, standardized FIPS 204 version. Internal implementation only.
CIRCL
First released in 2019, CIRCL is a collection of cryptographic primitives written in Go. Developed by Cloudflare, its goal is to experiment on the deployment of PQC and elliptic curve cryptography. It is used across Cloudflare's infrastructure. Their PQC implementations are independent of other Go cryptographic libraries.
- ML-KEM, standardized FIPS 203 version.
- FrodoKEM, heavily inspired from PQClean's implementation30. Only the parameter set FrodoKEM-640-SHAKE is featured.
- ML-DSA, standardized FIPS 204 version.
- SLH-DSA, standardized FIPS 205 version.
- X-Wing, version 05 of the RFC draft8.
Trail of Bits
Trail of Bits is a cybersecurity research and consulting firm. Their cryptography team has implemented PQC algorithms in Go. These implementations are also self-audited by Trail of Bits, and aim for constant-time.
- ML-DSA, standardized FIPS 204 version.
- SLH-DSA, standardized FIPS 205 version.
- LMS, standardized RFC 8554 version.
Botan
Botan is a C++ cryptography library that began in the early 2000s. Developed by Jack Lloyd and a community of contributors, it aims to be the best option for production cryptography. The German Federal Office for Information Security (BSI) has funded Botan for various projects, aiming to improve documentation, resilience, and features of the library. PQC features were added since 2023.
- ML-KEM, standardized FIPS 203 version. Based on the reference implementation.
- FrodoKEM, based on the reference implementation.
- Classic McEliece, based on reference implementation.
- ML-DSA, standardized FIPS 204 version. Based on the reference implementation.
- SLH-DSA, standardized FIPS 205 version. Based on reference implementation.
- LMS, standardized RFC 8554 version.
- XMSS, standardized RFC 8391 version.
Bouncy Castle
Founded in 2000 in Australia, Bouncy Castle provides pure implementations in both Java and C# programming languages. Widely used for its Java and C# API, the Android operating system notably forked Bouncy Castle. Having experimented with PQC since 2013, algorithms were integrated after NIST standardization.
- ML-KEM, standardized FIPS 203 version.
- HQC, not featured in Bouncy Castle C#.
- FrodoKEM, as specified in 3.
- Streamlined NTRU Prime, as specified in 4.
- Classic McEliece, as specified in specified in 5.
- ML-DSA, standardized FIPS 204 version.
- SLH-DSA, standardized FIPS 205 version.
- LMS, standardized RFC 8554 version.
- XMSS, standardized RFC 8391 version.
- X-Wing, not featured in Bouncy Castle C#.
corecrypto
Developed and used by Apple, corecrypto is a library that provides self- developed implementations of cryptographic primitives. Formal verification is performed on their implementations through the use of the formal language Cryptol31 and formal verification tools Isabelle32 and Software Analysis Workbench (SAW)33. CoreCrypto notably features PQC that has been deployed in Apple's messaging app iMessage. - ML-KEM, standardized FIPS 203 version. - ML-DSA, standardized FIPS 204 version.
Intel Cryptographic Primitives
The Intel Cryptographic Primitives library offers self-developed cryptographic implementations that are optimized for different Intel CPUs and instruction set architectures. Post-Quantum algorithm started being featured in 2023.
- ML-KEM, standardized FIPS 203 version.
- ML-DSA, standardized FIPS 204 version.
- LMS, standardized RFC 8554 version.
- XMSS, standardized RFC 8391 version.
Mbed TLS
The Mbed TLS library provides implementations of cryptographic primitives, X.509 certificate handling as well as the SSL/TLS and DTLS protocols. It was specifically designed to be well suited for embedded systems. Post-Quantum cryptography is not yet fully supported as some algorithms are still in the library's road map. However, one specific PQC algorithm is already featured.
- LMS, standardized RFC 8554 version. It is self-implemented and only features the
LMS_SHA256_M32_H10parameter set.
Summary of libraries and implemented algorithms
Non-exhaustive table of the feature PQC algorithms in open source libraries.
Differential Fuzzing results
The goal of the internship was to test the listed implementations to find vulnerabilities. There are several approaches to test cryptographic implementations. One is to use test vectors to compare operations results to defined standards. The open-source tool crypto- condor automatically performs compliance testing through test vectors. To learn more, you can refer to this blogpost by Julio Loayza Meneses.
Another approach to test cryptographic implementations is through differential fuzzing, which was the approach used during the internship. To learn more on differential fuzzing and its applications in cryptography, you can refer to this blogpost by Celian Glenaz. Quarkslab has developed an internal closed-source differential fuzzer called DeltAFLy. It allows one to assess in- depth functional correctness (for edge cases not covered with test vectors), memory safety, and constant-time behavior of cryptographic implementations. DeltAFLy had already been used to test PQC implementations, you can find out more in this blogpost. Plenty of new PQC targets from the ones listed above remained to be tested with DeltAFLy.
DeltAFLy's logo.
ML-DSA and ML-KEM key checks
The first implementation discrepancies I found were on the signature algorithm ML-DSA. OpenSSL rejects some private key inputs while liboqs accepts them and successfully returns corresponding signatures. These discrepancies come from additional private key checks that OpenSSL includes in its key parsing function. When an ML-DSA private key is parsed, the following parameters are decoded: (Ο,K,tr,s1,s2,t0)(\rho, K, \mathit{tr}, s_1, s_2, t_0). In particular, s1s_1 and s2s_2 are vectors of polynomials whose coefficients should be in a specific interval. For math enthusiasts, algebraically, s1βRq&ells_1 \in R_q^\ell and s2βRqks_2 \in R_q^k, with Rq=Zq[X]/(X256+1)R_q = \mathbb{Z}_q[X]/(X^{256}+1). When the fuzzer mutates valid inputs and gives a private key with out-of-range coefficients for the polynomials in s1s_1 or s2s_2, OpenSSL detects the malformation of the key and rejects the input. However, other libraries such as liboqs do not perform any key checks (see the next sub-section for a discussion on the consequences of this). Additionally, OpenSSL also recomputes the vector t0t_0 and the hash value tr\mathit{tr} from the decoded vectors s1s_1 and s2s_2. It then compares the recomputed values to the ones that were decoded.
The specification of ML-DSA does not define any of these key checks, nor does it impose the requirement to check the validity of a key pair before use. As a result, libraries such as OpenSSL, BoringSSL, and SymCrypt choose to add the key checks described above, while others that thoroughly follow the specification do not.
Similarly to ML-DSA, we found discrepancies related to key checks in ML-KEM. In this case, the key checks are defined in Section 7.1 of the specification1. Some of them are mandatory to perform before encapsulation and decapsulation, but one key check in particular is noted as optional. It is the pairwise consistency check (PCT). It consists in encapsulating with the public key, decapsulating the resulting ciphertext with the private key, and then verifying whether the two computed shared secrets correspond. Some libraries include this check in their key parsing function, while others do not. Consequently, the fuzzer generates inputs that do not pass the PCT, resulting in discrepancies.
Diagram of a pair-wise consistency check.
Another difference between some implementations arises from whether the mandatory key checks are performed in the encapsulation and decapsulation functions or in a separate, dedicated key check function. For example, libcrux's implementation of ML-KEM chooses the latter approach. The function
validate_public_key(pk)performs the mandatory Encapsulation key check on the public key, defined in Section 7.2 of the specification. The functionvalidate_private_key(sk, ct)performs the Decapsulation input check on the private key and the ciphertext, defined in Section 7.3 of the specification.Consequences of using malformed ML-KEM and ML-DSA key pairs
If one were to use a corrupted ML-KEM key pair that is detectable by a PCT, the resulting shared secrets would differ, and symmetric encryption would fail. For ML-DSA, regarding out-of-range s1s_1 and s2s_2 coefficients, the specification states the following: "This can be a concern when running SimpleBitUnpack and BitUnpack on inputs that may come from an untrusted source."9. However, these specific concerns are not mentioned again nor explained further in detail in the specification.
The secret vector s1s_1 is used in the computation of the challenge-response:
z=y+cβ s1z = y + c \cdot s_1 with cβRqc \in R_q the public challenge, yβRq&elly \in R_q^\ell the private nonce, and zβRq&ellz \in R_q^\ell. To avoid a bias towards s1s_1 in the response zz, the coefficients of s1s_1 must fall within the relatively short range [βΞ·,Ξ·][-\eta, \eta], and zz is accepted and returned only if its polynomial coefficients fall inside the range:
W1=[βΞ³1+Ξ²+1, Ξ³1βΞ²β1]W_1 = [-\gamma_1 + \beta + 1,\ \gamma_1 - \beta - 1] with Ξ³1\gamma_1 and Ξ²\beta depending on the parameter set. This process is called rejection sampling and makes the returned zz independent of s1s_1 if the latter has in-range coefficients. Similarly, the following value is biased towards the secret vector s2s_2:
r=wβcβ s2r = w - c \cdot s_2 with wβRqkw \in R_q^k the commit of yy sent by the signer along with the signature. During signing, another rejection sampling is applied to rr. Its values are to be accepted only if its polynomial coefficients fall inside the range W2=[βΞ³2+Ξ²+1, Ξ³2βΞ²β1]W_2 = [-\gamma_2 + \beta + 1,\ \gamma_2 - \beta - 1] with again Ξ³2\gamma_2 and Ξ²\beta depending on the parameter set.
ML-DSA's key generation ensures that the coefficients of s1s_1 and s2s_2 fall inside the required range. However, the private key's encoded format allows for coefficients of s1s_1 and s2s_2 to be outside of the required range if the right bits are flipped. In such cases, some values in the acceptance ranges W1W_1 and W2W_2 can never be reached by respectively zz and rr. As a result, the accepted zz and rr are no longer independent of s1s_1 and s2s_2, which leaks secret information and compromises the security of the algorithm. Moreover, there exists a fault injection attack34 that specifically targets the coefficients of s1s_1, underlining why these coefficients must be in range. A reporting of missing ML-KEM and ML-DSA key checks in liboqs can be found here.
Summary table of the key checks included in the tested libraries.
XMSS OID parsing bug in RustCrypto
Another discrepancy found was in the implementation of XMSS in RustCrypto. This discrepancy is caused by an actual implementation bug. Some parameter sets of XMSS use a hypertree of XMSS Merkle trees to achieve a larger amount of signatures possible. These specific parameter sets are called Multi-Tree XMSS (XMSSMT). The first four bytes of an XMSS/XMSSMT public key correspond to a parameter set identifier that the specification calls the OID. XMSS and XMSSMT's OIDs are defined separately, meaning they both start from zero and hence have colliding OIDs.
RustCrypto's implementation distinguishes XMSS and XMSSMT's OIDs by adding an offset to XMSSMT's OIDs, in the definition of an enum defined as
XmssOid. When verifying signatures using a public key imported as raw bytes, the public key has to be parsed into the library'sVerifyingKey<P>type, withPspecifying the parameter set used. This is done by using the methodVerifyingKey::<P>::try_from(bytes). This method begins by calling the functionparse_oid_and_params(bytes), which parses theXmssOidfrom the first four bytes of the imported public key./// Parses the OID and initializes params from the first bytes of a key. /// Tries XMSS OIDs first, then falls back to XMSSMT. fn parse_oid_and_params(bytes: &[u8]) -> XmssResult<(XmssOid, XmssParams)> { if bytes.len() < XMSS_OID_LEN { return Err(Error::InvalidOid(0)); } let mut raw_oid: u32 = 0; for i in 0..XMSS_OID_LEN { raw_oid |= (bytes[XMSS_OID_LEN - i - 1] as u32) << (i * 8); } let oid = XmssOid::try_from(raw_oid).or_else(|_| XmssOid::from_xmssmt_raw_oid(raw_oid))?; let mut params = XmssParams::default(); oid.initialize(&mut params)?; Ok((oid, params)) }In the above code snippet, we can see that
parse_oid_and_params(bytes)first attempts to parse the OID as an XMSS one, by directly calling the methodXmssOid::try_from(value). If this first call fails, it will fall back toXmssOid::from_xmssmt_raw_oid(oid)which attempts to parse the OID as an XMSSMT one. This method will add the XMSSMT OID offset before callingXmssOid::try_from(value)again.The problem arises when importing an XMSSMT public key whose OID collides with an XMSS one. Since
parse_oid_and_params(bytes)attempts to parse the OID as an XMSS one first, it will wrongly return theXmssOidof the colliding XMSS parameter set, instead of the actual XMSSMT one with the added offset. As a result, whenVerifyingKey::<P>::try_from(bytes)later compares the parsed OID to the expected one thatPspecifies, as shown in the code snippet below, the check will wrongly fail.impl<P: XmssParameter> TryFrom<&[u8]> for VerifyingKey<P> { type Error = Error; fn try_from(value: &[u8]) -> Result<Self, Self::Error> { let (oid, params) = parse_oid_and_params(value)?; let expected_oid = P::oid(); if oid != expected_oid { return Err(Error::InvalidOid(oid.raw_oid())); } ...XMSSMT parameter sets that have an OID that collides with an XMSS one cannot be used if the public key is imported.
The library's tests only include one XMSSMT parameter set. It has a colliding OID but the test uses a public key generated from the library's key generation function, and not a raw bytes one that has to be parsed. The reporting of this bug can be found here.
Conclusion
With recent PQC migration timelines set by state agencies and major tech companies, open source cryptographic libraries are progressively including PQC algorithms. With more and more implementations being developed, making sure that they can safely be deployed for practical usage is a big part of the post-quantum transition process.
In this blog post, we listed and documented the featured PQC algorithms in some of the most widely used open-source cryptographic libraries. We also showed that our tool DeltAFLy is capable of finding bugs and implementation discrepancies.
While implementation bugs arise from mistakes that must be corrected, implementation discrepancies often come from a permissive algorithm specification. In the latter case, the implementation discrepancy is a distinct choice from the library, which often comes down to good practices like in the case of the ML-DSA and ML-KEM key checks.
Acknowledgements
I want to personally thank Julio Loayza Meneses for supervising my internship, Celian Glenaz for helping me understand and use his tool DeltAFLy, and Quarkslab for the great experience and opportunity I had.
-
NIST FIPS 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard &larrhk&larrhk
-
FrodoKEM: Learning With Errors Key Encapsulation, Algorithm Specifications And Supporting Documentation &larrhk&larrhk
-
Classic McEliece: conservative code-based cryptography, cryptosystem specification &larrhk&larrhk
-
Status Report on the Fourth Round of the NIST Post-Quantum Cryptography Standardization Process &larrhk
-
Avis de l'ANSSI sur la migration vers la cryptographie post-quantique &larrhk
-
X-Wing: General-Purpose Hybrid Post-Quantum KEM &larrhk&larrhk&larrhk&larrhk&larrhk&larrhk
-
NIST FIPS 204: Module-Lattice-Based Digital Signature Standard &larrhk&larrhk
-
Trapdoors for Hard Lattices and New Cryptographic Constructions &larrhk
-
Recommendation for Stateful Hash-Based Signature Schemes &larrhk
-
NIST FIPS 205: Stateless Hash-Based Digital Signature Standard &larrhk
-
FrodoKEM: Key Encapsulation from Learning with Errors , version 03 &larrhk
-
Correction Fault Attacks on Randomized CRYSTALS-Dilithium &larrhk
-
π @HexRaysSA@infosec.exchange π IDA 9.5 brings better DriverKit support for reversing Apple drivers: mastodon
π IDA 9.5 brings better DriverKit support for reversing Apple drivers:
β’ Types for every DriverKit SDK from 19 to 25
β’ Classes, layouts and vtables recovered, including private-framework classes
β’ Kernel calls named, even in stripped drivers and arm64 kernelcachesπ https://hex-rays.com/blog/ida-9.5-apple-driverkit-shared- cache
-
π Hex-Rays Blog IDA 9.5: Apple DriverKit Shared Cache rss
IDA 9.5: Reversing Apple DriverKit Drivers
Apple is moving third-party drivers out of the kernel and into DriverKit. A DriverKit driver, or dext , is the kernel's C++ driver framework, IOKit, compiled into a user-space library. It is still built from C++ classes with virtual methods, and it gets work done by sending the kernel messages.

-
π HexRaysSA/plugin-repository commits sync repo: +2 releases rss
sync repo: +2 releases ## New releases - [IDA-MCP-Hub](https://github.com/captain-ai-hub/ida-mcp): 0.9.8 - [oh-my-dump](https://github.com/nevergiveupcpp/oh-my-dump): 1.0.17 -
π r/Harrogate Thinking about going out this weekend rss
Newish to the area, trying to expand my circle a bit. Thought going a few bars might meet some people.
Any recommendations where to go?
submitted by /u/Apprehensive_Ring666
[link] [comments] -
π smol-machines/smolvm smolvm v1.31.1 release
What's Changed
- chore(nix): bump flake to 1.31.0 by @github-actions[bot] in #1917
- Never lower a branch source's memory ceiling below what its cgroup still holds by @BinSquare in #1921
New Contributors
- @github-actions[bot] made their first contribution in #1917
Full Changelog :
v1.31.0...v1.31.1 -
π smol-machines/smolvm smolvm v1.31.0 release
What's Changed
- Improve Linux checkpoint extraction with sequential read advice by @BinSquare in #1852
- Let a paused machine's export and resume read the same artifact by @BinSquare in #1854
- Prepare SmolVM v1.30.2 for release by @BinSquare in #1855
- Overlap a cache disk publish's sync with its hash and upload, and report the sync's progress by @BinSquare in #1856
- Keep a checkpoint's resolver options on restore and let machine update set them by @BinSquare in #1857
- Keep image pull progress flowing while one large layer downloads by @BinSquare in #1859
- Bring PTY streamed exec to parity with framed, non-blocking pipe exec by @Vishv07 in #1825
- Give uploads without an explicit owner to the workload container's user by @BinSquare in #1862
- Harden virtio devices against out-of-range guest input by @BinSquare in #1865
- Keep an image's symlinked resolv.conf and hosts instead of writing through them by @BinSquare in #1863
- Remove the retired guest DNS proxy and stop starting its host listener by @BinSquare in #1866
- Size /dev/shm like a VM, add --shm-size, and raise inotify limits by @BinSquare in #1864
- Say the guest agent is outdated when it rejects a request it does not know by @BABTUNA in #1214
- feat(cli): support credential set-header (#1860) by @azrod in #1861
- Add --deny-cidr as deny egress rules by @BABTUNA in #1212
- Document shipped features that had no docs by @BinSquare in #1878
- Read secrets from the host keychain with --secret-keychain by @BinSquare in #1876
- Hash cache bases with ring instead of sha2 by @BinSquare in #1883
- Accept file uploads up to 1 GiB when the Content-Length is declared by @BinSquare in #1882
- Record stratum handshakes and match TLS server names against the egress watchlist by @BinSquare in #1885
- Fail a fork whose clone exited right after boot instead of reporting it running by @BinSquare in #1872
- List the Go SDK in the README's embeddable install commands. by @BinSquare in #1891
- Wait for a branch source's checkpoint in proportion to its RAM, and answer a timeout with a retryable 503 by @BinSquare in #1892
- Size the shared extraction cache under the shared lock so a trim no longer stalls branches for seconds by @BinSquare in #1899
- Serialize preparing a chunked checkpoint for restore so overlapping restores of one fresh checkpoint stop deleting each other's half-built tree by @BinSquare in #1900
- Make the shared machine JSON builder public by @BinSquare in #1893
- Say a start may be in progress when exec finds no agent by @BinSquare in #1894
- Document that registry images boot without network by @BinSquare in #1895
- Check for the agent rootfs before compiling, and build bundles nightly by @BinSquare in #1896
- Add a --state-dir flag on Linux by @BinSquare in #1897
- Report the branch memory reserve and per-child overhead in /capacity by @BinSquare in #1898
- Pin libkrun at the vsock muxer guard fix and rebuild every bundled libkrun by @BinSquare in #1901
- Update rustls-webpki and webpki-roots past the distrusted emSign roots by @BinSquare in #1902
- Mount the agent's root overlay with index=off so a restart cannot lose hardlinked files by @BinSquare in #1890
- Replace a dangling resolv.conf link instead of failing every exec after systemd-resolved is installed by @BinSquare in #1889
- Keep a large file write's finalize from timing out the host by @BinSquare in #1881
- Keep supplementary groups on exec, let uploads set owner and mode, add --no-wait-ready to batch branches by @BinSquare in #1904
- Handle branch children outgrowing the host's RAM: OOM victim order and a memory pressure guard by @BinSquare in #1905
- Pin libkrun at the macOS chmod, AMD CPUID and host-full errno fixes by @BinSquare in #1907
- Sum node memory for /capacity from per-process counters instead of smaps_rollup so a node with many machines answers in milliseconds and stops self-cordoning by @BinSquare in #1908
- Remove the timing-dependent agent keepalive test by @BinSquare in #1909
- fork control socket: retry a read interrupted by a signal by @BinSquare in #1914
- pack: the default cache cap never exceeds the filesystem that holds it by @BinSquare in #1910
- storage test: read the ext4 superblock magic instead of shelling out to file by @BinSquare in #1911
- agent: a missing target is NOT_FOUND even when the read-path resolver canonicalizes it by @BinSquare in #1912
- client test: give the partial-frame shutdown test scheduling slack by @BinSquare in #1913
- ci: build the release profile with thin LTO and 16 codegen units by @BinSquare in #1915
New Contributors
Full Changelog :
v1.30.1...v1.31.0 -
π backnotprop/plannotator v0.28.25 release
Follow @plannotator on X for updates
Missed recent releases? Release | Highlights
---|---
v0.28.24 | A new look for the Inbox, Send now, tag agents, comment on an agent's message, much smaller reads for agents, links in HTML pages
v0.28.23 | Inbox replies reach sessions with background subagents, dictated text no longer goes missing, π Looks good reaches the agent, notifications that never fail silently
v0.28.22 | π Looks good, full view for files, one viewer for a thread's images and files, every session prints its URL,PLANNOTATOR_BROWSER=noneopens nothing
v0.28.21 | Message an agent from the Inbox, video attachments, Open in for attachments, Code / Tests / Generated in code review, writes from other websites refused
v0.28.20 | Inbox search (βK), real folder names for projects, data files open in the code view, word-only replies leave questions open
v0.28.19 | Ask this session in T3 Code, folder sessions load shared stylesheets and images, the agent note asked once per agent, Copy connect prompt
v0.28.18 |plannotator inboxconnects your agents, agents are told when to use the Inbox, rendered Markdown in code review, Inbox Settings in sections
v0.28.17 | The Inbox on iPads and narrow windows, the reply bar no longer cuts off "Keep open", a Pi crash on/reloadfixed
v0.28.16 | The Inbox on a phone, a doorbell for new questions, Mark read, step through a thread's files, replies when the asking session ended
v0.28.15 | Long Inbox threads fold to what is new, "Skipped N questions" replies, Inbox list and sidebar fixes
v0.28.14 | Agents can replace an earlier question, comment on a guided review in the Inbox, issue numbers link to the repository
v0.28.12 | Update notices andplannotator update, attach any file to an Inbox message, questions with context, links to attached filesWhat's New in v0.28.25
A follow-up to 0.28.24 for the Plannotator Inbox: Re-ask, delivery ticks on the list, a count of new messages on the tab, a right-click menu on threads, and click Inbox to refresh. All PRs by @backnotprop.
Plannotator Inbox
Re-ask open questions
When two or more questions in a thread are still open, Re-ask sits beside Reply. It asks the agent to ask them again together in one new message, with fresh context. Picks you made but didn't send go along as answers.
Delivery ticks on the list
A small mark before a row's time shows where your last reply is: a clock while it's queued, dots while it's sending, β when it's saved for an agent, ββ once it's delivered.
A count of new messages on the tab
The tab reads "(3) Plannotator Inbox" and its icon gets a red badge while threads hold agent messages you haven't looked at.
Right-click a thread
Right-click a row (or Shift+F10) to copy its link or thread ID, mark it read or archive it.
Click Inbox to refresh
Click Inbox, the project you're on or the list's title to load the list again, as a page reload would. The icon turns to β» on hover. Nothing is marked read.
Smaller changes
- Close or swipe away a toast with its Γ or a sideways drag. #2021
- Images in What's new. The page shows the images a release carries, saved on your computer first. #2017
- Older Claude Code sessions update with
/reload-plugins, without restarting. #2009 - Long lists stay fast. Rows off screen are skipped, and only changed rows redraw. #2022
- Shift-click works on attached HTML pages , joining several elements to one comment. #2019
- The Sent toast fits on one line. #2010
- A linked page's Back button gets focus reliably. #2015
- A row no longer shows "Sending" while the agent is working after a turn ended and started again within a second. #2030
Plannotator
Smaller changes
- Comments wrap long words and links , show the year on older dates, keep the time visible, and show right-to-left names correctly. Question context keeps its line breaks. #2020
- Documents open faster : the annotation toolbar no longer forces a layout pass when a document opens. #2025
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: The plugin and the
plannotatorbinary update separately, so run the install script above as well. In a terminal:claude plugin marketplace update plannotator claude plugin update plannotator@plannotatorThen restart Claude Code. Inside Claude Code, run
/plugin marketplace update plannotator, then open/pluginβ Installed β plannotator β Update now.Pi:
pi update --extensionsOpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.
What's Changed
- Inbox: update older Claude Code sessions with /reload-plugins by @backnotprop in #2009
- Inbox: the Sent toast fits on one line by @backnotprop in #2010
- Inbox: a count of new messages on the tab by @backnotprop in #2011
- e2e: tag in a file comment measures the passage once the pane stops moving by @backnotprop in #2012
- e2e: wait for the touch-opened composer to take focus before Escape by @backnotprop in #2013
- Inbox: a linked page's Back takes focus once it is drawn by @backnotprop in #2015
- Inbox: delivery ticks on list rows by @backnotprop in #2016
- Inbox: images in What's new by @backnotprop in #2017
- Inbox: Re-ask open questions by @backnotprop in #2018
- Inbox: shift-click joins more elements to one comment on an attached HTML page by @backnotprop in #2019
- @plannotator/ui: five display fixes from Workspaces' break-ui pass by @backnotprop in #2020
- Inbox: close or swipe away a toast by @backnotprop in #2021
- Inbox: skip layout for rows off screen by @backnotprop in #2022
- Inbox: right-click a thread row to copy its link by @backnotprop in #2024
- @plannotator/ui 0.53.1: two fewer forced layouts on document open by @backnotprop in #2025
- Inbox: click Inbox to refresh the list by @backnotprop in #2027
- Inbox: tell the windows when a turn ends and starts again between delivery looks by @backnotprop in #2030
- Tests: two DOM tests that failed at random in CI by @backnotprop in #2031
Community
Every PR in this release is by @backnotprop.
Full Changelog :
v0.28.24...v0.28.25
-





