Instead of asking people to extract a .tar.xz somewhere and run a random binary by hand, Tarminal installs the app into a standard location, creates a command, a desktop menu entry and an icon, tracks what it installed, and removes it cleanly later.
The project is split into two Cargo packages: tar-install, a reusable library, and tarminal, the CLI frontend built on top of it. If someone runs the bare tar-install binary directly, it just points them at tarminal.
Written in Rust, MIT licensed, maintained by TamKungZ_. The reusable core is published as the tar-install Rust crate and Python bindings for tools that want to build on the installer directly.
Tarminal installing an application from a plain tarball.
Published channels: packages are available from packages.tamkungz.me for Debian/Ubuntu, Fedora/RPM, Alpine, Void, and Arch. openSUSE Tumbleweed packages are built through Open Build Service.
Alpine (APK)
bash
sudo mkdir -p /etc/apk/keys
curl -fsSL https://packages.tamkungz.me/apk/tamkungz.rsa.pub | \
sudo tee /etc/apk/keys/tamkungz.rsa.pub >/dev/null
echo "https://packages.tamkungz.me/apk" | \
sudo tee -a /etc/apk/repositories
sudo apk update
sudo apk add tarminal
for deb in target/debian/*.deb; do
dpkg -I "$deb"
dpkg -c "$deb"
done
for rpm in target/generate-rpm/*.rpm; do
rpm -qpi "$rpm"
rpm -qpl "$rpm"
rpm -qpR "$rpm"
done
Release Process
Releases are handled by GitHub Actions when a version tag is pushed:
bash
git tag v0.2.0
git push origin v0.2.0
The workflow builds packages, signs artifacts, creates the GitHub Release, and publishes package-repository files to packages.tamkungz.me:
/apps/tarminal is only this landing/documentation page — package managers install from /apt and /rpm/$basearch (and the Alpine/Void/Arch repositories above) directly.
Tagged releases also publish GitHub Release assets, OBS sources for openSUSE Tumbleweed, AUR PKGBUILD updates when credentials are configured, the tar-install crate on crates.io, and Python bindings through the pylib-tar-install workflow.
Project Structure
text
crates/
tar-install/
src/lib.rs library exports
src/bin/ hint command binary
src/archive.rs inspect tarball, detect binary/icon/manifest
src/filename.rs parse <app>-<version>-<os>-<arch>
src/install.rs install/remove/doctor logic
src/ffi.rs C ABI used by Python bindings
src/desktop.rs .desktop generation
src/paths.rs user/system install targets
src/recipe.rs manifest/recipe schema
src/state.rs installed apps database
tarminal/
src/main.rs CLI frontend
pylib-tar-install/
python/tarinstall/ Python bindings around libtar_install.so
Status
This is an early prototype designed for iteration — but the important architecture is already separated:
tar-install can be reused by other GUIs or tools
tarminal is only a CLI wrapper around it
recipes are optional but first-class
--config lets people fix bad filename/archive detection
package publishing is automated for GitHub Releases and packages.tamkungz.me
tar-install is published for Rust and Python developers
Alpine APK, Arch Linux PKGBUILD, and Void Linux XBPS package formats
Runtime version detection fallback for when no reliable version is found from the archive filename
Metadata-based version detection: product-info.json (JetBrains IDEs), package.json / resources/app/package.json (Electron/Node apps), and plain VERSION/VERSION.txt/version.txt/build.txt/RELEASE files
Command probing fallback using --version, -version, -v, version, -V
--no-probe-version flag and probe_version: false recipe key to disable execution-based detection
Fixed
Improved version detection for apps that don't include a version in the archive filename
Fixed missing version metadata for Neovim, Blender, Java-based tools, and JetBrains IDE archives
Reduced weak filename guessing by preferring metadata / runtime probing over unreliable numeric fragments
Improved JetBrains archive handling by reading versions from product-info.json
Changed
Version detection now runs in a fixed order: user input → filename → metadata → runtime probe → unknown/None
Runtime probing happens only after extraction, against the actual installed executable path
Failed version probes no longer fail the install — they're recorded as install notes instead
Notes: runtime probing may execute the installed app with version flags — use --no-probe-version for untrusted archives. Some GUI apps may briefly open a window or write extra files when probed; metadata detection is always attempted first to reduce this.