SequelPG

v0.2.1 gave SequelPG a strong visual identity — warm charcoal, a single phosphor-lime accent, monospaced headlines, roman-numeral section labels. It photographed well. It also fought macOS at every turn: a hand-rolled sidebar with its own resize handle, an in-window tab bar, tab strips drawn from scratch, a forced accent color, and a dozen small places where the app behaved like a web page instead of a Mac app. v0.3.6 keeps the mark and the lime, and hands everything else back to the system.

A window that behaves like every other Mac window

The workspace is now a standard three-column NavigationSplitView: the navigator in a real sidebar (collapsible with the toolbar button or ⌃⌘S, resizable with the native divider, vibrant background), the main area in the middle, and a native Inspector on the trailing edge (⌥⌘I). The window title shows the connection name; the subtitle shows the database you’re in.

Structure, Content, Definition, Query, and Diagram moved out of the content area and into the toolbar as a segmented control — ⌘1 through ⌘5 — the way Sequel Pro and Sequel Ace have always done it. Modes that need a selected object no longer show up greyed out; they show a native empty state that tells you what to select.

Multiple connections use native window tabs. ⌘T opens a new connection as a tab of the current window; the system tab bar handles reordering, tearing a tab off into its own window, and merging windows back together. Closing a tab disconnects its session. The custom tab bar — and the “no multi-window support” line in the README — are gone.

Menus that do things

A Mac app’s menu bar is its documentation. SequelPG’s was nearly empty, and a couple of shortcuts the README promised didn’t exist. There are now Database (Refresh ⌘R, New Database…, New Schema…, Extensions…, Roles & Privileges…, Function Library…, Disconnect ⇧⌘W) and Query (Run ⌘↵, Stop ⌘., Explain ⌥⌘E, Explain Analyze ⌥⇧⌘E, Beautify ⇧⌘F, Clear ⌘K) menus, and View gained the five modes, the inspector, the query history drawer (⇧⌘Y), Show Advanced Objects, and Appearance.

Every command targets the key window through SwiftUI’s focused values. Previously ⌘F, ⇧⌘Y, Export, and Import were broadcast notifications, so with two connections open they fired in both. ⌘F is now contextual: on the Content tab it toggles the row filter; anywhere else it opens the editor’s native find bar, with Find Next / Previous and Use Selection for Find working as they do in every other text view on the Mac.

System colors, one monospace, your accent

Chrome — sidebar, toolbars, bars, sheets, lists, labels — now uses the system’s semantic colors and SF Pro. That means Light and Dark look like macOS Light and Dark, and the accent color you picked in System Settings is the one you get in selection highlights and default buttons; the lime lives on as SequelPG’s own accent for people who keep “multicolor.” Monospaced type is reserved for the things that are actually code or data: SQL, DDL, identifiers, cell values, type names. The roman-numeral kickers, dotted rules, and decorative key-cap chips are gone.

The SQL editor and the Definition view got a font setting: Settings → Editor offers SF Mono, JetBrains Mono, or Menlo at 10–20 pt, applied live. Settings itself is split into General, Editor, and Tools panes.

Behaviour that stopped fighting you

  • The mode is sticky. Clicking a table in the sidebar used to throw you out of the query editor and into Structure. Now it keeps whatever mode you’re in — browse tables while writing a query, and their columns feed autocompletion. The very first object you open still switches to Structure (or Definition for functions and types), because there was nothing on screen yet.
  • A filter in the sidebar. Type in the field at the bottom of the navigator and the tree narrows to matching objects; matching categories expand on their own. The create menu and the Show Advanced Objects toggle live next to it. Double-click a database to switch to it.
  • Insert is a form. The inline insert row never lined up with the grid’s columns and had no room for hints. Insert now opens a sheet listing every column with its type, NOT NULL, default, and identity status, flags the required ones, and leaves empty fields to the database’s defaults.
  • Structure edits are a double-click. A single click on a column name, type, or default used to start editing — and a stray click could issue an ALTER TABLE. Single click now selects, double-click edits, right-click drops.
  • Query results have one status bar. Row count, cap notice, editable hint, Export, and timing sit under the grid; the duplicated header meta is gone. Errors are a dismissable inline banner, and the Messages tab — previously a no-op — shows the last statement’s outcome with the full error text.
  • Sheets share one layout. Extensions, Roles, Function Library, Export, Import, and every create/add sheet: title on top, grouped form, Cancel and the primary action bottom-right. Type fields accept any type you type and offer common ones in a menu, replacing the picker-plus-text-field pair that could disagree with itself.
  • Object tabs are native-looking chips with Close Tab, Close Other Tabs, and Close All Tabs in the context menu.

The EXPLAIN bug hiding in a display cap

While checking every screen against a PostgreSQL 18 fixture, Explain Analyze on a partitioned table failed with “The data couldn’t be read because it isn’t in the correct format.” The plan visualizer asks for EXPLAIN (FORMAT JSON, …) and reads the single JSON cell back through the same path as every other query result — and that path caps text cells at 10 000 characters for display. A plan for a table with five partitions and a couple of indexes is about 14 000 characters. Truncated JSON isn’t JSON, so every non-trivial plan had been failing since the visualizer shipped in v0.3.0.

EXPLAIN now reads its output whole; the display cap still applies to ordinary results, where it belongs. If you tried the visualizer on a real schema and gave up on it, try again.

Two lessons from SwiftUI on macOS

Two things bit during the rebuild and are worth writing down. VSplitView is an NSSplitView underneath, and NSSplitView treats each pane’s intrinsic width as a floor. A pane containing a toolbar row and an empty-state view reports an ideal width of several hundred points, the detail column refuses to get narrower than that, and NavigationSplitView quietly squeezes the sidebar and inspector to make room. Pinning a modest idealWidth on each pane fixes it. And a .popover attached to rows inside a grouped Form renders as a blank panel on macOS 14; the inspector now presents its field editor as a sheet, like the results grid does.

Concretely, v0.3.6 means

  • NavigationSplitView sidebar, native inspector (⌥⌘I), window title and subtitle showing connection and database
  • Structure / Content / Definition / Query / Diagram as a toolbar segmented control (⌘1–⌘5)
  • Native window tabs (⌘T) and windows (⌘N) for multiple connections
  • Database, Query, and View menus with shortcuts that act on the key window; contextual ⌘F with a native find bar in the editor
  • System colors and SF Pro for chrome, your accent color respected, monospace only for SQL and data; editor font family and size in Settings
  • Sticky mode when browsing the sidebar, a sidebar filter field, double-click to switch databases
  • Insert-row form with type and default hints, double-click structure editing, a working Messages tab, a single results status bar, consistent sheets with free-form type fields
  • EXPLAIN / EXPLAIN ANALYZE fixed for plans over 10 000 characters
  • The release workflow now ships a version set in a pull request as-is instead of bumping past it

Grab v0.3.6 from the latest release or build from source with Xcode. Open a connection, press ⌘T for a second one, and notice that SequelPG finally looks like it was built for the machine it runs on.