Skip to content

Reel: streaming service sample with core DRM streaming API - #6086

Open
shai-almog wants to merge 34 commits into
masterfrom
reel-streaming-sample
Open

shai-almog wants to merge 34 commits into
masterfrom
reel-streaming-sample

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Reel is a full-stack streaming sample at scripts/reel, in the same shape as Wayline, Savor and Parley. It works like Netflix or YouTube, with a training-academy mode. It adds a core streaming API with DRM, which the app needs.

Core

  • StreamRequest, DrmConfig and DrmScheme (com.codename1.media). They stream HLS and DASH, with ClearKey, AES-128, Widevine and FairPlay, through each port's native player. MediaManager.isDrmSupported reports which schemes a device can play.
  • Backend runtime: a class-library host is now installed, so MessageDigest works on a ParparVM server. Before this, every algorithm was unavailable there. SelfTest checks the known answers.
  • Image cache: an empty cached entry is downloaded again. Two requests for the same URL raced: the second request loaded the zero-byte file the first had just opened, and the image threw on first use.
  • Build engine: the bytecode compliance check skips classes that annotation processing is about to regenerate. Separately, the mapper processor no longer redeclares a local variable that shares a name with a record component.

The sample

  • Viewer: profiles with PINs and kids' ratings, home rows and recommendations, search, resume across devices, a list, ratings, downloads with expiring licenses, plans, trials, coupons, rentals and a wallet, and courses with quizzes, branches and certificates.
  • Player: ad breaks with skipping, chapters, interactive overlays, heartbeats, a per-plan stream limit, and screenshot blocking plus a watermark for protected video.
  • Creator studio: resumable chunked uploads, a packaging worker (tools/packager, which runs ffmpeg), chapters and interactions, review submission and analytics.
  • Moderation: a queue of submitted titles, reports and appeals. Uploads are checked against a keyword blocklist and against perceptual frame hashes of video that was taken down before.
  • Admin: a dashboard and charts, accounts and roles, suspensions, live sessions, sharing alerts, plans, coupons and ad campaigns, feature switches with three presets, and branding.
  • Server: media and license tokens per session. Every playlist and key request is checked, entitlement is re-checked at each heartbeat and each download license, and only ads the server actually served are counted. Widevine and FairPlay requests are forwarded to a license vendor once one is configured.
  • The content is the Blender open movies. tools/fetch-demo-media.sh downloads and packages them at build time; nothing is committed.
  • Docs: Reel-Users-Guide and Reel-Implementors-Guide in the developer guide.
  • Initializr: Reel is offered as a template, with a preview image and synced zips. check-template.sh passes.
  • CI: .github/workflows/reel.yml.

Verification

  • Server tests: 22/22 on the JVM and 22/22 compiled with ParparVM.
  • Simulator end-to-end tests: 4/4 (viewer, studio, moderation and admin flows).
  • Three red-team rounds; each round's findings are fixed and held by tests.
  • Locally clean: SpotBugs (android, ios, build-engine, core-unittests, backend), copyright headers, control characters, @author tags, and Vale on the new guides.
  • Not run locally: LanguageTool and the web end-to-end test (run-web-e2e.sh, which needs Playwright).

🤖 Generated with Claude Code

shai-almog and others added 16 commits October 23, 2026 10:07
AES-128 HLS on every port whose player decrypts it, Widevine/ClearKey on
Android through the framework MediaPlayer DRM API, FairPlay on iOS through
AVContentKeySession, and stream request headers on Android.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…DASH and availability (red-team round 1)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Catalog, recommendations, playback with AES-128/ClearKey keys served only to
live sessions, Widevine/FairPlay license proxying, plans, rentals and coupons,
ads, studio uploads in checked pieces, a packaging worker, moderation with
frame blocklists, quizzes, polls, branching and certificates, an admin console
API and the demo catalog of Blender open movies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Quality cap on cenc.mp4, device sign-out ends its OAuth grant, downloads
withdrawn on suspension/sharing and dead with their device, server-side
profile PIN keys and kids edits, re-review of changed published titles,
stale approvals refused, renewal retries a day apart, coupons once per
account, rentals only of published titles, DRM scheme packaging checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eclares it

A @mapped record gathers its components in locals named _<component>, and
readXml declares helper locals of the same shape (_kids, _i, _e, _ch). A
record with a component named kids therefore failed to build on the
generated source. Components now take two underscores.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fications

The Codename One client for every mode, with the device id sent on each
request, and a backend Notifier: new episodes to followers on the devices
that asked, and account news (new sign-in, failed payment, moderation).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eplace

bytecode-compliance runs before process-annotations, so it read the previous
build's generated mappers and REST clients; after a shared DTO changed, the
stale mapper named a constructor that no longer exists and failed the build.
Processing now records the class files it wrote beside the output directory,
and the check leaves those out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Player: a session opened after the viewer left is stopped; heartbeats run on
their own timer so dialogs and the chapters list no longer silence them, and
report paused during ads; offline playback blocks screenshots, carries the
watermark and releases the player. Ads: one guarded finish per ad that stops
the countdown. Uploads: one forward stream per file and a synchronous status
check on resync; no answer is retried. Downloads: listed from the device so
they work offline, forgotten on sign-out and server change, and a failed one
is cleaned up and reported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The simulator suite (viewer, studio, moderation, admin) and the browser run
now drive Reel's own screens; all four simulator flows pass against a JVM
server. reel.yml runs the server tests on the JVM, compiled and on each
database, the simulator and browser runs, and the device builds. The bundles
carry Reel's strings in five languages, the last food-delivery text and
comments are gone, tools/fetch-demo-media.sh packages the Blender films the
server reads, and server.sh runs on the JDK in JAVA_HOME.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Registered beside Parley (template picker, brand, generated README, matrix
test, fixtures, sync script); check-template.sh builds a generated project.
The fixture generator now looks for the sample's name in its three exact
spellings: "reel" sits inside "hasMoreElements".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The compiled server's class library has no regular expressions or time
zones: String.split, replaceAll and SimpleDateFormat.setTimeZone become
Rows.split, Rows.words and Rows.utcDay, held to the JDK's answers by
RowsTest. Artwork shows a film mark until (or unless) the picture arrives,
the title actions get room for their words, and the hero buttons a gap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed ads

A heartbeat and a download license now check again that the title is
published and the plan or a rental covers it; a download needs its device
still signed in; an ad event counts only for a campaign the server served
that session; Download is offered only where ClearKey plays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing installed a JdkHost on a compiled server, so every MessageDigest
algorithm was unavailable. The host wraps the shared Hash (MD5 to SHA-512)
and supplies random bytes; the JVM twin is a no-op. SelfTest checks the
known answers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two requests for the same image URL raced: the second found the file the
first had opened but not yet written and handed back an image of zero
bytes, which threw on first use. A failed download leaves the same empty
entry. Either is now treated as absent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…view

Also: fetch-demo-media.sh runs the packager on JAVA_HOME's java, the admin
user page shows None for an account with no plan, and scripts/reel is
MIT-0 like the other Initializr samples for the header gate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 12 screenshots: 12 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ desktop-compat-runtime: 0 findings (no issues)
    • ✅ fxml-compiler: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ javafx-compat: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
    • ✅ swing-compat: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 227 screenshots: 227 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 63ms / native 5ms = 12.6x speedup
SIMD float-mul (64K x300) java 57ms / native 4ms = 14.2x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 75.000 ms
Base64 CN1 decode 103.000 ms
Base64 SIMD encode 104.000 ms
Base64 encode ratio (SIMD/CN1) 1.387x (38.7% slower)
Base64 SIMD decode 103.000 ms
Base64 decode ratio (SIMD/CN1) 1.000x (0.0% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.222x (77.8% faster)
Image applyMask (SIMD off) 32.000 ms
Image applyMask (SIMD on) 25.000 ms
Image applyMask ratio (SIMD on/off) 0.781x (21.9% faster)
Image modifyAlpha (SIMD off) 32.000 ms
Image modifyAlpha (SIMD on) 13.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.406x (59.4% faster)
Image modifyAlpha removeColor (SIMD off) 34.000 ms
Image modifyAlpha removeColor (SIMD on) 18.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.529x (47.1% faster)

@shai-almog

shai-almog commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 191 screenshots: 191 matched.

Native Android coverage

  • 📊 Line coverage: 18.90% (48250/255341 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 17.64% (229182/1299035), branch 12.04% (16817/139675), complexity 9.67% (12910/133466), method 14.57% (9122/62628), class 25.16% (1774/7052)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 18.90% (48250/255341 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 17.64% (229182/1299035), branch 12.04% (16817/139675), complexity 9.67% (12910/133466), method 14.57% (9122/62628), class 25.16% (1774/7052)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 151ms / native 141ms = 1.0x speedup
SIMD float-mul (64K x300) java 159ms / native 133ms = 1.1x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 64.000 ms
Base64 native encode 504.000 ms
Base64 encode ratio (CN1/native) 0.119x (88.1% faster)
Base64 native decode 329.000 ms
Base64 decode ratio (CN1/native) 0.195x (80.5% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 59ms / native 5ms = 11.8x speedup
SIMD float-mul (64K x300) java 58ms / native 4ms = 14.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 73.000 ms
Base64 CN1 decode 87.000 ms
Base64 SIMD encode 106.000 ms
Base64 encode ratio (SIMD/CN1) 1.452x (45.2% slower)
Base64 SIMD decode 98.000 ms
Base64 decode ratio (SIMD/CN1) 1.126x (12.6% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 28.000 ms
Image applyMask (SIMD on) 32.000 ms
Image applyMask ratio (SIMD on/off) 1.143x (14.3% slower)
Image modifyAlpha (SIMD off) 41.000 ms
Image modifyAlpha (SIMD on) 26.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.634x (36.6% faster)
Image modifyAlpha removeColor (SIMD off) 39.000 ms
Image modifyAlpha removeColor (SIMD on) 12.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.308x (69.2% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: Intel64 Family 6 Model 106 Stepping 6, GenuineIntel (baseline windows-x64@intel64-family-6-model-106-genuineintel)

1 performance regression:

  • translator (self) on all 4 CPUs: time 0.80x against a 0.63x baseline (+26.9%, tolerance 20%)

1 improvement past the baseline (not a failure; rebaseline to lock it in):

  • hello (WinHelloMain) on all 4 CPUs: RAM 0.55x against a 0.76x baseline (-27.6%, tolerance 25%)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.39x (base 1.21x, +14.7%) 0.55x (base 0.76x, -27.6%) improved: rebaseline to lock in (RAM -27.6%)
translator (self) 4 0.80x (base 0.63x, +26.9%) 0.51x (base 0.54x, -4.7%) REGRESSION (time +26.9%)
intArithmetic 4 1.03x (base 1.03x, +0.3%) 0.06x (base 0.06x, +4.2%) ok
longArithmetic 4 1.00x (base 1.00x, -0.1%) 0.06x (base 0.05x, +3.1%) ok
mathTranscendental 4 0.81x (base 0.81x, -0.1%) 0.06x (base 0.06x, +2.6%) ok
arraySequential 4 1.55x (base 1.43x, +8.8%) 0.38x (base 0.38x, +0.3%) ok
arrayRandom 4 0.99x (base 1.00x, -0.6%) 0.23x (base 0.23x, +0.6%) ok
objectAllocation 4 1.20x (base 1.21x, -0.8%) 0.37x (base 0.32x, +13.0%) ok
valueEscape 4 0.13x (base 0.17x, -24.2%) 0.05x (base 0.04x, +6.3%) ok
hashMapChurn 4 1.19x (base 1.21x, -2.3%) 0.09x (base 0.10x, -15.6%) ok
stringBuilding 4 1.44x (base 1.44x, +0.4%) 0.27x (base 0.27x, -0.9%) ok
recursion 4 1.19x (base 1.26x, -5.6%) 0.06x (base 0.06x, +3.0%) ok
quicksort 4 1.07x (base 1.11x, -3.8%) 0.12x (base 0.12x, +1.4%) ok

A change that moves performance ON PURPOSE records the new baseline in vm/selfhost/perf-baseline/pr/6086.json, with the reason, from this job's perf-results.json. The rebaseline is then part of this pull request's diff:

python3 vm/selfhost/calibrate-perf-baseline.py --pr 6086 --reason "<why these benchmarks moved>" perf-results.json

Result: performance regression

@shai-almog

shai-almog commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

ParparVM vs HotSpot (JDK 25): Linux x64

Runner CPU: AMD EPYC 7763 64-Core Processor (baseline linux-x64@amd-epyc-7763-64-core-processor)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.82x (base 0.85x, -3.2%) 0.89x (base 0.83x, +7.1%) ok
translator (self) 4 0.60x (base 0.64x, -6.5%) 0.45x (base 0.52x, -14.1%) ok
intArithmetic 4 1.10x (base 1.12x, -1.2%) 0.06x (base 0.06x, +1.1%) ok
longArithmetic 4 1.08x (base 1.08x, +0.0%) 0.06x (base 0.05x, +5.9%) ok
mathTranscendental 4 1.09x (base 1.08x, +0.2%) 0.06x (base 0.07x, -21.7%) ok
arraySequential 4 2.11x (base 2.00x, +5.1%) 0.36x (base 0.36x, -0.2%) ok
arrayRandom 4 1.29x (base 0.91x, +41.4%) 0.21x (base 0.21x, +0.2%) ok
objectAllocation 4 1.65x (base 1.65x, -0.0%) 0.30x (base 0.35x, -16.3%) ok
valueEscape 4 0.10x (base 0.10x, -0.3%) 0.05x (base 0.04x, +3.3%) ok
hashMapChurn 4 1.48x (base 1.48x, -0.1%) 0.09x (base 0.09x, -1.6%) ok
stringBuilding 4 1.43x (base 1.39x, +3.0%) 0.26x (base 0.31x, -16.9%) ok
recursion 4 1.19x (base 1.25x, -5.4%) 0.08x (base 0.08x, +2.0%) ok
quicksort 4 1.11x (base 1.07x, +3.6%) 0.11x (base 0.11x, -0.5%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.98x (base 1.02x, -4.4%) 0.67x (base 0.93x, -28.1%) ok
translator (self) 4 0.76x (base 0.70x, +8.5%) 0.44x (base 0.43x, +2.0%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.03x (base 0.03x, +4.6%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, +5.0%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.3%) 0.04x (base 0.03x, +9.6%) ok
arraySequential 4 0.37x (base 0.36x, +3.1%) 0.37x (base 0.37x, +0.4%) ok
arrayRandom 4 0.94x (base 0.94x, +0.0%) 0.20x (base 0.20x, +0.7%) ok
objectAllocation 4 1.95x (base 1.77x, +10.4%) 0.38x (base 0.37x, +1.8%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +4.5%) ok
hashMapChurn 4 0.81x (base 0.84x, -3.9%) 0.12x (base 0.12x, -1.0%) ok
stringBuilding 4 1.44x (base 1.57x, -8.0%) 0.27x (base 0.26x, +2.4%) ok
recursion 4 1.42x (base 1.43x, -1.2%) 0.04x (base 0.04x, +3.2%) ok
quicksort 4 1.00x (base 0.99x, +1.0%) 0.09x (base 0.09x, +1.3%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 50ms / native 3ms = 16.6x speedup
SIMD float-mul (64K x300) java 50ms / native 3ms = 16.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 61.000 ms
Base64 CN1 decode 70.000 ms
Base64 SIMD encode 78.000 ms
Base64 encode ratio (SIMD/CN1) 1.279x (27.9% slower)
Base64 SIMD decode 73.000 ms
Base64 decode ratio (SIMD/CN1) 1.043x (4.3% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.167x (83.3% faster)
Image applyMask (SIMD off) 20.000 ms
Image applyMask (SIMD on) 21.000 ms
Image applyMask ratio (SIMD on/off) 1.050x (5.0% slower)
Image modifyAlpha (SIMD off) 17.000 ms
Image modifyAlpha (SIMD on) 8.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.471x (52.9% faster)
Image modifyAlpha removeColor (SIMD off) 17.000 ms
Image modifyAlpha removeColor (SIMD on) 13.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.765x (23.5% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.01x (base 1.11x, -9.1%) 0.65x (base 0.75x, -13.6%) ok
translator (self) 4 0.88x (base 0.84x, +4.5%) 0.48x (base 0.51x, -4.5%) ok
intArithmetic 4 1.04x (base 1.04x, +0.0%) 0.06x (base 0.06x, +3.0%) ok
longArithmetic 4 0.80x (base 0.80x, +0.1%) 0.06x (base 0.06x, +3.5%) ok
mathTranscendental 4 0.72x (base 0.72x, +0.0%) 0.07x (base 0.06x, +2.1%) ok
arraySequential 4 0.39x (base 0.46x, -14.8%) 0.39x (base 0.39x, -0.0%) ok
arrayRandom 4 0.94x (base 0.94x, -0.2%) 0.23x (base 0.23x, +0.2%) ok
objectAllocation 4 1.75x (base 1.82x, -3.9%) 0.41x (base 0.43x, -4.8%) ok
valueEscape 4 0.76x (base 0.76x, +0.1%) 0.05x (base 0.05x, +3.2%) ok
hashMapChurn 4 1.00x (base 0.98x, +1.2%) 0.11x (base 0.12x, -8.8%) ok
stringBuilding 4 1.59x (base 1.43x, +11.8%) 0.27x (base 0.27x, -0.4%) ok
recursion 4 1.55x (base 1.46x, +5.9%) 0.07x (base 0.07x, +1.4%) ok
quicksort 4 1.01x (base 1.00x, +0.6%) 0.12x (base 0.12x, +0.5%) ok

Result: no regression

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Flutter vs Codename One

Same application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor.

android

9 interleaved rounds; host load 0.74, 2.13, 1.71

Metric Codename One Flutter Ratio Winner
Installed size 78.2 MB 95.8 MB 1.22x Codename One
Executable code 4.7 MB 20.6 MB 4.41x Codename One
Download size (zipped) 78.2 MB 95.8 MB 1.22x Codename One
Cold start to first frame on screen 559 ms 1377 ms 2.57x Codename One
Memory at rest 47.7 MB 89.8 MB 1.88x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 76 ms 164 ms 2.16x
longArithmetic 50 ms 52 ms 1.04x
mathTranscendental 218 ms 282 ms 1.29x
arraySequential 24 ms 31 ms 1.29x
arrayRandom 206 ms 239 ms 1.16x
objectAllocation 62 ms 37 ms 0.60x
valueEscape 6 ms 6 ms 1.00x
hashMapChurn 124 ms 244 ms 1.97x
stringBuilding 78 ms 98 ms 1.26x
recursion 63 ms 235 ms 3.73x
quicksortBench 115 ms 133 ms 1.16x
Geometric mean 1.35x

Gate: within tolerance against scripts/flutter-bench/baseline.

Android sizes are for the arm64-v8a slice a phone is delivered, on both sides; Flutter's release apk carries three ABIs and would otherwise count its engine about three times.
Android start-up and memory come from an x86_64 emulator with a software GPU. They compare the two runtimes on one machine; they are not phone timings, and a renderer that leans on the GPU is penalised more there.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

ios

9 interleaved rounds; host load 33.0, 21.69, 12.33

Metric Codename One Flutter Ratio Winner
Installed size 108.2 MB 110.5 MB 1.02x Codename One
Executable code 17.2 MB 19.1 MB 1.11x Codename One
Download size (zipped) 80.0 MB 81.9 MB 1.02x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Not measured: iOS compute is not measured: a device build needs signed hardware, and on the simulator Flutter runs its JIT debug engine rather than AOT code. The macOS row runs the same ParparVM and Dart AOT compilers on the same Apple silicon.

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -7.16% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6086 --reason "<why these moved>" baseline-ios.json, then commit the overlay it writes.

iOS start-up and memory are not measured here: Flutter cannot AOT-compile for the simulator, so a simulator run would time a JIT debug build against a release build. Sizes come from release device bundles; timings need signed hardware.
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

javascript

9 interleaved rounds; host load 1.98, 1.28, 0.56

Metric Codename One Flutter Ratio Winner
Installed size 104.0 MB 122.5 MB 1.18x Codename One
Executable code 12.9 MB 25.2 MB 1.95x Codename One
Download size (zipped) 76.3 MB 84.1 MB 1.10x Codename One
Cold start to first frame on screen -- -- -- not measured
Memory at rest -- -- -- not measured

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 654 ms wrong result Flutter: wrong result
longArithmetic 4992 ms did not run Flutter: did not run
mathTranscendental 570 ms did not run Flutter: did not run
arraySequential 226 ms 82 ms 0.36x
arrayRandom 922 ms wrong result Flutter: wrong result
objectAllocation 38 ms 27 ms 0.71x
valueEscape 149 ms 7 ms 0.05x
hashMapChurn 1138 ms 247 ms 0.22x
stringBuilding 526 ms 107 ms 0.20x
recursion 508 ms 488 ms 0.96x
quicksortBench 405 ms wrong result Flutter: wrong result
Geometric mean 0.28x

Gate: within tolerance against scripts/flutter-bench/baseline; BEHIND FLUTTER on Compute (geomean of the VM workloads) (reported, not gated: a loss to Flutter on the web is currently accepted).

the JavaScript adapter needs a Chrome DevTools driver; sizes are reported and timings are not
This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

linux

9 interleaved rounds; host load 0.22, 2.9, 2.45

Metric Codename One Flutter Ratio Winner
Installed size 111.5 MB 143.8 MB 1.29x Codename One
Executable code 14.1 MB 16.1 MB 1.15x Codename One
Download size (zipped) 80.9 MB 92.9 MB 1.15x Codename One
Cold start to first frame on screen 150 ms 222 ms 1.49x Codename One
Memory at rest 85.7 MB 225.3 MB 2.64x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 75 ms 183 ms 2.44x
longArithmetic 56 ms 56 ms 1.00x
mathTranscendental 253 ms 276 ms 1.09x
arraySequential 16 ms 35 ms 2.19x
arrayRandom 314 ms 319 ms 1.02x
objectAllocation 23 ms 38 ms 1.65x
valueEscape 5 ms 7 ms 1.40x
hashMapChurn 49 ms 331 ms 6.75x
stringBuilding 32 ms 109 ms 3.41x
recursion 87 ms 257 ms 2.95x
quicksortBench 137 ms 149 ms 1.09x
Geometric mean 1.88x

Gate: within tolerance against scripts/flutter-bench/baseline.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

macos

9 interleaved rounds; host load 1.5, 13.66, 18.36

Metric Codename One Flutter Ratio Winner
Installed size 124.2 MB 139.4 MB 1.12x Codename One
Executable code 33.1 MB 47.9 MB 1.45x Codename One
Download size (zipped) 85.5 MB 93.3 MB 1.09x Codename One
Cold start to first frame on screen 403 ms 513 ms 1.34x Codename One
Memory at rest 36.8 MB 53.4 MB 1.45x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 8 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 113 ms 255 ms 2.26x
longArithmetic 71 ms 76 ms 1.07x
mathTranscendental 280 ms 334 ms 1.19x
arraySequential 11 ms 48 ms 4.36x
arrayRandom 268 ms 373 ms 1.39x
objectAllocation 54 ms 26 ms 0.48x
valueEscape 6 ms 13 ms 2.17x
hashMapChurn 39 ms 234 ms 6.00x
stringBuilding 24 ms 132 ms 5.50x
recursion 139 ms 317 ms 2.28x
quicksortBench 121 ms 169 ms 1.40x
Geometric mean 1.99x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -6.26% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6086 --reason "<why these moved>" baseline-macos.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

windows

9 interleaved rounds

Metric Codename One Flutter Ratio Winner
Installed size 107.8 MB 121.1 MB 1.12x Codename One
Executable code 11.4 MB 14.1 MB 1.25x Codename One
Download size (zipped) 77.9 MB 86.4 MB 1.11x Codename One
Cold start to first frame on screen 173 ms 251 ms 1.50x Codename One
Memory at rest 58.5 MB 92.8 MB 1.58x Codename One

Start-up and memory at rest are judged round by round: the ratio is the median of the per-round ratios, each from two launches made back to back, and the times and sizes shown are each side's median, so the ratio need not equal their quotient. Codename One was ahead in 9 of 9 rounds on cold start to first frame on screen; 9 of 9 rounds on memory at rest.

Compute -- the VM workloads (vm/benchmarks), run inside each app; time is the best of the app's own repetitions, higher ratio means Codename One is faster.

Workload Codename One Flutter Ratio
intArithmetic 83 ms 183 ms 2.21x
longArithmetic 63 ms 57 ms 0.91x
mathTranscendental 198 ms 269 ms 1.36x
arraySequential 11 ms 35 ms 3.18x
arrayRandom 273 ms 316 ms 1.16x
objectAllocation 25 ms 39 ms 1.56x
valueEscape 1 ms 7 ms 7.00x
hashMapChurn 48 ms 318 ms 6.62x
stringBuilding 36 ms 122 ms 3.39x
recursion 195 ms 266 ms 1.36x
quicksortBench 138 ms 146 ms 1.06x
Geometric mean 2.10x

Gate: within tolerance against scripts/flutter-bench/baseline. Smaller than its baseline, which does not fail the gate: Executable code -10.64%; Download size (zipped) -0.77% -- rebaseline to tighten. To accept the move, download this platform's baseline-<platform>.json artifact and run python3 scripts/flutter-bench/flutter_baseline.py calibrate --pr 6086 --reason "<why these moved>" baseline-windows.json, then commit the overlay it writes.

This platform's adapter has not been exercised end to end before; treat the first published run as the thing under review.

Codename One wins 26 of 26 measured metrics across 6 platform(s).

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • ✅ Tests: 881 total, 0 failed, 55 skipped

Benchmark Results

  • Execution Time: 10726 ms

  • Hotspots (Top 20 sampled methods):

    • 12.13% com.codename1.tools.translator.IteratorEscape.mangle (204 samples)
    • 7.49% java.lang.System.identityHashCode (126 samples)
    • 7.02% java.lang.Object.hashCode (118 samples)
    • 6.78% java.util.ArrayList.indexOf (114 samples)
    • 3.27% com.codename1.tools.translator.BytecodeMethod.equals (55 samples)
    • 3.21% com.codename1.tools.translator.JavascriptReachability.enqueueResolved (54 samples)
    • 3.09% java.lang.StringBuilder.append (52 samples)
    • 2.26% java.lang.String.equals (38 samples)
    • 1.84% com.codename1.tools.translator.bytecodes.Invoke.resolveDirectTarget (31 samples)
    • 1.55% java.util.AbstractCollection.containsAll (26 samples)
    • 1.43% com.codename1.tools.translator.Parser.cullMethods (24 samples)
    • 1.43% java.util.HashMap.hash (24 samples)
    • 1.25% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (21 samples)
    • 1.19% com.codename1.tools.translator.ReachabilityCull.run (20 samples)
    • 1.19% com.codename1.tools.translator.BytecodeMethod.updateInlinableFieldDependencies (20 samples)
    • 1.07% java.io.FileOutputStream.writeBytes (18 samples)
    • 1.07% com.codename1.tools.translator.classfile.analysis.Analyzer.analyze (18 samples)
    • 1.01% com.codename1.tools.translator.classfile.tree.JsrInliner.replay (17 samples)
    • 1.01% com.codename1.tools.translator.bytecodes.Invoke.findMethodUp (17 samples)
    • 0.95% com.codename1.tools.translator.IteratorEscape.ctorOnlyStoresParamsIntoThis (16 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

shai-almog and others added 2 commits October 23, 2026 21:17
AES-128 is supported by the default implementation, header values with
line breaks are rejected, DASH is no longer claimed, the iOS FairPlay path
checks its license URL, and Android stops preparing a player closed during
license acquisition. The guide documents the FairPlay certificate as a URL.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The implementor's guide includes its snippets from docs/demos and from
  tagged PlayerForm code, as the guide gate requires; scripts/reel is an
  allowed include root and in the docs workflow's paths.
- check-native-signatures compiles the backend with the class library's
  JdkHost, which ClassLibraryHost extends.
- The media origin creates its directory, so a server with no packaged
  media answers 404 for art rather than failing the request.
- The web test switches the admin to the console from the menu: staff
  open watching, like everyone else.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 192 screenshots: 192 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 516 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 51ms / native 2ms = 25.5x speedup
SIMD float-mul (64K x300) java 52ms / native 3ms = 17.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 52.000 ms
Base64 CN1 decode 67.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.400x (60.0% faster)
Image applyMask (SIMD off) 70.000 ms
Image applyMask (SIMD on) 80.000 ms
Image applyMask ratio (SIMD on/off) 1.143x (14.3% slower)
Image modifyAlpha (SIMD off) 53.000 ms
Image modifyAlpha (SIMD on) 71.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.340x (34.0% slower)
Image modifyAlpha removeColor (SIMD off) 72.000 ms
Image modifyAlpha removeColor (SIMD on) 57.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.792x (20.8% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 0.75x (base 0.96x, -21.7%) 0.90x (base 0.93x, -2.3%) ok
translator (self) 3 0.71x (base 0.62x, +14.0%) 0.61x (base 0.78x, -22.4%) ok
intArithmetic 3 1.06x (base 1.03x, +2.6%) 0.12x (base 0.12x, +2.1%) ok
longArithmetic 3 1.03x (base 1.03x, +0.4%) 0.11x (base 0.07x, +61.8%) ok
mathTranscendental 3 0.97x (base 1.01x, -3.5%) 0.12x (base 0.12x, -0.4%) ok
arraySequential 3 0.46x (base 0.42x, +9.7%) 0.53x (base 0.53x, +0.5%) ok
arrayRandom 3 0.98x (base 0.99x, -0.7%) 0.33x (base 0.32x, +0.5%) ok
objectAllocation 3 1.03x (base 1.11x, -6.6%) 0.63x (base 0.72x, -12.8%) ok
valueEscape 3 0.50x (base 0.51x, -0.9%) 0.09x (base 0.09x, +6.4%) ok
hashMapChurn 3 0.97x (base 1.18x, -17.9%) 0.07x (base 0.07x, +11.5%) ok
stringBuilding 3 0.84x (base 0.84x, -0.2%) 0.37x (base 0.46x, -19.1%) ok
recursion 3 1.27x (base 1.24x, +3.2%) 0.12x (base 0.12x, +1.3%) ok
quicksort 3 0.99x (base 1.01x, -2.0%) 0.11x (base 0.11x, +0.6%) ok

Result: no regression

shai-almog and others added 2 commits October 24, 2026 08:15
The home screen and a title's page lead with the artwork across the whole
width (Backdrop), shaded into the page by a per-row alpha gradient so the
title stays readable. Rows are landscape tiles; on a wide window the
sections sit along the top bar and the hero text moves left. Dark is the
default theme, the app has its own icon, and posters are frames picked by
hand instead of the opening titles.

run-e2e.sh now runs the desktop pass on every OS through an in-memory
preferences store, sizes the window like a laptop and keeps both sets of
captures; the guide gains desktop shots and fresh phone shots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 189 screenshots: 189 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 2066 seconds

Build and Run Timing

Metric Duration
Simulator Boot 59000 ms
Simulator Boot (Run) 0 ms
App Install 16000 ms
App Launch 4000 ms
Test Execution 471000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 346ms / native 13ms = 26.6x speedup
SIMD float-mul (64K x300) java 362ms / native 3ms = 120.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 168.000 ms
Base64 CN1 decode 156.000 ms
Base64 native encode 1962.000 ms
Base64 encode ratio (CN1/native) 0.086x (91.4% faster)
Base64 native decode 1052.000 ms
Base64 decode ratio (CN1/native) 0.148x (85.2% faster)
Base64 SIMD encode 85.000 ms
Base64 encode ratio (SIMD/CN1) 0.506x (49.4% faster)
Base64 SIMD decode 122.000 ms
Base64 decode ratio (SIMD/CN1) 0.782x (21.8% faster)
Base64 encode ratio (SIMD/native) 0.043x (95.7% faster)
Base64 decode ratio (SIMD/native) 0.116x (88.4% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 3.000 ms
Image createMask ratio (SIMD on/off) 0.375x (62.5% faster)
Image applyMask (SIMD off) 588.000 ms
Image applyMask (SIMD on) 28.000 ms
Image applyMask ratio (SIMD on/off) 0.048x (95.2% faster)
Image modifyAlpha (SIMD off) 39.000 ms
Image modifyAlpha (SIMD on) 33.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.846x (15.4% faster)
Image modifyAlpha removeColor (SIMD off) 86.000 ms
Image modifyAlpha removeColor (SIMD on) 93.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.081x (8.1% slower)

shai-almog and others added 7 commits October 24, 2026 18:35
Reel follows master's Initializr changes: a complete-app choice in the
regrouped picker, the JUnit 5 engine in its template pom, and a REEL leg in
the released-download e2e. Reel needs the core DRM API from this PR, so the
page offers it only from REEL_SINCE and e2e-shipped.sh skips it before then.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reel plays through the core DRM API this PR adds, which no release before
7.0.280 has. GeneratorModel.sinceFor(template) is now the one gate: the page
does not list Reel below it, validateOptions refuses to generate it, and the
fixtures and tests generate each template at its own gate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Player: auto-hiding transport (back/forward 10s, play/pause), scrub bar
  with elapsed and remaining time, chapters, next episode, and an Audio &
  subtitles sheet with subtitle, audio and quality choices. Subtitles are
  WebVTT drawn by the app; audio and quality reopen at the same position.
- A stream that fails keeps the player up with the reason instead of leaving.
- Title page: rating, advisories, HD/4K/CC, languages, share sheet, and a
  course explainer with progress. Home rows carry captions.
- Settings: streaming quality, subtitle language and caption size.
- Studio: content advisories and subtitle tracks per video.
- Backend: subtitle tracks, audio tracks, qualities, shared watch page.
- E2e: PlaybackTest and AccountTest capture the new screens; the guide
  shows them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- run-e2e.sh hard-links the packaged media (tools/fetch-demo-media.sh) into
  the test profile's media directory when it exists, so local captures show
  real artwork, playing video and live captions. CI has none and is
  unchanged. Symbolic links do not work: StaticFiles refuses a path that
  resolves outside its root, which 403'd every variant playlist.
- PlaybackTest starts the viewer's plan first (no pre-roll over the film)
  and waits for the picture to move and for the Spanish cue.
- JavaSE ffmpeg player: scale decoded frames to the probed size. With an HLS
  master playlist ffmpeg can decode a different variant than the one
  probed, and the frames were read at the wrong stride.
- Guide: the Oxford comma Vale counted as an issue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l's demos

Follows master's java.time ORM mapping: an un-annotated Instant is the same
BIGINT of epoch milliseconds, so no migration changes; wire DTOs keep
milliseconds. The skill's demo guide names Reel, which the matrix test
requires of every demo template.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	docs/developer-guide/languagetool-accept.txt
@shai-almog

shai-almog commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 188 screenshots: 188 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 582 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 63ms / native 4ms = 15.7x speedup
SIMD float-mul (64K x300) java 66ms / native 2ms = 33.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 55.000 ms
Base64 CN1 decode 69.000 ms
Base64 native encode 599.000 ms
Base64 encode ratio (CN1/native) 0.092x (90.8% faster)
Base64 native decode 272.000 ms
Base64 decode ratio (CN1/native) 0.254x (74.6% faster)
Base64 SIMD encode 53.000 ms
Base64 encode ratio (SIMD/CN1) 0.964x (3.6% faster)
Base64 SIMD decode 47.000 ms
Base64 decode ratio (SIMD/CN1) 0.681x (31.9% faster)
Base64 encode ratio (SIMD/native) 0.088x (91.2% faster)
Base64 decode ratio (SIMD/native) 0.173x (82.7% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.167x (83.3% faster)
Image applyMask (SIMD off) 51.000 ms
Image applyMask (SIMD on) 49.000 ms
Image applyMask ratio (SIMD on/off) 0.961x (3.9% faster)
Image modifyAlpha (SIMD off) 54.000 ms
Image modifyAlpha (SIMD on) 54.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.000x (0.0% slower)
Image modifyAlpha removeColor (SIMD off) 120.000 ms
Image modifyAlpha removeColor (SIMD on) 72.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.600x (40.0% faster)

shai-almog and others added 3 commits October 26, 2026 03:50
# Conflicts:
#	maven/build-engine/src/main/java/com/codename1/maven/processors/MappingAnnotationProcessor.java
…vers

Reel takes master's per-template floor (templateSince, NOT-OFFERED marker)
instead of its own. Its settings no longer ask for location, the camera or
Face ID, which only Savor used, and Savor's dead styles, wording and the
courier time-on-line helper are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion one

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant