Project Overview
Termux Desktop is a collection of scripts and configuration files that transforms your Android device into a usable desktop environment by setting up a GUI layer inside Termux. The project installs a VNC server, a window manager (Openbox), and a set of themed UI components — giving you a mouse-driven graphical workspace on hardware you already own.
Maintained by adi1090x, the project targets Android users who want a visual Linux desktop without rooting their device. The primary language is CSS, reflecting the project's focus on theming and visual configuration rather than system infrastructure.
If you want to run graphical Linux apps on Android — a text editor, file manager, or terminal with a proper desktop layout — this is a working starting point. It is not a virtualization layer. It runs natively inside Termux's Linux userspace, which gives better performance than PRoot-based approaches but also limits which packages are available.
The project shows 11.8% star growth over the last ~6 months as of 2026, indicating continued community interest.
Key Challenges Addressed
Running a desktop GUI on Android without root has three concrete problems:
No native display server: Android does not expose a Linux display protocol. You need a VNC or X11 bridge to get graphical output from Linux processes.
Package dependency complexity: Setting up a window manager, compositor, fonts, and icon themes in Termux by hand requires resolving dozens of package dependencies in the right order. Get one wrong and you get a blank screen or a broken VNC session.
Configuration sprawl: After installing packages, you still need dotfiles, keybindings, panel configuration, and autostart scripts before anything looks usable.
Termux Desktop handles all three by wrapping install and configuration into a single setup script. After running it, you get a consistent themed environment without manually working through Openbox or tint2 documentation.
Getting Started
Prerequisites:
- Android 7.0 or later
- Termux installed from F-Droid (not the Play Store version)
- A VNC viewer app — RealVNC Viewer and bVNC are both reliable
Installation:
pkg update && pkg upgrade
pkg install wget
wget -qO- https://raw.githubusercontent.com/adi1090x/termux-desktop/master/setup.sh | bash
After the script completes, start the VNC server:
vncserver-start
Connect from your VNC viewer to localhost:1 with the password you set during setup.
Sharp edges:
- If you installed Termux from Google Play instead of F-Droid,
pkg upgradefails with conflicting package signatures because the Play Store build stopped receiving updates. Use F-Droid. - The setup script overwrites
~/.bashrcand your.configdirectory without prompting. If you have an existing Termux setup, back it up before running. - VNC resolution is fixed at server start time. If you start with a low resolution, you must kill and restart the VNC server to change it — there is no live resize.
- The script is not idempotent. Running it a second time corrupts your dotfiles.
Features and Use Cases
Themed Openbox environment: The project ships with an Openbox window manager configuration, a tint2 panel, and a set of matching color themes. The default result looks polished rather than like a bare Openbox install.
Pre-configured applications: The script installs and configures a file manager, text editor, and terminal emulator so you have a functional setup immediately after running it.
Multiple themes: Several color schemes are bundled. You can switch between them without reinstalling. The dotfiles are designed to be modified — treat the project as a themed starting point you extend for your own preferences.
Practical use cases:
- Writing and editing code on a tablet with a Bluetooth keyboard
- Running graphical Linux tools that have no Android-native equivalent
- Using an Android device as a secondary development terminal
- Learning Linux desktop environments on hardware you already own
Ecosystem and Dependencies
Termux Desktop sits on top of Termux's Linux userspace and several well-known X11 components:
- TigerVNC (
tigervnc): The VNC server that bridges the X11 display to your Android screen. This is the core rendering layer. - Openbox: The default window manager. Lightweight, keyboard-configurable, and independently well-documented.
- tint2: Panel and taskbar, configured via
~/.config/tint2/tint2rc. - Picom: Optional compositor for transparency and shadow effects.
- Nerd Fonts: Icon fonts used in the panel and terminal prompt, pulled from Termux's package repos.
termux-x11 is a notable complement to this setup. Instead of VNC, termux-x11 provides a native Android app acting as an X11 display server, eliminating the VNC relay. You get lower latency and better touch handling. If VNC lag becomes a problem for your workflow, termux-x11 is the first thing to evaluate.
Architectural Overview
The project is a configuration and automation layer. No compiled binary, no persistent daemon. Three components:
- Setup script (
setup.sh): Installs Termux packages, copies dotfiles to your home directory, and registers autostart hooks. One-time run. - VNC wrapper scripts (
vncserver-start,vncserver-stop): Shell scripts that launch TigerVNC with your configured display number, resolution, and password. They set theDISPLAYenvironment variable so X11 apps know where to render. - Dotfiles and themes (
~/.config/,~/.local/): Openbox keybindings, tint2 panel config, terminal colors, wallpapers, and icon themes. Standard Linux dotfiles — existing knowledge of these tools transfers directly.
The session flow: start VNC server → connect from VNC viewer → Openbox starts → tint2 starts → desktop is ready. Nothing runs persistently between sessions except the VNC server process.
This simplicity is the architecture's main operational advantage. If something breaks, you're debugging standard X11 components with standard tools. There's no abstraction layer hiding behavior.
Pros and Cons
Pros:
- No root required. Runs entirely in Termux's native Linux userspace.
- Single-script setup. Package installation and dotfile configuration are handled automatically.
- Standard components. Openbox, tint2, and TigerVNC are well-documented independently. Skills transfer.
- Fully customizable. The dotfiles and theme files are standard Linux config — edit them directly.
- Works on older budget Android hardware where PRoot virtualization would be too slow.
Cons:
- VNC latency. Input lag over VNC is noticeable compared to a native display. On local connections it's tolerable; over a network it degrades quickly.
- No Wayland support. The X11/VNC stack is the only available path. Modern Linux apps that require Wayland won't run.
- Android memory pressure. Running a window manager, VNC server, and several apps simultaneously is heavy on devices under 4GB RAM.
- Non-idempotent setup. Running the setup script a second time breaks your dotfile configuration with no recovery path.
- No hardware acceleration. Apps that need GPU rendering fall back to software rasterization inside the VNC session.
- Smaller package set than a full distro. Some Linux GUI applications aren't available or don't build cleanly in Termux's package repos.
Comparison and Alternatives
GitHub stars
Weekly star gains
Full metrics details
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
Termux Desktop
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
151 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Issues opened
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
Termux Desktop
GitHub API observation. Historical values render only when the source provides a real observation for that day.
176 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub API observation. Historical values render only when the source provides a real observation for that day.
175 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub API observation. Historical values render only when the source provides a real observation for that day.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Issues closed
Weekly total
Full metrics details
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
Termux Desktop
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
176 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
175 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests opened
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
Termux Desktop
GitHub API observation. Historical values render only when the source provides a real observation for that day.
176 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub API observation. Historical values render only when the source provides a real observation for that day.
175 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub API observation. Historical values render only when the source provides a real observation for that day.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests closed
Weekly total
Full metrics details
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
Termux Desktop
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
176 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
175 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests merged
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
Termux Desktop
GitHub API observation. Historical values render only when the source provides a real observation for that day.
176 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub API observation. Historical values render only when the source provides a real observation for that day.
175 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub API observation. Historical values render only when the source provides a real observation for that day.
143 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Open/closed pull request ratio
Weekly average
Full metrics details
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
Termux Desktop
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
151 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Open/closed issues ratio
Weekly average
Full metrics details
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
Termux Desktop
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
151 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Releases
Weekly total
Full metrics details
GitHub release published_at events bucketed by UTC day; drafts are excluded.
Termux Desktop
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
termux-x11
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
AnLinux
GitHub release published_at events bucketed by UTC day; drafts are excluded.
151 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hotness score
Weekly average
Full metrics details
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
Termux Desktop
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
termux-x11
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
AnLinux
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
151 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
Reliability score
Weekly average
Full metrics details
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
Termux Desktop
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
termux-x11
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
AnLinux
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
151 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
Two main categories of alternative exist: native X11 display approaches that replace the VNC layer, and Linux container approaches that run a full distro instead of Termux's package set.
| Project | Repo | Hotness (~6mo) | PRs merged (~6mo) | Star growth (~6mo) |
|---|---|---|---|---|
| Termux Desktop | https://github.com/adi1090x/termux-desktop | 1.40 | 0 | 293 |
| termux-x11 | https://github.com/termux/termux-x11 | 54.34 | 28 | 1551 |
| AnLinux | https://github.com/EXALAB/AnLinux-Resources | metrics pending | 0 | metrics pending |
termux-x11: Replaces VNC with a native Android X11 display app. You sideload the APK, start the X server inside Termux, and graphical apps render directly to an Android surface. Input latency is significantly lower than VNC. The tradeoff: you do more manual configuration since termux-x11 doesn't ship a themed desktop setup. Use it when VNC lag is a blocker for your workflow.
AnLinux: Installs Ubuntu, Debian, Kali, or other distributions inside PRoot on top of Termux. You get access to a full distro's package repositories, which solves the missing-package problem. The downside is PRoot syscall interception overhead — CPU-bound tasks run noticeably slower than native Termux execution. If you need software that doesn't exist in Termux's package set, AnLinux is the right tool. For native-speed execution, stay with Termux's package set.
The best overall alternative is termux-x11. It directly solves Termux Desktop's most significant practical limitation — VNC input latency — and is maintained by the core Termux team, giving it stronger long-term maintenance signals than most community projects in this space.
Conclusion
Termux Desktop is the right choice for Android users who want a polished, themed Linux GUI without root and without PRoot's performance penalty. The one-script setup is the clearest path from a bare Termux install to a working Openbox desktop, and the project repo documents the process well enough to get you unstuck when the script hits a snag.
Do not run the setup script on an existing Termux environment with custom dotfiles — it overwrites ~/.bashrc and your .config directory without a backup or confirmation prompt, and there is no undo path. Back up your config first, then run the setup script from the project repo on a clean Termux session.
