Skip to content
CAI
Software that uses CAICheck a score

GenericJam/mob

72.5

Strong · 18 September 2026

21.5k

lines of production code

Elixir

with Objective-C, Zig, Swift

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a cross-platform UI framework built on the BEAM (Erlang/Elixir) that renders native interfaces on iOS and Android. It manages a declarative widget tree, handles high-frequency user input and media, and exposes device capabilities like audio and Bluetooth through a native interface layer. The framework also includes internal tooling for causal debugging, flake detection, and developer onboarding to ensure reliability.

Features

Action receipts for causal debugging

The framework now records a correlation ID for every dispatched action, tracking its progress through stages from dispatch to committed frame. This allows agents and developers to determine exactly where an action failed—whether it was unhandled, caused no assigns change, or failed to render—without the ambiguity of the previous 300ms window-based effect detection. The system stores the last 256 receipts in an ETS table for low-overhead access and emits telemetry events when the host application has \:telemetry\ loaded.

lib/mob · high confidence

Add project-wide linting and formatting configuration files

The repository now includes configuration files for C/C++, Elixir, and Swift tooling: \.clang-format\ sets LLVM-style formatting for native code, \.credo.exs\ registers the \ExSlop\ plugin and customizes Credo checks, \.swiftlint.yml\ tunes SwiftLint rules for the iOS renderer, and \.tool-versions\ pins the host development environment to Erlang 29.0, Elixir 1.20.0, and Zig 0.17.0-dev.

(repo-wide) · high confidence

New Mix tasks for Erlang formatting, flake detection, and onboarding verification

Three new Mix tasks are introduced in lib/mix to improve developer workflow and test reliability. \mix erlfmt\ wraps the erlfmt library to format or check \.erl\ files, resolving the dependency at runtime to avoid compiler warnings when the dev-only dependency is absent. \mix mob.flake\ runs the test suite repeatedly in fresh OS processes to detect non-deterministic failures, saving logs for analysis. \mix mob.onboarding\_test\ executes integration tests that verify a new user can successfully set up and run the application, isolating each test in a temporary workspace.

lib/mix · high confidence

iOS platform layer and native UI primitives

This change introduces the iOS implementation for the Mob UI framework, providing the native rendering engine and core widget set. It includes a SwiftUI-based root view and view model that manage the UI tree, navigation transitions, and a startup watchdog to prevent indefinite loading states. The update adds support for a comprehensive set of UI components, including layout containers (Column, Row, Wrap, Box), interactive elements (Button, TextField, Toggle, Slider, Scroll, LazyList), and media views (Camera, WebView, Video). It also implements high-frequency input handling for gestures (pinch, rotate, drag, pointer move) and IME composition, a GPU-accelerated Metal view for fragment shaders, and an anchored panel primitive for floating overlays. The entry point is wired through a bridging header to the BEAM NIFs, enabling two-way communication for events, theme updates, and frame tracking.

ios · high confidence

Behavioural changes

Android native layer ported from C to Zig

The Android native bridge (JNI, NIFs, and BEAM launcher) has been rewritten in Zig, replacing the previous C implementation. This migration introduces a hand-declared FFI layer for the Android NDK and Erlang NIF API, implements in-process IPv4 DNS resolution via Bionic's getaddrinfo to fix resolution failures on physical devices, and expands the tap-handle registry from 256 to 4096 slots to prevent exhaustion crashes. The change also adds comprehensive support for high-frequency gesture events (scroll, drag, pinch, rotate, pointer), Bluetooth Classic (HFP/SPP/HID) event delivery, and ensures BEAM stdout/stderr is piped to Android logcat for visibility.

android · high confidence

Introduction of mob\_nif stub module defining native interface contract

The \src/mob\_nif.erl\ file has been added as the central Erlang NIF stub module, establishing the public API contract for native platform interactions. This change introduces exports for a wide range of device capabilities including audio (playback, recording, metering, output probes), device state (battery, network, orientation, lifecycle), UI components (alerts, toasts, webview, theme), and test harness utilities (screenshot, scroll control, UI inspection). It also formalizes the removal of legacy Bluetooth Classic declarations, directing callers to the separate \mob\_bluetooth\ plugin, and includes DNS resolution and post-mortem data ingestion functions.

src · high confidence

New pre-push hook enforces code quality and release preflight checks

A new \.githooks/pre-push\ script is introduced to automatically validate code before pushing. It runs fast checks (formatting, Credo linting, and compilation with warnings-as-errors) on every push. If \mix.exs\ has changed, it additionally runs a subset of tests and a security scan. The hook also provides advisory warnings if the branch is significantly behind \origin/master\ or if code changes were made without corresponding test updates, helping developers catch integration issues and coverage gaps early.

.githooks · high confidence

Test coverage

Expanded test coverage for core framework components

Added comprehensive test suites for the \Mob.Agent.Receipt\ system (including integration tests for screen dispatches and store behavior), the \Mob.Alert\ JSON encoding layer, the \:anchored\ node type contract, Android native stats NIF registration, iOS \inet\_db\ configuration, \Mob.Audio\ option parsing and status decoding, \Mob.Canvas\ primitive operations, and the \Mob.Capabilities\ runtime probe logic.

test · high confidence

Dependencies

Upgrade to Elixir 1.19 and update dependency versions

The project now requires Elixir 1.19 (up from 1.18) and has updated its dependency lockfile to include newer versions of key libraries such as Ecto 3.14.0, ExDoc 0.40.3, and Credo 1.7.18. Additionally, the \:public\_key\ OTP application is now explicitly declared in the application configuration to ensure it remains available on the code path in Elixir 1.19+ environments where unused applications are stripped.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 72.

Lenses

  • Code Health 93
  • Architecture 100
  • Maturity 89
  • Readiness 58
  • Security 80

Changes since last survey

  • 300 commits — 250 feature/other, 50 fixes

By area

  • (root) — 150 commits
  • lib/mob — 40 commits
  • (repo) — 34 commits
  • android/jni — 18 commits
  • test/mob — 17 commits
  • guides/components.md — 7 commits
  • ios/mob_nif.m — 7 commits
  • ios/MobRootView.swift — 4 commits
  • guides/mobile_surface_matrix.md — 2 commits
  • decisions/2026-05-26-data-dir-helper.md — 1 commit
  • decisions/2026-05-26-dns-cellular-resolution.md — 1 commit
  • decisions/2026-05-27-plugin-phase1-host.md — 1 commit
  • decisions/2026-06-04-plugin-permission-registry.md — 1 commit
  • decisions/2026-06-10-load-plugin-nif-modules-at-boot.md — 1 commit
  • decisions/2026-06-16-files-pick-type-filter.md — 1 commit
  • decisions/2026-08-27-frame-registry-purge-by-id.md — 1 commit
  • decisions/2026-08-27-screen-process-architecture.md — 1 commit
  • decisions/2026-08-29-migration-off-the-single-screen-process.md — 1 commit
  • decisions/2026-09-04-defect-reports-are-a-shipped-feature.md — 1 commit
  • decisions/2026-09-11-column-row-fixed-dims-precedence.md — 1 commit

Notable commits

  • fix: Bump to 0.7.19 — iOS Motion accel units + sign fix
  • fix: Bump to 0.7.21 — Mishka Chelekom docs, Linear tracking, gitignore fix
  • fix: Bump to 0.7.24 — fix Android orientation reading freed memory
  • fix: Bump to 0.7.28 — component + tap handle pool exhaustion fixes
  • fix: Bump to 0.7.31 — frame-tracker ownership fix + honest platform docs (#90)
  • fix: Bump to 0.7.32 — intrinsic Sheet detents, Box accessibility, launch-deadlock fix
  • fix: Bump to 0.7.33 — screen processes, multi-stack navigation, MOB-107 fixed
  • fix: Bump to 0.7.36 — iOS fixed-height boxes, quiet host theme probes
  • fix: Bump to 0.8.1 — defect capsule, bus, and owner attribution (#153)
  • fix: Bump to 0.8.4 — physical iOS launch crash fix (MOB-199)
  • fix: Fix component handle pool exhaustion crashing the screen process (MOB-100)
  • fix: Fix iOS Motion accel: match Android units + sign convention (#70)
  • fix: Fix what MOB-129 broke by keeping parked screens alive (#132)
  • fix: Fix: Column honours fill_height: true (iOS)
  • fix: MOB-102: fix element_frames staleness after a no-op-frame rerender
  • fix: MOB-124 rounds 1-2: measure the render pipeline, then fix what it showed (#118)
  • fix: MOB-159 phase 1: defect capsule, bus, and owner attribution (#152)
  • fix: MOB-191: release-gate fixes ahead of 0.8.3 (#165)
  • fix: MOB-94: fix data race on g_font_fallback in nif_set_theme
  • fix: MOB-95: mark issues.md #6's CameraX/ML Kit rows fixed
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

GenericJam/mob was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 18 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit b97a394e14b7ad43d5560692da7a2799f7b80da9 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-5d04157a340d.