Linux dotfiles for Debian, Ubuntu, Arch, Fedora and openSUSE: zsh, tmux, Neovim, Ghostty and Hyprland in one command
A one-command Linux dotfiles installer (Debian/Ubuntu, Arch, Fedora, openSUSE) for a fast terminal and an optional Hyprland desktop with the Caelestia shell. It sets up zsh (Oh My Zsh, starship), tmux, Neovim with NvChad (tree-sitter, LSP), Ghostty, terminal browsers (Browsh, elinks, w3m) and a Dracula + cyan theme. Nothing is overwritten without a backup, and everything can be undone.
bash <(curl -fsSL https://dotfiles.rahmateka.my.id)| Terminal (Neofetch) | Editor (Neovim) |
|---|---|
![]() |
![]() |
| File manager (Yazi) | Launcher (Caelestia) |
![]() |
![]() |
Desktop demo:
Watch the full-quality video (mp4)
Theme: a Dracula palette with a cyan accent across Ghostty, Neovim (NvChad), tmux, starship and Yazi, on Hyprland with the Caelestia shell.
Use bash <(...) rather than curl | bash: it keeps your terminal attached, so the menu and the sudo password
prompt work. Read a script before you run it. You can look at this one first:
curl -fsSL https://dotfiles.rahmateka.my.id | lessEvery step can be rehearsed without changing anything:
bash <(curl -fsSL https://dotfiles.rahmateka.my.id) --dry-run --allThe short domain redirects to the script in this repository (see docs/short-domain.md). If it
ever fails, the same script is at
https://raw.githubusercontent.com/rhmatzeka/dotfile/main/install.sh.
| Component | Contents |
|---|---|
base |
Base packages (git, fzf, ripgrep, eza, zoxide, ...), the JetBrainsMono Nerd Font, and makes sure your Downloads folder exists |
shell |
zsh, Oh My Zsh (autosuggestions, syntax highlighting) and the starship prompt |
tmux |
tmux with a cyan / Dracula theme |
nvim |
Neovim + NvChad, tree-sitter parsers (html, css, js, php, ...) and LSP servers through Mason |
terminal |
Ghostty config: dark theme, Vim-style keys |
browsers |
Terminal browsers: Browsh (Firefox in the terminal), elinks, w3m. Files you download in elinks and Browsh are saved to your Downloads folder instead of the current directory |
apps |
Microsoft 365 web apps (Word, Excel, PowerPoint, Outlook, OneDrive) in their own windows, plus Open with Microsoft 365 for local files (converts PDFs to .docx, uploads the file to a private folder of your OneDrive through the Microsoft Graph API, using rclone only for the sign-in, then opens it on the web). Double-clicking Word/Excel/PowerPoint files does this; for PDFs (which stay in your PDF viewer unless you agree to change that during installation) use the Thunar right-click entry Open with Microsoft 365. A file that is already open in Word online is not uploaded again (OneDrive locks it); the open copy is shown instead, PDF viewer, VLC, GIMP. Pre-selected only when a graphical session is running |
web |
Web development: PHP, Composer, MariaDB, Apache, phpMyAdmin. Services are not started unless you say yes (Apache listens on port 80); no passwords are set |
rust |
Rust through the official rustup installer: stable toolchain, clippy, rustfmt, rust-analyzer |
desktop |
Hyprland + Caelestia shell (with two small patches: the Bluetooth panel hides devices that only show a MAC address and lists audio devices first; notifications that contain HTML, such as Instagram's, show clean text), plus Caelestia's btop, fastfetch, foot, micro, thunar, zed and fish configs (only where you have none). Debian 13 only, beta. Builds Qt 6.11 from source (1 to 2 hours) |
The default selection is everything except desktop.
How much RAM does this setup take? Measured once, on the author's laptop: Debian 13, AMD Ryzen 3 7320U, 7 GB RAM,
Hyprland 0.55.2, on 2026-09-21. The numbers are PSS (read from /proc/<pid>/smaps_rollup: memory shared between
processes is divided between them, so nothing is counted twice, unlike the RSS column of top). They are approximate,
were taken while the machine was in normal use, and will differ on your hardware.
| Part | RAM | Notes |
|---|---|---|
| Hyprland (compositor) | ~100 MB | RSS; PSS could not be read for this process |
| Caelestia shell (bar, launcher, sidebar, notifications) | ~330 MB | qs ~303 MB plus six small helpers: the largest single part of the desktop |
| Ghostty | ~100 MB | one process shared by all windows (measured with a few windows open) |
| Audio, portals, Xwayland, polkit | ~60 MB | not from this repository, but the desktop needs them |
| zsh + Oh My Zsh + starship | ~3 MB | per interactive shell |
| tmux | ~9 MB | the server with one session |
| Neovim (NvChad) | ~136 MB | one shell file open with a language server (Node.js) attached; more plugins and servers mean more |
| Firefox for Browsh | ~560 MB | one blank page. Browsh is the heaviest of the terminal browsers; elinks and w3m need only a few MB |
The whole desktop (Hyprland + Caelestia + terminal + system services) idles at roughly 0.6 GB before you open anything else. In practice your applications dominate: at the time of measuring, a browser with many tabs used about 2.3 GB and a chat app about 0.6 GB, far more than everything in this repository together.
If RAM is tight:
- Skip
desktop. The terminal parts alone (--only base,shell,tmux,nvim,terminal) cost tens of megabytes plus Neovim. - Skip Browsh (it needs Firefox) and use elinks or w3m.
- The Microsoft 365 web apps run in a Chrome window, so each open window costs as much as a browser window (hundreds of MB): close them when you are done.
- MariaDB and Apache (
web) are not started unless you say so. MariaDB's memory use varied too much here (12 to 160 MB) to give a single figure.
| System | Status |
|---|---|
| Debian 13 (trixie) | All components except desktop installed and checked from scratch in a clean Debian 13. desktop: the package lists are validated; the source build has not been re-run through this script yet (beta) |
| Ubuntu 24.04 LTS, 26.04 LTS | Same components installed and checked from scratch in a clean Ubuntu (earlier revision of the installer). starship is not in the 24.04 repositories, so its official installer is used; Browsh is skipped (no firefox-esr package) while elinks and w3m are installed |
Arch Linux (and Manjaro, EndeavourOS, ... via ID_LIKE=arch) |
Installed and checked from scratch in the official Arch bootstrap image. Only Arch itself was tested. web and rust also installed and checked from scratch |
Fedora 44 (and RHEL-likes via ID_LIKE) |
Installed and checked from scratch in the official Fedora container image. starship is not in the Fedora repositories: its official installer is used. Only Fedora itself was tested. web and rust also installed and checked from scratch |
| openSUSE Tumbleweed | Installed and checked from scratch in the official Tumbleweed image. Leap and SLE were not tested. web and rust also installed and checked from scratch |
| Alpine, NixOS, Void, Gentoo, macOS | Not supported. Contributions are welcome (see below) |
desktop (Hyprland + Caelestia) is Debian 13 only because it depends on trixie-backports and on pinned build
versions. On the other distributions it is not offered; install Hyprland from your repositories and follow
caelestia-dots/caelestia.
On Arch, keep the system up to date (sudo pacman -Syu) before running the installer: it installs with
pacman -S --needed and does not refresh the package database itself, to avoid a partial upgrade.
Ghostty has no package on Debian, Ubuntu, Fedora or openSUSE: only its config is installed there. On Arch it is installed from the repositories when available.
- Real installs into clean root filesystems (official images, run in
systemd-nspawn) as a normal user with the final version of the installer: Debian 13, Arch, Fedora 44 and openSUSE Tumbleweed with every component exceptdesktop, then inspected: tool versions, fonts, Neovim with 18 tree-sitter parsers and 7 Mason packages, the Microsoft 365 launchers, anduninstall(14 links removed each time). Ubuntu 24.04 and 26.04 were verified the same way with the previous Debian-only revision. Repeat it yourself withtests/clean-rootfs.sh(see below). - A user who already has their own config files: they are backed up, a second install does not back them up
again, and
uninstallputs the originals back. --dry-runfor every component, shellcheck, and a GitHub Actions run on Ubuntu for every push.- Failures are not swallowed: a failed package step fails its component and the installer exits non-zero.
Not tested: "Open with Microsoft 365" with a work or school (Microsoft 365 Business) account (it was tested end to end with one personal account: PDF converted, uploaded and opened), the extra Caelestia application configs installed by desktop, the desktop source build from scratch, the Microsoft 365 web apps opening in a real browser
(the launchers and the installer were tested, not a login), Ghostty itself, any distribution or release not listed
above, and ARM machines.
./install.sh # interactive menu
./install.sh --all # every component, including desktop
./install.sh --only shell,nvim # pick components
./install.sh --dry-run --all # show what would happen, change nothing
./install.sh --yes # no questions, use the default answers
./install.sh --list # list the componentsThrough curl, put the options after the command, for example
bash <(curl -fsSL <url>) --only shell,tmux.
- A file that would be replaced is moved to
~/.dotfiles-backup/<timestamp>/, never overwritten. - Every symlink it creates is recorded, so
uninstallonly undoes what this installer did. sudois used only to install packages and, fordesktop, to write under/optand/usr/local.- Run it as a normal user, not as root.
bash <(curl -fsSL https://dotfiles.rahmateka.my.id/uninstall.sh)The links are removed and your original files come back. Packages, fonts, Oh My Zsh and anything built under /opt
are left in place; the list is printed at the end.
The top-level install.sh detects the OS, fetches this repository to ~/.local/share/rhmatzeka-dotfile, and hands over to the installer for
that platform (linux/install.sh, which uses lib/pkg.sh to talk to apt, pacman, dnf or zypper). Configs live in config/ and are installed as symlinks, so editing them
in that directory takes effect immediately. Shared helpers (backup, symlinks, dry run) are in lib/common.sh.
install.sh uninstall.sh entry points (OS detection)
lib/common.sh lib/pkg.sh shared helpers; pkg.sh maps package names per distribution
linux/ installer for every family: install.sh, uninstall.sh
linux/debian/desktop.sh Hyprland + Caelestia build (Debian 13 only)
config/ zsh, starship, tmux, nvim, ghostty, elinks, caelestia
bin/ small scripts (web, firefox-for-browsh)
docs/ preview placeholder, how-tos
tests/clean-rootfs.sh install into a clean Debian/Ubuntu/Arch/Fedora/openSUSE root filesystem and check it
Everything distribution-specific lives in lib/pkg.sh: a case in pkg_detect (which ID/ID_LIKE belongs to which
family), and in pm_is_installed, pm_install and pm_names (the package names that differ). Add the same family to
the detection in the top-level install.sh. Use pkg_need / pkg_optional in components so --dry-run and backups
keep working. Pull requests are welcome; please say in the description which system you actually tested on.
tests/clean-rootfs.sh <debian|ubuntu|arch|fedora|opensuse> <codename> builds a minimal system, runs the installer in it
as a normal user and checks the result (needs sudo and systemd-container; debootstrap for Debian/Ubuntu, zstd
for Arch).
dotfiles, Linux setup script, Debian dotfiles, Ubuntu dotfiles, Arch Linux dotfiles, Fedora dotfiles, openSUSE dotfiles, one-line installer, Hyprland dotfiles, Hyprland rice, Caelestia shell install, Wayland desktop, NvChad setup, Neovim config, zsh + starship + tmux, Ghostty config, terminal browser, developer environment, unixporn.
The code in this repository is MIT licensed. The colour palette is Dracula (MIT) with a cyan
accent. These are downloaded during installation and are not redistributed here: Oh My Zsh (MIT), the NvChad starter
(Unlicense), Browsh (LGPL-2.1), quickshell and the Caelestia shell/CLI (GPL-3.0, built from source; the Bluetooth fix is shipped as a patch in config/caelestia/patches/, not as a copy of upstream files), and the Hyprland
configuration from caelestia-dots/caelestia (cloned from upstream).




