Repository navigation
TablePeek v0.2.0
A desktop app for macOS and Windows (also through Homebrew) that updates itself, settings rebuilt the way Tern does them, Tern's themes and color tables, a large JSON explorer, live setting previews, and motion throughout.
Added
- Desktop app for macOS and Windows (
crates/tablepeek-desktop, Tauri 2). It starts the same server inside the app on a free port with the same~/.tablepeeksettings folder, and shows it in native windows: links to other sites open in the system browser, "Open in new window" opens another app window, exports and GridFS downloads go to the Downloads folder (numbered when the name is taken), and file drops reach the page. On macOS ⌘W, ⌘T, ⌘N and ⌘R stay with the page (Close Window is ⇧⌘W). Release builds are ad-hoc signed on macOS and unsigned on Windows; docs/INSTALL.md covers the first launch. - The desktop app updates itself. When the update check finds a newer release (and checks are on and the release isn't skipped), the app downloads it in the background and checks its updater signature, with no click. Once it is ready, a Restart to update pill arrives in the top bar and on the home screen with a wash of color (it just appears with reduced motion); hovering shows the version, a click installs it and relaunches, a failure shows beside the pill and clicking tries again, and right-clicking offers the release notes or skipping the version. Settings > General shows the same state (downloading with its percent, downloaded) with Check now and the same button. The app looks again every hour while it stays open (GitHub is still asked at most once a day), keeps a release already downloaded, and replaces it when a newer one appears.
GET /api/updatereportsinstallableandinstall(idle,checking,downloading,ready,installing,error);POST /api/update/installinstalls the downloaded release, and/api/versionreports the desktop build asdist: "desktop". - Releases also publish
TablePeek-<tag>-<target>.dmg(macOS arm64, x64),TablePeek-<tag>-x86_64-pc-windows-msvc-setup.exe, the updater bundles with their.sigsignatures, andlatest.jsonfor the updater.make desktopruns the app from source andmake desktop-bundlebundles it. - Homebrew cask for the desktop app:
brew install --cask extransload/tap/tablepeek. Each stable release updates it in Extransload/homebrew-tap; it clears the download quarantine so the unsigned app opens without a Gatekeeper prompt. - Reorder connections on the home screen by dragging them within a group, or into another group at a chosen spot, the top of the list included; groups reorder the same way, and ⌥↑/⌥↓ move the focused connection or group. The order is kept in
~/.tablepeek/ui-state.jsonand the connection picker follows it. Previously a dropped connection took its place by last use, so it could not be put at the top. - Large view for JSON in Quick Look. "Expand" (⌘↩ in the cell popover) opens the value filling the window: a tree that stays responsive with hundreds of thousands of nodes (expand all, collapse all, expand to depth 1–5 or press 1–9), search across keys and values with a match count and ↩/⇧↩ to step through, a breadcrumb with Copy path and Copy value, long strings shown in full, and a Raw view that indents the stored text without rounding big numbers. Esc goes back to the popover. Works for JSON/JSONB columns and MongoDB documents.
- Window material: Solid, Glass or Clear (Settings → Appearance), with an opacity and, for Clear, a blur radius. Dialogs, the command palette, menus, pickers and the settings sheet turn to tinted glass over the app. In the desktop app the window itself becomes see-through: macOS vibrancy for Glass, the desktop blurred without the system tint for Clear (Windows: Mica and Acrylic). The page asks for it through
GET/PUT /api/window; a browser tab reports that its window can't be see-through. Every open window and tab follows a material (or any other setting) changed in another. The system's "Reduce transparency" makes every material solid; on macOS the desktop app reads it itself (WebKit doesn't report it to the page) andGET /api/windowpasses it on asreducedTransparency. - An animated home. Behind the connection home a table runs as a floor to the horizon, its rows flowing toward you in the theme's type colors; the pointer is a lens that lifts the cells under it and shows their values, and a click sends a ripple out. First run gets the full show (the wordmark's "Peek" peeks up, the actions rise in turn, the New connection button leans toward the pointer); the connection list gets a dimmer, slower floor without values. One 2D canvas, capped at 60 fps (30 behind the list), paused while the page is hidden and stopped off the home; with reduced motion it is a still frame.
- Dark Noir and Light Noir themes. Dark Noir is the look of the author's Tern terminal theme: Dracula-style surfaces, a vivid 16-color table (green strings, yellow numbers, pink keywords, cyan functions and dates, blue types, grey
NULL) and a teal#287D8Eaccent. Light Noir keeps the same hue in each role on cool light surfaces, every text color at 4.5:1 or better on every surface. - Tern's themes (oh-my-pi's 102 theme files, MIT-licensed, in
web/src/themes/tern) as a Tern group in the theme pickers, dark and light. The build converts them to color tables and surfaces (virtual:tern-themes, an 11.9 kB gzipped chunk) loaded only when Settings opens or a Tern theme is saved; text colors too faint on their background (most light themes' ANSI colors, some accents and secondary text) are darkened or lightened to stay readable. - Import a Tern theme file ("Import Tern theme…" in either theme picker): a Tern theme CSS becomes the theme of its mode, named after the file, from the oh-my-pi theme it
@imports with its--tv-bg,--tv-fg,--ansi0…--ansi15and surface variables over it; its other rules are skipped. Imported themes are kept in~/.tablepeek/ui-state.json, listed under "Imported" in the picker, and can be removed there. - Color table on the theme page: the current theme's background, foreground and 16 colors as swatches. Syntax and value colors map to the slots, so a picked color carries to every part mapped to it; picks are saved per theme, and in the settings sheet the table is one row (⏎ in, arrows between swatches, ⏎ opens the picker, ⌫ puts one back, ⌫ on the row puts all back).
- Settings menus preview live. Moving over a theme, font, font size or syntax preset (with the pointer or ↑↓) shows it in the whole app at once (data table, SQL editor, sidebar, window material), a light theme even while dark is shown and the other way round; a click or ⏎ saves it, and closing the menu without picking (Esc, Tab, a click elsewhere, closing Settings) puts the saved look back. Previews are never saved or sent to other windows.
- Motion throughout, in Tern's manner (one set of durations and spring curves in
styles.css,web/src/motion.tsfor what CSS can't do; only transforms and opacity move). With the system's reduced motion everything is instant.- Home drag and drop. A dragged connection lifts off the list as a glass card that follows the pointer, leaning into sideways moves; the rows part to open a gap where it will land (the gap is the marker), and on release it springs into place. A folded or empty group under it lights up and pulses, the card thins over it, and a drop there falls into the folder, which bounces. A dragged group travels as its header with its rows stacked behind, and its rows unfold where it lands. Esc, or leaving the list, springs it back. ⌥↑/⌥↓ moves glide, and folding a group rolls its rows in and out. Dragging is pointer-driven now, so it works the same in the desktop app's WebKit.
- Liquid tabs. Switching query/table or connection tabs pours the highlight toward the new tab, its leading edge first and its tail catching up; a new tab buds out of the one beside it, a closed one melts into the neighbour taking its place, and the rest slide over.
- Overlays share one motion. Dialogs and the command palette spring up out of a dim that fades in by its color (so a glass dialog is blurred from its first frame), and leave with a quick fade and shrink. Menus, pickers, selects, context menus and popovers grow out of what opened them (the point nearest the pointer or the focused control) and fade back toward it; editor tooltips and hover tooltips drop in. The settings sheet slides in from the right edge on a spring, glass the whole way, and slides back out. Error toasts spring in from the right edge, the others moving aside as one comes or goes, and slide out when closed; the "nothing to run" note rises in and fades. Closing is unchanged (focus goes back at once): what plays is an inert copy.
- Panels and the schema tree. Tree nodes and sections unroll and roll up (a short list's rows drop in one after another, a long one just fades), the sidebar, row detail panel and console slide in and out from their edges, structure, definition and plan views fade in, and Quick Look grows into its large view and shrinks back.
- Rolling numbers. Row counts, query times, the page range, sidebar and group counts, the jobs badge and the pending-edits count roll only the digits that change, up or down. A query's status turns into its result: "Running…" becomes ✓ with the row count and time, or the error.
- The Restart to update pill unfolds from its icon with a flood of accent color, a sweep across and a ring of glow, its words sharpening into focus one by one.
Changed
- Every font and color setting is on Settings › Appearance, grouped into cards: Theme (mode, light and dark theme), Colors (accent, color table), Syntax colors (preset and colors, with the editor preview), Value colors (type colors and their colors), Fonts (interface, code, editor and table fonts with their sizes), Material and Display. The SQL Editor page keeps keyword case and the Data Table page the maximum rows and query time limit; search still finds every setting by its old words.
- The README is now a short page with install steps and screenshots. The details moved to docs/INSTALL.md (downloads, first launch, updating), docs/GUIDE.md (databases, features, MCP, security), and docs/DEVELOPMENT.md (architecture, building, tests).
- The JSON tree in Quick Look drops the type glyphs (Aa, #, ✓, ∅, {}, []) in front of every key: values keep their type colors, objects and arrays show a muted member count after the key (
address {3},tags [3]), array positions are muted, and hovering a row shows its type. - Settings is a keyboard-first sheet docked to the right edge: it takes its width from the app, which keeps working beside it (its shortcuts too, while focus is outside the sheet), rather than floating over it. ⌘, opens and closes it from anywhere. ↑↓ move between settings, ←→ switch pages, ⏎ or Space flips a switch, steps a choice or opens a menu, typing searches every page, ⌫ resets a setting marked as changed from its default, and Esc steps back (out of a field, clears the search, then closes). Tab stays in the sheet, and the sheet's edge resizes it by drag or ←→; its width is remembered.
- Settings are laid out like Tern's. The pages are General (language, updates, activity-log retention), Appearance, SQL Editor, Data Table, Import & Export, Shortcuts and Security; the Theme and Sidebar pages are gone. Appearance holds the theme, accent, color table, fonts, material and display settings. Theme: Mode is Light, Dark or System, with a light theme and a dark theme picked separately; System follows the operating system's mode live (the desktop window too, through a new
systemfield inPUT /api/window). Each theme row opens a compact searchable picker with swatches (type to filter, ↑↓, ⏎, Esc) that also holds Tern's themes, the imported ones and "Import Tern theme…", in place of the inline gallery. The accent follows the theme shown unless one is picked. Fonts cascade as Tern's do: Font and Font size for the interface (the sidebars follow it), Code font for monospaced text (SQL editor, data table, code labels) with a size that follows Font size, and an Editor font and a Table font that follow the code font unless set apart; one searchable font picker serves them all. Search: "Search settings ⌘F" finds rows on every page in Korean or English, lists them under a small page-name eyebrow with the match highlighted, offers a page by its name, and says "Try a shorter word, or the name of a page." when nothing matches. Notes under settings are shorter. Earlier settings move over on first start: the saved theme becomes the theme of its mode (System if it was the default), an accent that was the theme's own follows the theme, the SQL editor's font and size become the code font's, and the data table's and sidebar's become the table font and the interface font only where they differed. - The connection home is pared down. With nothing saved it shows the wordmark, one line, three buttons (New connection…, Open SQLite file, Import connections…) and a "Look around with demo data" link; the keychain note, the driver chips, the "what you'll need" box, the tech line, and the
make run DEMO=1hint are gone. With connections, the search bar carries a New connection button and a … menu (new group, open SQLite file, import, export, database backup and restore, open demo) in place of the big backup/restore tiles. - Less text in Quick Look and Settings. The large JSON view's right side now matches the popover's: the picked object's or array's members as labeled field boxes (key, type, value; nested values indented as stored), drawn only as they scroll into view, long values cut with "Show all", and a picked value as one box. In both, values (and the tree's) take the data table's colors by kind (string, integer, decimal, big integer, boolean, NULL), and objects and arrays in a box are colored token by token with faint punctuation. The popover's expand button and the settings page tabs are icons with their names in tooltips (Shortcuts gets a keyboard icon), and the update check in Settings › General drops its explanation and error box for a one-line reason under the status.
Fixed
- Moved the test MySQL default port from 3307 to 3329 so it does not occupy a production proxy's port. Engine and server tests share the same port override.
- Pages opened as
localhost:<port>now redirect to127.0.0.1:<port>, the launch address. The browser stores the token, settings, and workspaces per origin, so the two names used to show a stale token (invalid_token) and different settings. API calls still work under either name. - Settings, language, workspaces and their tabs, drafts, column widths, panel sizes, and recent queries were lost whenever the server started on a different port, because the browser keeps them per origin. They now live in
~/.tablepeek/ui-state.json, shared by every TablePeek on the machine; each address imports once what the browser kept for it there, for keys not saved yet. Several open windows (browser tabs, desktop windows, a CLI server alongside the desktop app) keep each other's changes instead of writing back stale copies.