-
Notifications
You must be signed in to change notification settings - Fork 0
2 dashboard
wiki[bot] edited this page Apr 27, 2026
·
1 revision
The dashboard is a Vue 3 single-page application (SPA) that serves as both a developer debugging console and a user-facing interface for the VISIONS API. It provides real-time visualization of inference streams, request/response inspection, theme customization, and direct interaction with all three server layers: REST, MCP, and Socket.IO. The dashboard is served independently on port 5173 in development; in production it is built as a set of static assets and served by a reverse proxy or CDN.
| Concern | Technology | Version | Rationale |
|---|---|---|---|
| Framework | Vue 3 Composition API | 3.4+ | Fine-grained reactivity, TypeScript-native |
| Bundler | Vite | 5+ | Rapid HMR, optimized tree-shaking |
| Styling | Tailwind CSS | v4 | Utility-first CSS with CSS-native @theme
|
| State Management | Pinia | 2.1+ | Type-safe stores with setup() syntax |
| Server State | TanStack Vue Query | 5+ | Request deduplication, caching, background refetch |
| Real-time | Socket.IO Client | 4+ | Shared Socket.IO namespace with server |
| Icons | Lucide Vue Next | — | Tree-shakeable icon set |
| Notifications | vue3-toastify | — | Non-blocking toast system |
flowchart TB
subgraph Browser["Browser"]
User[User]
end
subgraph Dashboard["@CKIR.IO/Dashboard"]
subgraph Components["UI Components"]
FileUpload[FileUpload.vue]
EventLog[EventLog.vue]
Inputs[Input Panels]
Preprocessing[Preprocessing Toggles]
end
subgraph Composables["Vue Composables"]
SocketConn[useSocketSubscription]
EventLogComp[useEventLog]
Toast[useToast]
Blink[useBlink]
Clipboard[useClipboard]
Validation[useValidation]
ResponseHandler[useResponseHandler]
AutoScroll[useAutoScroll]
LocalStorage[useLocalStorage / useLocalStorageSync]
end
subgraph Stores["Pinia Stores"]
AppStore[App Store]
SocketStore[Socket Store]
MessagesStore[Messages Store]
DebugStore[Debug Store]
ThemeStore[Theme Store]
PreprocessingStore[Preprocessing Store]
ModelsStore[Models Store]
end
subgraph API["API Layer"]
ApiClient[TanStack Vue Query + native fetch]
end
end
subgraph Backend["@CKIR.IO/VISIONS API"]
REST[REST API]
MCP[MCP /api/v1/mcp]
SocketIO[Socket.IO]
end
User --> Components --> Composables --> Stores --> API
API --> REST --> SocketIO --> SocketConn --> EventLogComp --> Components
API --> MCP --> SocketIO
| Panel | Route / Tab | Purpose |
|---|---|---|
| REST Request | <RestPanel> |
Form-based submission to /api/v1/vision with file upload, field inputs, and query parameters |
| MCP Request | <McpPanel> |
JSON-RPC payload builder for tools/call with base64 image attachment |
| Debug/Event Log | <DebugPanel> |
Real-time event stream, health check status, request/response inspection |
| Preprocessing | <PreprocessingPanel> |
UI for toggling variants and tuning Sharp parameters |
| Variable | Required | Example | Description |
|---|---|---|---|
VITE_API_URL |
Yes | http://localhost:3000 |
REST API base URL |
VITE_SOCKET_URL |
Yes | http://localhost:3000 |
Socket.IO server URL (same host:port as API) |
Variables must be prefixed with VITE_ to be exposed to client-side code. CORS on the server must permit the dashboard origin (e.g., http://localhost:5173).
dashboard/src/
├── api/
│ ├── mutations/
│ │ ├── use-vision.mutation.ts
│ │ ├── use-vision.mutation.type.ts
│ │ ├── use-mcp.mutation.ts
│ │ ├── use-mcp.mutation.type.ts
│ │ ├── use-cancel-vision.mutation.ts
│ │ └── use-cancel-vision.mutation.type.ts
│ ├── queries/
│ │ ├── use-health-ready.query.ts
│ │ ├── use-health-ready.query.type.ts
│ │ ├── use-health-live.query.ts
│ │ ├── use-health-live.query.type.ts
│ │ ├── use-models.query.ts
│ │ └── use-models.query.type.ts
│ └── api-url.ts
├── assets/
│ └── css/
│ ├── animations.css
│ ├── colors.css
│ ├── style.css
│ ├── toast.css
│ └── themes/
│ ├── souls.css
│ ├── diablo.css
│ ├── gothic.css
│ ├── cyberpunk.css
│ ├── stellar.css
│ ├── ghostwire.css
│ ├── deathspace.css
│ ├── nioh.css
│ └── pragmata.css
├── components/
│ ├── app/ # AppHeader, AppFooter, AppThemeSwitcher, AppMainContent, TabButton
│ ├── buttons/ # ActionButton, ClearButton, FilterButton, RefreshButton
│ ├── drop-down/ # DropDown, DropDown.Field, DropDown.Select
│ ├── event-log/ # EventLog
│ ├── file-upload/ # FileUpload, FileUpload.Field, FileUpload.Files, FileUpload.Input, FileUpload.Label
│ ├── inputs/ # Form fields: PromptField, ModelField, TaskField, StreamField, RequestIdField, NumCtxField, MethodField, JsonField, MaxWidthField, MaxHeightField, BlurSigmaInput, SharpenSigmaInput, SharpenM1Input, SharpenM2Input, BrightnessInput, ClaheWidthInput, ClaheHeightInput, ClaheMaxSlopeInput, NormalizeLowerInput, NormalizeUpperInput, SubmitButton
│ ├── preprocessing/ # PreprocessingMasterToggle, PreprocessingParamTile, PreprocessingSection, PreprocessingToggleButton
│ ├── socket-subscriber/# SocketPanel, subscription controls
│ ├── ui/ # ActionTagButton, PanelHeader, and other base primitives
│ └── toast/ # Toast customization
├── composables/
│ ├── use-blink.ts
│ ├── use-debounced-loading.ts
│ ├── use-clipboard.ts
│ ├── use-event-log.ts
│ ├── use-local-storage.ts
│ ├── use-local-storage-sync.ts
│ ├── use-response-handler.ts
│ ├── use-socket-subscription.ts
│ ├── use-toast.ts
│ ├── use-validation.ts
│ └── use-auto-scroll.ts
├── panels/
│ ├── debug/ # DebugPanel, DebugPanel.Health, DebugPanel.Details, DebugPanel.Layout, DebugPanel.Header, DebugPanel.EmptyState
│ ├── mcp/ # McpPanel, McpPanel.RequestPanel, use-mcp-panel
│ ├── preprocessing/ # PreprocessingPanel.OptionsPanel, PreprocessingPanel.ToolsPanel
│ ├── rest/ # RestPanel, RestPanel.RequestPanel, use-rest-panel
│ └── socket/ # SocketPanel for manual event inspection
├── stores/
│ ├── app.ts # Global UI state (active tab, request IDs, abort)
│ ├── debug.ts # Debug panel state, filters, result history
│ ├── debug.helper.ts # Debug result formatting helpers
│ ├── messages.ts # Persistent message queue (rest + mcp instances)
│ ├── models.ts # Fetched Ollama models list
│ ├── preprocessing.ts # Variant selection, parameter values, localStorage sync
│ ├── socket.ts # Socket connection, rooms, events
│ └── theme.ts # Active theme, theme colors, persistence
├── types/
│ ├── debug.model.ts
│ ├── message.model.ts
│ └── socket-provider.model.ts
└── utils/
├── colors/ # Semantic color helpers (method, status, tag colors)
├── formatting.helper.ts
├── http.helper.ts
├── id.helper.ts
├── message-data.helper.ts
└── promise.helper.ts
User selects files → RestPanel emits mutation
→ POST /api/v1/vision (202 Accepted)
→ Response contains { realtime: { event, roomId, requestId } }
→ Dashboard joins room via Socket.IO
→ Server streams vision events to room
→ Dashboard renders progressive responses
User builds JSON-RPC payload in McpPanel
→ POST /api/v1/mcp with payload + images
→ Response contains realtime info
→ Same Socket.IO subscription as REST
All socket events captured by useEventLog()
→ Timestamp, event type, payload size, origin
→ Filterable by type (request / response / error / system)
→ Auto-scroll with pause-on-interaction
# Development server (port 5173)
cd dashboard && pnpm run dev
# Production build
cd dashboard && pnpm run build # vue-tsc -b && vite build
# Testing
cd dashboard && pnpm run test # Vitest run, jsdom environment
cd dashboard && pnpm run coverage # Coverage report| Feature | Minimum Version | Fallback |
|---|---|---|
| WebSocket | Chrome 90+, Firefox 88+ | Socket.IO polling transport |
| ES2020 | All modern evergreen | Vite transpiles to target |
| CSS Grid/Flexbox | All modern evergreen | N/A (layout critical) |
localStorage |
All modern evergreen | Theme defaults to souls
|
- 2.1 Frontend Architecture — Component hierarchy, composables, API layer
- 2.2 Color Harmony & Theming — 9 dark themes, Tailwind v4 theme system
- 2.3 State Management & Real-time Events — Pinia stores, Socket.IO lifecycle, event log