Skip to main content

Pipeburn

Write ISOs to USB straight from a URL.

Paste a link, pick a drive, and Pipeburn streams the image directly to the device while hashing it on the fly. It's the curl | dd workflow with a GUI and safety rails: USB-only device picker, a confirmation showing the drive's model and size, optional SHA256 verification, and on-the-fly .xz / .gz / .zst decompression.

Status: early (v0.1), Linux only. The core and GUI are tested against local HTTP servers and plain files. Try it on a spare stick first, because writing to a drive erases it.

Install

Debian, Ubuntu, Mint. Download the .deb for your CPU (amd64 or arm64) from the latest release. It carries its own PySide6, so nothing else is needed:

sudo apt install ./pipeburn_*.deb

Arch: build packaging/arch/PKGBUILD with makepkg -si.

Anywhere else, with pipx:

pipx install pipeburn            # or: pipx install "pipeburn[zstd]" for .zst images
pipeburn

From source:

git clone https://github.com/Hexcrown/pipeburn
cd pipeburn
python3 -m venv .venv && . .venv/bin/activate
pip install .
pipeburn

Needs lsblk and umount (util-linux, present on practically every distro) and pkexec (polkit) for the root prompt. The .deb and Arch packages also install a root-owned helper and a polkit policy, so the password prompt says "Pipeburn" and the root code is never loaded from your home directory. Installs without them still work, but the prompt is the generic one.

On macOS only --dry-run works so far. If you see a certificate error with a python.org install, run Install Certificates.command from the Python folder in Applications.

Want to look around without touching a drive? Run pipeburn --dry-run /tmp/test.img. It writes to a file instead.

How it works

GUI (PySide6, unprivileged)  --pkexec-->  worker (root, stdlib only)
   URL, checksum, drive          JSON lines     validate -> unmount -> stream -> fsync -> read back

The worker re-checks the target itself, so a bug or tampering in the GUI cannot point it at a system disk.

  • USB disks only. Internal disks, read-only media and empty card-reader slots never appear.
  • Never the running system. Disks with /, /boot, /home, /usr, /var, swap or a live-USB mount are excluded.
  • Confirmation shows model, size, device path and what will be unmounted.
  • SHA256 is computed over the bytes as downloaded, so it matches the checksum a distro publishes even for .xz / .gz / .zst downloads.
  • Read-back verification re-reads what was written and compares hashes (best effort at bypassing the page cache).

Logging and debugging

  • Log file: ~/.local/state/pipeburn/pipeburn.log (or $XDG_STATE_HOME/pipeburn/), rotating at about 1 MB with three older files kept. The same lines show in the window's log pane.
  • pipeburn --debug adds detail (HTTP headers, first bytes of the image, write progress, drive lookups) and turns on debug logging in the root helper too.
  • Copy log puts the session log, with version and Python info, on the clipboard. Paste it into a bug report.
  • The helper runs as root and never writes into your home directory. Its log lines are sent to the GUI, which writes them to the file. Unexpected errors include a full traceback.
  • Secrets stay out. URLs are logged without credentials, query strings or fragments (signed download links keep secrets there), and your home directory shows as ~ in copied logs. A log can still contain drive names, file paths and a checksum you entered, so skim it before posting publicly.

Limits

  • No resume. If the connection drops mid-write, the drive is half-written; start over.
  • The checksum is checked after writing. A mismatch means the drive holds a bad image. Pipeburn says so, but it cannot know in advance.
  • Compressed images can't be size-checked up front. An uncompressed image larger than the drive is rejected before writing; a compressed one is caught when it overflows.
  • Cancel leaves a partial write. Burn again before using the drive.

Development

pip install -e ".[dev]"
pytest

The core (core.py) is standard library only and has no GUI imports, so most tests run without Qt. The GUI tests use the offscreen Qt platform and skip if PySide6 is missing.

src/pipeburn/
  core.py       stream, decompress, hash, write, verify
  devices.py    USB-only discovery and safety checks (lsblk)
  worker.py     privileged helper, reports JSON lines
  launcher.py   builds the pkexec command
  logs.py       log file, in-memory log for Copy log, URL redaction
  gui.py        PySide6 window
  assets/       app icon (svg, png, icns, ico)
  theme.py      colours and Qt stylesheet
packaging/      .deb build script, PKGBUILD, polkit policy, root helper, .desktop file

Roadmap

  • Windows and macOS device backends
  • AppImage / Flatpak packaging
  • saved list of favorite image URLs

License

MIT

Metadata

Release files for pipeburn 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pipeburn 0.1.0
File Size Uploaded
pipeburn-0.1.0.tar.gz 323.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pipeburn 0.1.0
File Interpreter ABI Platform
pipeburn-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 633.9 kB

Release files / pipeburn-0.1.0.tar.gz

Download URL pipeburn-0.1.0.tar.gz
Size 323.7 kB
Tags Source
SHA-256 checksum
How to use checksums
5468569b758415eb542f5abaa4d242f7bcfd2ff0d6fd1376a68f5326e0217fa2
BLAKE2b-256 checksum
How to use checksums
02dd38043e6cee7ac67364ffdc4e5cc85b04f8ae3eeaa140224f6c8a7b05894d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release files / pipeburn-0.1.0-py3-none-any.whl

Download URL pipeburn-0.1.0-py3-none-any.whl
Size 310.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
66fbc3b3a587208b2c3a69c347e1bd1b422b2e99546d6d9b672c06f6bd2dd13b
BLAKE2b-256 checksum
How to use checksums
3e0368e23070c6003876afcc45de977a603b1e118b1bb5bdcd8fe5fcbb399df6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page