A lightweight, on-device IDE that edits and builds Android & Java projects — no laptop, no Gradle daemon.
CodeAssist is an extensible IDE framework that runs entirely on device (Android/ART) and edits and builds Android/Java projects without hosting Gradle. A full Gradle runtime is too heavy for a phone, so CodeAssist models projects itself, mimics Gradle's incremental task engine without the Gradle daemon, and drives the Android toolchain (aapt2, D8/R8, apksigner) directly.
It is designed to be lightweight:
It ships with a Compose Multiplatform UI and both desktop and Android launchers.
![]() | ![]() |
| A real IDE, on your phone — write, navigate, and build end to end. | Completion that knows your code — precise, ranked JDT suggestions with signatures and docs. |
![]() | ![]() |
| Kotlin completion (beta) — the same calm, ranked experience as Java. | Edit as code, or as blocks — a live projection of the same source, byte-for-byte. |
![]() | ![]() |
| Build real APKs, on device — resolve, compile, dex, package, sign, install. | Jump anywhere, instantly — one input for commands, files, and symbols. |
![]() | ![]() |
| Layouts, fully assisted — Android XML completion with live validation. | Built on Jetpack Compose — a native Compose UI throughout. |
Any Java file can be projected into interlocking, typed blocks — and edited there. The block tree is a live projection of the same DOM the code editor uses, so the two views never drift; a block edit compiles to the smallest possible source edit, leaving every untouched line and comment intact.
Typed value sockets (Scratch-style shapes for boolean/number/string/type), inline completion inside sockets, palette search, and drag-and-drop all map back to the same surgical projection pipeline. Read how the projection and edit round-trip work →
CodeAssist tracks completion quality, editor latency, indexing, and build performance against committed
baselines (a regressionTest suite that fails CI on a quality regression). The numbers below regenerate
on each release.
| Area | Metric | Result |
|---|---|---|
| Java completion quality | recall / top-1 / MRR | 100% / 75% / 0.88 |
| Java completion latency (per keystroke) | member access / type ref | 4.3 ms / 2.8 ms |
| Symbol index quality | recall / top-1 / MRR | 100% / 90% / 0.95 |
| Symbol index query | prefix / fuzzy | ~4.4 µs / ~56 ns |
What the metrics mean
1 / rank of the expected item; 1.0 means it is always
first.3429 tests passing across 525 suites · 0 failing · 2 skipped (framework / CI_CORE_ONLY).
The badges and the numbers in this section are regenerated automatically on each release (see
.github/workflows/update-readme.yml).
| Doc | What's in it |
|---|---|
| docs/architecture.md | Project model, the two graphs, build abstraction, concurrency model. |
| docs/modules.md | The module map and responsibilities. |
| docs/extension-points.md | Extension points and the language-backend SPI. |
| docs/language-support.md | DOM, completion, the language backends, indexing, analysis, block editing. |
| docs/kotlin-completion.md | How on-device Kotlin completion works. |
| docs/block-editing.md | How the projectional (block) editor works. |
| docs/build-system.md | The task engine, the native pipelines, Gradle compat. |
| docs/version-control.md | Git on device: the model, running JGit on ART, accounts, and the UI. |
Dependencies point downward only (acyclic). Platform modules carry no domain knowledge; domain behavior is contributed through extension points.
platform-core no domain knowledge; depended on by all
└─ vfs-api
└─ project-model-api
├─ build-api
└─ language-api
deps-api / index-api / analysis-api / block-api → the layers above
ide-ui (Compose UI) ← ide-core (engine→UI bridge) ← ide-desktop, ide-android
The full table — every module, its packages, and its responsibility — is in docs/modules.md.
The build uses the Gradle wrapper and a JDK 17+ (developed against the JetBrains Runtime).
# Core framework only (pure JVM; no Android SDK or Compose shells needed)
CI_CORE_ONLY=true ./gradlew check
# Full build, including the Compose UI and Android launcher (requires the Android SDK)
./gradlew build
# Run the desktop IDE
./gradlew :ide-desktop:run
# Assemble the Android launcher
./gradlew :ide-android:assembleDebug
The regression suite (completion quality, latency, allocation, and build-at-scale) is opt-in and runs
via the regressionTest tasks against committed JSON baselines.
@JvmInline value class wrappers — no stringly-typed APIs.NodeKind, BuildSystemId, LanguageId) are string-backed value classes
so plugins can extend them; closed sets (DependencyScope, SymbolKind) are enums.suspend and run under the read/write-lock discipline; model and DOM
access happens inside read/write actions.*Transaction/Modifiable*, then commit().DomNode/Symbol/Scope, never a backend's native types.CodeAssist is free software licensed under the GNU General Public License v3.0 or later
(GPL-3.0-or-later). See LICENSE.
Join the CodeAssist Discord to chat, get help, report bugs, and share what you build.
Kotlin
99.2%
A lightweight, on-device IDE that edits and builds Android & Java projects — no laptop, no Gradle daemon.
CodeAssist is an extensible IDE framework that runs entirely on device (Android/ART) and edits and builds Android/Java projects without hosting Gradle. A full Gradle runtime is too heavy for a phone, so CodeAssist models projects itself, mimics Gradle's incremental task engine without the Gradle daemon, and drives the Android toolchain (aapt2, D8/R8, apksigner) directly.
It is designed to be lightweight:
It ships with a Compose Multiplatform UI and both desktop and Android launchers.
![]() | ![]() |
| A real IDE, on your phone — write, navigate, and build end to end. | Completion that knows your code — precise, ranked JDT suggestions with signatures and docs. |
![]() | ![]() |
| Kotlin completion (beta) — the same calm, ranked experience as Java. | Edit as code, or as blocks — a live projection of the same source, byte-for-byte. |
![]() | ![]() |
| Build real APKs, on device — resolve, compile, dex, package, sign, install. | Jump anywhere, instantly — one input for commands, files, and symbols. |
![]() | ![]() |
| Layouts, fully assisted — Android XML completion with live validation. | Built on Jetpack Compose — a native Compose UI throughout. |
Any Java file can be projected into interlocking, typed blocks — and edited there. The block tree is a live projection of the same DOM the code editor uses, so the two views never drift; a block edit compiles to the smallest possible source edit, leaving every untouched line and comment intact.
Typed value sockets (Scratch-style shapes for boolean/number/string/type), inline completion inside sockets, palette search, and drag-and-drop all map back to the same surgical projection pipeline. Read how the projection and edit round-trip work →
CodeAssist tracks completion quality, editor latency, indexing, and build performance against committed
baselines (a regressionTest suite that fails CI on a quality regression). The numbers below regenerate
on each release.
| Area | Metric | Result |
|---|---|---|
| Java completion quality | recall / top-1 / MRR | 100% / 75% / 0.88 |
| Java completion latency (per keystroke) | member access / type ref | 4.3 ms / 2.8 ms |
| Symbol index quality | recall / top-1 / MRR | 100% / 90% / 0.95 |
| Symbol index query | prefix / fuzzy | ~4.4 µs / ~56 ns |
What the metrics mean
1 / rank of the expected item; 1.0 means it is always
first.3429 tests passing across 525 suites · 0 failing · 2 skipped (framework / CI_CORE_ONLY).
The badges and the numbers in this section are regenerated automatically on each release (see
.github/workflows/update-readme.yml).
| Doc | What's in it |
|---|---|
| docs/architecture.md | Project model, the two graphs, build abstraction, concurrency model. |
| docs/modules.md | The module map and responsibilities. |
| docs/extension-points.md | Extension points and the language-backend SPI. |
| docs/language-support.md | DOM, completion, the language backends, indexing, analysis, block editing. |
| docs/kotlin-completion.md | How on-device Kotlin completion works. |
| docs/block-editing.md | How the projectional (block) editor works. |
| docs/build-system.md | The task engine, the native pipelines, Gradle compat. |
| docs/version-control.md | Git on device: the model, running JGit on ART, accounts, and the UI. |
Dependencies point downward only (acyclic). Platform modules carry no domain knowledge; domain behavior is contributed through extension points.
platform-core no domain knowledge; depended on by all
└─ vfs-api
└─ project-model-api
├─ build-api
└─ language-api
deps-api / index-api / analysis-api / block-api → the layers above
ide-ui (Compose UI) ← ide-core (engine→UI bridge) ← ide-desktop, ide-android
The full table — every module, its packages, and its responsibility — is in docs/modules.md.
The build uses the Gradle wrapper and a JDK 17+ (developed against the JetBrains Runtime).
# Core framework only (pure JVM; no Android SDK or Compose shells needed)
CI_CORE_ONLY=true ./gradlew check
# Full build, including the Compose UI and Android launcher (requires the Android SDK)
./gradlew build
# Run the desktop IDE
./gradlew :ide-desktop:run
# Assemble the Android launcher
./gradlew :ide-android:assembleDebug
The regression suite (completion quality, latency, allocation, and build-at-scale) is opt-in and runs
via the regressionTest tasks against committed JSON baselines.
@JvmInline value class wrappers — no stringly-typed APIs.NodeKind, BuildSystemId, LanguageId) are string-backed value classes
so plugins can extend them; closed sets (DependencyScope, SymbolKind) are enums.suspend and run under the read/write-lock discipline; model and DOM
access happens inside read/write actions.*Transaction/Modifiable*, then commit().DomNode/Symbol/Scope, never a backend's native types.CodeAssist is free software licensed under the GNU General Public License v3.0 or later
(GPL-3.0-or-later). See LICENSE.
Join the CodeAssist Discord to chat, get help, report bugs, and share what you build.
Kotlin
99.2%