Inside ShellHub: March 2026 #6108
Locked
gustavosbarreto
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Two months ago we laid out a three-phase rollout plan: ship the new React UI on MongoDB, introduce migration tooling, then switch to PostgreSQL. All three phases shipped. v0.22.0, v0.23.0, and v0.24.0 are out — the React frontend is the default interface, PostgreSQL is the default database, and the enterprise architecture was unified along the way. Here's a closer look at what happened.
Highlights
UI: From parity to product
Status: The React UI is now the default at
/. The legacy Vue frontend is still available at/v1but is no longer maintained.The first edition of this post described a UI that had reached Community Edition feature parity. Since then, the frontend evolved from "everything Vue had" to "things Vue never had."
Secure Vault is a client-side encrypted SSH key store. Keys are encrypted in the browser before they reach the server, and decrypted only at connection time. This means the server never sees your private keys in plaintext — a capability the old UI never offered.
Session recording playback lets you review past terminal sessions as recorded video, with full scrollback and timing preserved. This was an Enterprise feature that existed only as raw data before; now it has a proper player.
Other additions include a welcome onboarding wizard for first-time setups, a migration status page with live progress feedback during the MongoDB-to-PostgreSQL transition, and a namespace creation dialog for Community Edition users.
Under the hood, the entire data-fetching layer was rebuilt. Hand-written API wrappers were replaced with a generated OpenAPI SDK (via hey-api/openapi-ts), and all data fetching now goes through TanStack Query with proper caching, invalidation, and loading states. This alone eliminated entire categories of bugs around stale data and race conditions.
Up next: Now that the major migration is behind us, the focus shifts to polish: fixing rough edges found in production, improving test coverage, and starting work on features that were deferred during the rewrite.
Database: PostgreSQL is the default
Status: PostgreSQL ships as the default database in v0.24.0. The MongoDB-to-PostgreSQL migration pipeline is production-ready with deep validation. Cloud-specific migration is also complete.
The migration story matured significantly. Beyond the store-layer completeness we reported last time, the pipeline now includes:
On the store testing side, a new storetest package with YAML fixtures enables the same tests to run against both MongoDB and PostgreSQL. Coverage now includes sessions, tunnels, public keys, namespace cascading deletes, device cascading deletes, and more.
All PostgreSQL migrations (nine for core, nine for cloud) were squashed into single SQL files per edition, making fresh installs clean and fast.
Up next: Performance benchmarking under production workloads, monitoring the migration path for early adopters, and continuing to expand storetest coverage.
Enterprise architecture: one binary
The most significant architectural change this cycle happened on the enterprise side. Previously, Cloud and Enterprise features ran as a separate service alongside the core API. This meant separate containers, separate routing, and the transaction coordination problem we described in the first edition.
Now, enterprise features build as extensions of the core API binary. The API server was extracted into an importable
apppackage. Enterprise code registers additional routes, billing logic, and background workers through an extension system. At runtime, it's a single container serving everything.This change simplifies deployment (one fewer container to manage), eliminates the routing complexity of having two services behind a gateway, and — most importantly — makes the transaction wrapping we built for PostgreSQL actually work end-to-end. When enterprise code extends a community operation inside a transaction, it's the same connection, the same transaction, the same atomic guarantee.
Releases
Three releases shipped, each with multiple release candidates:
/v1.Other updates
WantReply=true), PTY window change deadlocks were resolved with a drain pattern, and the standalone runc dependency was replaced with a native static binary.sync.Onceand concurrency-safe ping handling.X-Total-Countheader were added to all paginated endpoints. The spec is now served dynamically based on edition (community vs. enterprise).AI as a force multiplier
Last edition we described AI-assisted development in general terms. Two months in, some patterns have sharpened.
The storetest package is a good example. Writing YAML fixture files, comparator functions, and test cases across eleven entity types is precisely the kind of work where AI shines: repetitive enough to benefit from generation, specific enough to need human review. The pattern was designed by hand, the first comparator was written by hand, and then AI helped replicate it across the remaining ten — each one reviewed and adjusted.
The OpenAPI SDK migration followed a similar pattern. Replacing dozens of hand-written API wrappers with generated code required touching nearly every data-fetching call in the frontend. AI handled the mechanical translation while we focused on the TanStack Query integration patterns and cache invalidation strategy.
The enterprise unification was the opposite: almost entirely human-driven. Architectural decisions about how extensions register, how billing is injected, and how routing is simplified required understanding the full system. AI contributed to code review and catching inconsistencies, but the design was human.
The takeaway: AI is most valuable when the pattern is clear and the volume is high. It's least valuable when the work is fundamentally about design decisions. Knowing where each tool fits is what makes a small team productive.
Beta Was this translation helpful? Give feedback.
All reactions