Unified Base

Beta

One tabbed window that runs your projects — whatever language each one is written in.

Platforms
Linux (X11 / XWayland)
Built with
Python · PyQt6 · python-xlib
Unified Base running a web module and an Electron module side by side in one window

Anyone with more than a couple of side projects knows the shape of the problem: nine folders, nine ways to start the thing, nine terminals, and a window per project scattered across the desktop. Unified Base takes a folder, works out what it is, sets up its environment the way a developer would, starts it, and pulls its window into a tab.

Embedding is done at the window level through X11 reparenting, which is the reason it does not care what language a module is written in. A Rust binary, a Ruby Tk script, a C# Avalonia app and a Vite dev server all end up as panes in the same window.

Runtimes it sets up for you

  • Python — venv and pip, or uv if you have it. Dependencies from requirements files, pyproject (PEP 621 or poetry), .in files, and a recursive scan of the actual imports.
  • Node.js and Electron — npm install, then npm start, an npm script, or electron directly.
  • Native binaries — Cargo, Go, Make or CMake, built and launched; or a prebuilt executable run as-is.
  • Java — Maven or Gradle, then the jar.
  • Web apps — npm install, the dev server, and a Chromium window in app mode pointed at whatever URL it announced.
  • C# / .NET — dotnet restore, dotnet run.
  • Ruby — bundle install where there is a Gemfile.
  • PHP — composer install, then the script or the built-in server.
  • Docker — build the image, run the container.

Real embedding, not a launcher

  • Modules are reparented into their tab as real windows, so they behave exactly as they would on their own.
  • The host self-heals: when the window manager grabs a freshly mapped window back, or Qt recreates the tab’s native window, the child is re-parented under it again.
  • If a module never produces an embeddable window, its tab degrades to a control panel — logs and buttons — and the module runs in its own window rather than failing.

Arranging the panes

  • A single resizable row with draggable handles, or a grid that wraps into rows with a fixed or auto-fit column count.
  • Panes have a minimum size and the view scrolls, so loading a sixth module does not squash the other five into slivers.
  • Even out panes puts them back to equal widths in one click.
  • Any module can go Independent and take the whole window, with the tab bar still there to switch back.

Living with it

  • Per tab: Start, Stop, Restart, Rebuild Env, Embed and a live stdout/stderr log.
  • Rebuild Env wipes that module’s environment — venv, node_modules, target, build — and sets it up again from scratch.
  • Scan a folder to bulk-add every subfolder it recognises; scan a module for sub-modules to open its other entry points as their own tabs.
  • Save modules to a library, save the whole set of tabs as a named layout, and reload either in one click.
  • Per-module environment variables, startup arguments, a shared venv for the heavy dependencies, colour-coded tabs, and rename by double-click.
  • No sudo, ever. Everything is user-level.

Screenshots

The same app on both platforms, Linux on the left. Click any shot to open it full size.

Six modules running at once in a grid layout
Six modules at once: a Vite web app, Electron, C# Avalonia, a Ruby Tk clock and a Java Swing table.
Five colour-coded modules including a Rust raytracer and a PHP dashboard
Tab colours carry through to the pane borders, so you can tell at a glance which pane is which tab.
The same modules with their live log panels open
Logs toggle per module — the build output, the dev server’s requests, and the embed handshake.
Panes being resized by dragging the handles between them
Drag the handles to size panes. Past the window width the row scrolls rather than squashing.
The File menu showing module and layout commands
Add a module, scan a folder for several, or restore a saved layout of tabs.
The View menu showing row and grid arrangement options
Single row or grid, column count, minimum pane size, and even out panes.
The right-click menu on a module tab
Per module: independent mode, embedding, a shared environment, and startup arguments.

Getting hold of it

Unified Base is in beta and not published for download yet. Want a heads-up when it lands? Say so on the contact page.

← All software