Skip to content

Release notes

What changed in each release of the hub, newest first. Each release lists only the groups that apply: Features (new things you can do), Changes (existing behaviour that is different now, including anything you have to act on), Bug fixes and Updates (new versions of bundled components: IDEs, R, Python, Claude Code, ShinyProxy, ...).

Unreleased

Features

  • On your own Kubernetes cluster the installer works from a jump host: install.sh install --cluster (and upgrade, rollback, diagnose as on a single host) replaces the bundle you used to get from us. The release and your configuration are fetched with your account, your images are built where you are.
  • Documentation at https://docs.hub.linnerprogramming.com: installing on a host or a cluster, the overlay and every hub.env key, these release notes. One tree per release; the version menu at the top switches between them.

Bug fixes

  • install.sh as downloaded from our registry stopped at start with "No such file or directory": it looked for a file that only our source tree has. generate and diagnose had the same dependence. All three work from the downloaded file alone now.

v0.5.0 (2026-10-14)

Features

  • One-command installation on a single Ubuntu host: install.sh from our distribution registry fetches a release, writes your overlay from a domain, a mail address, the features, the IDEs and the auth mode (simple or OpenID Connect, Keycloak included), sets the host up and tests the hub. install.sh upgrade <version> and rollback move a hub between releases, with a backup first where backups are on; the overlay stays yours and is never overwritten.

  • install.sh diagnose writes one archive with what we need to look at a problem on your hub: host state, your configuration without its secrets and certificates, the cluster's objects, the platform's logs and the public checks. Send it to us.

  • On a cluster, session_pool=true in hub.env keeps user code (IDE sessions, apps, APIs, builds, pipeline runs) on the nodes you label and taint hub.linnerprogramming.com/pool=sessions, and the platform's own pods off them. Off by default; a single machine needs nothing.

Changes

  • For customers whose configuration we maintain, it arrives with each release and with every change we make for you: install.sh install and upgrade fetch it with your account. Your secrets and certificate files stay on your host and are never part of it.
  • Platform images come from our distribution registry, the same for every customer, with a read-only account per customer. A bundle's customer layer is built after one docker login with that account; --platform-from is no longer needed. Your own registry holds only your images (hub/*, apps/*) from now on.

v0.4.2 (2026-10-13)

Features

  • Apps bound to a git repository over SSH: hub git bind git@host:path makes a key for the binding and prints its public key and the server's host key fingerprints; register the key as a read-only access key (Bitbucket) or deploy key (GitHub, GitLab, Gitea) of the repository and run the command again. No token to paste or to renew. The https form with a token stays. Needs a rebuild of the deploy service image.

v0.4.1 (2026-10-13)

Changes

  • Security review of the platform: inside a hub, an IDE session or a Shiny app now answers the hub's proxy only, an API or MCP server its auth sidecar only, and code running in a deployed app can no longer run hub commands as whoever is viewing it. Pods that run user code can reach the internet and the hub but not the cluster's own addresses. The login token of the identity provider is no longer visible inside sessions and apps. The VS Code session has no sudo any more. hub history, hub runs and hub logs answer the app's owner and admins only. hub git bind takes https:// URLs only; uses: and system-packages: in hub.yaml must be names; r-btw, btw, hub and claude cannot be app names. Needs a platform re-apply (new network policies, a new Secret the deploy service creates) and a rebuild of the images; an overlay should copy patches/user-egress.yaml from the example and list the addresses its cluster must keep from user code. Sessions started before the upgrade are covered once restarted.

v0.4.0 (2026-10-13)

Features

  • MCP servers as a kind: a project with _server.yml (engine: mcptools, tools: tools.R, a list of ellmer tools) deploys with hub deploy as an MCP server of R tools, and every colleague its access-groups admit gets it in their Claude Code and Posit Assistant at their next session start; hub mcp lists them, hub apikey gives other clients the credential. hub::new_app(template = "mcp") scaffolds one (not on hubs without AI). R only for now.

  • Identity at APIs and MCP servers: a call from inside the hub (an IDE session, a Shiny app, a pipeline run) at the in-cluster address http://api-<name>/ is made as the user, the server's access-groups are checked on every call, and the API receives the caller in the same headers a Shiny app gets (hub::user(request)); hub::api_url() names the address. From outside, a token of the hub's IdP (Authorization: Bearer) is the identity, for people and, with the new access-clients key in hub.yaml, for registered systems; the hub's api_token_* keys in hub.env turn that on. The API key remains for callers without an identity. MCP servers are registered without a credential. Needs a platform re-apply (the HubApp schema grows); a pipeline calls with its owner's groups after its next deploy.

Changes

  • The project templates are formatted with Air and ship an air.toml whose skip = ["use"] keeps box::use() blocks as written when you format a project.
  • Apps bound to a git repository: hub git bind URL --branch main deploys the branch now and then every push to it within a minute, without an IDE session; hub deploy of a bound app is refused until hub git unbind. HTTPS with a read-only token; hub git status shows the last check and build, admins get an alert when a build from a push fails. Also as hub::git_bind() in R. Needs a platform re-apply (the HubApp schema grows).

  • Hubs without AI: ai=false in hub.env builds the IDEs without Claude Code, Posit Assistant, ellmer, btw and gander and sets none of them up.