Skip to content

Releases: siinghd/brookmd

brookmd 0.23.0 — wire delta mode retires the streaming re-emit floor

Choose a tag to compare

@siinghd siinghd released this 21 Jul 15:19

brookmd 0.23.0 — wire delta mode: the streaming re-emit floor is retired

The last by-design quadratic in the streaming pipeline is gone. Previously, every append re-emitted each open block's full rendered HTML across the patch boundary — O(n²/chunk) total bytes for a block that grows across many chunks (the documented "re-emit floor"). Wire contract v1.2.0 adds an opt-in delta mode: an active block that was emitted in the previous patch serializes as a verified splicehtml_delta: { keep_bytes, keep_units, append } — against that emit. The kept prefix is established by byte comparison, never structural inference, so reconstruction is byte-exact by construction. Committed blocks always carry full HTML.

Measured (200 KB document, 256-byte chunks, real WASM boundary):

Shape Total patch JSON before After Wall
Streaming list 119.6 MB 0.78 MB (153× less) 2.8× faster
Unclosed code fence 80.1 MB 0.58 MB (137× less) 4.9× faster
Fast-committing prose 2.0 MB 1.95 MB unchanged

Emitted bytes are now gated linear in CI (tests/scaling.rs); the multipliers grow with document size since the quadratic curve is gone.

  • npm brookmd / brookmd-react-native: enabled automatically and invisibly — no API change, Block.html is always complete. Just upgrade.
  • Raw-boundary consumers (WASM BrookParser, native BrookSession, C ABI): opt-in via setWireDelta(true) / wire_delta: true; the default wire stays byte-identical to contract v1.1.0. Enabling it obliges you to reconstruct per WIRE.md §11.
  • Pinned by reconstruction-parity suites (dual UTF-8/UTF-16 offset verification), wire goldens in all five language surfaces (core / FFI / C-ABI / Kotlin / Swift, including the Android instrumented twin on an emulator), a fuzzer extension asserting per-patch reconstruction on arbitrary inputs, and the RN app-level e2e on emulator + simulator.

Ships as npm brookmd@0.23.0, crates.io brookmd-core 0.23.0, and npm brookmd-react-native@0.1.1. Also includes 0.22.2's core perf pass (7–24% faster streaming across all shapes).

Prebuilt native artifacts (experimental)

CI-built binaries for the native bindings, rebuilt from this release — the Swift/Kotlin/C-ABI/Flutter bindings are not yet on package registries. All emit the same versioned wire (WIRE.md v1.2.0), pinned by per-language golden tests.

Asset Contents SHA-256
brook_md_ffi.xcframework.zip Swift/uniffi XCFramework: iOS device + simulator + macOS (arm64 + x86_64) 9a3108613c5b259632ee6d7509029517398879fbe62f19c1f547c3a4478d8fd4
brookmd-ffi-android-jniLibs.zip Android libbrook_md_ffi.so — arm64-v8a, armeabi-v7a, x86_64 (16 KB page aligned) 9a4988929179d2399bc0a08cf4fc55381081023eaaa4e940de55a3eab61fd17b
brookmd-ffi-rn-ios.xcframework.zip React Native iOS XCFramework (device + fat simulator) ffa941cb9471ada14da6eb8d5baaf293b130ab8faed06860ec19decc1025ebcd
brookmd-cabi-android.zip C-ABI libbrook_md_cabi.so per ABI + brook_md.h d730ea438ba0de88a740ca750599eea0063d869f7195ba151b231ea3c56daf4c
brookmd-cabi-apple.zip C-ABI XCFramework + universal macOS dylib + brook_md.h e7abbb172324ad3d452307191a7fce7a4ecac13ba515a8262c76ae13136ade4d

Swift Package Manager binaryTarget example:

.binaryTarget(
    name: "BrookMdRustFFI",
    url: "https://github.com/siinghd/brookmd/releases/download/v0.23.0/brook_md_ffi.xcframework.zip",
    checksum: "9a3108613c5b259632ee6d7509029517398879fbe62f19c1f547c3a4478d8fd4"
)

brookmd 0.22.2 — final perf pass + brookmd-react-native 0.1.0

Choose a tag to compare

@siinghd siinghd released this 21 Jul 13:47

brookmd 0.22.2

A final performance pass over the Rust core before the platform rollout: profiling found two hot spots shared by every streaming document shape, and fixing them makes streaming 7–24% faster across all benchmarked shapes — byte-identical output, native and WASM builds alike.

  • the scanner's newline search (line_end), the hottest primitive in the engine (re-run by every block probe on every line), now scans 8 bytes per step (SWAR) instead of one;
  • the inline renderer copies runs of plain text with a single push_str instead of per-byte dispatch + escape calls.

Verified byte-identical by the full battery: CommonMark + GFM spec goldens, wire-envelope goldens, chunk-independence property tests, and the streaming-parity fuzzer. Ships as brookmd@0.22.2 on npm and brookmd-core 0.22.1 on crates.io.

This release window also includes brookmd-react-native@0.1.0 — the first npm publish of the React Native package, gated on the app-level end-to-end CI run (a real RN 0.86 release build streaming the wire goldens through the native parser on an Android emulator and an iOS simulator, byte-asserted). See 0.22.1's notes in the changelog for the Metro/Hermes compatibility fixes that e2e gate surfaced.

Prebuilt native artifacts (experimental)

CI-built binaries for the native bindings, rebuilt from the optimized core — the Swift/Kotlin/C-ABI/Flutter bindings are not yet on package registries. All emit the same versioned wire (WIRE.md v1.1.0), pinned by per-language golden tests.

Asset Contents SHA-256
brook_md_ffi.xcframework.zip Swift/uniffi XCFramework: iOS device + simulator + macOS (arm64 + x86_64) aaf78778121b901cbdb17567640237e2f722ab7adb1cf9fffc126b0a7e58cb45
brookmd-ffi-android-jniLibs.zip Android libbrook_md_ffi.so — arm64-v8a, armeabi-v7a, x86_64 (16 KB page aligned) 7264daa80bf2fd973e9862bf8ad58f0efbab61ad6a8372a532565b4ee1706f9a
brookmd-ffi-rn-ios.xcframework.zip React Native iOS XCFramework (device + fat simulator) eb3ec7d8aa8581c249ffeb1e693bd71c2701732439dc73e7fe9c24719dd8af48
brookmd-cabi-android.zip C-ABI libbrook_md_cabi.so per ABI + brook_md.h 79f6cf4359e4abddf87f4edbad62e394587d7741a3815ab282ced436b0c2017d
brookmd-cabi-apple.zip C-ABI XCFramework + universal macOS dylib + brook_md.h fa9f29b23e63131ef828f4c3e1636ddd6da51c4ad5a454764ddcb98221a596dc

Swift Package Manager binaryTarget example:

.binaryTarget(
    name: "BrookMdRustFFI",
    url: "https://github.com/siinghd/brookmd/releases/download/v0.22.2/brook_md_ffi.xcframework.zip",
    checksum: "aaf78778121b901cbdb17567640237e2f722ab7adb1cf9fffc126b0a7e58cb45"
)

brookmd 0.22.0 — the flux-md rename

Choose a tag to compare

@siinghd siinghd released this 20 Jul 21:03

brookmd 0.22.0

The project formerly named flux-md is now brookmd — same project, same wire, new name. npm flux-md is deprecated and frozen at 0.21.0; install brookmd. The Rust core lives on crates.io as brookmd-core.

Migration is a mechanical rename: package flux-mdbrookmd, APIs Flux*Brook* (BrookClient, BrookMarkdown, initBrook, …), element <flux-markdown><brook-markdown>, CSS --flux-*--brook-* and .flux-md.brook-md, pending-link marker data-flux-pendingdata-brook-pending (wire contract 1.0.0 → 1.1.0; envelope unchanged). Full table in the changelog.

0.22.0 also carries everything from 0.21.0: the streaming worst-case performance campaign (five previously quadratic shapes now linear, byte-identically) and the new subpath exports.

Prebuilt native artifacts (experimental)

CI-built binaries for the native bindings — not yet published to any package registry; device validation is in progress. All emit the same versioned wire (WIRE.md v1.1.0), pinned by per-language golden tests.

Asset Contents SHA-256
brook_md_ffi.xcframework.zip Swift/uniffi XCFramework: iOS device + simulator + macOS (arm64 + x86_64) ab8c7f8148302efff78756c328bca3552832aabde70fd89372cec08ce79de224
brookmd-ffi-android-jniLibs.zip Android libbrook_md_ffi.so — arm64-v8a, armeabi-v7a, x86_64 (16 KB page aligned) c4afaad6fcc7e9b3ddceac5d63a6b5fb02da213df825736bde90ecf940ad0e2e
brookmd-ffi-rn-ios.xcframework.zip React Native iOS XCFramework (device + fat simulator) 68ed6d7bcf48249cbe3614f6c93fe210387b022dedebed64931b41cb7d5a712c
brookmd-cabi-android.zip C-ABI libbrook_md_cabi.so per ABI + brook_md.h fe37e1d3c535baa6ce76be1ee293600b58ea9a4b744acbc0ea2e104990034aa1
brookmd-cabi-apple.zip C-ABI XCFramework + universal macOS dylib + brook_md.h 9b6f97b0283473ffa3afe121b16c3bf743f6f4ec746f0b103bd8de224c5316ad

Swift Package Manager binaryTarget example:

.binaryTarget(
    name: "BrookMdRustFFI",
    url: "https://github.com/siinghd/brookmd/releases/download/v0.22.0/brook_md_ffi.xcframework.zip",
    checksum: "ab8c7f8148302efff78756c328bca3552832aabde70fd89372cec08ce79de224"
)

flux-md v0.12.0

Choose a tag to compare

@siinghd siinghd released this 30 May 21:32
8b029a8

Optional default theme.

import "flux-md/styles.css";

Good-looking output out of the box — including the built-in syntax highlighter's colors (without any CSS, highlight() rendered uncolored). Scoped to .flux-md, driven by --flux-* CSS variables (re-theme by overriding a few), light by default with automatic dark via prefers-color-scheme (force with class="flux-md flux-dark" / flux-light). Opt-in and zero-runtime — the rendered HTML is unchanged; skip the import to bring your own CSS.

Full notes: packages/flux-md/CHANGELOG.md

flux-md v0.11.0

Choose a tag to compare

@siinghd siinghd released this 30 May 19:39

Opt-in live region + root attributes + docs/demo.

  • <FluxMarkdown> and mountFluxMarkdown accept className/id/role and aria-live/aria-atomic on the root. aria-live="polite" announces streamed content to screen readers (coalesces rapid updates; off by default). Covers React + the DOM mount (Web Component, Vue/Svelte/Solid).
  • Docs: repo root README, a "Structured block data" guide, and a runnable Data Studio demo (sort/filter/CSV table + live TOC from block.data, mid-stream).

Full notes: packages/flux-md/CHANGELOG.md

flux-md v0.10.0

Choose a tag to compare

@siinghd siinghd released this 30 May 17:08

SSR-safe + an opt-in structured block.data channel.

  • new FluxClient() / renderToString(<FluxMarkdown/>) are server-safe (worker creation deferred to first append/pipeFrom) across React/Vue/Solid/Svelte.
  • blockData: true (per-stream config, default off → byte-identical output) emits typed structured data on block.kind.data, surfaced as typed BlockComponentProps fields, streaming in lock-step with the HTML:
    • Table {headers,rows,aligns} · Heading {level,text,id} · CodeBlock {lang,code} · MathBlock {latex} · List {ordered,start}
    • Build toolbars / TOCs / charts / copy buttons from data, no HTML re-parse.

Full notes: packages/flux-md/CHANGELOG.md