
Lightweight on-device IDE framework editing and building Java projects without a Gradle daemon: incremental task DAG, disk-backed flat-memory symbol indices, block editor, on-device toolchain, and Git.
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.
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.2099 tests passing across 375 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/github-action.md | Building CodeAssist projects in CI: the headless codeassist launcher and the GitHub Action. |
| docs/version-control.md | Git on device: the model, running JGit on ART, accounts, and the UI. |
Sixty modules, grouped on disk by the layer they belong to:
platform/ no domain knowledge; depended on by all
lang/ reading source: the language SPI, indexes, analysis, per-language backends
build-system/ the incremental task engine and the JVM build pipelines over it
run/ executing project code on device: source interpreter, bytecode VM, AWT/Swing
android/ Android as a target: facets, variants, SDK metadata, layout preview, ART shims
services/ cross-cutting api/impl pairs: deps, version control, store, analytics, agent
plugins/ the SPI a third-party plugin compiles against, and the host that resolves it
app/ the IDE itself: the Compose UI and the desktop/Android/headless-CLI shells
tools/ test-only harnesses
Gradle paths stay flat, so a module's directory never has to be spelled out to build it: the Kotlin
editor backend is :lang-kotlin even though it lives at lang/lang-kotlin. settings.gradle.kts
maps the two, and is the only place that mapping exists.
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:assembleDebugThe 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.
The plugin SPI is the one exception. The modules a plugin author compiles against (plugin-api,
plugin-ui-api, platform-core, and the feature SPIs vfs-api, project-model-api, language-api,
index-api, analysis-api, build-api), published under io.github.tyron12233, add the Classpath
exception (GPL-3.0-or-later WITH Classpath-exception-2.0, see LICENSE-EXCEPTION) so
that a plugin compiled against them may be released under any license, proprietary included.
Join the CodeAssist Discord to chat, get help, report bugs, and share what you build.
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.
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.2099 tests passing across 375 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/github-action.md | Building CodeAssist projects in CI: the headless codeassist launcher and the GitHub Action. |
| docs/version-control.md | Git on device: the model, running JGit on ART, accounts, and the UI. |
Sixty modules, grouped on disk by the layer they belong to:
platform/ no domain knowledge; depended on by all
lang/ reading source: the language SPI, indexes, analysis, per-language backends
build-system/ the incremental task engine and the JVM build pipelines over it
run/ executing project code on device: source interpreter, bytecode VM, AWT/Swing
android/ Android as a target: facets, variants, SDK metadata, layout preview, ART shims
services/ cross-cutting api/impl pairs: deps, version control, store, analytics, agent
plugins/ the SPI a third-party plugin compiles against, and the host that resolves it
app/ the IDE itself: the Compose UI and the desktop/Android/headless-CLI shells
tools/ test-only harnesses
Gradle paths stay flat, so a module's directory never has to be spelled out to build it: the Kotlin
editor backend is :lang-kotlin even though it lives at lang/lang-kotlin. settings.gradle.kts
maps the two, and is the only place that mapping exists.
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:assembleDebugThe 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.
The plugin SPI is the one exception. The modules a plugin author compiles against (plugin-api,
plugin-ui-api, platform-core, and the feature SPIs vfs-api, project-model-api, language-api,
index-api, analysis-api, build-api), published under io.github.tyron12233, add the Classpath
exception (GPL-3.0-or-later WITH Classpath-exception-2.0, see LICENSE-EXCEPTION) so
that a plugin compiled against them may be released under any license, proprietary included.
Join the CodeAssist Discord to chat, get help, report bugs, and share what you build.