Setup A Beautiful Desktop/GUI In Termux

  • By Aditya Shakya
  • Last update: Jan 3, 2023
  • Comments: 12

logo

Alright, Lets just get this straight, these are just some dotfiles & scripts, which will help you to setup a graphical environment in termux. I've tried to make it as easy as possible to setup a beautiful linux desktop on your android device with termux, So follow the steps and you'll end up making it look like this -

Openbox WM Another Style
desktop desktop

Lets start from the beginning...

What is termux?

Termux is an Android terminal emulator and Linux environment app that works directly with no rooting or setup required. A minimal base system is installed automatically - additional packages are available using the PKG/APT package manager. More Here...

How To install termux?

You can install termux form google play store or from f-droid.

More information about installation is here

Preparation

Install Termux & Termux:API on your phone. It's recommended to install Termux API application as many desktop elements are dependent on it.

This setup is created and tested on :

Device - Redmi Note 9 Pro
Android - Android 10 (Q)
CPU Type - aarch64

Installation

After installing both applications above, open Termux and follow the steps below -

  • Update termux packages and install git
pkg upgrade && pkg install git
  • Clone this repository
git clone --depth=1 https://github.com/adi1090x/termux-desktop.git

Warning : I'm assuming that you're doing this on a fresh termux install. If not, I'll suggest you to do so. However the setup.sh script backup every file it replace, It's still recommended that you manually backup your files in order to avoid conflicts.

  • Change to cloned directory and run setup.sh with --install option
cd termux-desktop
chmod +x setup.sh
./setup.sh --install

If script setup.sh fails during package installation (due to network issues), you can re-execute it again.

  • During installation, you'll be asked to set up password for VNC -
[*] Setting up VNC Server...

You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n

Note that passwords are not visible when you are typing them and minimum password length is 6 characters. Remember the password you typed as it'll be required to connect via vnc client.

  • If everything is okay, you will see this message -
New 'localhost:1 ()' desktop is localhost:1

Creating default startup script /data/data/com.termux/files/home/.vnc/xstartup
Creating default config /data/data/com.termux/files/home/.vnc/config
Starting applications specified in /data/data/com.termux/files/home/.vnc/xstartup
Log file is /data/data/com.termux/files/home/.vnc/localhost:1.log

[*] Server Is Running...

TigerVNC server sessions:

X DISPLAY #     PROCESS ID
:1              XXXXX

It means that X (vnc) server is available on display 'localhost:1'.

That's it. Termux Desktop is installed successfully. Restart Termux and enter startdesktop command to start vncserver and connect via VNC Client.

startdesktop

[*] Starting VNC Server...

New 'localhost:1 ()' desktop is localhost:1

Starting applications specified in /data/data/com.termux/files/home/.vnc/xstartup
Log file is /data/data/com.termux/files/home/.vnc/localhost:1.log

Uninstallation

If you ever want to uninstall Termux Desktop, just run setup.sh with --uninstall option. Just keep the setup.sh script and delete the cloned repository to save space. I'll create a separate uninstaller script later. The command below will remove all the packages and delete all the config files it installed, including the changes you've made. So, Be careful there...

./setup.sh --uninstall

VNC Client

Now you need a VNC client app to connect to server. I'm using this Android VNC client: VNC Viewer. You can use TigerVNC if you're trying to connect to server by a computer (Windows or Linux).

Determine port number on which VNC server listens. It can be calculated like this: 5900 + {display number}. So for display 'localhost:1' the port will be 5901.

Now open the VNC Viewer application and create a new connection with the following information (assuming that port is 5901) -

Address:
127.0.0.1:5901

Name:
Termux

Now launch it. You will be prompted for password that you entered during installation. After entering password, you'll be headed directly to this desktop -

desktop

First Impression

Let's take a look at following installed programs you'll get here -

File Manager Text Editor/IDE
img img
Terminal Emulator Web Browser
img img
Openbox Menu Many CLI based Programs
img img
vim & htop ranger & calcurse mutt & elinks mpd & ncmpcpp
img img img img

Rofi Application launcher and Applets -

App Launcher Music Player
img img
Battery Status Exit Menu Network Info
img img img

Styles

There are total Eight different styles/themes available in this setup. To change style, Right click on desktop > Preferences > Change Style and select the one you want to apply.

Default Beach Forest Grid
img img img img
Manhattan Slime Spark Wave
img img img img

Applications of Termux Desktop

Well, These are some ideas or things you can do with termux desktop. From Learning coding to Penetration testing, Chatting over IRC to Browsing web and Downloading file, Playing classic retro games to run Windows from 90s.

  • Learn and practice you coding skill without having a laptop
Python Bash
img img
  • Chatting, Web Browsing and Downloading files
Hexchat & Pidgin Netsurf & Uget Browsing Wiki
img img img
  • Penetration testing and Learn cyber security stuff

I'm not doing anything illegal or sponsoring any kind of Hacking and Cracking. Termux is a powerful tool, use it with responsibilities.

Metasploit - Sherlock - Socialfish - Zphisher - Sqlmap
img
  • Play classic retro games or Run Microsoft Windows from 90s with Dosbox
Turbo C++, Windows 1 and Windows 3 Duke and Blue Brothers
img img
Mario and Pacman Prince of Persia (both)
img img
Wolfenstein and Turrican2 SuperKarts and Spiderman
img img

You'll probably get the idea of possible things you can do with Termux and how Termux Desktop makes it more easy.

Keybindings

Here's some shortcut keys you want to use to speed up your work. For more, Right click on desktop > Keybinds

Keys Action ----- Keys Action
W-1 Go To Desktop 1 S-W-1 Send To Desktop 1
W-2 Go To Desktop 2 S-W-2 Send To Desktop 2
W-3 Go To Desktop 3 S-W-3 Send To Desktop 3
W-4 Go To Desktop 4 S-W-4 Send To Desktop 4
W-5 Go To Desktop 5 S-W-5 Send To Desktop 5
W-S-Left Send To Prev Desktop W-S-Right Send To Next Desktop
A-Tab Next Window (Current Workspace) W-Tab Next Window (All Workspaces)
W-h Move to TopLeft W-j Move to BottomLeft
W-k Move to TopRight W-l Move to BottomRight
W-Left Move To Left Edge W-Right Move To Right Edge
W-Up Maximized W-Down Unmaximized
W-q/c Close Windows A-r/m Toggle Resize/Move
W-Space Openbox Menu W-p/A-F1 App Launcher
W-d Toggle Desktop W-v Set Tasks
W-f File Manager W-e Text Editor
W-t/return Terminal W-w Web Browser
W-x Exit Menu W-m Music Menu
W-b Battery Menu W-n Network Menu
C-A-v Vim C-A-r Ranger
C-A-h Htop C-A-n Nano

Additional Tools

You can install additional tools for termux, to make it visually look good.

  1. Oh my zsh, Setup zsh with oh-my-zsh framework. (Already Added in this setup)
  2. Termux style, Change color and fonts in termux.

FYI

  • If you face any problem or get any error, you can create an issue & i'll try to help.
  • Edit ~/.local/bin/email and put your Email ID and Password (Use an App password) to show unread mails on polybar.
  • You may need to edit some config files accoring to your need (~/.mutt/muttrc, ~/.gitconfig)
  • Don't Email or DM me to ask how to hack, I ain't a Hacker.
  • Have Fun, Share this repository with your friends.

Github

https://github.com/adi1090x/termux-desktop

Comments(12)

  • 1

    dock and taskbar?

    Followed instructions by the letter but I have no application dock or top task bar. I need to right click to open terminal, and when I do I get the error

    OPENBOX failed to execute child process "sterm" (no such file or directory)

  • 2

    Unable to open apps due to missing `/etc/machine-id`

    I recently installed Termux Desktop and the VNC server seems to be running pretty smoothly overall, but I'm unable to open some apps. For example, I tried opening the settings manager through the GUI, but nothing would happen. I then tried running xfce4-settings-manager in the terminal, which causes the following error:

    Failed to connect to Xfconf daemon: Cannot spawn a message bus without a machine-id: Unable to load /data/data/com.termux/files/usr/var/data/data/com.termux/files/usr/lib/dbus/machine-id or /data/data/com.termux/files/usr/etc/machine-id: Failed to open file /data/data/com.termux/files/usr/var/data/data/com.termux/files/usr/lib/dbus/machine-id: No such file or directory
    

    I found that /etc/machine-id is usually generated when Linux is installed, and that it can be regenerated with the command systemd-machine-id-setup, but I don't think systemd is meant to be installed on Android/Termux.

    I'm running on a Samsung A52s with Android 11 - let me know if you need any more information about my system.

  • 3

    Unable to install neofetch

    Device: Samsung a51 Android: Android 10 Kernel Architecture: aarch64

    `Checking availability of current mirror: /data/data/com.termux/files/usr/bin/pkg: line 43: 4331 Illegal instruction timeout 6 curl --head --fail --connect-timeout 5 --location --user-agent 'Termux-PKG/1.0 mirror-checker (termux-tools 0.104) Termux (com.termux; install-prefix:/data/data/com.termux/files/usr)' "${current_mirror%/}/dists/stable/Release" > /dev/null 2>&1 bad Testing the available mirrors: [*] https://termux.org/packages: ok [*] https://main.termux-mirror.ml: /data/data/com.termux/files/usr/bin/pkg: line 83: 4351 Illegal instruction timeout 6 curl --head --fail --connect-timeout 5 --location --user-agent 'Termux-PKG/1.0 mirror-checker (termux-tools 0.104) Termux (com.termux; install-prefix:/data/data/com.termux/files/usr)' "${mirrors[$w]%/}/dists/stable/Release" > /dev/null 2>&1 bad [*] https://grimler.se/termux-packages-24: ok Picking mirror: https://termux.org/packages Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package neofetch

    [!] Error installing neofetch, Terminating...`

    Edit2: It wasnt a clean instalation, i already have vnctiger and many python packages

  • 4

    Xauth does not exist

    I've run into this issue: file /data/data/com.termux/files/home/.Xauthority does not exist It's probably why I get a black screen in the desktop. The device is a oneplus 8t with LineageOS 18.1

  • 5

    cannot locate package xfsettingsd

    I ran the command to install all the dependancies, and got an error: "E: Unable to locate package xfsettingsd" This is on a fresh install of termux on Android 9, Galaxy S8

  • 6

    error installing htop-legacy

    Package htop-legacy is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source However the following packages replace it: htop

    E: Package 'htop-legacy' has no installation candidate

  • 7

    Web browser doesn't support JavaScript

    The program 'netsurf' doesn't support JavaScript. Are you know some graphical browsers for termux-desktop? Or a way to fix this netsurf program issue? Help. : ]

  • 8

    Why this errors

    I can't able to access everything see the screenshot Some difference between your screenshot and my i install step by step Unable to access some thing whic i provid you [ Screenshot_2020-04-22-05-08-34-693_com realvnc viewer android Screenshot_2020-04-22-05-08-40-227_com realvnc viewer android

    IMG_20200422_082354 IMG_20200422_082458

    ](url)

  • 9

    Cannot install geany

    The following packages have unmet dependencies: glib-bin : Depends: glib (= 2.72.1-1) but 2.72.2 is to be installed E: Unable to correct problems, you have held broken packages.

    help.

  • 10

    vnc shows the desktop but it's stuck

    I can connect to the vnc display but can't click anything and I noticed the time doesn't update so it looks stuck. Tried with vnc viewer and bvnc free with same results. Funny enough I can only connect once, if I want to connect again I need to kill and start vnc again.

    Very strange.

    Here is the log with me trying to connect and disconnect if that tells anything at all.

    tail -f localhost:1.log
    client(c00000): Released pid(27913).
    client(c00000): Released cmdline(rofi) and cmdargs(-theme default/powermenu.rasi -p UP - 15 hours, 38 minutes -dmenu -selected-row 0).
     VNCSConnST:  closing 127.0.0.1::45432: Clean disconnection
     EncodeManager: Framebuffer updates: 0
     EncodeManager:   Total: 0 rects, 0 pixels
     EncodeManager:          0 B (1:nan ratio)
     TcpSocket:   unable to get peer name for socket
     Connections: closed: ::0
     ComparingUpdateTracker: 0 pixels in / 0 pixels out
     ComparingUpdateTracker: (1:nan ratio)
    
    Wed Apr 13 23:26:11 2022
     Connections: accepted: 127.0.0.1::45728
     SConnection: Client needs protocol version 3.8
     SConnection: Client requests security type VncAuth(2)
     VNCSConnST:  Server default pixel format depth 24 (32bpp) little-endian rgb888
    
    Wed Apr 13 23:26:12 2022
     VNCSConnST:  Client pixel format depth 24 (32bpp) little-endian rgb888
    
    Wed Apr 13 23:27:01 2022
     Connections: accepted: 127.0.0.1::45768
     VNCSConnST:  closing 127.0.0.1::45728: Clean disconnection
     EncodeManager: Framebuffer updates: 5
     EncodeManager:   RRE:
     EncodeManager:     Solid: 5 rects, 278.664 kpixels
     EncodeManager:            100 B (1:11147.2 ratio)
     EncodeManager:   ZRLE:
     EncodeManager:     Indexed RLE: 11 rects, 706.222 kpixels
     EncodeManager:                  49.6367 KiB (1:55.58 ratio)
     EncodeManager:     Full Colour: 4 rects, 88.778 kpixels
     EncodeManager:                  11.168 KiB (1:31.0563 ratio)
     EncodeManager:   Total: 20 rects, 1.07366 Mpixels
     EncodeManager:          60.9023 KiB (1:68.8682 ratio)
     TcpSocket:   unable to get peer name for socket
     Connections: closed: ::0
     ComparingUpdateTracker: 4.19635 Mpixels in / 110.72 kpixels out
     ComparingUpdateTracker: (1:37.9006 ratio)
     VNCSConnST:  closing 127.0.0.1::45768: Clean disconnection
     EncodeManager: Framebuffer updates: 0
     EncodeManager:   Total: 0 rects, 0 pixels
     EncodeManager:          0 B (1:nan ratio)
     TcpSocket:   unable to get peer name for socket
     Connections: closed: ::0
     ComparingUpdateTracker: 0 pixels in / 0 pixels out
     ComparingUpdateTracker: (1:nan ratio)
    
    Wed Apr 13 23:27:51 2022
     Connections: accepted: 127.0.0.1::46006
     SConnection: Client needs protocol version 3.8
     SConnection: Client requests security type VncAuth(2)
     VNCSConnST:  Server default pixel format depth 24 (32bpp) little-endian rgb888
     VNCSConnST:  Client pixel format depth 24 (32bpp) little-endian rgb888
    
    Wed Apr 13 23:28:37 2022
     VNCSConnST:  closing 127.0.0.1::46006: Clean disconnection
     EncodeManager: Framebuffer updates: 5
     EncodeManager:   RRE:
     EncodeManager:     Solid: 5 rects, 278.664 kpixels
     EncodeManager:            100 B (1:11147.2 ratio)
     EncodeManager:   ZRLE:
     EncodeManager:     Indexed RLE: 12 rects, 710.318 kpixels
     EncodeManager:                  50.2783 KiB (1:55.1892 ratio)
     EncodeManager:     Full Colour: 3 rects, 76.49 kpixels
     EncodeManager:                  10.6201 KiB (1:28.1376 ratio)
     EncodeManager:   Total: 20 rects, 1.06547 Mpixels
     EncodeManager:          60.9961 KiB (1:68.2377 ratio)
     TcpSocket:   unable to get peer name for socket
     Connections: closed: ::0
     ComparingUpdateTracker: 4.19635 Mpixels in / 32.768 kpixels out
     ComparingUpdateTracker: (1:128.062 ratio)
    client(c00000): Reserved pid(5292).
    client(c00000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 6, socket fd = 13
    client(e00000): Reserved pid(5286).
    client(e00000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 7, socket fd = 15
    client(1000000): Reserved pid(5320).
    client(1000000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 8, socket fd = 16
    client(1200000): Reserved pid(5316).
    client(1200000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 9, socket fd = 17
    client(1400000): Reserved pid(5322).
    client(1400000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 10, socket fd = 18
    client(1600000): Reserved pid(5313).
    client(1600000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 11, socket fd = 19
    client(1800000): Reserved pid(5331).
    client(1800000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 12, socket fd = 20
    client(1a00000): Reserved pid(5329).
    client(1a00000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 13, socket fd = 21
    client(1c00000): Reserved pid(5332).
    client(1c00000): Reserved cmdname(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    AllocNewConnection: client index = 14, socket fd = 22
    client(1000000): Released pid(5320).
    client(1000000): Released cmdline(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    client(1400000): Released pid(5322).
    client(1400000): Released cmdline(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    client(c00000): Released pid(5292).
    client(c00000): Released cmdline(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    client(e00000): Released pid(5286).
    client(e00000): Released cmdline(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    client(1600000): Released pid(5313).
    client(1600000): Released cmdline(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    client(1a00000): Released pid(5329).
    client(1a00000): Released cmdline(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    client(1c00000): Released pid(5332).
    client(1c00000): Released cmdline(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    client(1800000): Released pid(5331).
    client(1800000): Released cmdline(rofi) and cmdargs(-no-lazy-grab -show drun -theme default/launcher.rasi).
    
  • 11

    Backing Up

    It takes a ridiculous amount of time to install this. Is there a way to back up this to internal storage? https://wiki.termux.com/wiki/Backing_up_Termux Can I use this method 👆? If yes then how?

  • 12

    How did you make the Icons on the newline

    https://user-images.githubusercontent.com/105246539/205478038-5907bf0f-4611-4b76-b7e5-e73186267754.mp4

    I just set up Termux desktop and I am a bit new to ZSH and was just wondering how you made the icons as shown in the recording.