🏑


  1. October 24, 2026
    1. πŸ”— 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 NotoSerif through 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

      New Contributors

      Full Changelog : 1.6.5...2.0.0rc

    2. πŸ”— r/Harrogate Leeds Utd rss

      Are the Harrogate Whites meeting anywhere tomorrow?

      submitted by /u/gregthesailor
      [link] [comments]

    3. πŸ”— 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_voc and from_pascal_voc now treat <bndbox> indices as 1-based and inclusive, shifting only xmin and ymin by 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 that from_yolo loads with float noise no longer grows a pixel. Box-only objects written by 0.31.1 and earlier carry an extra +1 in xmax and ymax; 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_vlm with VLM.GOOGLE_GEMINI_2_5 or VLM.GOOGLE_GEMINI_3_5 raised ValueError as soon as a box_2d coordinate 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

      CropAnnotator and IconAnnotator used to raise IndexError or ValueError on 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_boxes and Detections.get_anchors_coordinates now compute box centers without overflowing float16: a box from 40000 to 60000 used to report an inf center. DetectionsSmoother also compares oriented-box corner distances in float64, which stops float16 and narrow integer coordinates from overflowing; integer coordinates beyond 2**53 still lose low-order pixels in the float64 average. (#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 affects sv.DetectionDataset.as_pascal_voc and sv.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: only xmin and ymin are shifted by one, and export rounds to the nearest pixel. Export rounds every corner to a whole pixel and the loader returns float32 coordinates, 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 xmax and ymax can go.

      πŸ“ Notable changes

      ⚠️ Breaking Changes

      • Pascal VOC box extents β€” as_pascal_voc and from_pascal_voc follow 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_structure now raise OSError with the destination path. (#2772)
      • JSONSink.write_and_close() raised ValueError: I/O operation on closed file. when called inside a with block, because the block's exit calls it again; it's now a no-op once the file is closed, like CSVSink.close(). (#2771)
      • JSONSink.append kept 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_vlm with the Gemini 2.5 and 3.5 connectors failed on any item whose box_2d left 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 in data; scalar NumPy values are now preserved. (#2769)
      • sv.mask_iou_batch now treats CompactMask inputs like dense masks: mismatched image shapes raise ValueError, 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_boxes and Detections.get_anchors_coordinates overflowed to inf for float16 boxes with large coordinates. (#2787)
      • DetectionsSmoother could overflow or tie on float16 and large integer coordinates when aligning oriented-box corners; integer coordinates beyond 2**53 still lose low-order pixels in the float64 average. (#2785)

      Annotators and video

      • CropAnnotator and IconAnnotator raised IndexError or ValueError on grayscale scenes. (#2788)
      • get_video_frames_generator left 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 CropAnnotator and IconAnnotator work on grayscale scenes.
      • 卒文彬 (@lu123bing) β€” fixed inf box centers for half-precision boxes.
      • A Aswanth Raj (@aswanth-07) β€” fixed overflow in DetectionsSmoother corner 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.append buffer 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 CompactMask IoU 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_product doctest.
      • Jirka Borovec (@Borda) β€” prepared the release.

      Automated contributions: Dependabot, Copilot, Claude, pre-commit.ci


      Full changelog : 0.31.1...0.31.2

    4. πŸ”— 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]

    5. πŸ”— 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

      • 2f49ed7 Merge pull request #975 from dappermint/feat/hidden-bar-inline-items
      • f35618e Merge pull request #971 from hezhizhen/codex/input-source-regression-tests
      • 665c864 feat(hidden-bar): show hidden items inline in the bar
      • 36bcd78 Merge pull request #974 from OmniNull/dependabot/npm_and_yarn/website/npm_and_yarn-9cae7cad90
      • 736ffbf test(shell): await queued input source refresh after stopping
      • 2404244 build(deps): bump astro
      • de43c42 Merge pull request #972 from hezhizhen/codex/localize-shell-choice-labels
      • 94cef1b Merge pull request #973 from dappermint/fix/shell-timed-render-pacing
      • b9f4ed4 test(shell): cover deferred input source refreshes
      • 49e30e5 fix(shell): pace timed renders by the feed seconds
      • c2048b6 fix(shell): localize built-in choice labels
      • 9a41498 Merge pull request #968 from hezhizhen/codex/localize-shell-option-titles
      • d44316c Merge PR #970: Read the input source after the change notification
      • 2c07492 fix(shell): skip a queued input source read after listening stops
      • 2d1bd27 fix(shell): read the input source after the change notification
      • 8f5e27b Close the TOML example in the components configuration guide
      • c7533ce Merge PR #966: Scroll in batches the surface can keep up with
      • 7e92c8e Merge PR #964: Pin the remaining actions to commit SHAs
      • f7a3d48 test(shell): simplify option title localization coverage
      • 9bd82c5 fix(shell): localize built-in widget option titles
      • 9cf93a6 Merge PR #962: Make root scripts declare HTTP hosts and allow plain HTTP only on loopback
      • 4cf64cf test(shell): scroll in batches the surface can keep up with
      • 9435b2e ci: drop the stored checkout token in website and scope greetings permissions
      • 99d2f28 docs(shell): put the root capabilities key above the option tables
      • fff3f78 ci: pin the remaining actions to commit shas
      • 86572bf fix(shell): make root scripts declare http hosts and allow plain http only on loopback
    6. πŸ”— 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

    7. πŸ”— 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

    8. πŸ”— 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
      
    9. πŸ”— 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=none opens 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 inbox connects 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 /reload fixed

      What'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 | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. In a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin β†’ Installed β†’ plannotator β†’ Update now.

      Pi:

      pi update --extensions
      

      OpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.

      What's Changed

      New Contributors

      Community

      Full Changelog : v0.28.29...v0.28.30

    10. πŸ”— Andrew Healey's Blog Decompiling Fast Food Tycoon 2: Drawing the World rss

      How a 2001 business sim rendered its rich and detailed cities.

  2. October 23, 2026
    1. πŸ”— IDA Plugin Updates IDA Plugin Updates on 2026-10-23 rss

      IDA Plugin Updates on 2026-10-23

      Activity:

      • augur
        • 86a36fe5: Merge pull request #15 from 0xdea/dependabot/github_actions/actions-d…
        • 021fa116: ci: bump taiki-e/install-action
      • haruspex
        • dc94d1f4: Merge pull request #19 from 0xdea/dependabot/github_actions/actions-d…
        • 9632d682: ci: bump taiki-e/install-action
      • rhabdomancer
        • eea04bef: Merge pull request #19 from 0xdea/dependabot/cargo/toml-1.1.8spec-1.1.0
        • 34ea21e0: Merge pull request #18 from 0xdea/dependabot/github_actions/actions-d…
        • 58e6f0c9: chore: bump toml from 1.1.6+spec-1.1.0 to 1.1.8+spec-1.1.0
        • 603de3fe: ci: bump taiki-e/install-action
    2. πŸ”— 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

    3. πŸ”— 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"
      
    4. πŸ”— 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]

    5. πŸ”— 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=none opens 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 inbox connects 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 /reload fixed
      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

      What'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_plan and 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 | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. In a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin β†’ Installed β†’ plannotator β†’ Update now.

      Pi:

      pi update --extensions
      

      OpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.

      What's Changed

      Community

      Full Changelog : v0.28.27...v0.28.29

    6. πŸ”— backnotprop/plannotator v0.28.28 release

      chore: bump version to 0.28.28

    7. πŸ”— 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

      • 28ded16 Merge pull request #959 from dappermint/fix/toolchain-cache-recovery
      • 810a195 ci: start from a clean toolchain when its cache restore fails
      • 0e0bf3c Merge PR #958: Add Fluxer community chat links
      • 9f35cdf docs: add fluxer community chat links
      • 4450248 Update SwiftFormat to 0.64.1
      • 9bfd535 Merge pull request #921 from dappermint/test/qa-suite-hardening
      • 4eba57f style(hidden-bar): drop the trailing comma swiftformat 0.63 rejects
      • 931a291 Merge pull request #957 from hezhizhen/codex/fix-hidden-native-cross-display
      • c532780 test(hidden-bar): stop depending on the finder extension setting
      • ba39913 test(shell): give bundled widget renders a 1 s cpu budget
      • 2b4cf58 test(shell): wait for the bar before counting its widgets
      • 18427da test(support): let until name the condition it waited for
      • 958bbfd fix: discard deferred native moves for hidden windows
      • 22b8f6c Translate the new swipe-edge and cross-display drag settings
      • 92ca342 Merge pull request #952 from brdoney/swipe-edge-behavior
      • b7b10dd Merge pull request #933 from hezhizhen/codex/native-titlebar-cross-display
      • 47d8df0 Merge pull request #949 from brdoney/fill-left-reserve-space
      • 6b608a4 Merge pull request #956 from brdoney/fix-nil-layer-border
      • dc5117e Merge pull request #951 from hezhizhen/codex/fix-notification-api-reference
      • a89d802 fix(shell): draw no border when a widget sets a width without a color
      • dafebd0 Update fill-left reserve docs and reuse the overlapping case
      • c24495e Add configurable workspace swipe behavior at the edges
      • 56dd4a4 fix(docs): include notification types in the Luau reference
      • bc403f5 fix: retain deferred native drag correction obligations
      • 44459e7 fix: ignore managed frames during native cross-display adoption
      • f71c0a6 feat: opt in to native title-bar moves across displays
      • 9fc6374 Merge pull request #940 from hezhizhen/codex/fix-wallpaper-region-crop
      • 672f8ff Reserve workspace bar space in Fill Left of Notch mode
      • cf3599e Merge PR #945: Check widget option declarations and add Nocturne options
      • 97b8aaa test(shell): match whole option names in the declaration check
      • efb89c7 fix: crop full-window wallpaper captures before region fallback
      • 80dca94 feat(shell): declare scratchpad, calendar and weather options for nocturne
      • 37f7889 test(shell): check bundled widgets declare the options they read
      • f8cddb7 Merge pull request #941 from dappermint/fix/touch-count-provider-rewrap
      • ddc5e5c Merge origin/main while preserving notification support
      • 10455b5 Merge pull request #943 from rickythefox/feat/942-focus-rank
      • d61a7d3 Dismiss notifications through their native Close action
      • bacd0e5 Add native notification actions and capture diagnostics
      • 2ebfb50 feat(ipc): expose window focus history via query windows
      • 0aa1470 Match Notifications to OmniShell styles
      • 4953efe Add retained notifications to OmniShell
      • 31d4e80 fix(input): stop the touch count provider growing on every read
    8. πŸ”— 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

    9. πŸ”— 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=none opens 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 inbox connects 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 /reload fixed
      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

      What'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 | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. In a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin β†’ Installed β†’ plannotator β†’ Update now.

      Pi:

      pi update --extensions
      

      OpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.

      What's Changed

      Community

      Most of this release came from your reports. Thank you:

      Full Changelog : v0.28.26...v0.28.27

    10. πŸ”— 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.

    11. πŸ”— 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.

  3. October 22, 2026
    1. πŸ”— 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
        • 31bf35ed: Merge pull request #31 from williballenthin/fix-pyside6-first
        • d1042cb2: prefer PySide6 over PyQt5 so IDA 9.2+ doesn't show the PyQt5 shim dialog
      • 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
    2. πŸ”— 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

    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

    4. πŸ”— exe.dev Give Your Agents Less Internet rss

      The old Yahoo 101 billboard, but modified. It says "exe.dev, A nice place
for your agents to stay off the Internet", with "on" crossed out and replaced
by "off". A marquee sign below it reads "egress your-vm
integrations".

      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.

      Diagram: an exe VM's direct connections to a random website and to a trusted
service are both blocked. The VM reaches the trusted service only through an
exe integration. The Network access dialog for a VM, with two options: All destinations
(unrestricted internet access) and Integrations only (allow attached
integrations; block other outbound connections). Below them is the equivalent
command, egress exfoliate all.

      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.xyz
      

      It 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/docs
      

      Limit its internet access to integrations only:

      $ ssh exe.dev egress no-net integrations
      Set egress policy for "no-net" to integrations
      

      Now the same request is rejected:

      $ ssh no-net.exe.xyz curl -fsS https://exe.dev
      curl: (6) Could not resolve host: exe.dev
      

      Create 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-net
      

      Access 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
      
    5. πŸ”— Hex-Rays Blog Hex-Rays Completes Acquisition of HexAI to Expand Its Agentic Platform Offering for Cybersecurity Research rss

      Hex-Rays Completes Acquisition of HexAI to Expand Its Agentic Platform
Offering for Cybersecurity Research

      HexAI's team joins Hex-Rays, the company behind IDA Pro, to bring IDA technology into its agentic security research platform.

    6. πŸ”— 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."

      altAnthropic saw PRs merged per day snowball 10x in less than 4 months ' time. Source: Anthropic

      That'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:

      altScion's architecture, at a high level

      I 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:

      1. 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.
      2. 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.
      3. 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.
      4. 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.
    7. πŸ”— 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]

    8. πŸ”— Console.dev newsletter Sponsor: Falconer rss

      Monitor your docs like your code. Falconer finds and fixes doc issues before they mislead agents.

      Visit Falconer

    9. πŸ”— 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.

    10. πŸ”— 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.

    11. πŸ”— Console.dev newsletter Sponsor: BuildKite rss

      Better CI

      Visit BuildKite

    12. πŸ”— 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=none opens 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 inbox connects 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 /reload fixed
      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

      What'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
      • Afile.ts:42 link 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 withoutgh. #1995 by @viniciusestevam

      Install / Update

      macOS / Linux:

      curl -fsSL https://plannotator.ai/install.sh | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. In a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin β†’ Installed β†’ plannotator β†’ Update now.

      Pi:

      pi update --extensions
      

      OpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.

      What's Changed

      New Contributors

      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:

      Full Changelog : v0.28.25...v0.28.26

    13. πŸ”— pydantic/monty v1.3.0 - 2026-10-21 release

      What's Changed

      New Contributors

      Full Changelog : v1.2.0...v1.3.0

    14. πŸ”— 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

      Full Changelog : v1.31.0...v1.31.2

    15. πŸ”— 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

      • 8ecdfbf Merge pull request #938 from dappermint/fix/command-palette-shortcuts
      • 20204d2 Merge pull request #937 from dappermint/fix/live-wallpaper-capture
      • 6f734a5 Merge pull request #936 from dappermint/perf/idle-1019
      • ae50dec Merge branch 'main' into perf/idle-1019
      • 223c61e Merge pull request #935 from dappermint/perf/input-1019
      • f1adb34 fix(palette): match shortcuts by key position on non-qwerty layouts
      • ca21cc4 fix(wallpaper): keep live wallpaper captures already clipped to the display
      • 480451b test(input): check captured drags still reach main, keep the forward private
      • 91a3049 fix(wallpaper): keep the crop at the display size for fractional window origins
      • 0e9b55d test(shell): assert both backdrop filters survive a fill only repaint
      • 49a3955 fix(wallpaper): capture live wallpapers drawn above the desktop level
      • c20322e Merge upstream/main into perf/idle-1019
      • 76364c3 Merge upstream/main into perf/input-1019
      • d2a6d2f Merge pull request #934 from OmniNull/dependabot/npm_and_yarn/website/npm_and_yarn-63f9813d79
      • e81e6f1 build(deps): bump vite
      • 707d37d Keep settled tab rail moves on SkyLight after animation moves
      • 0b5fa2b Skip tab rail relayout when its size is unchanged
      • 2b75644 Check screenshot selection once per pointer-validated focus handoff
      • 19980a7 Merge pull request #931 from dappermint/test/stabilise-shell-ui-tests
      • 6af545c test(shell): wait for the drawer package before toggling its popout
      • faa6219 fix(surface): ignore registrations whose window was deallocated
      • 39bcaaa Pass query options instead of a window count to SkyLight queries
      • 7de1437 Render launcher icons in the system icon style
      • bdeeddb Skip clipboard items that macOS excludes from history
      • 5b1beb0 Read window fullscreen state in the admission attribute batch
      • 1059fa2 Query a dragged window's identity off the main connection
      • 2736ce5 Merge pull request #927 from CallMeLaNN/fix-zsh-completion
      • 55a2737 docs: initialize compinit before evaluating zsh completions
      • 023b7b3 test: cover zsh completion eval registration and autoload paths
      • 4b0d1f4 test: wrap long completion harness lines
      • d1f28f2 test: call zsh completer explicitly in completion harnesses
      • 2aeb8d9 Merge pull request #914 from hezhizhen/codex/dwindle-native-live-resize
      • 8b1b400 fix: use AX fallback for final native resize frames
      • bf662ab perf: avoid duplicate native resize renders on release
      • 7f33a6c fix: avoid world commits for rejected native resizes
      • 416f198 feat: resize Dwindle neighbours during native edge drags
      • eaf668c fix: zsh completions for eval based on official doc
      • 9481efe test(shell): cover fill-only repaint keeping backdrop filters
      • 4c18d61 perf(input): stop captured drags from blocking on the main thread
      • a792655 perf(idle): cut idle wakeups and redundant layer work
    16. πŸ”— 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 provider inside your infrastructure. The orb provider then reaches out to Amp and waits for requests to spawn, pause, or delete orbs. Like this:

      1. amp orb provider opens a connection to ampcode.com. 2. Amp sends events to the provider. 3. The provider spawns an orb per thread. 4. Each orb runs in your infrastructure and connects back to its thread on ampcode.com. No inbound ports are needed.

      How you satisfy those requests is up to you, because amp orb provider will dispatch the requests for orb operations (spawn to create or resume orbs, pause, and delete) to a program that you provide, like so:

      $ amp orb provider ./dispatch.sh
      

      In 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"
              ;;
      esac
      

      Install the E2B CLI and the e2b package, set E2B_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
              ;;
      esac
      

      Use Amp's Helm chart to run orbs on GKE, EKS, or AKS. Under the hood, it runs amp orb provider with a supplied dispatch program that handles spawning, pausing, and deleting orbs. You don't need to write a dispatch script yourself.

      1. Create a custom orb provider in your Amp workspace and copy its token.
      2. Prepare a dedicated cluster with worker nodes and snapshot storage. Paused orbs are saved to storage and can resume on another worker node.
      3. Download the Kubernetes setup files. The ZIP includes gke.md, eks.md, and aks.md with 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 start amp orb bootstrap in 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.sh
      

      Once 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.

      The full new thread composer with the executor picker open and our-k8s-orbs highlighted and selected under Self-Hosted The full new thread composer with the executor picker open and our-k8s-orbs highlighted and selected 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.

  4. October 21, 2026
    1. πŸ”— IDA Plugin Updates IDA Plugin Updates on 2026-10-21 rss

      IDA Plugin Updates on 2026-10-21

      New Releases:

      Activity:

      • capa
      • 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, and CFunction to be dropped bef…
      • mcrit-plugin
        • 38f9bac7: Make the Ghidra tab headers clickable
        • 36b42d36: Add a MCRIT plugin for Ghidra
      • 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
    2. πŸ”— earendil-works/pi v1.4.0 release

      New Features

      • Image input for classifiers : codemode models.classify() accepts images for TypeSafe's Jev and Cloudflare's Clef models on typesafe, 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_WORKERS raises 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.json schema, listing all provider, model, model override, and compatibility fields (#10790)
      • Codemode models.classify() now accepts images for TypeSafe's Jev and Cloudflare's Clef models on typesafe, cloudflare-workers-ai, and OpenRouter, and lists Clef Omni and Jev 1.14 on Workers AI.
      • Provider-level compat in models.json now also applies to classifier models, with the System One fields imageInput and sendImageOptInHeader for proxies that serve another service's classifiers. Extension classifier models accept compat too.
      • Added MiniMax-M3.1-Flash to the minimax and minimax-cn providers, 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_headers handlers no longer see the OpenRouter, NVIDIA NIM, and OpenCode attribution headers; returning null for one still removes it. Cloudflare requests send pi's detailed User-Agent instead of pi-coding-agent, as do GitHub release checks for tool downloads, and OpenCode requests send x-opencode-client whenever attribution is enabled, not only with a session.
      • generateSummary() and generateSummaryWithUsage() now ignore their reserveTokens parameter. Summary requests use the model's output limit instead.
      • Changed the default GitHub Copilot model from gpt-5.4, which Copilot retired, to gpt-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-pro for the xiaomi and Xiaomi Token Plan providers, since mimo-v2.5-pro left the catalog.
      • Grok 4.3 and Grok 4.5 on the xai provider now offer the xhigh thinking 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.reserveTokens only controls when compaction starts (#9512, #9075).
      • Fixed models.schema.json missing descriptions for provider and model fields, so editors showed no hints for them (#10790)
      • Fixed pi update failing with "Managed install marker is missing or invalid" when managed-install.json starts 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/editor dialogs and inline custom() 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/xsel process 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_WORKERS raises the limit of two workers (#11184)
      • Fixed extensions failing to load when importing @earendil-works/pi-ai/models (e.g. for clampThinkingLevel) by exposing the subpath through the extension loader aliases and virtual modules (#11156)
      • Fixed mcp.json files that start with a UTF-8 BOM failing to parse, which skipped all their MCP servers and made pi mcp add/pi mcp remove fail (#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 /tree navigation 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 with defaultActive: 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 grep tool following RIPGREP_CONFIG_PATH, where options such as --fixed-strings silently changed regex searches into literal ones. The tool now runs rg --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 PATH and the legacy WSL bash.exe launcher when Windows is not installed in C:\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 request instead of compacting and retrying (#11016 by @petrroll)
      • Fixed the openai-codex provider offering gpt-5.5 and gpt-5.3-codex-spark, which always fail for ChatGPT accounts (#11173 by @lucasmeijer)
      • Fixed whitespace-only tool output (for example a bare \r\n from 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 completion errors 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)
    3. πŸ”— 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 Key Encapsulation Mechanism, where Alice generates a key
pair, Bob uses her encapsulation key to generate a shared secret and
ciphertext, and Alice uses her decapsulation key to recover the shared secret
from the
ciphertext.

      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-128s and SLH-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_H10 parameter set.

      Summary of libraries and implemented algorithms

      The table summarises the contents of this section: it lists the open
source projects studied, along with the PQC algorithms they support or
not.

      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 features a red and gold delta symbol with a pair of
wings.

      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.

      Illustrates the pair-wise consistency check. First, a call to encapsulate
returns a ciphertext and shared secret 1. Decapsulating the ciphertext with
the corresponding secret key yields a second shared secret. The check verifies
is both shared secrets are equal or
not.

      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 function validate_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.

      A table summarising which libraries implement ML-KEM pair-wise consistency
check and ML-DSA's additional checks. From the projects listed in the table,
only OpenSSL, BoringSSL, and SymCrypt implement
them.

      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's VerifyingKey&lt;P&gt; type, with P specifying the parameter set used. This is done by using the method VerifyingKey::&lt;P&gt;::try_from(bytes). This method begins by calling the function parse_oid_and_params(bytes), which parses the XmssOid from 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 method XmssOid::try_from(value). If this first call fails, it will fall back to XmssOid::from_xmssmt_raw_oid(oid) which attempts to parse the OID as an XMSSMT one. This method will add the XMSSMT OID offset before calling XmssOid::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 the XmssOid of the colliding XMSS parameter set, instead of the actual XMSSMT one with the added offset. As a result, when VerifyingKey::&lt;P&gt;::try_from(bytes) later compares the parsed OID to the expected one that P specifies, as shown in the code snippet below, the check will wrongly fail.

      impl<P: XmssParameter> TryFrom<&[u8]> for VerifyingKey&lt;P&gt; {
          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.


      1. NIST FIPS 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard &larrhk&larrhk

      2. Hamming Quasi-Cyclic (HQC) specification &larrhk&larrhk

      3. FrodoKEM: Learning With Errors Key Encapsulation, Algorithm Specifications And Supporting Documentation &larrhk&larrhk

      4. NTRU Prime: round 3 submission &larrhk&larrhk

      5. Classic McEliece: conservative code-based cryptography, cryptosystem specification &larrhk&larrhk

      6. Status Report on the Fourth Round of the NIST Post-Quantum Cryptography Standardization Process &larrhk

      7. Avis de l'ANSSI sur la migration vers la cryptographie post-quantique &larrhk

      8. X-Wing: General-Purpose Hybrid Post-Quantum KEM &larrhk&larrhk&larrhk&larrhk&larrhk&larrhk

      9. NIST FIPS 204: Module-Lattice-Based Digital Signature Standard &larrhk&larrhk

      10. Trapdoors for Hard Lattices and New Cryptographic Constructions &larrhk

      11. Recommendation for Stateful Hash-Based Signature Schemes &larrhk

      12. RFC 8554: Leighton-Micali Hash-Based Signatures &larrhk

      13. RFC 8391: XMSS, eXtended Merkle Signature Scheme &larrhk

      14. NIST FIPS 205: Stateless Hash-Based Digital Signature Standard &larrhk

      15. FrodoKEM: Key Encapsulation from Learning with Errors , version 03 &larrhk

      16. Pq-Code-Package/Mlkem-Native &larrhk

      17. NVIDIA cuPQC &larrhk&larrhk

      18. HQC reference implementation &larrhk

      19. PQCrypto-LWEKE: FrodoKEM implementation &larrhk

      20. Openssh-Portable/Sntrup761.c &larrhk

      21. NTRU Prime: Software &larrhk

      22. PQClean implementation of Classic McEliece &larrhk

      23. Pq-Code-Package/Mldsa-Native &larrhk

      24. Pq-Code-Package/Slhdsa-c &larrhk

      25. Cisco/Hash-Sigs : LMS reference implementation &larrhk

      26. XMSS reference implementation &larrhk

      27. FrodoKEM, ISO standard &larrhk

      28. HACL*: A High-Assurance Cryptographic Library &larrhk

      29. hax: A high assurance translations tool &larrhk

      30. PQClean implementation of FrodoKEM &larrhk

      31. Cryptol: The Language of Cryptography &larrhk

      32. Isabelle: a generic proof assistant &larrhk

      33. SAW: The Software Analysis Workbench &larrhk

      34. Correction Fault Attacks on Randomized CRYSTALS-Dilithium &larrhk

    4. πŸ”— @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

    5. πŸ”— Hex-Rays Blog IDA 9.5: Apple DriverKit Shared Cache rss

      IDA 9.5: Apple DriverKit Shared Cache

      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.

    6. πŸ”— 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
      
    7. πŸ”— 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]

    8. πŸ”— 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

    9. πŸ”— 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

    10. πŸ”— 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=none opens 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 inbox connects 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 /reload fixed
      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 and plannotator update, attach any file to an Inbox message, questions with context, links to attached files

      What'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 | bash
      

      Windows:

      irm https://plannotator.ai/install.ps1 | iex
      

      Claude Code Plugin: The plugin and the plannotator binary update separately, so run the install script above as well. In a terminal:

      claude plugin marketplace update plannotator
      claude plugin update plannotator@plannotator
      

      Then restart Claude Code. Inside Claude Code, run /plugin marketplace update plannotator, then open /plugin β†’ Installed β†’ plannotator β†’ Update now.

      Pi:

      pi update --extensions
      

      OpenCode: Re-run the install script above. It now also clears the OpenCode 2 plugin cache.

      What's Changed

      Community

      Every PR in this release is by @backnotprop.

      Full Changelog : v0.28.24...v0.28.25