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 GIMPhoto 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, GIMPhoto 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) 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). - Restart Firefox and Chrome, then set up the bookmark sync (see Bookmark Sync). On the first machine, click the MarkSync icon in Firefox, create a new sync and choose a password. Save the sync ID it shows and the password in your password manager: the password encrypts the bookmarks and cannot be recovered. In Chrome, choose the existing sync and enter the same ID and password. On a new machine, join with that ID and password in both browsers.
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
- Birdtray (Thunderbird in the system tray)
The local AI models this machine's applications share live in their own
repository: local-ai-setup.
The Local AI step clones it and runs its setup.sh every time (it is
idempotent: it skips what is there and resumes interrupted model
downloads), passing the COMFYUI_* and OLLAMA_* settings of this
config.sh through the environment.
- ComfyUI with open-weight image models (Qwen-Image-Edit, FLUX.2 klein,
SAM 2.1, BiRefNet, LaMa), as the
comfyuisystemd user service, behind GIMPhoto's AI tools, comic-skills and photo-restore. Skipped unlessCOMFYUI_DIRis set, because the models are tens of GB (about 42 GB with the defaultCOMFYUI_MODEL_SETS); needs an NVIDIA GPU. - Ollama, the local language-model server, behind
Goose (the steps after it), comic-skills,
tvshow-skills and Digivice.
OLLAMA_MODELS_DIRmoves its models to another disk.
See the local-ai-setup README
for the model sets, the service and the requirements. The repository can be
overridden with LOCAL_AI_SETUP_REPO.
GIMPhoto, GIMP with Photoshop's
tools and interface, is installed from the Flatpak bundle of its latest
GitHub release (GIMPHOTO_RELEASES_API_URL), after checking the SHA-256
GitHub records for it. It installs next to the official GIMP, with its own
app ID and user profile; Flatpak fetches the GNOME runtime it needs from
Flathub. Its AI tools run on the local ComfyUI above, which GIMPhoto starts
when it opens and stops when it closes. AMD64 only.
Once GIMPhoto is installed the step is skipped: to update it, install a
newer release's bundle (flatpak install --user GIMPhoto.flatpak).
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.
- On AMD64 and ARM64 systems, installs calibre
with its official installer to
/opt/calibre(the apt package is several major versions behind). - Creates the
~/Kindle-DeDRMworkspace (orKINDLE_DEDRM_DIRfromconfig.sh) withtools/,output/, andbackup/subdirectories. The folder is deliberately not shared automatically: expose it to the Windows guest only through WinBoat's supported shared-folder configuration. - If
KINDLE_DEDRM_BACKUP_DIRis set, copies the known account-derived Kindle key files (oldbooks.k4i,books.keyfile, andstorage/.kinf2024) there with mode0600. The backup directory itself is mode0700. - 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.
This setup installs the Linux-side prerequisites—Calibre, WinBoat, and a private host workspace—but it does not automate Amazon sign-in, Microsoft Store installation, TPM configuration, Windows executables, DeDRM plugin installation, or ebook conversion. Those operations depend on the installed Kindle app and WinBoat version, expose account-derived key material, and need interactive verification.
For purchased or otherwise authorized books, follow the companion Kindle DRM workflow. It adapts Fabio Akita's 2026 process for a Linux Mint host using WinBoat, including the version-matching and secure-backup checks. Do not use the Omarchy-specific commands or paths from the original post with WinBoat.
A free, open-source alternative to Claude Cowork that runs entirely on this machine: Goose as the agent and Ollama serving a local model.
-
Ollama comes from the Local AI step (local-ai-setup). 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.
-
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.
Keeps the bookmarks of Firefox and Chrome the same, in both directions, with MarkSync. It is the Manifest V3 successor of xBrowserSync, whose Chrome extension can no longer be installed, and it uses the same sync service and sync IDs. Bookmarks are encrypted on the machine with your password before they are uploaded.
- Installs the extension in Firefox and in Chrome (the
.debor the Flatpak version) through each browser's policy file, as an extension the browser installs automatically but that you can still disable:- Firefox:
/usr/lib/firefox/distribution/policies.json. - Chrome:
/etc/opt/chrome/policies/managed/linux-mint-setup.json. The Flatpak version reads the same file from the host.
- Firefox:
- Merges its entry into those files, so other policies already there are kept, and leaves a file alone when it is not valid JSON. It runs again without changing anything once the entries are there.
- Takes effect the next time each browser starts. Firefox and Chrome then show "managed by your organization" in their settings, which is how they display any policy file.
- Creating the sync, or joining the one made on another machine, needs a password, so it is a manual step and the password is never stored by the setup.
The extension IDs and download URLs can be overridden in config.sh
(MARKSYNC_*). Firefox must come from APT, as it does in this setup; the
Snap version ignores that policy file.
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 Thunderbird to show the full content of every email: remote
images and content load automatically and messages display as original
HTML. The preferences go in the default profile's
user.js; if there is no profile yet, open Thunderbird once and re-runsetup.sh. - Configures Discord to hide to the system tray when its window is closed. If
Discord is running, quit it and re-run
setup.sh(it rewrites its settings when it quits). - Configures Birdtray, since Thunderbird has a system tray of its own only on Windows: Birdtray starts at login, launches Thunderbird hidden and shows the unread count of every account's inbox in the tray. Closing or minimizing the Thunderbird window hides it to the tray (Birdtray restarts it hidden); Quit in the tray icon menu quits both. Needs a Thunderbird profile with at least one account, and Birdtray not running while the step writes its configuration.
- 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.
- GIMPhoto replaces the official GIMP and its gimp-setup add-ons, which this setup no longer installs. To add Photoshop-style plug-ins to the official GIMP instead, run gimp-setup on its own; its AI plug-ins use the same local ComfyUI.
- 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).
- calibre is installed only on AMD64 and ARM64 systems. Remove it with
calibre-uninstall. - 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 (through
local-ai-setup) 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