Skip to content

Commit 2f2d746

Browse files
kalwaltclaude
andcommitted
chore(release): v0.8.0
Bump the workspace and npm package versions 0.7.0 -> 0.8.0, regenerate the wasm pkg (standard + SIMD), and prepend the 0.8.0 changelog section (git-cliff) for the "Pure-Rust completeness, validation & polish" milestone. Release prep per MAINTAINERS.md §2. The dev->main merge and the v0.8.0 tag (which triggers the crates.io + npm publish) are done separately. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 619c6a2 commit 2f2d746

5 files changed

Lines changed: 99 additions & 37 deletions

File tree

CHANGELOG.md

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,76 @@
1-
# Changelog - webarkit/webarkitlib-rs
1+
# Changelog - webarkit/webarkitlib-rs
22

33
All notable changes to this project will be documented in this file.
44

5-
## [0.7.0] - 2026-06-05
5+
## [0.8.0] - 2026-06-26
6+
7+
## Milestone — Pure-Rust completeness, validation & polish
8+
9+
### ⚙️ Miscellaneous Tasks
10+
11+
- *(ar2)* Allow too_many_arguments on SIMD get_similarity variants (#180)
12+
- Clear strict clippy lints in examples/tests/benches (#180)
13+
- *(codecov)* Exclude examples/benches from coverage targets (#180)
14+
- *(coverage)* Fix tarpaulin tests/ glob and mirror in codecov (#180)
15+
- Tighten clippy gate to --all-targets --all-features (#180)
16+
- Relocate strict clippy gate to kpm-build (ubuntu) job (#180)
17+
- *(miri)* Add Miri UB validation for pure-Rust code paths (#182)
18+
- *(miri)* Drop -Zmiri-strict-provenance (trips on third-party deps) (#182)
19+
- *(miri)* Switch to Tree Borrows to avoid crossbeam-epoch false positive (#182)
20+
- *(miri)* Enable -Zmiri-disable-isolation for tempfile-using tests (#182)
21+
- *(miri)* Enable -Zmiri-ignore-leaks for rayon thread pool (#194)
22+
- *(miri)* Promote to required gate, split workflow, add README badge (#182)
23+
- *(miri)* Skip docs-only changes via paths-ignore + same-name shim
24+
- *(benchmarks)* Harden against flaky external C-library downloads (#204)
25+
26+
### ⚡ Performance
27+
28+
- *(ci)* Scope Miri job to unsafe boundaries via cfg_attr(miri, ignore) (#194)
29+
- *(ci)* Annotate remaining real-image tests (#194 follow-up)
30+
- *(kpm)* Gaussian scale-space pyramid — benchmark + rayon parallelization (#209)
31+
- *(kpm)* Box-filter Pyramid downsample — criterion benchmark + SIMD (#211)
32+
33+
### 🐛 Bug Fixes
34+
35+
- *(core)* Clean up trivial clippy lints under --all-targets --all-features (#180)
36+
- *(kpm)* Tighten dual-mode FFI extern cfg to match caller cfg (#180)
37+
- *(kpm)* Replace unaligned transmute in hamming_distance_96 (#192)
38+
- *(ci)* Disable cargo-bin cache on kpm-build to stop stale rustup-init shim (#134)
39+
40+
### 💼 Other
41+
42+
- *(wasm)* Make cc/bindgen optional, fix wasm dead-code (#161 goal 1)
43+
44+
### 📚 Documentation
45+
46+
- *(benches)* Refresh BENCHMARKS.md for criterion 0.8
47+
- *(agents)* Codify #180 clippy conventions and un-ignore .agents/
48+
- *(kpm)* Mark box-filter Pyramid as kept-but-unused reference (#203)
49+
- *(wasm)* Note .fset3 / KPM detection in the NFT demo description (#161)
50+
- Update README + ARCHITECTURE for the v0.8.0 milestone
51+
52+
### 🕸️ WebAssembly & Emscripten
53+
54+
- *(wasm)* Wire console logger + clean SIMD wasm build; add .fset3 asset (#161 goals 2,3)
55+
- *(wasm)* KPM detection binding + browser NFT demo (#161 goal 4)
56+
57+
### 🚀 Features
58+
59+
- *(kpm)* Facade-parity convenience accessors on VisualDatabase + FeatureStore slices (#148)
60+
- *(example)* Nft_marker_gen .fset3 via RustFreakMatcher — drop ffi-backend (#179)
61+
62+
### 🚜 Refactor
63+
64+
- *(ar)* Convert Default::default() + field reassign to struct-init (#180)
65+
- *(kpm)* Factor VisualDatabase::query matching loop + add query_from_keyframe (#147) (#217)
66+
67+
### 🧪 Testing
68+
69+
- *(core)* Add unit tests for relocated math/pattern helpers (#180)
70+
- *(homography)* Widen cauchy_cost tolerance to 1e-5 for Miri (#194)
71+
- *(kpm)* Raise M9 coverage — exclude examples + edge tests (#177) (#218)
72+
- *(ci)* Verify ffi-backend tests + example link on macOS (#119)
73+
## [0.7.0] - 2026-06-05
674

775
## Milestone 9 — VisualDatabase & pure Rust backend
876

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ exclude = [
99
resolver = "2"
1010

1111
[workspace.package]
12-
version = "0.7.0"
12+
version = "0.8.0"
1313
authors = ["kalwalt <github@kalwaltart.it>"]
1414
edition = "2021"
1515
description = "A high-performance, memory-safe Rust port of WebARKitLib (ARToolKit) for native and WASM."

crates/wasm/pkg/README.md

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
![WebARKitLib-rs](./assets/WebARKitLib-Rust-banner.jpg)
44

55
[![CI](https://github.com/webarkit/WebARKitLib-rs/actions/workflows/ci.yml/badge.svg)](https://github.com/webarkit/WebARKitLib-rs/actions/workflows/ci.yml)
6+
[![Miri](https://github.com/webarkit/WebARKitLib-rs/actions/workflows/miri.yml/badge.svg)](https://github.com/webarkit/WebARKitLib-rs/actions/workflows/miri.yml)
67
[![codecov](https://codecov.io/gh/webarkit/WebARKitLib-rs/branch/main/graph/badge.svg)](https://codecov.io/gh/webarkit/WebARKitLib-rs)
78
[![Crates.io](https://img.shields.io/crates/v/webarkitlib-rs.svg)](https://crates.io/crates/webarkitlib-rs)
89
[![npm](https://img.shields.io/npm/v/@webarkit/webarkitlib-wasm.svg)](https://www.npmjs.com/package/@webarkit/webarkitlib-wasm)
@@ -13,7 +14,7 @@
1314
This project aims to provide a pure-Rust implementation of the core ARToolKit algorithms, targeting both **native** systems and **WebAssembly (WASM)** for high-performance augmented reality in the browser.
1415

1516
> [!NOTE]
16-
> This project is currently a **Work in Progress**. Core marker detection and pose estimation are functional. KPM/NFT (Natural Feature Tracking) is in an early stage with partial Rust porting -- a fully idiomatic Rust KPM pipeline with a working example is the primary goal for v1.0.0.
17+
> Core marker detection and pose estimation are functional, and as of **v0.8.0** the **KPM/NFT (Natural Feature Tracking) pipeline is fully ported to pure Rust** — end-to-end keypoint matching, marker generation (`.iset`/`.fset`/`.fset3`), and runtime tracking all run with **no C++ toolchain**, natively and in the browser via WebAssembly. The project remains a **Work in Progress** toward v1.0.0 (broader API docs, multi-marker support, and a dedicated KPM benchmark are the remaining focus areas).
1718
1819
## 🌟 Key Features
1920

@@ -39,7 +40,7 @@ Add `webarkitlib-rs` to your `Cargo.toml`:
3940

4041
```toml
4142
[dependencies]
42-
webarkitlib-rs = "0.7"
43+
webarkitlib-rs = "0.8"
4344
```
4445

4546
### Pure Rust tracking (no C++ compiler required)
@@ -65,7 +66,7 @@ need to do anything special:
6566

6667
```toml
6768
[dependencies]
68-
webarkitlib-rs = "0.7" # default backend is pure Rust
69+
webarkitlib-rs = "0.8" # default backend is pure Rust
6970
```
7071

7172
```bash
@@ -82,7 +83,7 @@ NFT tracking**:
8283

8384
```toml
8485
[dependencies]
85-
webarkitlib-rs = { version = "0.7", features = ["ffi-backend"] }
86+
webarkitlib-rs = { version = "0.8", features = ["ffi-backend"] }
8687
```
8788

8889
> When installing from crates.io, no extra setup is required — the C++
@@ -122,42 +123,33 @@ This example loads a camera parameter file, a marker (pattern or barcode), and a
122123
Generate NFT (Natural Feature Tracking) marker files compatible with ARnft and NFT-Marker-Creator-App:
123124

124125
```bash
125-
# Pure-Rust default (no C++ toolchain required) — produces .iset + .fset.
126-
# Pass --yes to skip the interactive "no .fset3" confirmation prompt
127-
# (recommended for scripted / CI use):
126+
# Pure Rust, no C++ toolchain — produces a COMPLETE marker (.iset + .fset + .fset3):
128127
cargo run --release --example nft_marker_gen -- \
129-
--input path/to/image.jpg \
130-
--output path/to/output_name \
131-
--dpi 220 \
132-
--yes
133-
134-
# Full output including .fset3 (FREAK descriptors) — opt-in C++ backend:
135-
# .fset3 generation still uses CppFreakMatcher today; the runtime KPM
136-
# tracker reads .fset3 files in pure Rust, only the marker-creation step
137-
# needs the C++ FREAK extractor. Wiring nft_marker_gen to RustFreakMatcher
138-
# for .fset3 is a follow-up task.
139-
cargo run --release --features ffi-backend --example nft_marker_gen -- \
140128
--input path/to/image.jpg \
141129
--output path/to/output_name \
142130
--dpi 220
143131

144132
# With SIMD acceleration + Rayon parallelism (recommended for x86_64):
145-
cargo run --release --features "ffi-backend,simd-x86-sse41,simd-x86-avx2" \
133+
cargo run --release --features "simd-x86-sse41,simd-x86-avx2" \
146134
--example nft_marker_gen -- \
147135
--input path/to/image.jpg \
148136
--output path/to/output_name \
149137
--dpi 220
150138
```
151139

140+
> Since #179, `.fset3` (FREAK descriptors) is generated by the pure-Rust
141+
> `RustFreakMatcher` — a single invocation produces a complete marker with no
142+
> C++ toolchain.
143+
152144
> **Important:** Always use the `--release` flag. Debug builds are 5–10× slower due to missing compiler optimizations.
153145
154-
Output files (depends on whether `ffi-backend` is enabled):
146+
Output files (all produced on the pure-Rust default):
155147

156-
| File | Default (pure Rust) | With `ffi-backend` | Description |
157-
|---|:---:|:---:|---|
158-
| `<output>.iset` | || JPEG-compressed image pyramid (~300 KB, matches C++ `ar2WriteImageSet()` format) |
159-
| `<output>.fset` | || Feature map with one entry per pyramid level |
160-
| `<output>.fset3` | ❌ (skipped, with warning) || FREAK descriptors for KPM-based recognition |
148+
| File | Description |
149+
|---|---|
150+
| `<output>.iset` | JPEG-compressed image pyramid (~300 KB, matches C++ `ar2WriteImageSet()` format) |
151+
| `<output>.fset` | Feature map with one entry per pyramid level |
152+
| `<output>.fset3` | FREAK descriptors for KPM-based recognition (pure-Rust `RustFreakMatcher`) |
161153

162154
**Options:**
163155

@@ -167,14 +159,12 @@ Output files (depends on whether `ffi-backend` is enabled):
167159
| `-o` | `--output` | Output base path (without extension) | required |
168160
| `-d` | `--dpi` | Source image resolution in DPI | required |
169161
| `-l` | `--level` | Tracking extraction level (0–4) | `2` |
170-
| `-n` | `--search-feature-num` | Max features per pyramid level | `250` |
171-
| `-y` | `--yes` | Skip the "no .fset3" confirmation prompt (for scripted / CI use; only relevant when built without `ffi-backend`) | (interactive) |
172162

173163
**Performance feature flags:**
174164

175165
| Feature flag | What it enables |
176166
|---|---|
177-
| `ffi-backend` | C++ FREAK backend (opt-in since M9-3 #142). Enables `.fset3` generation in `nft_marker_gen` (the `.iset`/`.fset` outputs work on the pure-Rust default) and powers development cross-validation (`dual-mode`, `cross_stack_parity`). Runtime NFT tracking with existing `.fset3` files works on the pure-Rust default. |
167+
| `ffi-backend` | C++ FREAK backend (opt-in since M9-3 #142). Used only for development cross-validation (`dual-mode`, `cross_stack_parity`); all of `nft_marker_gen` (`.iset` + `.fset` + `.fset3`) and runtime NFT tracking run on the pure-Rust default. |
178168
| `simd-x86-sse41` | SSE4.1 SIMD acceleration for feature map correlation (`get_similarity`) |
179169
| `simd-x86-avx2` | AVX2+FMA SIMD acceleration for feature map correlation (faster than SSE4.1) |
180170
| `simd` | Umbrella flag — enables all SIMD optimizations (SSE4.1, AVX2, WASM SIMD, image, pattern) |
@@ -258,7 +248,7 @@ Enable the `log-helpers` feature and call the bundled initializer once in your b
258248

259249
```toml
260250
[dependencies]
261-
webarkitlib-rs = { version = "0.7", features = ["log-helpers"] }
251+
webarkitlib-rs = { version = "0.8", features = ["log-helpers"] }
262252
```
263253

264254
```rust
@@ -439,12 +429,16 @@ The workspace contains two crates:
439429
- Cross-platform / cross-stack matcher determinism — Rust `HashMap` → `BTreeMap` and upstream C++ `unordered_map` → `std::map` ([WebARKitLib#39](https://github.com/webarkit/WebARKitLib/pull/39)).
440430
- Hand-annotated absolute corner-error regression gate (browser-based annotation tool + 5 fixtures + Linux CI gate). Finding: pure-Rust backend is more accurate than C++ on `pinball-demo` (5.27 px vs 18.79 px max corner error).
441431
- Cross-stack parity gate against `@webarkit/jsartoolkit-nft@1.10.0` ([jsartoolkitNFT#584](https://github.com/webarkit/jsartoolkitNFT/pull/584)) — guarantees native Rust pose matches what production WASM consumers see.
432+
- **v0.8.0 — Pure-Rust completeness, validation & polish**: Closed out the remaining gaps on top of M9:
433+
- **Full WASM/NFT support** ([#161](https://github.com/webarkit/WebARKitLib-rs/issues/161)): `WasmKpmHandle` KPM-detection bindings, `console_log` wiring, clean dual (standard + SIMD) wasm builds, and an end-to-end **browser NFT demo** of the pure-Rust pipeline.
434+
- **Pure-Rust `.fset3` marker generation** ([#179](https://github.com/webarkit/WebARKitLib-rs/issues/179)): `nft_marker_gen` now produces `.iset` + `.fset` + `.fset3` entirely via `RustFreakMatcher` — the `ffi-backend` is no longer needed for marker creation.
435+
- **`VisualDatabase` ergonomics** ([#147](https://github.com/webarkit/WebARKitLib-rs/issues/147), [#148](https://github.com/webarkit/WebARKitLib-rs/issues/148)): factored the per-frame query loop, added `query_from_keyframe`, and facade-parity accessors on `VisualDatabase` + `FeatureStore` slices.
436+
- **Gaussian scale-space pyramid performance** ([#200](https://github.com/webarkit/WebARKitLib-rs/issues/200)/[#201](https://github.com/webarkit/WebARKitLib-rs/issues/201)/[#207](https://github.com/webarkit/WebARKitLib-rs/issues/207)): criterion benchmark, NO-FMA SSE4.1/AVX2/wasm SIMD binomial filter with bit-exact scalar parity, and rayon-parallelized filter passes.
437+
- **Validation & CI hardening**: raised M9 patch coverage ≥90% ([#177](https://github.com/webarkit/WebARKitLib-rs/issues/177)), Miri UB gate ([#182](https://github.com/webarkit/WebARKitLib-rs/issues/182)), strict `--all-targets --all-features` clippy gate ([#180](https://github.com/webarkit/WebARKitLib-rs/issues/180)), benchmark download hardening ([#204](https://github.com/webarkit/WebARKitLib-rs/issues/204)), and macOS/Windows build + cache fixes ([#134](https://github.com/webarkit/WebARKitLib-rs/issues/134), [#119](https://github.com/webarkit/WebARKitLib-rs/issues/119)).
442438
443439
### 🎯 Short-term Goals (toward v1.0.0)
444440
- **KPM-specific benchmark** ([deferred from #142](https://github.com/webarkit/WebARKitLib-rs/issues/142)): Add a dedicated `kpm_bench.rs` Criterion bench so we can verify the pure-Rust backend stays within 20% of C++ on `pinball-demo`. The existing `marker_bench` only measures barcode marker detection.
445-
- **WASM browser examples for KPM/NFT** ([#161](https://github.com/webarkit/WebARKitLib-rs/issues/161)): End-to-end runnable browser demo of the pure-Rust NFT pipeline.
446-
- **Raise M9 patch coverage** ([#177](https://github.com/webarkit/WebARKitLib-rs/issues/177)): Lift M9 modules from 84.76% → ≥90% patch coverage with no file under 85%.
447-
- **Dependency upgrades**: Criterion 0.5 → 0.8 ([#174](https://github.com/webarkit/WebARKitLib-rs/issues/174)).
441+
- **Live-camera WASM demo + pose parity** ([#215](https://github.com/webarkit/WebARKitLib-rs/issues/215)): Extend the browser NFT demo with a live camera feed and jsartoolkitNFT pose parity.
448442
- **Enhanced Documentation**: Expand API reference with complete module-level docs, integration walkthroughs for JS/TS, and detailed usage examples.
449443
- **WASM Memory Management**: Improve resource cleanup when switching engines or markers in long-running browser sessions.
450444

crates/wasm/pkg/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"kalwalt \u003cgithub@kalwaltart.it\u003e"
66
],
77
"description": "A high-performance, memory-safe Rust port of WebARKitLib (ARToolKit) for native and WASM.",
8-
"version": "0.7.0",
8+
"version": "0.8.0",
99
"license": "LGPL-3.0-or-later",
1010
"repository": {
1111
"type": "git",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "webarkitlib-rs",
3-
"version": "0.7.0",
3+
"version": "0.8.0",
44
"description": "Port of WebARKitLib (ARToolKit) to Rust and WASM",
55
"private": true,
66
"scripts": {

0 commit comments

Comments
 (0)