Skip to content

Repository files navigation

Basalt

A rock-solid cross-distribution package manager for Linux.

Install packages from Ubuntu, Arch Linux, Debian, Fedora, and more—without modifying your host system.

Basalt runs each Linux distribution inside an isolated rootless Podman container while making installed applications feel native on your machine. CLI tools appear in your $PATH, GUI applications show up in your application launcher, and every distribution remains completely independent.

No root. No dependency conflicts. No host pollution.


Why Basalt?

Linux distributions all have excellent package repositories—but they're isolated by design.

Want an AUR package on Ubuntu?

Need a Fedora-only tool on Debian?

Want to test software across multiple distributions without spinning up VMs?

Basalt makes all of that possible.

Host Linux
│
├── Ubuntu Container ───── apt install ranger
├── Arch Container ─────── pacman -S yay
├── Fedora Container ───── dnf install toolbox
└── Debian Container ───── apt install neovim

            │
            ▼

      Basalt Merge Layer

            │
            ▼

ranger
yay
toolbox
neovim

Available directly on the host.

Every distribution stays isolated while your applications feel like they were installed natively.


Features

  • Install packages from multiple Linux distributions simultaneously.
  • Rootless containers powered by Podman.
  • No modifications to your host package manager.
  • Automatic CLI wrapper generation.
  • Native desktop integration for GUI applications.
  • Unified package management interface.
  • SQLite-backed package tracking.
  • Simple container lifecycle management.

How it works

Each enabled distribution runs inside a persistent rootless Podman container.

For example:

basalt-ubuntu
basalt-archlinux
basalt-fedora

Each container remains alive in the background and shares your $HOME.

When installing a package, Basalt:

  1. Resolves the appropriate distribution.

  2. Installs the package using that distribution's native package manager.

  3. Records installation metadata in SQLite.

  4. Generates host integrations:

    • Shell wrappers for CLI tools
    • .desktop launchers for GUI applications

Removing a package cleans up these integrations automatically.

Your host system remains untouched.


Requirements

  • Rootless Podman
  • Rust toolchain (cargo)

Installation

Clone the repository:

git clone https://github.com/yourname/basalt
cd basalt

Build and install:

./install

This installs the binary to:

~/.local/bin/basalt

Initialize Basalt:

basalt init

During initialization Basalt will:

  • create the required containers
  • generate configuration files
  • configure shell integration
  • add Basalt's binary directory to your PATH

Quick Start

Initialize Basalt:

basalt init

Install a package:

basalt install ranger

Install from a specific distribution:

basalt install yay -d archlinux

Run a command:

basalt run ranger

Open a shell:

basalt shell ubuntu

Update every enabled distribution:

basalt update

Commands

Command Description
basalt init Interactive first-time setup
basalt install <pkg> Install a package
basalt install <pkg> -d <distro> Install into a specific distribution
basalt remove <pkg> Remove a package
basalt search <pkg> Search enabled distributions
basalt update Update every distribution
basalt run <cmd> Execute a command inside its container
basalt run -d <distro> <cmd> Execute inside a chosen distribution
basalt shell <distro> Interactive shell
basalt merge <tool> Merge an application onto the host
basalt unmerge <tool> Remove host integration
basalt list-merged List merged applications
basalt which <binary> Find which container owns a binary
basalt status Show containers, packages, and merges
basalt doctor Diagnose common issues
basalt config Show current configuration
basalt start <distro> Start a container
basalt stop <distro> Stop a container
basalt restart <distro> Restart a container

Project Structure

basalt/
├── basalt-cli/
├── basalt-core/
├── basalt-registry/
├── basalt-runtime/
├── basalt-shell/
├── basalt-state/
└── install
Crate Responsibility
basalt-cli CLI parsing and command dispatch
basalt-core High-level orchestration
basalt-runtime Container runtime abstraction
basalt-registry Distribution metadata
basalt-shell Host integration layer
basalt-state SQLite persistence

Configuration

Configuration lives in:

~/.config/basalt/config.toml

Example:

[global]
mode = "hybrid"
default_distro = "ubuntu"

[distros]
enabled = [
    "ubuntu",
    "archlinux"
]

Installation Modes

auto

Always install using the default distribution.

manual

Prompt before every installation or command.

hybrid

Automatically resolve when possible and ask only when multiple distributions match.

Recommended for most users.


Development

Build:

cargo build

Run without installing:

cargo run -p basalt -- install htop

Each crate is independently testable. Keep command-line parsing inside basalt-cli; business logic belongs in basalt-core or the appropriate library crate.


Roadmap

  • Flatpak integration
  • OCI image caching
  • Custom repositories
  • Package pinning
  • Automatic updates
  • Plugin system
  • Export/import configurations
  • Remote container support

Contributing

Issues and pull requests are welcome.

Please keep the CLI thin, place business logic in the library crates, and write tests for new functionality whenever practical.


License

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages