Your desktop is already built around the four most relevant Suckless programs: dwm, dmenu, st, and slstatus. The audit found only one clear simplification:
sxhkd into dwm and remove sxhkd. This eliminates a daemon and a configuration language while preserving the same scripts and keys.
Most other apparent matches are false economies. surf cannot replace your Chromium-based authenticated browser workflow; tabbed and experimental scroll cannot replace the persistence, panes, popups, and remote operation you use in tmux; sam/ed cannot replace your LSP-based development editors; and Suckless base utilities should not displace Debian/Ubuntu userland underneath these dotfiles.
A cautious outcome is therefore: make one replacement, keep the rest, and do not install Suckless programs merely because they exist. That is more consistent with simplicity and frugality than growing the toolset.
I compared the official projects listed under the Suckless home, tools, and core sections against:
setup/packages/*.sh and setup/toolchains.sh;
.config/;
.local/bin/ and .local/lib/;
README.md and mkfile;
“Using” means declared or directly referenced by these dotfiles. It does not mean that every installed package is used daily. The audit deliberately excludes projects merely listed on Suckless’s “Stuff that rocks” page: those share the philosophy but are not the first-party Suckless tool catalogue requested here.
Recommendations were judged on functional coverage, integration cost, security/reliability, and whether the change actually reduces total complexity. A name or category overlap alone was not treated as a replacement.
| Suckless program | Evidence in the dotfiles | Finding |
|---|---|---|
dwm |
.config/sx/sxrc ends with exec dwm |
Already the right Suckless window manager. |
slstatus |
.config/sx/sxrc starts it before dwm |
Already supplies dwm’s status text. |
dmenu |
.local/lib/sh/dmenu.sh, clipboard history, bookmarks, notes, password, OTP, and Bluetooth scripts |
Deeply integrated and appropriately reused. |
st |
Password, OTP, notes, and bookmark scripts invoke it | Already the default lightweight X terminal for these workflows. |
This matters because the largest credible substitutions—window manager, launcher, terminal, and status monitor—have already happened. The remaining software mostly handles jobs for which the official catalogue has no equivalent.
sxhkd → dwm key bindingsRecommendation: replace. Priority: high. Confidence: high.
The current X session launches sxhkd as a separate daemon from .config/sx/sxrc. Its configuration contains only ten bindings, all simple Super or Super+Shift combinations:
xhisper;
Dwm already owns keyboard shortcuts through its keys[] table. Each command can continue invoking the existing script; only dispatch moves into dwm. This removes:
sxhkd APT package;
.config/sxhkd/sxhkdrc;
The scripts under .config/sxhkd/scripts/ do not need to be rewritten merely because their parent directory is named after sxhkd. Move them to a neutral directory such as .local/libexec/ only if that improves ownership; avoid churn otherwise.
The dwm source/configuration is referenced at runtime but is not managed by this repository’s installer. Before migrating shortcuts, put the exact dwm source, patches, and config.h under a reproducible source/build path. Suckless explicitly expects dwm customization to happen in source. Editing an unmanaged system copy would make the setup less reproducible, not more.
keys[] table without changing their scripts.
sxhkd launch from .config/sx/sxrc and its package declaration only after the new binary is proven.
The official dwm documentation states that dwm is configured by editing source, and contrasts this with runtime configuration systems. Your small, static shortcut set is a good fit for that model.
tmux → tabbed, scroll, or multiple st windowsRecommendation: keep tmux.
tabbed is a generic XEmbed tab container. It can group XEmbed-aware st instances, but it is not a terminal multiplexer. scroll is a terminal scrollback helper whose own page calls it experimental and not recommended for productive use; the page also says a proper experience would require a new terminal emulator like screen or tmux.
Your tmux configuration depends on:
nnn picker and interactive shells;
Replacing that with tabbed st windows would lose persistence and remote/headless operation while moving pane management up to dwm. It would also break explicit Helix and shell integration. tabbed is suitable only for a narrower, purely local X tab use case that is not evident here.
surfRecommendation: keep the current browsers.
surf is a minimal WebKit2/GTK browser with no native tab UI. It is a credible focused browser for simple sites, but your browser is infrastructure, not just a document viewer:
BROWSER=helium is the global default;
helium-agent.sh maintains a persistent automation profile;
Surf’s own documentation warns, “Compile your own webkit or expect hell,” highlighting WebKit packaging complexity. Installing it would add another browser engine without retiring the existing one. That is the opposite of the desired simplification.
sam or ed from 9base/sbaseRecommendation: keep the development editors.
9base includes Plan 9 sam and ed; sbase also provides ed. They can replace a basic text editor, not the development contract visible here. Helix is integrated with language servers, formatters, tmux popups, nnn, and clipboard commands. Neovim and VS Code are optional but deliberately provisioned with plugins/extensions.
Adopting sam could be an interesting personal experiment, but it would be a new editing workflow rather than a like-for-like replacement. It should not be presented as a complexity reduction unless the language-server and IDE requirements are intentionally abandoned.
Recommendation: do not replace the host userland.
Suckless describes sbase and ubase together as a smaller base system comparable to BusyBox. 9base supplies a separate Plan 9-flavoured command set. Your target, however, is explicitly Ubuntu/Debian with apt-get, and the scripts use host-specific command behavior and packages such as flock, setsid, lsblk, udisksctl, and GNU-style options.
Replacing commands in PATH creates subtle semantic risk across bootstrap, backup, cloud, and service scripts. It also does not let you uninstall the distribution’s essential packages safely. BusyBox is intentionally installed for its ash shell and compact applet set, so swapping it for two source-built collections is unlikely to reduce the maintained surface.
Use sbase/ubase only in a deliberately isolated image built and tested around their semantics—not as a shadow userland on this workstation.
runit user supervision → sinit/svcRecommendation: keep runit.
The X session starts one runsvdir tree, and services already use runit-compatible run/finish scripts. sinit is a minimal PID 1, not a drop-in user service supervisor on Ubuntu. Suckless svc is described only as service scripts and control programs; migrating the mature user tree would create system-integration work without a demonstrated benefit. Replacing Ubuntu’s init is outside the workstation requirement and would increase operational risk substantially.
shotgun + hacksaw) → farbfeld ecosystemRecommendation: keep the current stack.
The screenshot script supports full-screen, selected-region, and active-window capture, then writes PNG to disk and the X clipboard. farbfeld is primarily a simple lossless image format and conversion toolkit, not a direct screenshot workflow. Its page links to xscreenshot, but that utility is listed as a third-party implementation, not one of the official tools in the catalogue. Region selection and clipboard publication would still require other programs.
Changing the intermediate image format would add conversions while final outputs remain PNG. There is no simplification here.
xclip → sselpRecommendation: keep xclip.
sselp only prints the current X selection. Your configuration mostly needs the opposite direction: writing usernames, passwords, filenames, copied tmux text, and PNG screenshots into the clipboard. It also distinguishes primary and clipboard selections and uses MIME type image/png.
sselp could replace the single primary-selection read in clipboard history, but xclip would remain required for every write. Adding a second selection utility to replace one invocation is net complexity.
sxiv and ImageMagick → farbfeldRecommendation: keep them.
sxiv is used as an image viewer by .local/bin/open.sh and has a configured key handler. Farbfeld itself is a format plus converters, not a first-party graphical viewer. Its ecosystem can interoperate with viewers, including sxiv through imlib2, but does not remove the viewer requirement. ImageMagick and farbfeld also have different breadth: replacing general conversion and manipulation with pipelines would require a task-by-task audit not justified by current evidence.
blindRecommendation: keep OBS and ffmpeg.
blind is a command-line video-processing collection for composing video. Its documentation explicitly says it is not designed for small edits, uses very large raw intermediate data, has no audio support, and expects ffmpeg for extracting or adding audio. Your scripts use ffmpeg for screen/audio recording, and OBS has a recording profile. Blind cannot replace capture, live composition, hardware encoding, or audio; it would supplement ffmpeg rather than remove it.
quarkRecommendation: keep the current publisher.
quark is a small GET/HEAD static server. publish.py, however, is not only static hosting: it renders Djot, publishes atomically, maps stable job-log URLs to the newest rotated file, converts ANSI logs to HTML, and sends no-store headers. Quark could serve the generated static report directories only, but the Python service would remain for dynamic log behavior—or that behavior would need a separate generator and routing scheme.
That split adds a daemon and interface. The existing Python standard-library server has no extra package dependency and keeps the contract in one auditable file. Quark becomes attractive only if publication is redesigned to be entirely pre-generated static content for an independent reason.
ii, sic, or lchatRecommendation: no replacement.
ii, sic, and lchat are IRC clients/frontends. Your tools target Slack and Matrix protocols and APIs. Similar user intent (“chat”) does not provide protocol compatibility. A bridge would add infrastructure rather than remove it.
quark or other Suckless toolsRecommendation: no first-party replacement.
Grafana serves interactive SQLite-backed dashboards; SearXNG aggregates search engines; FreshRSS maintains feed state and an API consumed by scheduled jobs. Quark only serves static files. Suckless’s “Stuff that rocks” page mentions sfeed, but it is outside the official catalogue and replacing FreshRSS’s server-side state, API, and mark-read workflow would be a separate product decision. None is a direct substitution.
The following declared or configured areas should not be forced into a Suckless comparison:
nnn, pick, pulsemixer, Bluetooth TUI;
entr, Pi, Jira, email helpers;
herbe (already a small source-built X notifier, though not an official Suckless project).
The correct Suckless choice here is often no new tool.
| Current tool or subsystem | Candidate | Functional fit | Net simplification | Decision |
|---|---|---|---|---|
| sxhkd | dwm built-in keys | High | High | Replace |
| tmux | tabbed / scroll | Low | Low | Keep |
| Helium / LibreWolf | surf | Low for this workflow | Negative | Keep |
| Helix / Neovim / VS Code | sam / ed | Low | Negative | Keep |
| BusyBox / GNU / util-linux | sbase / ubase / 9base | Medium in isolation | Negative on Ubuntu | Keep |
| runit user tree | sinit / svc | Low | Negative | Keep |
| shotgun + hacksaw | farbfeld ecosystem | Low | Negative | Keep |
| xclip | sselp | Partial, read-only | Negative | Keep |
| sxiv / ImageMagick | farbfeld | Partial | Negative | Keep |
| OBS / ffmpeg | blind | Low | Negative | Keep |
| publish.py HTTP service | quark | Partial, static only | Negative today | Keep |
| Slack / Matrix | ii / sic / lchat | None: different protocols | Negative | Keep |
| Grafana / SearXNG / FreshRSS | quark and related tools | None/partial | Negative | Keep |
slock if you need an X screen locker; there is no current locker to replace. Note that xhisper is speech dictation, not locking.
sent for future plaintext presentations, not as a replacement for an existing configured tool.
README.md, mkfile, bootstrap.sh
setup/install-tools.sh, setup/packages/*.sh, setup/toolchains.sh
.config/sx/sxrc, .config/sxhkd/sxhkdrc, .config/sxhkd/scripts/*
.config/tmux/tmux.conf, .config/helix/*, .config/sh/env, .config/sh/functions
.local/bin/screenshot.sh, .local/bin/open.sh, .local/bin/publish.py, browser and recording scripts