Bouwer - desktop firmware builder GUI (Linux/Windows)

Some users expressed interest in building their own images locally, but lack the skills to either set up the necessary dependencies for the prepackaged image builder, or use containerized images. With that in mind I made a simplified desktop GUI for the official image builders. The app still uses Podman or Docker under the hood, so some assembly required.

Features

  • Allows easy configuration of installed packages, setting the size of the root filesystem, disabling unwanted services, and including a filesystem overlay with your custom files.
  • Uses official OpenWrt image builder images (via Podman or Docker).
  • Stores and loads your build configurations as presets, making it easy to reuse settings for newer OpenWrt versions.
  • Caches OpenWrt profile metadata, packages, and image builders to speed up subsequent operations.
  • Manages downloaded image builders and allows removing them from within the app.
  • Supports OpenWrt version 21.02 and above, including release candidates.

Currently, modern Linux and Windows running on x86/64 are supported. Windows version only tested on 11 in a VM with Podman Desktop. Linux version tested on Fedora 43 x86/64 and SteamOS 3.8.1.

macOS on aarch64 is doable, but there's no practical way for me to test this at the moment, although the basic macOS-specific hooks are there. If anybody wants to donate a remote aarch64 macOS VM, then it's probably a matter of hours to implement.

Please read the requirements and the usage instructions. And read the build log in the build folder after building to see if it matches your package selection.

Feedback, suggestions, and GH stars are welcome :duck:

UI demo (not the latest version):

5 Likes

An available desktop GUI to build an image on a device would be useful in cases for when LuCI Attended Sysupgrade or the The OpenWrt Firmware Selector is unable to be used.

The only thing I would request to have would be the ability to add any user-added packages from their current router.

As to how, previous ideas mentioned were a copy-paste function in LuCI, or a config file to drag and drop. Otherwise, thinking out loud now, perhaps displaying on the GUI a command or script we could copy and run via ssh to get the packages list from.

could be stupid question but will this enable building NSS & modem packages or it’s restricted to vanilla builds only?

If by building you mean compiling from source, then no. This is a user-friendly front-end for the image builder: i.e. picking release, target, packages, etc. Think of it is a local firmware selector/ASU.

1 Like

Correct me if i’m wrong, but in image builder, if i want to lets say remove a default package like dnsmsq, i have to do “-dnsmasq”. But that in turn removes dependencies for that package too.

In the firmware selector website, we can provide a custom package list irrespective of the default packages and it builds the image with only the package list i gave it.

Or have i been using image builder wrong in some way?

The tool passes the list of package to image builder via PACKAGES=. The internal logic of the image builder for package list is:

  • take user provided packages if any
  • add default target packages and profile-specific packages
  • add base packages (libc, kernel, etc.)
  • remove any - packages

I'm not sure what the firmware selector does differently. I supposed this could mimic the behavior, if that makes sense.

Firmware selector basically does,

  1. Take user provided package list.
  2. Add any/all dependencies of those packages.

The user provided package list in this case will replace any default packages of the target.

Any removals also doesn't need to be specified seperately.

Basically the list that user provided is all the packages which will get installed and that's it.

So my update workflow so far has been,

  1. Save the custom packages list for my router.
  2. When a new release comes out, compare my package list to the default to see if any new packages have been added.
  3. Then paste my package list on the firmware selector website and generate a custom build.

I specifically remove ipv6 packages and things like firewall from my AP’s to save space and reduce overhead.

But I haven't found a way to replicate the above with image builder yet. It always removed dependencies when I remove a base package.

I'm basically doing this now (latest UI):

If any of the default packages are missing from the package list, show them in Removed default packages and pass them to the image builder with -.

2 Likes

it is a very good idea. may i suggest to consider adding two things please:

  1. allow services to be disabled the same way it is already supported via DISABLED_SERVICES variable
  2. add a small, simple web server to offer built images to directly download to a router, instead of ftp/scp it.

thanks

How would that be materially different from scp, considering you still need to ssh into the device?

it is a file transfer either way, you are right, but i found fetching from target host is easier.

I released the first version on GitHub. Linux and Windows binaries are available from the release page.

Please read the updated first post for some additional notes.

1 Like

This is awesome. :clap:

Not sure how, but if it would be useful to use my Mac remotely, message me and I'm happy to let you do what you need to do on it.

1 Like

New version 0.2.0 has been released with multiple under-the-hood changes. Bouwer now shows the actual image builder command used to build images and allows managing downloaded image builders from within the app:

2 Likes