Skip to content

cn1:metadata-push goal + App Store submission developer-guide chapter#5353

Merged
shai-almog merged 8 commits into
masterfrom
feature/metadata-as-code
Jul 10, 2026
Merged

cn1:metadata-push goal + App Store submission developer-guide chapter#5353
shai-almog merged 8 commits into
masterfrom
feature/metadata-as-code

Conversation

@shai-almog

@shai-almog shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Client-side tooling + docs for the build cloud's automated app-store submission (server side: BuildCloud feature/submission-hardening).

cn1:metadata-push goal

Lets developers manage store release metadata as code. It reads a cn1-metadata/{apple,google}/<locale>/*.txt + screenshots/<type>/*.png folder (one file per listing field), builds the descriptor, authenticates with the cached Codename One login token (same account the build uses), and PUTs it — plus uploads screenshots — to the build cloud, which applies it to App Store Connect / Google Play at submission time.

mvn cn1:metadata-push                 # both stores from cn1-metadata/
mvn cn1:metadata-push -Dstore=apple
  • Neutral text file names map to each store's fields (subtitle.txt → App Store subtitle / Google short description); unset files leave the store's value unchanged.
  • Bundle id defaults to codename1.packageName.
  • Auth reuses the plugin's cached JWT; the server endpoint (/appsec/7.0/metadata) is secured by the same bearer chain the build API uses.
  • Pure JDK-8 HttpURLConnection + hand-rolled JSON/multipart (no new plugin deps).

cn1:metadata-init scaffold

mvn cn1:metadata-init scaffolds the cn1-metadata folder (empty field-file template + screenshots folder + README), idempotently, so developers don't hand-create the layout.

Developer guide + website

  • docs/developer-guide/App-Store-Submission.asciidoc (new, registered after the macOS chapter): end-to-end submission flow (console submit, beta vs production, Mac App Store, review status), credentials, and the metadata-as-code workflow (scaffold, folder layout, cn1:metadata-push, apply timing, transient screenshots). No pricing/plan content (that lives on the pricing page).
  • Pricing page: automated-submission feature bullets per tier + an FAQ clarifying that manual submission is always unlimited and free; the limits apply only to the optional automated feature.

🤖 Generated with Claude Code

shai-almog and others added 3 commits July 9, 2026 22:34
…pter

Metadata-as-code client tooling for the Codename One build cloud's automated
app-store submission.

- MetadataPushMojo (goal cn1:metadata-push): reads a cn1-metadata/{apple,google}/
  <locale>/*.txt + screenshots/<type>/*.png folder, builds the store listing
  descriptor, authenticates with the cached Codename One login token, and PUTs it
  (plus uploads screenshots) to the build cloud, which applies it to App Store
  Connect / Google Play at submission. Store text files map to each store's fields;
  unset files are left unchanged. -Dstore=apple|google|both, -DmetadataDir,
  -Dpackage overrides; bundle id defaults to codename1.packageName.
- docs/developer-guide: new App-Store-Submission.asciidoc chapter covering the
  end-to-end submission flow (console single-click submit, beta vs production,
  Mac App Store, review status), credentials, plan tiers/quotas, and the
  metadata-as-code workflow (folder layout, cn1:metadata-push, apply timing,
  transient screenshots, benefits vs manual). Registered after the macOS chapter.

Server side: BuildCloud feature/submission-hardening (machine bearer-JWT endpoint
under /appsec/7.0/metadata).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…int)

The developer-guide snippet validator requires every [source,LANG] block to be
include-backed from docs/demos. The illustrative mvn command block is not a
demo-backed snippet, so use a plain [source] listing (no language) -- the same
form the metadata folder-layout block in this chapter already uses.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The developer guide describes how the feature works, not commercial terms:
remove the paid-feature paragraph and the plans/quotas table, and the remaining
plan-tier clauses (notification gating, metadata update quota, 'plan limits').
Also drop fastlane references from the chapter and the mojo javadoc.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Cloudflare Preview

- MetadataInitMojo (goal cn1:metadata-init): scaffolds cn1-metadata/ with an empty
  template of per-locale field files, a screenshots folder, and a README. Idempotent
  (creates only what's missing). Documented in the App Store Submission guide chapter.
- Pricing page: automated-submission feature bullets per tier (Basic beta + metadata
  as code; Pro production + review tracking + 50/mo; Enterprise unlimited + zero-touch).
- Pricing FAQ: clarify that manual submission is always unlimited and free on any
  plan; the limits apply only to the optional automated submission feature.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 9, 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)

@github-actions

github-actions Bot commented Jul 9, 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)
    • codenameone-maven-plugin: 0 findings (no issues)
    • core-unittests: 0 findings (no issues)
    • ios: 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 Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 144 screenshots: 144 matched.

Native Android coverage

  • 📊 Line coverage: 10.04% (10232/101865 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.89% (50341/565997), branch 4.40% (2269/51534), complexity 4.44% (2421/54493), method 6.74% (1906/28265), class 10.85% (436/4020)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 10.04% (10232/101865 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.89% (50341/565997), branch 4.40% (2269/51534), complexity 4.44% (2421/54493), method 6.74% (1906/28265), class 10.85% (436/4020)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6327 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.ClassReader – 0.00% (0/1519 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1148 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.MethodWriter – 0.00% (0/923 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/730 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/623 lines covered)
      • org.jacoco.agent.rt.internal_b6258fc.asm.org.jacoco.agent.rt.internal_b6258fc.asm.Frame – 0.00% (0/564 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/495 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 201ms / native 97ms = 2.0x speedup
SIMD float-mul (64K x300) java 101ms / native 48ms = 2.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 224.000 ms
Base64 CN1 decode 281.000 ms
Base64 native encode 870.000 ms
Base64 encode ratio (CN1/native) 0.257x (74.3% faster)
Base64 native decode 843.000 ms
Base64 decode ratio (CN1/native) 0.333x (66.7% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

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

Use contractions (Microsoft.Contractions), drop 'and so on' and the flagged
adverbs, use American 'afterward', and avoid non-dictionary words (diffable/
revertable) and a false-positive 'the what's-new'. Verified locally: Vale 0/0/0,
LanguageTool 0 matches, snippet validator clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 52ms / native 2ms = 26.0x speedup
SIMD float-mul (64K x300) java 53ms / native 3ms = 17.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 280.000 ms
Base64 CN1 decode 200.000 ms
Base64 native encode 1010.000 ms
Base64 encode ratio (CN1/native) 0.277x (72.3% faster)
Base64 native decode 694.000 ms
Base64 decode ratio (CN1/native) 0.288x (71.2% faster)
Base64 SIMD encode 55.000 ms
Base64 encode ratio (SIMD/CN1) 0.196x (80.4% faster)
Base64 SIMD decode 48.000 ms
Base64 decode ratio (SIMD/CN1) 0.240x (76.0% faster)
Base64 encode ratio (SIMD/native) 0.054x (94.6% faster)
Base64 decode ratio (SIMD/native) 0.069x (93.1% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 33.000 ms
Image createMask (SIMD on) 24.000 ms
Image createMask ratio (SIMD on/off) 0.727x (27.3% faster)
Image applyMask (SIMD off) 207.000 ms
Image applyMask (SIMD on) 216.000 ms
Image applyMask ratio (SIMD on/off) 1.043x (4.3% slower)
Image modifyAlpha (SIMD off) 268.000 ms
Image modifyAlpha (SIMD on) 235.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.877x (12.3% faster)
Image modifyAlpha removeColor (SIMD off) 182.000 ms
Image modifyAlpha removeColor (SIMD on) 155.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.852x (14.8% faster)

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 216 screenshots: 216 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 139 screenshots: 139 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

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

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 69000 ms
Simulator Boot (Run) 2000 ms
App Install 17000 ms
App Launch 9000 ms
Test Execution 393000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 69ms / native 5ms = 13.8x speedup
SIMD float-mul (64K x300) java 101ms / native 2ms = 50.5x 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 547.000 ms
Base64 CN1 decode 241.000 ms
Base64 native encode 894.000 ms
Base64 encode ratio (CN1/native) 0.612x (38.8% faster)
Base64 native decode 422.000 ms
Base64 decode ratio (CN1/native) 0.571x (42.9% faster)
Base64 SIMD encode 57.000 ms
Base64 encode ratio (SIMD/CN1) 0.104x (89.6% faster)
Base64 SIMD decode 71.000 ms
Base64 decode ratio (SIMD/CN1) 0.295x (70.5% faster)
Base64 encode ratio (SIMD/native) 0.064x (93.6% faster)
Base64 decode ratio (SIMD/native) 0.168x (83.2% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 21.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.095x (90.5% faster)
Image applyMask (SIMD off) 116.000 ms
Image applyMask (SIMD on) 223.000 ms
Image applyMask ratio (SIMD on/off) 1.922x (92.2% slower)
Image modifyAlpha (SIMD off) 231.000 ms
Image modifyAlpha (SIMD on) 276.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.195x (19.5% slower)
Image modifyAlpha removeColor (SIMD off) 279.000 ms
Image modifyAlpha removeColor (SIMD on) 175.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.627x (37.3% faster)

@shai-almog

shai-almog commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 137 screenshots: 137 matched.
✅ Native iOS screenshot tests passed.

Benchmark Results

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

Build and Run Timing

Metric Duration
Simulator Boot 66000 ms
Simulator Boot (Run) 0 ms
App Install 12000 ms
App Launch 2000 ms
Test Execution 449000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 84ms / native 3ms = 28.0x speedup
SIMD float-mul (64K x300) java 53ms / native 2ms = 26.5x 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 286.000 ms
Base64 CN1 decode 217.000 ms
Base64 native encode 943.000 ms
Base64 encode ratio (CN1/native) 0.303x (69.7% faster)
Base64 native decode 576.000 ms
Base64 decode ratio (CN1/native) 0.377x (62.3% faster)
Base64 SIMD encode 55.000 ms
Base64 encode ratio (SIMD/CN1) 0.192x (80.8% faster)
Base64 SIMD decode 49.000 ms
Base64 decode ratio (SIMD/CN1) 0.226x (77.4% faster)
Base64 encode ratio (SIMD/native) 0.058x (94.2% faster)
Base64 decode ratio (SIMD/native) 0.085x (91.5% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 21.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.095x (90.5% faster)
Image applyMask (SIMD off) 185.000 ms
Image applyMask (SIMD on) 191.000 ms
Image applyMask ratio (SIMD on/off) 1.032x (3.2% slower)
Image modifyAlpha (SIMD off) 195.000 ms
Image modifyAlpha (SIMD on) 124.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.636x (36.4% faster)
Image modifyAlpha removeColor (SIMD off) 164.000 ms
Image modifyAlpha removeColor (SIMD on) 193.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.177x (17.7% slower)

shai-almog and others added 3 commits July 10, 2026 05:48
…e Android

Broaden the submission chapter into "App Store Submission and Deployment": one
place to reach users on the App Store, Mac App Store, Google Play, Huawei
AppGallery, and Android markets beyond Google Play.

- Document Huawei AppGallery submission (credentials, the console button,
  beta-draft vs production-review).
- New "Reaching Android users beyond Google Play" section: per-store
  distribution-channel packages with the channel id readable via a Codename One
  API (no third-party SDK), each signed with the app's key. Google Play always
  receives the standard, unmodified AAB, so channel packaging never touches the
  Play artifact and can't be challenged by Google.
- Pricing card: multi-store / reach-beyond-Google-Play bullet.

Verified: Vale 0/0/0, LanguageTool 0 matches, snippet validator clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Completes the client tier of multi-store Android distribution: the Android port
reads the channel id the build server's channel packages stamp into the APK
Signing Block (BuildDaemon ApkChannelWriter) and exposes it via
Display.getProperty("DistributionChannel") -- so apps report their install source
with no third-party channel SDK.

- AndroidImplementation.getProperty: new "DistributionChannel"/"cn1.channel" keys.
- Reader mirrors the daemon writer's signing-block walk (same CN1 channel pair id),
  reads once from the running APK (getApplicationInfo().sourceDir) and caches it;
  returns the default (empty) for a normal Google Play build.
- Guide: document the concrete API call.

Doc gates green (Vale 0/0/0, LanguageTool 0, snippets clean). Server: BuildCloud
#89; daemon writer: BuildDaemon #149.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Screenshot of the build console Submissions page showing the per-store credential
cards (App Store Connect + the new Huawei AppGallery card), captured from the
console simulator. Provides visual context for the "Store credentials" section.

Verified: Vale 0/0/0, LanguageTool 0, snippets clean, image referenced (unused-
images allow-list unchanged).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@shai-almog shai-almog merged commit b4eb966 into master Jul 10, 2026
35 checks passed
@shai-almog shai-almog deleted the feature/metadata-as-code branch July 10, 2026 06:07
shai-almog added a commit that referenced this pull request Jul 10, 2026
…posts (#5357)

* Release week 2026-07-10 blog series: ParparVM vs HotSpot + 3 feature posts

Parent post (Fri): "How We Beat HotSpot Performance (By Cheating, But Not
Like That)" -- the PR #5327 performance story from 4.21x slower than warmed
Java 25 to geomean 1.00x parity, with the GC/tagged-Integer deep dives and
the PR #5338 synchronized-on-wrapper build check.

Daily posts: standalone certificate wizard (PR #5339, Sat), AR/VR support
and simulation (PR #5335, Sun), automated store submissions as code incl.
Huawei AppGallery plus organization accounts and self-service account
deletion (PR #5353, Mon).

Includes 1024x512 hero images, post screenshots, and VM/performance
vocabulary for the LanguageTool blog accept-list. Prose gate passes; all
mermaid diagrams verified against the site's mermaid@10 loader.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Blog series: Oxford commas + numeral percentage for the Vale gate

CI runs Vale's Microsoft.OxfordComma and Microsoft.Percentages rules that
the local styles cache was missing. Sweep every serial list in the four
posts and switch "Ninety percent" to "90%".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Restructure the HotSpot post around architecture

Founder feedback pass: add the memory story (table + chart, standalone
ParparVM benchmark note, Java 25 AOT fairness note), explain the HotSpot
big-block heap vs our malloc/free philosophy and the BiBOP page heap,
tease the twists up top, drop the bug-anecdote sections and the warmup/
GraalVM/what-I-got-wrong filler, rework "Going Deeper" around the
readable one-file-per-class tradeoff, add a TL;DR, and close on the
two-big-PRs slow-week note. Charts split into two clean single-series
xycharts (render-verified on mermaid@10 and mermaid.ink for syndication).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 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