Skip to content

Releases: momics/iroh-http

v0.6.1

Choose a tag to compare

@github-actions github-actions released this 21 Jul 09:06
915b1a9

[0.6.1] - 2026-07-21

🐛 Bug Fixes

  • (android) Manage legacy DNS-SD multicast lifecycle
  • (release) Publish curated changelog notes
  • (android) Fail closed without legacy multicast service
  • (core) Disable QUIC GSO on Android
  • (release) Preserve dependency graph during version bump

💼 Other

  • (deps) Bump js-yaml to 4.3.0

📚 Documentation

  • Align skill review and closure language
  • Complete next-release readiness audit
  • Format mobile setup guides
  • Make mobile release gate executable
  • (core) Link Android GSO removal tracker

⚙️ Miscellaneous Tasks

  • Consolidate project agent skills

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 18 Jul 15:45
983d356

[0.6.0] - 2026-07-18

🚀 Features

  • (ci) Add workflow_dispatch tag input to re-benchmark a release (#253)
  • (tauri) Make httpi:// scheme response cap configurable
  • (example) Stream peer-hosted audio and images over httpi:// (#265)
  • (core) Route self-requests via in-process loopback (#267)
  • (shared) Add ServeHandle.close() and Symbol.asyncDispose
  • (adapter) Unify fetch header/numeric validation across Node/Deno/Tauri
  • (adapter) Unify fetch input validation across adapters
  • (adapter) Unify serve/endpoint numeric caps across adapters
  • (adapter) Unify compressionLevel validation + fix drainTimeout doc
  • (tauri) Mobile AddressLookup bridge for iroh peer auto-dial (#310)
  • (discovery) Replace swarm-discovery with standard DNS-SD (mdns-sd)
  • (discovery) Add generic dnsSd advertise/browse surface
  • (discovery) Add dnsSd examples, re-exports, and interop docs
  • (tauri) Implement generic DNS-SD on mobile
  • (discovery) Exclude self from browsePeers()
  • (example) Add live discovered-peer list with copy button
  • (test) Add cross-device interop Test tab (#340)
  • (core) Split transport liveness from handle existence for #336
  • (tauri) Clear stale mobile discovery on endpoint recovery (#336)
  • (core) Add dialable_direct_address to IrohEndpoint
  • (adapters) Expose discoveryInfo across shared, node, deno, tauri
  • (tauri) Re-export TXT_KEY_ADDRESS and isDialableSocketAddr from guest-js
  • (examples/tauri) Direct-dial testing mode, peer registry/picker, suite-runner UI
  • (discovery) Advertise all routable direct addresses
  • (interop) Add iroh-http result collector + harness submit
  • (interop) Prefill collector id from VITE_IROH_COLLECTOR_ID

🐛 Bug Fixes

  • (ci) Create local bench-results branch from FETCH_HEAD in bench archival
  • Guard u64 handle precision loss at Deno rawFetch and Tauri FFI boundary (#254)
  • (tauri) Drain pending handler promises on serve shutdown (#256)
  • (deno) Drain serve teardown ops so leak sanitizer stays green (#257)
  • (shared,core) Strip URL fragments and abort request stream on body-pipe failure
  • (core) Log request path without query string
  • (core) Enforce negotiated ALPN and bound request-head reads
  • (deno) Verify native binary integrity before dlopen
  • (ci) Pin publish to the artifact commit and verify on manual dispatch
  • (tauri) Cap buffered httpi:// scheme handler response size
  • (shared) Only skip finishBody on error for request uploads
  • (tauri) Guard datagram base64 encode against oversize spread
  • (shared) Redact SecretKey.toString() and add explicit secret-export methods
  • (core) Surface stream error instead of clean EOF on over-limit bodies
  • (core) Unsubscribe path-change watcher when iteration stops
  • (tauri) Stop returning raw secret key from create_endpoint (#275)
  • (core) Store local_service as a Weak to break the endpoint cycle (#282)
  • (core) Distinguish body stream errors from BodyTooLarge
  • (shared) Refine createNode secretKey typing and validate chunk size
  • (core) Preserve BodyTooLarge across drain-time stream errors
  • (core) Reuse watcher on repeated subscribe_path_changes (#298)
  • (tauri) Add path-change subscription parity (#314)
  • (tauri) Mobile mDNS browse falls back to instance name for node-id (#318)
  • (ci) Build iroh-http-shared before tauri guest tests in check.sh (#321)
  • (tauri) Make the plugin build for iOS/Android (#328)
  • (deno) Emit browse event "type" field so discovered peers aren't mislabeled
  • (examples) Declare _demo-printer._tcp Bonjour service for tauri dnssd demo
  • (examples) Grant iroh-http:dns-sd capability in tauri example
  • (discovery) Fix CI-blocking fmt and real DNS-SD peer bugs
  • (discovery) Harden instance-label parsing, document iOS ServiceRecord gap
  • (example) Make tauri example typecheck cleanly
  • (release) Auto-revert CI artifact churn before version bump
  • (tauri) Make Android Kotlin plugin compile
  • (tauri) Make Android peers reachable and buildable
  • (shared) Deliver serve response body when res.body is falsy (#338)
  • (tauri) Add iOS get_dns_servers to restore Swift/Kotlin FFI parity
  • (tauri) Invalidate stale pooled conns and replace stale endpoints
  • (tauri-example) Whitelist _iroh-http-test._udp for iOS Bonjour
  • (tauri) Base64 body chunks when the WebView rejects raw binary (#338)
  • (core) Propagate bound QUIC port into advertised direct addresses (#346)
  • (discovery) Drop bare port-less discovered addrs; robust iOS advertise (#346)
  • (tauri) Advertise the real bound QUIC port, not the iOS placeholder (#346)
  • (core) Close stale connections when serve loop is replaced
  • (test) Honor skip-annotated compliance cases in mobile Test tab (#334, #340)
  • (tauri) Chain wait_serve_stop after serve so restarts survive many cycles
  • (core) Close active connections on graceful serve stop (drain-then-close)
  • (core) Use saturating_add for DNS nameserver counter
  • (shared) Preserve relay URLs in asIrohPeer (#350)
  • (discovery) Advertise a dialable ip:port from the desktop advertiser (#350)
  • (tauri) Harden Android DNS-SD browse for desktop dialing and rebinds (#350)
  • (tauri) Serialize iOS browse/advertise id allocation (#350)
  • (core) Transparently retry a fetch when a reused pooled connection was closed
  • (core) Close teardown concurrency races in serve lifecycle
  • (core) Gate retry on idempotency and scope pool eviction to the failed connection
  • (shared) Reject non-decimal ports in isDialableSocketAddr
  • (discovery) Skip link-local addresses in address selectors
  • (tauri) Re-emit peer-browse rebinds under the same node id
  • (tauri) Close browse/advertise sessions on terminal failure
  • (core) Close residual drain-truncation + drain-wakeup races, harden pool eviction
  • (examples) Restore clean Tauri example build and gate it in CI (#350)
  • (addr) Treat port 1 as a placeholder and pair addresses within one IP family (#350)
  • (android) Guard DNS-server lookup on API 21–22 (#350)
  • (android) Use SRV fallback only without address TXT; make DNS-SD signatures injective (#350)
  • (shared) Validate literal IPv4/IPv6 in isDialableSocketAddr (#350)
  • (tauri) Abort lifecycle operations on stop and emit orphan/error signals once (#350)
  • (tauri) Honor reconnect auto: false and expose an honest recovery callback
  • (core) Scope timeout eviction without mutating the first request
  • (core) Make pool compare-and-evict atomic
  • (core) Disable HTTP/1 keep-alive to enforce one exchange per bidirectional stream
  • (core) Scope serve-stop signals to a restart generation
  • (harness) Make interop assertions reflect actual transport outcomes
  • (harness) Advertise testing mode only after serve succeeds
  • (core) [breaking] Make DiscoveryOptions non-exhaustive; reject all-invalid DNS nameservers
  • (harness) Distinguish empty peer-picker states
  • (harness) Target batch runs only at active testing-mode peers
  • (harness) Guard testing-mode serving and show an honest exposure warning
  • (tauri) Retire orphaned DNS-SD sessions after endpoint replacement
  • (harness) Drop testing-mode peer allowlist and stop instance-rename eviction
  • (core) Strip IPv6 zone suffix from DNS nameservers
  • (tauri) Close lifecycle ownership races (#363)
  • (core) Preserve transport request ownership (#362)
  • (discovery) Preserve scoped address policy (#364)
  • (discovery) Own native session state (#365, #366)
  • (discovery) Preserve in-flight native operations
  • (discovery) Close abandoned failed updates
  • (shared) Preserve inbound request headers
  • (discovery) Replace stale address snapshots
  • (transport) Preserve discovered relay hints
  • (android) Recover stalled dns-sd resolution
  • (core) Await response delivery before graceful close
  • (discovery) Refresh peer records after interface changes
  • (ci) Satisfy strict arithmetic lint
  • (node) Close an endpoint safely while serve registration is still in flight (#374)
  • (tauri) Replay early serve-stop requests after registration completes (#375)
  • (core,adapters) Give path-change subscriptions token-scoped ownership and safe resubscription (#375)
  • (deno) Order serve registration, fetch, stop, and endpoint close without leaking operations (#376)
  • (node,tauri) Treat a removed endpoint as closed when an asynchronous close waiter starts late (#378)

💼 Other

  • (node) Regenerate napi loader from pinned CLI baseline
  • (deps) Bump crossbeam-epoch to 0.9.20 (RUSTSEC-2026-0204)
  • (release) Generate CHANGELOG.md during release via git-cliff
  • (example) Bump example tauri crate to 2.11.5 to match @tauri-apps/api
  • Bump yanked spin 0.9.8/0.10.0 to 0.9.9/0.10.1
  • (discovery) Make engine-only mode dependency-free

🚜 Refactor

  • (deno) Use @denosaurs/plug for native lib download/cache
  • (adapter) Route undeliverable-request 503s through a shared helper
  • (core) Centralize fetch cancel/timeout/token cleanup (#281, #283, #284)
  • (shared) [breaking] Expose secretKey only when a key is supplied
  • (core) [breaking] Remove Endpoint::secret_key_bytes raw-key accessor
  • (core) Extract error/crypto/encoding/addr types out of lib.rs (#198)
  • (core) [breaking] Remove the inert maxServeErrors option (#278)
  • (adapter) Consolidate fetch/serve coercion behind coerce_* seam (#289)
  • (shared) Unify JS option normalisers into iroh-http-shared (#312)
  • (deno) Consolidate FFI chunk-read grow/retry into one readChunk (#313)
  • (adapter) Add RequestTransport seam and deliver_request (#315)
  • (tauri) Route request delivery through RequestTransport (#315)
  • (node) Route request delivery through RequestTransport (#315)
  • (deno) Route request delivery through RequestTransport (#315)
  • (tauri) Inherit iroh via workspace dependency (#310)
  • (discovery) [breaking] Flatten DNS-SD API onto node.advertise/browse
  • (discovery) Replace internal DnsSd class with stateless ...
Read more

v0.5.2

Choose a tag to compare

@github-actions github-actions released this 26 Jun 06:35

[0.5.2] - 2026-06-26

🚀 Features

  • (examples) Add Deno mDNS advertise/browse example

🐛 Bug Fixes

  • (examples) Resolve @momics/iroh-http-shared/adapter in Tauri Vite config
  • (tauri) Declare permission sets with [[set]] not [[permission]] (#246)
  • (tauri) Make mdns_advertise async so it runs on the Tokio runtime (#247)
  • (tauri) Register session_accept, try_next_chunk, start_transport_events in ACL (#248)
  • (examples) Correct Tauri mDNS advertise/browse usage

💼 Other

  • (examples) Update to iroh-http 0.5.1 and refresh lockfiles
  • (ci) Adopt deno fmt and enforce formatting in CI (#249)

📚 Documentation

  • (shared) Document node.browse and node.advertise (#249)
  • (api) Document public TS API across node/deno/tauri (#249)
  • (tauri) Fix literal \n in README; make tests/http-compliance fmt scope explicit (#249)

🎨 Styling

  • Format TS code with deno fmt (#249)

🧪 Testing

  • (tauri) Add ACL permission-set regression guard (#246)
  • (tauri) Guard command/permission-set parity (#248)

⚙️ Miscellaneous Tasks

  • (tauri) Regenerate ACL schema after permission-set fix (#246)
  • (tauri) Regenerate ACL artifacts for new commands (#248)
  • Release v0.5.2

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 25 Jun 15:19

[0.5.1] - 2026-06-25

🐛 Bug Fixes

  • (release) Lowercase GitHub org momics in package metadata (#242)
  • (node) Make mdns_advertise async to stop teardown SIGABRT (#243) (#244)

⚙️ Miscellaneous Tasks

  • (publish) Use npm OIDC Trusted Publishing, regen node index.js to 0.5.0 (#241)
  • (bench) Archive raw results to bench-results branch; drop gh-pages dashboard (#240)
  • Release v0.5.1

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 25 Jun 07:35

[0.5.0] - 2026-06-25

🚀 Features

  • (tauri) Register httpi:// as custom URI scheme
  • (deps) [breaking] Migrate to iroh 1.0 (#236)

🐛 Bug Fixes

  • (ci) Update napi artifacts flags for @napi-rs/cli v3
  • Remove endpoint from registry after close, not before
  • (node) Add local u32-to-u64 handle indirection to preserve slotmap bits
  • (node) Suppress mDNS shutdown panic that fails Node test runner
  • (core) Prevent stop_serve race when abort fires before rawServe resolves
  • (core) Prevent close/closed race on session handle removal
  • (node) Tolerate missing endpoint in stop_serve and wait_serve_stop
  • (ci) Version-bump policy matched context lines in package.json diffs
  • (tauri) Remove needless Ok wrap in scheme 405 response
  • (ci) Version-bump policy matched package-lock.json entries
  • (deps) Clear undici & js-yaml npm audit advisories (#239)

📚 Documentation

  • Rewrite READMEs for clarity and dedup shared API content

⚙️ Miscellaneous Tasks

  • Fix Node.js extended tests hanging on open handles
  • Regen napi bindings and fix Deno shutdown races (#231)
  • Release v0.5.0

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 02 May 08:41

[0.4.0] - 2026-05-02

🚀 Features

  • [breaking] Drop raw_connect from public surface
  • (core) Decompress inbound request bodies on serve path
  • (api) [breaking] Rename node.connect→dial, node.sessions→incoming, session_→Session::
  • (api) Node.dial() accepts httpi:// URLs (closes #166)
  • (compression) [breaking] Make zstd always-on, drop build-time feature flag
  • (ffi) Impl Sink for BodyWriter (#174)
  • (ffi) Pass StackConfig knobs through FFI — fetch timeout/decompress, serve decompress, per-call response limit (#189)
  • (node) [breaking] Migrate iroh-http-node from napi v2 to v3 (#146)

🐛 Bug Fixes

  • (core) Align compression docs and implementation
  • (core) Replace slab with slotmap in endpoint registry
  • (release) Regenerate lockfile with all platform optional deps
  • (tauri) Drop "connect" from build.rs command list
  • (deno) Close_all signals serve queues so SIGINT exits cleanly
  • (deno) Widen FFI endpoint handle to u64 to preserve slotmap version bits
  • (compression) Align min_body_bytes default with docs (1 KiB) (closes #167)
  • (server) Box ServeService and collapse pipeline assembly into one chain
  • (server) Add max_request_body_decoded_bytes to guard against zstd bombs (#190)
  • (tauri) Rename max_request_body_bytes in ServeArgs and ServeOptions mapping (#190 follow-up)
  • (server) Poll_ready logs+Pending instead of swallowing; add clippy.toml disallowed-types
  • (ffi) Forward fetch knobs in Node/Deno adapters; add AC regression tests (#189)
  • (ci) Narrow version-bump-policy to actual version-field diffs (#196)
  • (api) Tidy stale references after #194 rename
  • (shared) Export FetchOptions from adapter barrel
  • (deny) Ignore hickory CVEs blocked on iroh upstream
  • (audit) Ignore hickory CVEs in cargo-audit config
  • (bench) Replace serve() with ffi_serve() in bench fixtures
  • (shared) Export FetchOptions from public index barrel
  • (node) Make start_transport_events async to satisfy tokio runtime
  • (node) Make raw_serve async to run inside tokio runtime
  • (bench) Clean up formatting in QUIC stream and HTTP benchmarks
  • (core) Resolve P3 issues #199, #200, #201, #202, #203
  • (build) Auto-repair bare lockfile stubs in check-lockfile.mjs

🚜 Refactor

  • (core) Introduce unified Body newtype (slice 1 of #159)
  • (core) Make RequestService infallible (slice 2 of #159)
  • (core) Collapse serve-loop wiring with option_layer (slice 3 of #159)
  • (core) Split RequestService into FfiDispatcher + IrohHttpService (slice 4 of #159)
  • (core) Rename TowerErrorHandler → HandleLayerError + ADR-013 doc (slice 6 of #159)
  • (core) Use tower_http::RequestBodyLimitLayer for request-body size enforcement
  • (core) Unify response body via MapResponseBodyLayer + Body::new
  • (core) Extract config and stats types out of endpoint.rs
  • (server) Use tower-http NotForContentType for compression skip rules (closes #172)
  • (server) Extract per-bistream pipeline assembly into server_pipeline (closes #169)
  • (stream) Impl http_body::Body for BodyReader directly (refs #170)
  • (endpoint) Split EndpointInner into named subsystems (closes #171)
  • (server) IrohHttpService.remote_node_id is Arc, not Option
  • (server_pipeline) Extract build_stack so the guardrail tests the real chain
  • (core) [breaking] Slice A — introduce mod http / mod ffi split + architecture test
  • (core) Slice B — typed StackConfig + shared build_stack/build_client_stack (#184)
  • (core) Slice C.0 — boxed-per-layer stack composition (#185)
  • (core) Slice C.1+C.3 — pure-Rust serve(svc) + RemoteNodeId extension (#185)
  • (core) Move FfiDispatcher into mod ffi (Slice C.2 of #185)
  • (core) Delete dead duplex CONNECT/Upgrade branch (Slice C.5, closes #180)
  • (core) Typed ConnectionTracker / RequestTracker (Slice C.4, closes #178)
  • (core) Collapse src/ to endpoint.rs + http/ + ffi/ (#185)
  • (server) Split http/server/mod.rs to ≤200 LoC (Slice C.7 of #185)
  • (core) Pure-Rust http::fetch(addr, req, &cfg) -> Result<Response, FetchError> (Slice D, closes #186)
  • (client) Finish Slice D acceptance — pumps to ffi, drop hyper string match, wire timeout/decompress through ffi::fetch (#186 review)
  • (ffi) Slice E — move session under mod ffi, lock canonical layout (closes #187)
  • (api) Rename serve_service → serve; demote FFI serve to ffi_serve (#194)
  • (endpoint) Split endpoint.rs into endpoint/ subsystem modules (ADR-014 D1, #192)
  • (endpoint) Extract lifecycle.rs; update ADR-014 status note (#192 follow-up)

📚 Documentation

  • (spec) Add missing public types and Rust API coverage
  • (adr) Draft ADR-014 runtime architecture
  • (adr) Add ADR-013 lean on the ecosystem
  • (internals) Add core-assessment-2026-04
  • (core) Warn FFI adapters not to truncate slotmap handles to u32
  • (compression) Document zstd-only policy and runtime support (closes #173)
  • (lib,session) Regroup Session re-export under FFI banner; doc rationale (#187 review MAINT-1, INFO-1, TEST-2)
  • (adr-014) Record D4 perf-vs-elegance split after Slice E
  • (adr-014,ffi) Record D4 resolution; backlink pumps to #174
  • (adr-014,epic-182) Recalibrate D1 LoC targets; record subsystem split gap (#195)
  • (guidelines) Document FFI payload field naming convention; add handle doc comments (#143)

⚡ Performance

  • (build) Add .cargo/config.toml, prefer cargo nextest, document linker and sccache (closes #168)
  • (node) Use zero-copy buffer transfers in napi bridge

🎨 Styling

  • (core) Rustfmt fixes after Slice C.2/C.5
  • Move allow attr out of doc-comment block; drop trailing blank lines
  • Rustfmt + napi v3 generated bindings

🧪 Testing

  • (core) Regression test for #161 u32-handle truncation
  • (server_pipeline) Adding a no-op layer is one append (closes #175)
  • (core) Add layered channel and QUIC micro-benchmarks
  • (node) Add FFI bridge isolation benchmark

⚙️ Miscellaneous Tasks

  • Gate publish on extended tests passing
  • (core) Cargo fmt
  • Remove reviews/ — findings filed as issues #190-#195
  • (docs) Remove stale Slice E comment, fix fetch intra-doc links, delete dead apply_handle_layer_error
  • (release) Gate version bumps to chore-release commits; guard version.sh against dirty trees (#196)
  • Update deno.lock
  • Release v0.4.0

◀️ Revert

  • (release) Roll workspace back to 0.3.4 to unbreak CI

v0.3.4

Choose a tag to compare

@github-actions github-actions released this 29 Apr 14:40

[0.3.4] - 2026-04-29

🚀 Features

  • (shared) [breaking] Remove legacy two-argument fetch(peer, path) overload
  • (core) Validate ALPN capabilities at bind() time
  • (core) Expose BodyReader cancellation contract

🐛 Bug Fixes

  • (bench) Exclude close() from cold-connect measurement
  • (tauri) Wrap serve params in ServeArgs struct
  • Update fetch URLs to use dynamic serverId for bench tests
  • Update fetch URLs to use dynamic serverId in benchmark scripts
  • (ci) Align local and github checks
  • (deno) Re-add ignore flag to regression #115 test
  • (deno) Cancellable yield for serve loop shutdown (#115)
  • (deno) Keep serve registry entry alive until close_endpoint (#149)
  • (deno) Remove x-503-source debug header from production responses

💼 Other

  • Upgrade iroh to 0.98.1
  • (deps) Bump napi-build from 1.2.1 to 2.3.1
  • (deps) Bump criterion from 0.5.1 to 0.8.2
  • (deps) Bump rand from 0.9.4 to 0.10.1

🚜 Refactor

  • (core) [breaking] Mechanical cleanup — units, naming, type consistency
  • [breaking] Move serve config from NodeOptions to ServeOptions
  • Restructure JsNodeOptions and introduce JsServeOptions for improved server configuration

📚 Documentation

  • Promote httpi:// URL form as primary fetch() input
  • Correct ServeOptions default values

⚡ Performance

  • Redesign benchmark suite with 9 consistent scenarios
  • (deno) Reduce FFI overhead from ~40x to ~1.2x native (#126)
  • (node,tauri) Add try_next_chunk sync fast path for body streaming
  • (tauri) Use binary IPC for body chunks instead of base64
  • (shared) Profile and optimize shared TypeScript fetch layer
  • (deno) Benchmark JSON vs MessagePack for FFI boundary

🧪 Testing

  • (tauri) Add Rust and guest-JS test coverage
  • Assert response status in 32-stream regression test (#149)
  • (deno) Separate concerns in regression tests and add #149 coverage
  • Modularize and unify test suite naming and structure

⚙️ Miscellaneous Tasks

  • Restrict extended tests to tags and manual dispatch
  • (bench) Fix benchmark workflow — rename groups and create gh-pages
  • (bench) Fix gh-pages push — add auto-push and skip-fetch
  • (bench) Split release/main data paths and disable fail-on-alert
  • Release v0.3.4

v0.3.3

Choose a tag to compare

@github-actions github-actions released this 25 Apr 15:38

[0.3.3] - 2026-04-25

🐛 Bug Fixes

  • (build) Regenerate Tauri Cargo.lock during version bump
  • (ci) Revert upload-artifact to v7 (v8 does not exist)
  • (ci) Match cargo "already exists" in publish idempotency check

⚙️ Miscellaneous Tasks

  • Release v0.3.3
  • Skip verify for tauri-plugin-iroh-http publish
  • Harden release pipeline

v0.3.2

Choose a tag to compare

@github-actions github-actions released this 25 Apr 13:49

[0.3.2] - 2026-04-25

🐛 Bug Fixes

  • (build) Add version to all internal path deps for cargo publish

⚙️ Miscellaneous Tasks

  • Release v0.3.2

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 25 Apr 12:43

[0.3.1] - 2026-04-25

🐛 Bug Fixes

  • (deno) Signal shutdown and drain queue before removing serve registry
  • (shared) Await body pipe before respond on handler failure
  • (build) Version script now updates all iroh-http dep versions in Tauri Cargo.toml
  • (build) Regenerate lockfile to fix npm ci crash on versionless optional deps

📚 Documentation

  • Rename explorations/ to adr/ and add ADRs 009-012
  • (tauri) Update Cargo dependency version to 0.3 in README

⚙️ Miscellaneous Tasks

  • (cargo) Migrate workspace members to version.workspace inheritance
  • (scripts) Replace release/ folder with interactive release.sh
  • Fail publish on real errors, only skip on already-published
  • Release v0.3.1