Native on Omarchy · GTK4 + libadwaita

Toolport is native on Omarchy.

One local MCP gateway for every AI client, in a real GTK4 shell that follows your Omarchy palette, tiles like every other Hyprland window, and updates through pacman. No web view, no bundled browser engine, no self-updater. Free and open source, same as always.

For Arch and current-GTK distros. Ubuntu 22.04 and Debian 12 keep the .deb and AppImage - nothing changes there.

A quick tour in the native shell: servers, catalog stacks, clients, and agent permissions - in the active Omarchy theme, the whole way through.

What native means here

A real desktop app, not a browser in a trench coat.

GTK4 and libadwaita, not a web view

The shell links the GTK stack your system already has and picks up your fonts, your icons, and your cursor. The cross-platform build draws its UI in a WebKitGTK web view; this one has no web view at all.

Follows your Omarchy palette

It reads $XDG_STATE_HOME/omarchy/current/theme/colors.toml and paints itself with your active theme. Switch themes and the app follows. Every field has a fallback, so it still renders correctly off Omarchy.

A normal Hyprland window

Tiling, floating, and geometry belong to the compositor. No centering workarounds, no forced sizes, no fighting your binds. It tiles and swaps workspaces like anything else on your desktop.

A tray icon that cannot strand you

StatusNotifierItem, like every other tray app. A hidden launch only happens when a live SNI watcher is present, so the app cannot start invisible with no way to reach it.

Credentials in your keyring

Secrets go to the Secret Service over D-Bus - gnome-keyring on Omarchy, KWallet on KDE. They never land in Toolport's registry, and never in plaintext. Headless boxes with no keyring can switch to an encrypted file backend by setting TOOLPORT_SECRET_KEY.

Updates belong to pacman

There is no self-updater in this build. New versions arrive with pacman -Syu or the Omarchy update flow, signed, like everything else on your system.

Gateway internals

Numbers you can check.

Measured by driving the real gateway over stdio against a stub MCP server. Reproduce any of it yourself - that is the point of writing the numbers down.

Lazy discovery
With it off, the client sees 9 tools. On, the client sees 7 meta-tools and the downstream catalog is hidden. The agent searches and calls through them, so adding a server does not grow the context window.
Result shaping
A 120,000 character tool result came back as 48,966, with a marker naming the exact continuation cursor for toolport_fetch_result. Nothing is dropped, only deferred.
Human approval fails closed
With the app not running, a gated call is refused in 0.2s with an actionable message. Ungated calls are unaffected.
Agent confirmation
A 60 second single-use token. Replaying it is rejected.
Destructive-tool blocking
Hidden and refused. New in 1.18.0: the catalog used to keep listing tools the policy would refuse.
Audit privacy
Rows carry argsHash, durationMs, ok, server, tool, ts. A secret passed as a tool argument appears in no log file. The files live in ~/.config/Toolport - go grep.

The audit claim is the one worth verifying: ~/.config/Toolport holds the rows, the columns are listed above, and the secrets you passed stay out of them.

Also in the box

The parts this audience asks about.

Multi-tenant HTTP endpoint

Scoped clients each get their own bearer token and server scope. Verified: the admin token saw 8 tools, the scoped token saw its 4, and an out-of-scope call was refused by name. This is the Open WebUI story.

Per-project scoping

A folder maps to a profile. The gateway reads the project root the client reports and switches automatically. Longest path wins, so a nested repo overrides its parent.

Streamable HTTP, with sessions

The gateway speaks MCP streamable-HTTP with session ids, so remote clients keep state without a stdio pipe.

An OpenAPI path per tool

Every tool gets an OpenAPI path, so anything that can call an HTTP API can reach your servers without speaking MCP.

Cursor guard, observe or enforce

The guard hook runs in observe mode to show what would be blocked, or enforce mode to block it, from the same rule set as every other client.

Rules that read back

Agent permission rules are read back per client rather than write-and-trust, so you can see exactly what each agent actually loaded.

On screen

Captured on Omarchy, tiled, unretouched.

Toolport Playground on Omarchy with the Run list_issues dialog open over the Linear tool list, showing the arguments editor
Playground, running a tool Run any tool from any server without an AI client. Calls show live status and land in Activity.
Toolport agent permissions on Omarchy showing rule presets and the Claude Code and Cursor enforcement targets
Rules, and where they enforce Claude Code pattern syntax, presets including the new never-sudo, and two enforcement targets: settings files Toolport owns, and the Cursor guard hook.
Toolport Activity on Omarchy showing tool drift and result injection findings in the protection history
Findings, not noise Tool drift and result injection findings, with per-field fingerprints naming what changed. Activity records outcomes and timing, never arguments.
The Toolport tray menu in the Omarchy status bar showing open, pending approvals, and quit
In the tray Open, pending approvals with a count, quit. Drawn by your bar, like every other SNI item.
Install

pacman owns this one.

The package is toolport. It ships through Toolport's own pacman repository, so updates arrive with your usual pacman -Syu or the Omarchy update flow.

# Arch, Omarchy, EndeavourOS, Manjaro
curl -fsSL https://toolport.app/install.sh | bash

That adds the repository, trusts the signing key, and installs the package. If you would rather not pipe a script into a shell - reasonable - here is exactly what it does:

curl -fsSL https://repo.toolport.app/toolport.gpg | sudo pacman-key --add -
sudo pacman-key --lsign-key A16BFA2E1014BD6BD718CC6E6621247E3FFA6AA7

printf '\n[toolport]\nServer = https://repo.toolport.app/$arch\n' | sudo tee -a /etc/pacman.conf
sudo pacman -Sy toolport
Straight answers

What "native" does not mean.

It is not "native on every Linux"

The shell needs GTK 4.10+ and libadwaita 1.4, which rules out Ubuntu 22.04 and Debian 12. Those keep the .deb and AppImage, and those builds still ship. Native here means Arch and current-GTK distros.

One instance, on purpose

Both Linux builds read the same ~/.config/Toolport, and only one process can hold the approval broker's endpoint. That is why the package conflicts with toolport-bin instead of sitting beside it - a second instance would silently miss every approval prompt.

Bring your gateway home.

Free, open source, and packaged like a proper Arch app.