All articles
Linux 1.3.7 Release 22 August 2026

A GNOME desktop for the whole research loop: Verbinal for Linux 1.3.7

Verbinal for Linux is a native GTK 4 desktop for the CANFAR Science Platform and the CADC, written in Rust. It searches the archive, runs notebooks on a local kernel, orbits spectral cubes in 3D, turns research protocols into checklists you tick off, and hands the whole app to an AI agent over MCP — from one window, with your data staying on your machine. This is a tour of what it does at 1.3.7, and an honest account of what five releases in nine days changed.

Verbinal has been a native companion for the CANFAR Science Portal and the Canadian Astronomy Data Centre (CADC) across macOS, iOS, Windows, and Android. The Linux app is the member of the family that has never had a page of its own here — which has become conspicuous, because it is no longer the modest session manager it started as.

It is written in Rust, with a GTK 4 and libadwaita interface, a Tokio runtime bridged to the GLib main loop, and no Electron anywhere near it. It is not a port wearing another platform's clothes: it looks and behaves like a GNOME application because it is one. It installs from a .deb, it is free software under the GNU Affero General Public License v3.0, and its interface ships in English and French.

Version 1.3.3 brought it to parity with the Windows app's Workflows-and-AI generation. The four releases since — 1.3.4 through 1.3.7, all inside three days — were something less glamorous and more useful: six QA sessions driving the app against the live service, and the fixes that came out of them. Both halves of that story are below.

The Verbinal for Linux Welcome screen: a GNOME sidebar listing Home, Portal, Storage, Search, Research, FITS Viewer, Cube Viewer, Notebook, Workflows and AI Guide, beside a grid of ten module tiles.
The Welcome screen, one tile per module. Ten of them, and the sidebar reaches any of them in one click.

A protocol you can tick off. An agent that can run it, and has to ask before it breaks anything. A cube you can turn in 3D. One GTK window, and your data never leaves it.

What Verbinal for Linux is

If it is new to you: Verbinal for Linux is a desktop client for CANFAR and the CADC that needs GTK 4.12+, libadwaita 1.4+, and a Secret Service provider — GNOME Keyring, KDE Wallet, or an equivalent — where your CADC token lives instead of in a config file. Install the .deb from GitHub Releases with sudo dpkg -i verbinal_*_amd64.deb, or build it from source with cargo build --release.

The app is a set of modules, each a tile on the Welcome screen: Portal for sessions and batch compute, Search for the CADC archive, Research for what you have downloaded, Storage for VOSpace, a 2D FITS Viewer, a 3D Cube Viewer, a native Notebook, Workflows, and the optional AI Assistant and AI Guide. Portal, Storage, and compute need a free CADC account; Search and both viewers work without signing in, so you can pull a public file and inspect it before you ever log in. There is no telemetry anywhere in the app.

Portal: sessions, batch jobs, and what is inside a container

Portal is the CANFAR control room. Launch and manage interactive Skaha sessions — Notebook, Desktop, CARTA, Firefly, Contributed — from a Standard form, an Advanced one that takes a custom registry image with credentials, or a Headless tab for work that does not need a screen. Around the edges sit the numbers you plan around: your VOSpace quota, a Recent Launches list for one-click re-launch, and a Platform Load panel with live cluster CPU and RAM availability.

The Verbinal for Linux Portal: three running sessions with CPU and RAM in use, a Standard/Advanced/Headless launch form, user home storage quota, a Batch Jobs summary, Recent Launches, live Platform Load, and a CANFAR Images catalogue.
Portal — active sessions with their real CPU and RAM in use, a launch form, batch jobs, your quota, live cluster load, and the CANFAR image catalogue, in one adaptive layout.

Headless batch jobs run with replicas that are actually replicas: one launch per replica, each named job-N and told which one it is through REPLICA_ID and REPLICA_COUNT. Because CANFAR reaps finished jobs within seconds, Verbinal remembers the last fifty along with the reason each failure failed — captured from the job's logs and events while the job still exists, since those die with it.

The catalogue at the bottom is more interesting than it looks. Image Discovery answers a question you would otherwise answer by launching a session and poking around: which of these 359 container images has the package I need? It inspects images with a small headless probe, publishes the manifest to your own VOSpace so a second machine or a reinstall costs no jobs, and lets you facet the catalogue by OS family, version, and the packages inside.

The Find image by package dialog in Verbinal for Linux: a faceted filter panel on the left listing OS families and versions with counts, and a scrolling list of matching container images on the right, each with Use this image and Discover buttons.
Find image by package — facet 359 container images by OS family, version, and the packages they carry, then launch one without leaving the dialog.

Find it, keep it, store it: Search, Research, Storage

Most projects begin at the archive, and Search queries the CADC directly over TAP — CFHT, JCMT, DAO, Gemini, HST, JWST, MOST, and more. Do a cone search by coordinate or resolved target name, or write ADQL yourself in the editor tab. Narrow the results with live column filters that understand boolean expressions!tess & !apass means what you would expect — preview a row without leaving the grid, save the queries you will run again, run a VizieR catalogue cone search alongside, and export to CSV or TSV.

CADC Archive Search in Verbinal for Linux: a results grid of HST observations of M-51 with per-column filter boxes, a preview popover showing the observation image and its metadata with a Save to Research button, and panels for Recent Searches and Saved Queries.
Search results with a per-row preview popover — the image, its metadata, and one button to keep it. Recent searches and saved ADQL queries sit alongside.

What you keep lands in Research, a local library organised by observation, with previews, per-observation notes, and an exportable research bundle. The bundle can now carry the data files themselves, streamed through a ZIP64-capable writer so a multi-gigabyte cube is fine, and it includes the citation fields — proposal id, PI, title, data release — that its own README tells you to cite.

The Research module in Verbinal for Linux: a list of nine downloaded observations on the left, and on the right a MOST Fabry image of Altair with its CAOM2 observation metadata, file info, and a 'Created by AI agent' badge.
A downloaded MOST observation of Altair, its CAOM2 metadata filled in from the archive rather than left blank — and a badge recording that an AI agent, not a person, fetched it.

Storage is a full VOSpace/ARC browser — upload, download, organise, share a folder with a group or make it public, all with quota tracking. Transfers stream, with a progress strip and a cancel button; a download lands in .tmp and is renamed only once it is complete, so a failed transfer never leaves a truncated FITS file that looks whole.

Workflows: research protocols you can tick off

A great deal of astronomy is procedure — the ordered set of steps that turns a question into a measurement — and that procedure usually lives in someone's head, a lab wiki, or a stale README. Workflows makes it a first-class object: a protocol written as a plain markdown checklist, rendered as numbered step cards you check off as you go, with the check-off written back byte-preservingly so the file stays yours.

The Workflows module in Verbinal for Linux: a panel of seven built-in templates and a list of local workflows, beside a completed 'Altair delta-Scuti seismology from MOST archival photometry' protocol showing 9 of 9 steps checked off, each card carrying tool chips and a link into another module.
A completed replication protocol, 9/9 steps ticked. Each card names the tools it uses — execute_adql_query, download_observation, run_cell — and links into the module that does the work.

What makes it more than a to-do list is that the steps are wired into the app. Each card names the concrete action it stands for and links straight to the module that carries it out, so download all four epochs is one click from actually downloading them in Research. Verbinal ships seven built-in, Canada-first templates — archival imaging reconnaissance on CFHT MegaCam, stellar spectroscopy on DAO Plaskett and CFHT ESPaDOnS, batch reprocessing as headless jobs, a VizieR cross-match sample builder, observing-proposal due diligence, spectral-cube kinematics, and variable-star time-series photometry — and you can write your own in markdown with a live-preview editor. Keep a workflow local, or publish it to your team over VOSpace. And because a protocol is also a plan an agent can execute, every workflow has a Copy prompt button.

An AI assistant that can drive the app — and has to ask

Verbinal for Linux can pair with your own Claude Desktop, Claude Code, or any MCP client. A verbinal mcp bridge speaks the Model Context Protocol over a private per-user UNIX socket, and a guided connect wizard writes the client config and runs a self-test. The agent gets the same app you use: search and download, both viewers, the notebook, storage, sessions, and Workflows it can follow or author.

The AI Guide in Verbinal for Linux, reporting 135 tools in 16 categories, with a filter box, a list of user-authored guide tools, and category tiles for Foundational, Search & Archive, Saved Queries, Research & Notes, Downloads, FITS Viewer, Cube Viewer, Notebook, Storage, Sessions, Headless/Batch, Image Discovery, AI Compute and Workflows.
The AI Guide — 135 tools sorted into 16 categories, each description editable so you can re-tune how the agent sees a tool. You can also author guide tools of your own that hand the agent your conventions verbatim.

The reason this is comfortable rather than alarming is the control model. Read-only calls apply straight away; anything consequential queues as a proposal a human approves in the app, and destructive operations always do. Every action lands in an event log, and anything an agent created carries a robot badge so you can see whose work it was — the Altair observation two figures up is marked exactly that way. The AI Guide lets you rewrite how each of the 135 tools describes itself, live, so you can widen or narrow what the agent reaches for. It is an assistant with its hands visible, not an autopilot.

Two viewers: FITS in 2D, cubes in 3D

Data you can see is data you can trust, and Verbinal brings its own viewers rather than sending you to a browser. The FITS Viewer is a 2D image viewer with projection-aware WCS including SIP distortion (TAN, SIN, STG, ZEA), a coordinate readout and go-to, pixel probing, saved coordinates, multiple stretches and colormaps, a North-up rotation taken from the WCS, and an extension picker for multi-HDU files. Search here turns the crosshair into an archive query. Open several files at once and compare them: a linked crosshair that follows the same sky position across tabs, synchronised zoom across different pixel scales, and a blink mode with an adjustable fade.

The Verbinal for Linux FITS Viewer showing the SCI extension of a JWST/MIRI image of M51 as greyscale spiral structure, with a red WCS crosshair reading RA 13h29m51.73s Dec +47d12m07.60s, and Display, View, Crosshair and Compare panels on the right.
A JWST/MIRI image of M51, SCI extension, with the crosshair reading sky coordinates straight off the WCS. Blink, linked crosshair and synchronised zoom sit in the Compare panel below.

The Cube Viewer is the same idea in three dimensions. In 3D mode it is a real volume renderer — a GLSL ray-marcher on a GtkGLArea — and you fly around position–position–velocity space: orbit, zoom, auto-orbit, switch to a maximum-intensity projection, and shape the transfer function with density, spectral scale, and an editable opacity curve until the noise floor drops away and the structure stands out. A Slice mode reads a single channel with WCS coordinates and a spectral value, and click-to-probe pulls the full spectrum through the cube at any pixel. Along the bottom, a channel scrubber with an intensity waveform shows the spectral structure of the whole cube at a glance and plays through it. Export figure composes a publication plate as PNG or PDF rather than taking a screenshot.

The Verbinal for Linux Cube Viewer in 3D mode: a DRAO Faraday-depth cube rendered as an OpenGL volume in the Inferno colormap with labelled galactic coordinate and Faraday depth axes, a slice plane through it, and a Display panel with colormap, stretch, window, density, spectral scale, quality and an editable opacity curve.
A DRAO Faraday-depth cube as an OpenGL volume render, with a slice plane through it, axis captions in galactic coordinates, and an editable opacity curve. The channel scrubber and its intensity waveform run along the bottom.

One detail here is specific to Linux and worth stating rather than hiding: GPU drivers vary a great deal more on Linux than on a Mac or a well-behaved Windows box, so the Slice mode is entirely GL-free and always available. If the volume renderer cannot start on your machine, you still get the channel scrubber, the spectrum probe, the WCS readout, and figure export — the measuring instruments — rather than an error dialog and nothing.

Notebook: a local kernel, and a remote one when you want it

Some analysis wants code, and Verbinal runs it in place. The Notebook module edits and executes .ipynb files natively against a local Python kernel — your system python3, no browser, no server to start, no JupyterLab tab to babysit. Open several notebooks in tabs, run a cell or the whole book, see matplotlib figures render inline. From a downloaded observation in Research you can seed a ready-to-run analysis notebook, so a Workflow step like photometric extraction lands you in a real, populated notebook rather than a blank cell. Missing packages can be installed from the notebook — carefully, because on Ubuntu the system Python is externally managed and pip install --user is refused by design; Verbinal offers to override that only after pip itself says so, and only if you ask.

There is a second kind of compute, and knowing which one you are using matters. Notebook kernels run locally, on your machine, with whatever you have installed. run_code — the tool an agent reaches for — runs remotely on a warm CANFAR container: Python 3.11 with astropy, numpy, matplotlib and pyvo, your /arc/home mounted, and your CADC certificate available for authenticated archive fetches from inside the job. Local for anything touching your own files; remote for anything that wants the platform's data and packages.

Built the Linux way — and how it differs from the Mac and Windows

Because Verbinal is written natively on each platform, the Linux app is not the Mac or Windows app recompiled. A few differences are worth naming outright:

  • Toolkit. Rust with GTK 4 and libadwaita, where macOS is SwiftUI and Windows is WinUI 3. It follows your GNOME theme and adaptive layout rather than approximating a system it is not running on.
  • 3D rendering. The Cube Viewer is an OpenGL (GLSL 330) ray-marcher in a GtkGLArea, with a GL-free Slice mode as a guaranteed fallback; macOS uses Metal and Windows uses Direct3D, neither of which needs that fallback.
  • Credentials. Tokens live in the system keyring through the Secret Service API — GNOME Keyring, KDE Wallet, or another provider. On macOS that is the Keychain; on Windows, the Credential Manager.
  • Distribution. A .deb from GitHub Releases, or cargo build --release from source. There is no store gatekeeper between you and the app, and no sandbox restricting which of your files it can read.
  • Licence. AGPL-3.0, the same as the Windows client; the Mac app is MPL-2.0.
  • Requirements. GTK 4.12+, libadwaita 1.4+, a Secret Service provider, and Python 3 if you want to run notebooks locally.

What five releases in nine days actually changed

1.3.3 landed the features. Then six QA sessions drove the app against the live CADC and CANFAR services — including two end-to-end replications of published papers, run entirely on-platform — and 1.3.4 through 1.3.7 fixed what that turned up. It is worth being specific, because the pattern is instructive: almost none of it was visible from inside the code.

  • A filter that had never worked. The search form's Public data only option built ADQL with GETDATE(), which is T-SQL; CADC answers "Function [GETDATE] is not found in TapSchema". It had never worked here or in the Windows app it was ported from. CADC declares ADQL 2.0 with twelve geometry functions and no UDFs, and a guard now refuses any call outside that set — which is what would have caught it on day one.
  • Transfers ran blind. Storage held whole files in memory, so a 5 GB cube needed 5 GB of RAM, showed nothing until it finished, and could not be stopped.
  • A download that produced nothing counted as a success. One CADC endpoint answers HTTP 200 with an empty body for a publisher id it cannot resolve, so a zero-byte file landed in the library reported as "Downloaded … (0 bytes)". Zero bytes is refused now.
  • Every record in the library was anonymous. Target, instrument, filter and coordinates were only ever filled in by saving a search result, so anything fetched by publisher id arrived with a file and nothing else. A download now asks the archive — one indexed query, a quarter of a second.
  • Three services reported a 4xx beside a green tick. The label was not the fault; the probe was. It sent a bare GET to endpoints that answer 400 or 401 to exactly that, then called the host healthy because it had replied. Every IVOA service publishes /availability for this question, and the probe reads that document now — so a service announcing planned downtime is reported as down, in its own words.
  • An agent could not connect, and nothing said why. One tool advertised a malformed schema; clients that validate before registering rejected the whole list, which presents as "this server has no tools" rather than "one tool is malformed". Every advertised schema is checked now.
  • An agent's work was recorded as yours. Nothing an agent created ever earned its badge, because the router applied a copy of the record taken before the badge was stamped.
  • Pending proposals did not survive a restart. Seven awaiting review vanished in silence, and one already approved was voided. The queue is journalled and rehydrated now.
  • 89 suppressed dead-code warnings hid five real defects — features written and never wired up. The shipping build lints with dead_code on.

The test suite went from 841 to over 1,200, and the additions are the interesting part: invariant tests that walk the live tool manifest checking that every advertised argument is read by something and everything settable is readable, and tests that walk the source for strings a person reads — nothing reaches a label or a toast without the catalogue, and every localized string has a French form. That last one matters, because at 1.3.3 the French was only ever the part the reference had: 621 user-visible strings were reaching people in English, including whole screens. All of them are translated.

Privacy, source, and how to get it

The privacy posture is the same one every Verbinal app keeps. No data collection, no analytics, no crash reporting, no third-party services — the app has no backend of its own. Your CADC credentials stay in the system keyring, and network traffic goes directly to CANFAR and CADC over HTTPS with nothing in between. Data you open in the viewers is read and rendered on your own machine; the cube you turn in 3D is never uploaded.

Verbinal for Linux is free and open source under the GNU Affero General Public License v3.0, with the full source at github.com/szautkin/CanfarDesktopUbuntu — the FITS parser, the WCS handling, the volume shader, and the MCP tool layer described here are all things you can read rather than take on faith. Install the .deb, open a tile, and — if you like — start from a Workflow template and let it walk you from the archive to a figure without leaving the desktop.

Get Verbinal for Linux

Free and open source under AGPL-3.0. GTK 4.12+, libadwaita 1.4+, and a free CANFAR account. Search and both viewers work without signing in — and your data stays on your machine.

Download .deb Source Code