Personal post-install setup for Linux Mint. Follow the steps below in order.
This assumes Linux Mint is already installed — the script does not install the OS itself, only what runs on top of it.
| Resource | Linux Mint's own minimum | Comfortable for this script's full install |
|---|---|---|
| RAM | 2 GB (4 GB recommended by Linux Mint) | 8 GB+ (16 GB if you use Docker containers or WinBoat) |
| Disk (free space) | 20 GB (100 GB recommended by Linux Mint) | 60 GB+ — Snap, Flatpak, Docker images and the GIMP ecosystem all add up |
| Display | 1024×768 | — |
| CPU | x86_64 | x86_64 (AMD64) for the full app set; ARM64 gets a reduced set, see below |
- CPU architecture matters here, not just power. Some apps this
script installs are AMD64-only (Remote Mouse, balenaEtcher, WinBoat,
Claude Desktop), some support AMD64 and ARM64 (
immich-go, LocalSend, AppManager/Wattage), and the rest install on either. On ARM64 the script skips the AMD64-only pieces automatically and says so in its summary. - Docker, the GIMP ecosystem and WinBoat (a Windows-app compatibility layer) are the heaviest consumers of RAM/disk if you actually use them — a machine that skips those can get by with less than the "comfortable" numbers above.
- The local image models
(ComfyUI, installed by the GIMP ecosystem step) are the heaviest
download of all: ComfyUI plus the default model sets is about 42 GB on
disk and needs an NVIDIA GPU. They are skipped unless
COMFYUI_DIRis set inconfig.sh. - The local AI agent is the other heavy piece:
its default model is an ~18 GB download and needs about 24 GB of RAM
(GPU memory counts toward it). On smaller machines the model step is
skipped with a warning; pick a smaller model in
config.sh.
The setup is split across setup.sh, lib/ and steps/ (see
Project Layout), so download the whole repository rather
than setup.sh alone. Open a terminal and run:
curl -fsSL https://github.com/diegochagas/linux-mint-setup/archive/refs/heads/main.tar.gz | tar -xz && cd linux-mint-setup-main && ./setup.shOr, with Git:
git clone https://github.com/diegochagas/linux-mint-setup.git && cd linux-mint-setup && ./setup.shTo change any of the configurable values first, copy config.sh.example to
config.sh next to setup.sh and edit it before running the script.
./setup.sh --dry-run prints every action the script would take without
changing anything.
The script asks for the administrator password when it needs sudo
permissions. Keep an internet connection active while it runs. Each run
writes a log to the logs/ folder.
- Configure automatic system snapshots:
Update Manager > Edit > System Snapshots > Wizard > Next > Next > Weekly - Keep 4 > Next > Next > Finish. - Open a new terminal and run
claudeonce to sign in to Claude Code. - For Goose's Browser extension, install the Open Browser Control add-on in the browser Goose should control: Firefox or Chrome.
- Optional: to let Goose read email, add an IMAP account with
npx -p imap-mcp-server imap-setup, then turn on the IMAP Email extension in Goose when you need it (see Local AI Agent).
The script stops if an unhandled command fails and performs the following actions:
- Removes Linux Mint's Snap restriction by renaming
nosnap.pref, when present. - Adds the official Sublime Text APT repository.
- Updates APT and installs: Firefox, ExifTool, VLC, Sublime Text, Git, Node.js, npm, Python 3, PyYAML, curl, jq, AntiMicroX, unrar, unzip, rsync, xclip, FreeRDP X11, libsecret-tools, CopyQ, btop, Inkscape, Nextcloud Desktop, FFmpeg, fontconfig, GParted, Tree, ShellCheck, Docker, Docker Compose, gh, nfs-kernel-server, zbar-tools, Anki, the TimGM6mb SoundFont, and supporting libraries.
- Configures Docker after installation by adding the current user to the
dockergroup, fixing existing~/.dockerownership if needed, and enabling and starting the Docker and containerd systemd services. Log out and back in before using Docker withoutsudo. - On AMD64 systems, installs Remote Mouse with its bundled green taskbar icon, starting it from its install directory (from the menu and at login) because the tray icon is loaded relative to the working directory, and the latest balenaEtcher release.
- On AMD64 and ARM64 systems, installs the latest
immich-gorelease. - On AMD64 systems, installs the pinned Blender LTS
portable build to
/opt/blender(linked as/usr/local/bin/blender). - On AMD64 and ARM64 systems, installs the latest
LocalSend
.debrelease (not the Snap Store version — its AppArmor sandboxing breaks NetworkManager access and the system tray icon). - On AMD64 and ARM64 systems, installs the latest ZapFast release as a user-local WhatsApp client. Its launcher uses the bundled SVG by absolute path so Cinnamon displays the ZapFast icon even before its user icon-theme cache is registered.
- On AMD64 systems, installs the latest Scrcpy GUI
.debrelease. Its official SHA-256 manifest is verified before installation; the package bundles compatiblescrcpyandadbbinaries. - On AMD64 and ARM64 systems, installs
AppManager and uses it to install the
Wattage nightly AppImage from
nightly.link. - On AMD64 systems, installs WinBoat from its AppImage release using AppManager.
- Installs Claude Code for terminal use.
- On AMD64 systems, installs Claude Desktop from Anthropic's latest x64
.debinstaller. - On AMD64 systems, installs Discord from Discord's official Linux
.debdownload. - Installs Hypnotix from APT when it is not already available, then adds the IPTV-ORG Brazil M3U provider.
The script installs Snap support and then installs:
- Visual Studio Code
- Insomnia
The script installs Flatpak, adds Flathub, and installs:
- NormCap
- Google Chrome
- Emojify
- Master PDF Editor
- Kdenlive
- OBS Studio
- Free Download Manager
- Dosage
- EasyRPG Player
- PPSSPP (PSP emulator)
- Telegram Desktop
- Surfshark
The complete GIMP ecosystem lives in its own repository: gimp-setup. That includes the local AI models (ComfyUI with FLUX.2 klein and Qwen-Image-Edit) behind GIMP's AI tools, which run fully on this machine with no accounts or API keys.
If the GIMP Flatpak is already installed, this step is skipped entirely —
GIMP itself is the marker for the whole ecosystem — unless COMFYUI_DIR is
set and ComfyUI is not installed there yet. To add other missing pieces (or
another model set) to an existing GIMP install, run the (idempotent)
gimp-setup/setup.sh directly.
Otherwise the script clones that repository and runs its setup.sh, which
installs and configures with a single command the features listed in gimp-setup/docs/
The repository to clone can be overridden with the GIMP_SETUP_REPO variable
in config.sh. The ComfyUI settings set there — COMFYUI_DIR (empty skips
ComfyUI), COMFYUI_MODEL_SETS and COMFYUI_PORT — are forwarded to the GIMP
setup. See the
gimp-setup README for
details, configuration and how to add new GIMP features.
After the other setup steps finish, the script clones homelab-backup to:
~/Projects/homelab-backup
It then applies the systemd user timer configuration from backup.md:
- Makes
~/Projects/homelab-backup/backup.shexecutable. - Creates
~/.config/systemd/user/homelab-backup.service. - Creates
~/.config/systemd/user/homelab-backup.timer. - Reloads the user systemd daemon.
- Enables and starts the timer with
systemctl --user enable --now homelab-backup.timer.
The timer runs the backup daily at 10:00 AM. Because Persistent=true is set,
if the computer is powered off at the scheduled time, the backup runs on the
next login.
The repository to clone can be overridden with the HOMELAB_BACKUP_REPO
variable in config.sh. The clone location remains
~/Projects/homelab-backup, matching the systemd unit configuration.
After the Homelab Backup step, the script adds each file listed in
GIT_CONFIG_INCLUDES in config.sh (comma separated) to the global Git
configuration with git config --global --add include.path. Use it for Git
settings that must not be committed anywhere, such as per-repository push URLs
kept in a folder synced by Nextcloud. Because the include lives in
~/.gitconfig rather than in a repository, it still applies after a project is
deleted and cloned again.
Git skips an include whose file does not exist yet, so the step can run before
Nextcloud has finished syncing: the settings take effect once the file arrives.
Paths already included are left alone, and an empty GIT_CONFIG_INCLUDES skips
the step.
A typical included file applies settings to one clone through includeIf:
[includeIf "gitdir:~/Projects/<repo>/"]
path = <folder>/<repo>.gitconfigand <repo>.gitconfig can, for example, push to GitHub and to a copy of the
repository on a home server:
[remote "origin"]
pushurl = git@github.com:<user>/<repo>.git
pushurl = <user>@<server>:<path-to-repo>- Installs Tailscale using its official installation script.
- Installs
immich-goto/usr/local/bin/immich-goon AMD64 and ARM64 systems. - Installs the Blender LTS portable
build pinned by
BLENDER_VERSION/BLENDER_TARBALL_URLinconfig.shto/opt/blender, links it as/usr/local/bin/blenderand registers its menu entry. Thegames-extractorrender pipeline drives it headless (blender -b --python ...); the apt package is older and the Snap build is sandboxed, which is why the official tarball is used. - Installs AppManager, then downloads the
latest successful Wattage
build-appimage.ymlartifact for the current CPU architecture and installs the extracted AppImage withapp-manager install. - Installs WinBoat on AMD64 systems by downloading the
configured AppImage release and installing it with
app-manager install. - Installs ZapFast from its latest GitHub Linux
release into
~/.local/lib/zapfast, makes it available as~/.local/bin/zapfast, and creates a Cinnamon-compatible launcher with its bundled SVG icon. - Installs Claude Code using
Anthropic's Linux terminal installer:
curl -fsSL https://claude.ai/install.sh | bash - Installs Claude Desktop on AMD64 systems by
downloading Anthropic's latest x64
.debinstaller and installing it with APT. The installer registers Anthropic's APT repository so Claude Desktop updates with the rest of the system packages. - Installs Discord on AMD64 systems from its
official
.debdownload. - Installs the latest Scrcpy GUI AMD64
.debrelease after validating it against the upstreamSHA256SUMS.txtmanifest.
Installer and release source URLs, including the WinBoat AppImage URL, can also
be overridden in config.sh. See config.sh.example for the full list.
A free, open-source alternative to Claude Cowork that runs entirely on this machine: Goose as the agent and Ollama serving a local model.
-
Installs Ollama with its official script (AMD64 and ARM64). It uses an NVIDIA GPU when the proprietary driver is installed (Driver Manager); a model larger than the GPU memory is split between GPU and CPU/RAM automatically.
OLLAMA_MODELS_DIRinconfig.shmoves the model storage to another disk, through its own systemd drop-in (ollama.service.d/linux-mint-setup.conf). -
Installs the Goose CLI in
~/.local/binwith Block's installer (AMD64 and ARM64) and, on AMD64, Goose Desktop from its latest.debrelease after checking the SHA-256 GitHub records for it. -
Pulls the local model (
GOOSE_OLLAMA_BASE_MODEL, by default Qwen3-30B-A3B-Instruct-2507, ~18 GB) and creates a copy namedGOOSE_OLLAMA_MODELwith a 32k-token context. Ollama's default 4096 tokens is too small: Goose's own instructions and tool descriptions take most of it. -
Writes Goose's
~/.config/goose/config.yaml, keeping any existing settings (a previous version is saved asconfig.yaml.bak):-
Ollama as the provider, with the model above.
-
Smart approval mode and a 50-turn limit, only when not set yet, so choices made later in Goose Desktop are kept. The limit stops a stuck task instead of letting it loop.
-
Extensions, each added only when missing:
Extension What it does Developer Built in: runs shell commands and reads/edits files Browser Open Browser Control: controls your real Firefox or Chrome through its add-on (manual step) SearXNG Search mcp-searxng: web search through the SearXNG instance set in GOOSE_SEARXNG_URL; skipped when emptyIMAP Email imap-mcp-server: reads and manages email. Added disabled: its 40 tools use a large part of a local model's context, so turn it on only for email tasks
-
-
Installs
steps/goose/goosehintsas~/.config/goose/.goosehints, rules Goose reads at the start of every session: report only facts it actually read, use the GitHub API instead of GitHub pages, read web pages with smallbrowser_execute_jssnippets instead of the whole DOM, and usepython3.
Run goose session in a folder for the terminal version or open Goose
from the menu for the desktop app. What to expect from the default
model on a laptop with a 6 GB GPU: about 20 tokens/s, good at file,
shell, web search and simple browser tasks, weak at complex websites.
browser_execute_js is blocked on sites with a strict
Content-Security-Policy (GitHub, Gmail), and a small model may guess
instead of saying it could not read something, so check its facts.
The script creates these Cinnamon keyboard shortcuts:
| Shortcut | Action |
|---|---|
Alt + V |
Toggle CopyQ |
Alt + T |
Open NormCap |
Alt + E |
Open Emojify |
Alt + C |
Copy a screenshot of an area to clipboard |
Shift + Super + S |
Copy a screenshot to clipboard |
It also:
- Configures
~/.XComposeso pressing the acute-accent dead key (´) followed bycproducesç, and´followed byShift+CproducesÇ. Restart applications that were open during setup before testing the new sequence. - Configures CopyQ to start automatically.
- Configures LocalSend to start automatically, minimized to the system tray.
- Installs the fonts from
steps/fonts/fontsinto~/.local/share/fonts/linux-mint-setupand refreshes the font cache withfc-cache -f. - Installs the AntiMicroX controller profiles from
steps/antimicrox/profilesinto~/.config/antimicrox/profiles: ALendaDoHeroi, ApocalypseAcabouAPutaria, DragonBallZFighters, FallGuys, Jaspion, MegamanCollection, and SegaMegaDriveEGenesisClassics. Open AntiMicroX, clickLoad, and pick the game's profile before playing. - Grants EasyRPG Player access to the RPG Maker library set by
RPG_MAKER_LIBRARY_DIRinconfig.sh— a directory with one subfolder per game and the shared RTP assets inRTP/2000andRTP/2003subfolders, e.g. a folder synced by Nextcloud — and copies the RTP into EasyRPG's default search path together with the TimGM6mb GM soundfont so MIDI music plays. Open the games with EasyRPG's built-in game browser by navigating to the library folder; saves are written inside each game folder, so progress stays synced across machines. If the variable is empty or the library does not exist yet, the step is skipped — set the path inconfig.shand re-runsetup.sh. - Allows unverified Flatpak applications to appear in Software Manager.
- Enables automatic update checks and updates in Update Manager.
- Configures the Homelab Backup systemd user timer after the other setup steps.
- Adds the files in
GIT_CONFIG_INCLUDESto the global Git configuration. - Configures Hypnotix with the
IPTV-ORGM3U URL provider using the Brazilian playlist athttps://iptv-org.github.io/iptv/countries/br.m3u. Existing providers are retained, and a priorIPTV-ORGentry is updated rather than duplicated.
setup.sh Entry point: loads config.sh, lib/ and steps/, then runs
the steps in the order listed in run_setup_steps
config.sh.example Template for the optional config.sh
lib/
log.sh Terminal output and the log file
exec.sh run (dry-run aware), downloads, file writes, temporary
directories and the error handler
step.sh run_step, skip_step, warn_step, require_architecture
and the summary
system.sh File, binary, user, systemd, PATH and autostart helpers
packages.sh APT, Snap, Flatpak, .deb and GitHub release helpers
preflight.sh Dependency, sudo, internet and OS checks
steps/ One setup step (install_* or configure_*) per file
<name>.sh A step without extra files
<name>/<name>.sh A step that ships files, kept in the same folder:
antimicrox/ antimicrox.sh and the profiles/ it copies
fonts/ fonts.sh and the fonts/ it installs
goose/ goose.sh, goose-config.py (merges Goose's
config.yaml) and the goosehints it installs
xcompose/ xcompose.sh and the XCompose rules it merges
Every step is a function that installs or configures one thing. It runs
inside run_step, which prints the step header and records the result in
the summary:
- Return normally and the step is recorded as installed/configured.
- Call
skip_step "reason"when there is nothing to do (already installed, unsupported architecture, missing configuration). - Call
warn_step "reason"when the step could not complete but the setup should continue (a release asset is unavailable, a download failed). - Use
require_architecture amd64 arm64 || return 0to limit a step to some CPU architectures.
Every action that changes the system goes through run, download_file,
run_remote_script, write_file, write_root_file or append_to_file,
which print the action and skip it in --dry-run mode. Any command that
fails aborts the setup and reports its file and line.
Values that can be overridden in config.sh are declared with
: "${NAME:=default}" at the top of the step that uses them, and listed in
config.sh.example.
To add a step, create steps/<name>.sh with its function, source it in
setup.sh and add a run_step line to run_setup_steps in the position
where it should run. If the step ships files (fonts, profiles, config
snippets), put it in steps/<name>/<name>.sh with the files beside it and
resolve them from ${BASH_SOURCE[0]%/*}, as the fonts step does.
- Everything GIMP-related is handled by the gimp-setup repository. See its README for installation details, notes and troubleshooting.
- If GIMP has not been opened before the setup script runs, some GIMP plug-ins
and features are skipped. Open GIMP once, close it, and re-run
setup.sh. - The script downloads software and runs official third-party installation
scripts, so review
setup.shbefore running it.
- Check your Wi-Fi adapter:
If you see something similar to:
lspci -nnk | grep -A3 -i networkthen this guide applies.MediaTek Corp. MT7921 802.11ax PCI Express Wireless Network Adapter Kernel driver in use: mt7921e - Install the
iwutility, if it is not already installed:sudo apt update sudo apt install iw
- Check the current power-saving status:
You may see:
iw dev wlp63s0 get power_save
Power save: on - Disable Wi-Fi power saving permanently.
Create the NetworkManager configuration file:
Paste the following:
sudo mkdir -p /etc/NetworkManager/conf.d sudo nano /etc/NetworkManager/conf.d/wifi-powersave.conf
Save and exit with[connection] wifi.powersave = 2
Ctrl+O,Enter, thenCtrl+X. - Restart NetworkManager:
sudo systemctl restart NetworkManager
- Verify that power saving is disabled:
Expected output:
iw dev wlp63s0 get power_save
Power save: off - Reboot and verify again:
If it still shows
iw dev wlp63s0 get power_save
Power save: off, the configuration has been applied successfully and should persist across reboots. After disabling Wi-Fi power saving, the random network drops stopped occurring on the MediaTek MT7921 adapter under Linux Mint.
Everything related to the ZimaOS home server — the apps it runs and how to reinstall them with their customizations after a fresh installation — is handled by the zimaos-setup repository. Its data backup and restore chain lives in homelab-backup.
- Remote Mouse and balenaEtcher are installed only on AMD64 systems.
immich-gois installed only on AMD64 and ARM64 systems.- Blender is installed only on AMD64 systems (the official portable build has no ARM64 Linux release).
- LocalSend is installed only on AMD64 and ARM64 systems, from its official
.debrelease rather than the Snap Store, and any existing Snap install is removed first. - Scrcpy GUI is installed only on AMD64 systems from its official
.debrelease. The release bundle includesscrcpyandadb; enable USB debugging on an Android device before connecting it. - AppManager and Wattage are installed only on AMD64 and ARM64 systems. WinBoat is installed only on AMD64 systems. If a configured AppImage or nightly artifact is temporarily unavailable, the script reports that in the summary and continues.
- Claude Code is installed with Anthropic's terminal installer. Run
claudeonce after setup to sign in. - Claude Desktop is installed only on AMD64 systems.
- Goose Desktop is installed only on AMD64 systems; Ollama and the Goose
CLI on AMD64 and ARM64. The Goose Desktop package adds
/usr/bin/gooseas a link to the desktop app, so the setup keeps~/.local/binfirst on thePATHandgoosestill runs the CLI. - Hypnotix is installed from APT when missing. Its
IPTV-ORGprovider uses the public Brazilian playlist maintained by IPTV-ORG. - Homelab Backup is cloned to
~/Projects/homelab-backupand scheduled with a user systemd timer. - Some operations may already be complete when the script is run again. Review any errors before retrying.
- Type the cedilla character (
ç) with´followed byc; type the uppercase form (Ç) with´followed byShift+C. TheEnglish (US, intl., with dead keys)layout must be enabled. The setup script adds these rules to~/.XComposeand preserves other custom Compose entries. - The correct audio profile in Sound Settings is
Headset JBL TUNE770NC. - Install Python packages only for your user with
python3 -m pip install --user --break-system-packages PACKAGE_NAME