Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.18.0] "Dormant" - 2026-07-14

Fourteenth release of the RustyNES-parity roadmap: Mobile Phase 5, monetization scaffolding.

### Added

- **`rustysnes-monetization`** (Mobile Phase 5): a new, standalone UniFFI crate providing a
Expand Down
34 changes: 17 additions & 17 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ members = [
]

[workspace.package]
version = "1.17.0"
version = "1.18.0"
edition = "2024"
rust-version = "1.96"
license = "MIT OR Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-android/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-android"
description = "RustySNES: Android JNI presentation host (wgpu-on-Surface, no emulation logic)"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-apu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-apu"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cart/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-cart"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cheevos/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-cheevos"
description = "Native-only RetroAchievements (rcheevos) FFI wrapper for RustySNES"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-core"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cpu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-cpu"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-frontend/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-frontend"
description = "RustySNES: cross-platform SNES emulator binary (winit + wgpu + cpal + egui)"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-gfx-shaders/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-gfx-shaders"
description = "RustySNES: shared WGSL presentation-shader sources (blit + post-filters)"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-ios/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-ios"
description = "RustySNES: iOS Metal presentation host (wgpu-on-CAMetalLayer, no emulation logic)"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-mobile/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-mobile"
description = "RustySNES: UniFFI mobile bridge (Kotlin/Swift bindings over the emulation core)"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-monetization/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-monetization"
description = "RustySNES: dormant entitlement/ad-pacing policy scaffold (mobile-only, never a dependency of the deterministic core)"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-netplay/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-netplay"
description = "RustySNES: GGPO-style rollback netplay (UDP native, WebRTC browser)"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-ppu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-ppu"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-savestate/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-savestate"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-script/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-script"
description = "RustySNES: sandboxed Lua 5.4 scripting (memory read/write + a per-frame callback)"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-test-harness/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-test-harness"
version = "1.17.0"
version = "1.18.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
12 changes: 9 additions & 3 deletions docs/STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
This file is authoritative for per-suite pass counts, the board / coprocessor matrix, and
version policy. Everything else defers to it.

**Current release:** `v1.17.0 "Parity"` (`v0.1.0 "Foundation"`,
**Current release:** `v1.18.0 "Dormant"` (`v0.1.0 "Foundation"`,
`v0.2.0 "Persistence"`, `v0.3.0 "Continuum"`, `v0.4.0 "Completion"`, `v0.5.0 "Fidelity"`,
`v0.6.0 "Shippable"`, `v0.7.0 "Resolution"`, `v0.8.0 "Community"`, `v0.9.0 "Threshold"`,
`v1.0.0 "Zenith"`, `v1.0.1 "Aftertouch"`, `v1.1.0 "Latchkey"`, `v1.2.0 "Phosphor"`,
`v1.3.0 "Palimpsest"`, and `v1.4.0 "Convergence"` precede it; see `to-dos/VERSION-PLAN.md` for the
full ladder). **`v1.5.0`-`v1.17.0`** are the opening rungs of the RustyNES-parity ladder — a CI
full ladder). **`v1.5.0`-`v1.18.0`** are the opening rungs of the RustyNES-parity ladder — a CI
safety net (`v1.5.0 "Bedrock"`), a MkDocs documentation site + PWA + accuracy ledger
(`v1.6.0 "Lighthouse"`), the debugger extracted into its own module plus a hex Memory panel
(`v1.7.0 "Telemetry"`, `v1.7.1` patch), a Memory Compare panel + in-app Docs panel
Expand Down Expand Up @@ -38,7 +38,13 @@ the Android AVD, found and fixed a real, pre-existing, already-shipped native cr
since `v1.15.0` (per-frame allocation churn in the audio path disrupting `AudioTrack`'s native
buffer timing after ~10+ seconds of continuous run — never caught before because no prior
verification pass ran that long), with RetroAchievements wiring, an `mlua` migration, and
netplay honestly re-scoped to a later rung (`v1.17.0 "Parity"`) — all frontend/tooling/CI work
netplay honestly re-scoped to a later rung (`v1.17.0 "Parity"`), and dormant monetization
scaffolding — a new, standalone `rustysnes-monetization` `UniFFI` crate (never a dependency of
the deterministic core, every pricing/pacing figure an explicit placeholder pending the
standing "Mobile Phase 6" store-launch gate) wired into both mobile shells as an inert,
log-only startup call, real-verified on the Android AVD via `logcat` and compile-verified for
iOS via a real macOS CI build after fixing a genuine `xcodebuild` xcframework-modulemap
collision found on that same CI run (`v1.18.0 "Dormant"`) — all frontend/tooling/CI work
with **zero
change** to the accuracy dashboard, per-suite pass counts, or coprocessor tier matrix below,
which stayed byte-identical throughout; see `CHANGELOG.md` for full per-release detail. `v1.0.0`
Expand Down
9 changes: 7 additions & 2 deletions to-dos/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -359,8 +359,13 @@ under `v1.0.0`) and the netplay save-state-cost pre-work.
simulator run yet, only a build), then a hardening rung (`v1.17.0 "Parity"`,
**RELEASED 2026-07-12** — Save State/Load State on both mobile shells, plus a real,
pre-existing, already-shipped Android `AudioTrack` crash found and fixed while re-verifying it
on-device; RetroAchievements/`mlua`/netplay honestly re-scoped to a later rung) — with dormant
monetization scaffolding (`v1.18.0`) — and a PGO/BOLT pipeline last (`v1.19.0`). Tracked in
on-device; RetroAchievements/`mlua`/netplay honestly re-scoped to a later rung), then dormant
monetization scaffolding (`v1.18.0 "Dormant"`, **RELEASED 2026-07-14** — new, standalone
`rustysnes-monetization` UniFFI crate, never a dependency of the deterministic core, every
pricing/pacing figure an explicit placeholder; wired into both mobile shells as an inert,
log-only startup call, verified for real on the Android AVD via `logcat` and compile-verified
for iOS via a real macOS CI build, which caught and fixed a genuine `xcodebuild`
xcframework-modulemap collision) — and a PGO/BOLT pipeline last (`v1.19.0`). Tracked in
lockstep against RustyNES's own continuing development via `to-dos/LOCKSTEP-CHECKLIST.md`, not
a frozen snapshot target. Full detail in `to-dos/VERSION-PLAN.md`'s "RustyNES-parity ladder"
section.
Expand Down
27 changes: 20 additions & 7 deletions to-dos/VERSION-PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -1263,13 +1263,26 @@ migration, and direct-IP/LAN netplay were all investigated and found not to fit
honestly-verifiable change at this rung (see `CHANGELOG.md`'s `v1.17.0` entry for the full
reasoning per item); all three remain on the roadmap for a later mobile-track rung.

### `v1.18.0 "Dormant"` — the rest of the mobile track

`rustysnes-monetization` (dormant RevenueCat/AppLovin-style scaffold, never a dependency of the
deterministic core, policy shape only — no committed pricing). A store-launch decision (Play +
App Store submission, monetization activation) is an explicit maintainer go/no-go against
`docs/mobile-readiness.md`, not a numbered rung — mirroring RustyNES's own still-pending,
twice-deferred launch.
### `v1.18.0 "Dormant"` — Mobile Phase 5: monetization scaffolding — **RELEASED 2026-07-14**

Delivered: a new, standalone `rustysnes-monetization` UniFFI crate — dormant entitlement/
ad-pacing policy scaffold (`check_entitlement`, `default_ad_pacing_policy`, `should_show_ad`),
never a dependency of the deterministic core, every concrete pricing/pacing number an explicit
placeholder (unlike RustyNES's own already-committed figure). Wired into both mobile shells as
an inert dependency — compiled in, called once at startup, logged only, no real store SDK, no
UI. Verified for real on Android: rebuilt via a real Gradle build, installed on the real AVD,
launched, and confirmed via `logcat` that the dormant scaffold logs correctly with no crash.
iOS: the Rust `staticlib`/`rlib` outputs cross-compile for real in this development environment;
the `cdylib`/xcframework packaging pipeline needs a real Apple toolchain, so it's
compile-verified via `ios.yml`'s real macOS CI build only — which caught a genuine
`xcodebuild` "Multiple commands produce" failure from two per-crate xcframeworks each
contributing a same-named `module.modulemap` to a shared build-products directory, fixed by
merging `rustysnes-mobile` and `rustysnes-monetization` into one combined
`RustysnesFFI.xcframework`.

A store-launch decision (Play + App Store submission, monetization activation) remains an
explicit maintainer go/no-go against `docs/mobile-readiness.md`, not a numbered rung —
mirroring RustyNES's own still-pending, twice-deferred launch.

### `v1.19.0 "Afterburner"` — PGO/BOLT pipeline

Expand Down
Loading