#CodeNameOne
Thanks to #codenameone (an ahead-of-time transpiler), Java wins 38 out of 42 desktop benchmarks against Rust. And in 3 of the 4 measurements that favour Rust, the difference isn't greater than 4 ms 🤯

#java #jdk #jvm #rust
mastodon.social
October 24, 2026 at 10:51 AM
On Foojay, Shai Almog ( @codename-one.bsky.social ) introduces Wayline, a white-label ride-hailing app written in Java. It includes rider and driver apps, an admin console, payments, live tracking and a Java backend. The source is MIT-0 licensed. foojay.io/today/create... #Java #CodenameOne
Create an Uber Clone in 1 Minute
Own a full-stack Java ride-hailing application: rider, driver and admin apps, payments, live tracking and push.
foojay.io
October 24, 2026 at 6:06 AM
iOS 27 Glass You Can Choose, Measure, and Test dev.to/codenameone/...
iOS 27 Glass You Can Choose, Measure, and Test
Select the iOS 27 theme independently of Xcode, see the revised glass in motion, and explore local iPhone Duo posture support.
dev.to
October 4, 2026 at 7:55 PM
CodeScanner.scan(): Barcode Scanning Without Rebuilding the Camera Pipeline
The new vision analyzers could read barcodes, faces, poses, text, documents, and segmentation masks. Scanning one QR code still meant opening a camera, configuring a session, listening for frames, converting each frame, feeding a pipeline, moving the result to the event thread, and restoring the previous form. **What is Codename One?** Codename One is an open-source framework for building native iOS, Android, desktop, and web apps from a single Java or Kotlin codebase. Learn more at codenameone.com. The low-level layer remains necessary for custom camera products. It should not be a prerequisite for reading one code or counting faces. PR #5575 adds the missing layers above the analyzers. For the other work that shipped this week, see the weekly release overview. ## One call owns the scanner screen `CodeScanner.scan()` opens a scanner form, runs the barcode analyzer, returns the first accepted code, and restores the form the application was showing: if (!CodeScanner.isSupported()) { ToastBar.showErrorMessage("This device cannot scan codes"); return; } CodeScanner.scan().ready(code -> { if (code == null) { return; // the user pressed back } urlField.setText(code.getValue()); }).except(error -> Log.e(error)); Cancellation is a `null` result. A camera or decoder failure reaches `except(...)`. That maps the old scanner library's three callbacks onto one `AsyncResource` without treating the back button as an error. `CodeScannerOptions` changes the screen text and restricts the accepted formats: CodeScanner.scan(new CodeScannerOptions() .title("Boarding pass") .hint("Hold the pass flat inside the frame") .formats(BarcodeFormat.PDF417, BarcodeFormat.AZTEC)) .ready(code -> { if (code != null) { checkIn(code.getValue()); } }); Restricting formats prevents a nearby product barcode from completing a QR-only flow. ## One component owns the live pipeline `VisionCameraView` covers the case where the preview belongs inside an application form. It opens the camera when shown, keeps only the newest frame while analysis is busy, delivers results on the event dispatch thread, and releases the camera when the user leaves. Form previous = Display.getInstance().getCurrent(); FaceDetector detector = new FaceDetector(); VisionCameraView<Face[]> view = new VisionCameraView<>(detector); view.setFacing(CameraFacing.FRONT); view.setListener(new VisionPipelineListener<Face[]>() { public void result(Face[] faces, VisionImage source) { countLabel.setText(faces.length + " face(s)"); } public void error(Throwable error) { Log.e(error); } }); Form form = new Form("Faces", new BorderLayout()); form.add(BorderLayout.CENTER, view); form.add(BorderLayout.SOUTH, countLabel); form.getToolbar().setBackCommand("Back", event -> { view.close(); previous.showBack(); }); form.show(); The analyzer remains caller-constructed. That is how the build decides which native model to package. A face-detection application should not carry barcode, pose, and segmentation dependencies merely because a high-level component knows those analyzers exist. Leaving the form temporarily stops the camera but keeps the analyzer ready in case the form is shown again. Call `close()` from the navigation path that discards the screen permanently. It releases both resources and cannot be reversed. ## Results use types and component coordinates Backend strings such as `"QR_CODE"` and `"leftEye"` are now represented by `BarcodeFormat`, `FaceLandmarks`, and `PoseLandmarks`. Geometry helpers turn normalized analyzer coordinates into pixels an application can draw. Rectangle box = faces[0].getBounds() .toBounds(0, 0, photo.getWidth(), photo.getHeight()); Image face = photo.subImage(box.getX(), box.getY(), box.getWidth(), box.getHeight(), true); `VisionImage.fromFile(...)` and `VisionImage.fromImage(...)` bridge picked images into the analyzer path. Encoded images keep their original bytes instead of being decoded and encoded again. Selfie segmentation also gets the operation that makes its result immediately usable: SelfieSegmenter segmenter = new SelfieSegmenter(); EncodedImage photo = EncodedImage.create(jpegBytes); segmenter.process(VisionImage.encoded(jpegBytes)).ready(mask -> { Image person = mask.cutOut(photo, 0.6f); preview.setIcon(person); segmenter.close(); }).except(error -> { Log.e(error); segmenter.close(); }); Pixels below 60 percent foreground confidence become transparent. ## High-level classes must still select native dependencies The build scans application classes, not every class in core. An application referencing only `CodeScanner` never directly names `BarcodeScanner`. Without an explicit mapping, the build could prune the barcode adapter and camera natives while still compiling successfully. The new high-level classes select the dependencies they need. `HighLevelVisionDependencyTest` walks the vision sources and fails when a future convenience class is added without a corresponding build mapping. This tests the failure mode that would otherwise appear only as an inert feature on a device. ## Vision can be scripted before hardware arrives In the simulator, **Simulate > Vision** can mark a feature supported or unsupported and select a result, no-result, backend-error, or unsupported outcome. Scripted results include plausible geometry. That lets an application test cancellation, debounce behavior, overlays, and error copy without a camera or a trained model. It also makes the same application code run in desktop UI tests. The preview remains a native view. iOS and Android do not give native peers the same stacking order, so portable components should sit around the preview rather than assume they can paint a reticle on top of it. Only one camera session can be open at a time. The non-default preview scale modes are currently honored by the simulator but ignored by the iOS and Android camera previews. The low-level APIs remain available for products that need direct frame control. The change is that barcode scanning, face counting, and common camera analysis no longer start by rebuilding the plumbing. The next post shows how to expose a Java intent to Siri, Spotlight, and Shortcuts.
dev.to
September 2, 2026 at 5:13 PM
One Java API for HomeKit, Matter, and Google Home dev.to/codenameone/...
One Java API for HomeKit, Matter, and Google Home
Codename One now exposes smart-home accessories, traits, scenes, change subscriptions, and Matter commissioning through one capability-driven API with native and simulated backends.
dev.to
September 1, 2026 at 7:57 AM
June 7, 2026 at 11:25 PM
Codename One now includes AI, OAuth, and other platform APIs directly in the core. Shai Almog covers the new features and how they simplify cross-platform mobile development.

foojay.io/today/codena...

#Java #MobileDev #CodeNameOne
AI, OAuth, And Other Platform APIs In The Core
Deeper AI integration in the framework core, modern authentication via OAuth / OIDC and WebAuthn passkeys driven from the system browser, and a few smaller
foojay.io
June 15, 2026 at 11:21 AM
New post from Shai Almog on improving your Codename One workflow with on-device debugging and JUnit 5 integration. Learn how to catch bugs earlier and test more effectively.

foojay.io/today/on-dev...

#CodenameOne #Java #MobileDev
On-Device Debugging And JUnit 5
A walk-through of the new JDWP-based on-device debugging pipeline for ParparVM iOS apps and Android apps, with a step-by-step IntelliJ tutorial for each. P
foojay.io
June 12, 2026 at 2:33 PM
Codename One gets major updates: Metal renderer now default, new build cloud infrastructure, and a fresh format for better performance. Shai Almog breaks down what's new.

foojay.io/today/metal-...

#Java #MobileDev #CodenameOne
Metal Default, A New Build Cloud, And A New Format
The iOS Metal renderer is now the default, the new Build Cloud console is wired into every Dashboard link on the site, and the weekly release blog is movin
foojay.io
June 8, 2026 at 11:18 AM
New post from Shai Almog on Codename One: updating to Java 17, working with theme accents, and improving developer skills in mobile app development.

foojay.io/today/skills...

#Java #CodenameOne #MobileDev
Skills, Java 17, And Theme Accents with Codename One
Java 17 is the new Initializr default, generated projects ship an AGENTS.md authoring skill that any AI agent can pick up (including a…
foojay.io
May 29, 2026 at 7:11 AM
🐛 Front End Debugging Part 1: Not just Console Log
by Shai Almog @debugagent @debugagent@mastodon.social
#frontend #debugging #ConsoleLog #webdev

dev.to/codenameone/...
November 5, 2024 at 11:36 PM