UI design system & visual identity
Tabularis was built by a backend developer, one modal at a time, with colors and spacing picked on the spot. It works, but it lacks a system. This initiative replaces the vibe-coded UI with a documented design system: real logo, semantic palette, one type and spacing scale, shared primitives. Not a UX rework — pure visual coherence, plus the docs needed so the next contributor doesn't have to reverse-engineer my taste.
What the UI looks like today
The current frontend is functionally fine. The information architecture — sidebar, tabs, settings layout, query editor flow — is fine. The visual layer is not. Concrete examples:
- The logo is a placeholder, never replaced.
- The color palette grew organically. The CSS variables in
src/index.css(bg-base,bg-elevated,text-primary, etc.) are an attempt to centralize it, but the values themselves were chosen by trial and error. - Spacing is inconsistent across pages.
p-3/p-4/p-5show up on similar-looking containers depending on which file was open at the time. - Button, input and modal styles drift between the Connection modal, the Settings page, the plugin modals and the query editor toolbar.
- Icons (
lucide-react) get a different size or stroke depending on the component. - Light and dark themes are kept in sync manually, so they fall out of sync.
The settings page already moved in the right direction: SettingControls.tsx defines reusable SettingSection, SettingRow, SettingToggle, SettingButtonGroup, SettingSlider, SettingNumberInput. The rest of the app still doesn't have an equivalent.
Scope
A real design system. Not a redesign of features or workflows.
- Logo. A real mark, in the sizes the app actually needs: titlebar, About, splash, favicon, OG image, GitHub social preview. Light and dark variants. Documented rules for where it appears.
- Color palette. Semantic roles — surface levels, text levels, accent, success, warning, danger, info. Light and dark derived from the same source instead of maintained twice by hand. The custom themes feature already exists; the built-ins should be the reference implementation.
- Typography. One scale applied everywhere. Today font sizes are picked per component.
- Spacing & layout. One spacing scale, used everywhere: modals, settings, sidebar, results grid.
- Component primitives. Shared
Button,Input,Select,Tab,Modal,Tooltipused across the Connection modal, query editor toolbar, sidebar, DataGrid header and plugin modals — the same patternSettingControls.tsxalready applies to the Settings page. - Icon usage. Pick a default size and stroke for
lucide-react. Stop overriding per call site. - Documentation. A short Storybook-style page or markdown doc: here's the palette, here's the scale, here's how to build a modal. So the next contributor doesn't have to reverse-engineer the conventions.
Out of scope
- UX changes: the sidebar layout, the tab model, the query editor flow, the settings tabs are not being touched.
- Feature work: this is the visual layer only.
Help wanted
If you have a design background — palette proposals, a logo concept, a Figma file, opinions on the current state — please comment on issue #195. The maintainer is a backend dev and explicitly does not want to keep iterating on instinct.
For frontend devs: once direction is decided, the migration is incremental and easy to split into smaller follow-up issues — primitive by primitive, page by page. Issues will be opened once the system is documented and there's something concrete to migrate against.
Help shape this roadmap
The best feedback comes from real usage. Tabularis is free and open source (Apache 2.0) — download it, try it on your databases, and tell us what should come next. A star on GitHub supports the project too.
39k downloadsHomebrew, Snap, AUR and more →View all releases on GitHub →
