The APK is the shell; Termux is the engine. You install Termux once, tap
through four steps, and the app installs code-server, Python and a C++ compiler
inside Termux, then opens the editor on 127.0.0.1:8080.
Important
Termux must be the F-Droid or GitHub build. The Google Play build ships
without the RUN_COMMAND service, so no app can drive it. The setup screen
detects that build and tells you, instead of failing twenty minutes later.
On the phone, tap this link:
That link always resolves to the newest build, so it never goes stale. Then:
- Open Files → Downloads and tap the zip to extract it.
- Tap
OpenVScode-Mobile.apkinside. - Android will ask to allow installs from this source — tap Settings, turn on Allow from this source, go back, and tap Install.
- Launch OpenVScode from your app drawer.
Tip
Why a zip and not the APK directly? Chrome on Android routes .apk downloads
through an APK-specific Safe Browsing check and holds the file until a verdict comes
back. A debug-signed build from a small repo has no download reputation, so that
verdict never resolves and the download hangs at ~100% with no error — the bytes
have all arrived, Chrome just will not release the file. GitHub serves .zip as
application/octet-stream, which skips that path. Same bytes either way; the
checksums on each release prove it.
Other ways to get the APK
- Direct APK: OpenVScode-Mobile.apk — identical build. Fine in Firefox, Samsung Internet, or on a desktop; this is the one that stalls in Chrome for Android.
- Verify what you downloaded: each release ships
SHA256SUMS.txtcovering both files. CI also fails the build if the zip does not extract to a byte-identical APK. - Browse every version: the Releases page lists each build with its notes.
- Build it yourself:
cd android && ./gradlew assembleDebug— the APK lands inandroid/app/build/outputs/apk/debug/.
Note
These are debug builds, signed with the standard Android debug key. That is what
makes them installable without a Play Store account. Because app/build.gradle sets
applicationIdSuffix = ".debug", the package id is com.openvscode.mobile.debug, so
it installs alongside a release build rather than replacing one.
A native Android shell around the IDE: a foreground service holding a wake lock so
Android will not kill your compiler mid-build, a hardware-accelerated WebView for the
editor, a touch coding keybar (ESC, TAB, CTRL, ALT, { }, ( ), arrows), and a
bridge to Termux that installs and starts everything for you.
It also watches the editor while you work: if code-server stops, the app notices within seconds and offers to start it again, rather than leaving you inside a dialog that waits forever for a process that is gone.
Note
You do not need any of this if you use the app — it stages these same scripts inside Termux and runs them for you, showing live progress. This section is the manual path: useful for a headless phone, for scripting, or for reading exactly what the app is about to do. Every step is idempotent, so a failed run can simply be repeated. Please report what breaks.
Get Termux from F-Droid or the
GitHub releases. The Google Play
build is a separate, restricted app: it has no RUN_COMMAND service, so the OpenVScode
app cannot drive it.
pkg install -y curl && curl -fsSL https://raw.githubusercontent.com/hammadshakeelai/OpenVScode/master/install.sh | bashIt installs curl, downloads the installer, and runs it, announcing each step:
| Step | What it does |
|---|---|
| Checks Termux and your CPU | Stops immediately with a clear message if you are not in Termux, instead of failing halfway through. |
| Installs the toolchain | Python 3, Clang, make, cmake, Git — then verifies Python imports SSL/SQLite and that a real C++ program compiles and runs. |
| Installs the editor | code-server from the Termux User Repository (pulls its own Node runtime). 10–30 minutes on a phone connection. |
| Prepares the workspace | ~/OpenVScode_Workspace, mobile editor defaults, example projects. |
| Notebooks (opt-in) | psutil from Termux packages, then ipykernel, jupyter-server and notebook; registers a kernel and checks it. |
| Starts the IDE | On 127.0.0.1:8080, and waits until /healthz genuinely answers before saying it worked. |
Everything is written to ~/.local/state/openvscode/install.log.
Tip
If it stops partway, run it again. Every step checks whether it is already done, so re-running resumes rather than starting over. From the app, the same thing is one tap: Help & diagnostics → Repair or update my workspace.
Either open the OpenVScode app — it finds 127.0.0.1:8080 on its own — or visit
http://127.0.0.1:8080 in Chrome. To start it again later:
bash ~/.local/share/openvscode/runtime/start.shPython 3 with pip, the ms-python.python extension, and a Run button for scripts.
Setup refuses to report success unless Python can import ssl and sqlite3.
Clang with make, cmake and pkg-config, so clang++ compiles C++20 out of the
box. Setup compiles and runs a real C++ program on your phone before declaring the
toolchain good.
Editor completion depends on your code-server build. The clangd extension is installed when that build can host it; some builds answer that it is not available for their platform, which is permanent, and setup says so plainly instead of advising a retry that cannot work. Compiling and running are unaffected.
ipykernel plus jupyter-server and notebook, with a registered python3 kernel.
Opt-in because it lengthens the download, and it can never turn a working editor into
a failed installation.
Warning
Notebooks are the one part not yet working end to end. On arm64 the Jupyter server did not install successfully, so notebooks open but cells may refuse to run. Setup now reports that honestly instead of claiming success. This is the first item in the next version's plan; Python, C++ and the editor are unaffected.
Why the server matters: under code-server the Jupyter extension cannot use ZMQ kernels (the native module has no Android build), so it starts a Jupyter server instead. A kernel alone produced notebooks that opened and could not run a single cell — see finding F10.
Minimap and glyph margins off, word wrap on, auto-save on delay, the chat sidebar hidden, workspace trust disabled so the extensions we install actually load — plus the touch keybar. This is not yet a phone-first interface; it is desktop VS Code made tolerable. The honest assessment and the plan are in the design review below.
The interface is the weakest part of this release, and the next version is a redesign rather than a patch. That work is documented as a research-style record, not a changelog:
It contains the test method and devices, the measured install timings, ten defects that only appeared on real hardware (with root causes), a measured critique of the phone interface, and a prioritised redesign proposal for v1.2 — native navigation instead of VS Code chrome, a real modifier keyboard, a first-class terminal pane, progress that reflects reality, and session resilience.
OpenVScode/
├── install.sh # Entry point: bundled (from the APK) or standalone
├── setup.sh # Toolchain → editor → workspace → extensions → notebooks
├── start.sh # Starts code-server, waits for /healthz, writes the pid
├── config/
│ ├── settings.json # Mobile editor defaults (trust off, chat sidebar hidden)
│ ├── keybindings.json # Mobile touch shortcuts
│ └── compile_flags.txt # clangd include paths & C++20 standard
├── scripts/
│ ├── runtime.sh # Shared primitives: staging, locking, status, apt retries
│ ├── install_toolchain.sh # Python, Clang, make, cmake + on-device verification
│ ├── install_extensions.sh # Editor defaults + optional extensions (honest failures)
│ ├── install_jupyter_kernels.sh # psutil via pkg, then ipykernel + jupyter-server
│ ├── status_server.py # Authenticated, read-only progress on 127.0.0.1:8766
│ └── test_runtime.py # 17 runtime tests (Linux/WSL)
├── examples/
│ ├── hello_python/ # Sample Python project
│ ├── hello_cpp/ # Sample C++ project with Makefile
│ └── notebooks/ # Sample Python & C++ notebooks
├── android/ # Native Android app (Gradle project)
│ ├── app/src/main/java/com/openvscode/mobile/
│ │ ├── MainActivity.java # Setup flow, editor WebView, keybar, watchdog
│ │ ├── TermuxBridge.java # RUN_COMMAND dispatch, durable correlated state
│ │ ├── TermuxCommandBuilder.java# Builds the stdin script from APK assets only
│ │ ├── TermuxResultReceiver.java# Non-exported result receiver
│ │ ├── ServerAddress.java # Address parsing / same-origin checks
│ │ └── VScodeService.java # Foreground service + bounded wake lock
│ ├── scripts/smoke-test.ps1 # Device smoke test (install, launch, resume, logs)
│ ├── manifest.json # PWA manifest for standalone browser mode
│ └── mobile-keyboard-bar.js # Browser-side touch key bar
├── test-harness/ # Browser simulator for the keybar
├── .github/workflows/android.yml # CI: builds the APK, attaches it to releases
└── docs/
├── DESIGN_REVIEW.md # Measurements, defects, interface critique, redesign
├── RUNTIME.md # The installer/app contract (ports, states, locking)
├── MOBILE_OPTIMIZATIONS.md # RAM, battery, Android 12+ process fixes
├── JUPYTER_CPP_EXPLAINED.md # C++ Jupyter kernels, in depth
├── SELF_BOOTSTRAP_PLAN.md # The abandoned no-Termux path and why it failed
└── assets/screens/ # The screenshots above
In ~/OpenVScode_Workspace:
- Python — open
examples/hello_python/main.pyand press Run Python File. It prints the interpreter version, platform and a list of squares. - C++ — open
examples/hello_cpp/, then in the integrated terminal runmake run. It compiles withclang++ -std=c++20 -Wall -Wextra -O2and executes. - Notebooks — open
examples/notebooks/test_python.ipynb, pick the Python 3 kernel, and run the cells.examples/notebooks/test_cpp.ipynbneeds a C++ kernel that setup does not install; docs/JUPYTER_CPP_EXPLAINED.md covers the options.
- Battery — set Termux (and OpenVScode) to Unrestricted in App settings.
- Android 12+ phantom process killer — if long compiles die in the background, see docs/MOBILE_OPTIMIZATIONS.md.
- Keyboard — a 5-row layout such as Hacker's Keyboard (F-Droid) helps until the keybar redesign lands.
Requires JDK 17 and the Android SDK (compileSdk 35).
cd android
./gradlew assembleDebuglocal.properties is deliberately untracked — Android Studio writes your own sdk.dir
into it on first open, or set ANDROID_HOME in your environment instead.
Every push to master runs the same build in CI, and pushing a v* tag publishes the
resulting APK to a GitHub Release.
MIT. Built on open source: code-server / VS Code, LLVM/Clang, CPython, Project Jupyter, Termux and Open VSX.








