The current Metadata Inspector panel on the console list page is overly verbose and clutters the interface. This proposal outlines a modernization plan following design patterns from leading Silicon Valley companies (Linear, Vercel, Stripe, Notion, GitHub).
- The Metadata Inspector shows raw JSON dumps taking up ~30% of screen width
- Two large JSON blocks (View Configuration + Object Definition) require excessive scrolling
- Dark code blocks create visual heaviness
- Fixed-width panel (w-100 = 25rem) is not responsive
- Technical JSON is exposed by default (developer-focused, not user-focused)
- No progressive disclosure - all data shown at once
- Missing key actions (copy, collapse, export)
- Top companies hide debug/technical panels by default
- Modern interfaces prioritize content over chrome
- Lacks the "clean and spacious" aesthetic of contemporary SaaS
- Maximize space for primary content (data grid)
- Secondary tools should be non-intrusive
- Default state should be clean and focused
- Start with essential info only
- Allow users to drill down for details
- Use collapsible sections and tabs
- Every visible element must serve a purpose
- Reduce borders, shadows, and visual noise
- Use subtle backgrounds and dividers
- Panels should be collapsible/resizable
- Respect user's screen real estate
- Remember user preferences
// Change default state in useMetadataInspector
export function useMetadataInspector() {
const [showDebug, setShowDebug] = useState(false); // Currently true for some users
return {
showDebug,
toggleDebug: () => setShowDebug(prev => !prev),
};
}// MetadataPanel.tsx - Change from w-100 to w-80
<div className="w-80 border-l bg-muted/20 ..."><Accordion type="multiple" defaultValue={["view"]}>
<AccordionItem value="view">
<AccordionTrigger className="text-xs font-semibold">
View Configuration
</AccordionTrigger>
<AccordionContent>
<JsonCodeBlock data={viewConfig} />
</AccordionContent>
</AccordionItem>
<AccordionItem value="object">
<AccordionTrigger className="text-xs font-semibold">
Object Definition
</AccordionTrigger>
<AccordionContent>
<JsonCodeBlock data={objectDef} />
</AccordionContent>
</AccordionItem>
</Accordion>Instead of showing raw JSON first, show a structured summary:
// View Summary Component
<div className="space-y-3 p-4">
<div>
<Label className="text-xs text-muted-foreground">View Type</Label>
<div className="font-mono text-sm">grid</div>
</div>
<div>
<Label className="text-xs text-muted-foreground">Columns</Label>
<div className="flex flex-wrap gap-1">
{columns.map(col => (
<Badge key={col} variant="secondary" className="text-xs">
{col}
</Badge>
))}
</div>
</div>
<Separator />
<Button
variant="ghost"
size="sm"
className="w-full justify-start text-xs"
onClick={() => setShowRawJson(!showRawJson)}
>
<Code className="h-3 w-3 mr-2" />
{showRawJson ? 'Hide' : 'Show'} Raw JSON
</Button>
</div><div className="flex items-center justify-between px-3 py-2 border-b">
<span className="text-xs font-semibold">View Configuration</span>
<Button
size="sm"
variant="ghost"
className="h-6 w-6 p-0"
onClick={() => copyToClipboard(JSON.stringify(data, null, 2))}
>
<Copy className="h-3 w-3" />
</Button>
</div><Tabs defaultValue="summary" className="w-full">
<TabsList className="grid w-full grid-cols-3 h-9">
<TabsTrigger value="summary" className="text-xs">Summary</TabsTrigger>
<TabsTrigger value="schema" className="text-xs">Schema</TabsTrigger>
<TabsTrigger value="data" className="text-xs">Data</TabsTrigger>
</TabsList>
<TabsContent value="summary">
<StructuredSummary />
</TabsContent>
<TabsContent value="schema">
<JsonViewer data={schema} />
</TabsContent>
<TabsContent value="data">
<DataPreview />
</TabsContent>
</Tabs>import { ResizablePanel, ResizablePanelGroup } from '@object-ui/components';
<ResizablePanelGroup orientation="horizontal">
<ResizablePanel defaultSize={75} minSize={50}>
{/* Main content */}
</ResizablePanel>
<ResizablePanel defaultSize={25} minSize={20} maxSize={40}>
{/* Metadata panel */}
</ResizablePanel>
</ResizablePanelGroup>// Store in localStorage
const [showDebug, setShowDebug] = useLocalStorage('console:metadata-panel', false);// Add to CommandPalette.tsx
{
id: 'toggle-metadata',
label: 'Toggle Metadata Inspector',
icon: Code2,
shortcut: 'Mod+Shift+M',
onSelect: () => toggleDebug()
}Reduce visual weight:
| Slot | Class | Note |
|---|---|---|
background |
bg-background |
Instead of bg-muted/30 |
border |
border-border/50 |
Subtle |
header |
bg-muted/5 |
Barely visible |
Hierarchy:
| Slot | Classes |
|---|---|
title |
text-xs font-semibold uppercase tracking-wider text-muted-foreground |
content |
text-sm font-mono |
label |
text-xs text-muted-foreground |
More breathing room:
| Slot | Classes | Note |
|---|---|---|
panel |
p-0 |
Let inner components control padding |
section |
p-4 space-y-4 |
|
compact |
p-3 space-y-3 |
- Default panel to closed
- Reduce width from w-100 to w-80
- Add Accordion for collapsible sections
- Add Copy button for JSON
- Reduce visual weight (lighter backgrounds)
- Smart summary view with badges
- Tabbed interface (Summary/Schema/Data)
- Keyboard shortcut (Mod+Shift+M)
- Toast notification when copying
- Resizable panel
- LocalStorage persistence
- Export to file (JSON/YAML)
- Search within JSON
- Syntax highlighting with react-json-view
- ✅ Clean, minimal chrome
- ✅ Context panels slide in from right
- ✅ Collapsible sections with smart defaults
- ✅ Keyboard-first navigation
- ✅ Tabs for different data views
- ✅ Code blocks with copy buttons
- ✅ Subtle backgrounds (muted/5 instead of muted/30)
- ✅ Compact headers
- ✅ Progressive disclosure (show summary → expand for details)
- ✅ Monospace for technical data
- ✅ Action buttons on hover
- ✅ Responsive panels
- ✅ Collapsible sidebars
- ✅ Consistent spacing system
- ✅ Icon-only buttons for secondary actions
- ✅ Subtle borders and dividers
- Reduced cognitive load: Less visual noise on initial page load
- Faster task completion: Users can focus on data grid without distraction
- Improved accessibility: Better keyboard navigation and screen reader support
- Performance: Lighter DOM (fewer rendered nodes when panel is closed)
- Maintainability: Cleaner component structure with clear separation of concerns
- Extensibility: Easy to add new sections/tabs in future
- Week 1: Implement Phase 1 (Quick Wins) - Non-breaking changes
- Week 2: Add Phase 2 (Enhanced UX) - New features, opt-in
- Week 3: User testing with beta users
- Week 4: Ship to production with documentation
- Add "Metadata Inspector" section to Console Guide
- Document keyboard shortcuts
- Show before/after screenshots
- Document MetadataInspector API
- Show how to add custom sections
- Provide customization examples
- Metadata panel always visible
- Large JSON blocks taking up screen space
- Heavy visual design
- Clean interface, panel closed by default
- Progressive disclosure via tabs/accordion
- Modern, minimal aesthetic
This proposal prioritizes content over chrome and user-focus over developer-focus. By hiding technical details by default and providing better tools for when they're needed, we create a more professional and pleasant user experience aligned with modern SaaS expectations.
The phased approach allows us to ship incremental improvements quickly while building toward a best-in-class inspector panel.