Blend AI-casked knowledge with human judgment.
Explore Filter Select Edit
────── ────── ────── ──────
[ Graph ] ──→ [ Narrow ] ──→ [ Inspect ] ──→ [ Blend ]
Blending Room is a web dashboard for the Distillery knowledge graph. Like whisky blending, humans combine and refine the raw material — knowledge nodes and relationships — that AI has casked, using their own senses and judgment.
Browse the graph visually, filter by relationship type, inspect node details, and edit edges and content. Every human edit is recorded as source: 'human'.
The main view renders the knowledge graph with Cytoscape.js. Nodes and edges are laid out using the cola force-directed algorithm.
| Interaction | Action |
|---|---|
| Click | Open node/edge detail panel |
| Double-click | Expand subgraph around the node |
| Right-click | Context menu (add, edit, delete) |
| Hover | Highlight connected nodes |
| Relationship | Style |
|---|---|
RELATED_TO |
Gray solid line |
SUPPORTS |
Green solid line |
CONFLICTS_WITH |
Red dashed line |
source: human |
Thicker stroke |
Filter by relationship type or source, view node/edge details, and edit content — all without leaving the graph view.
Frontend Svelte 5 (runes) · SvelteKit · TypeScript
Graph Cytoscape.js · cytoscape-cola
Styling Tailwind CSS 4 · DaisyUI 5
Backend Elysia server (separate project, proxied via Vite)
Runtime Bun
bun install
cp .env.example .env
# Edit .env and set VITE_API_URL (default: http://localhost:8710)
| Variable | Description | Default |
|---|---|---|
VITE_API_URL |
Distillery Elysia backend URL | http://localhost:8710 |
VITE_USE_MOCK |
Use mock data instead of backend API | false |
bun run dev
bun run build
bun run preview
bun run check
Blending Room is a SvelteKit app. You can deploy it as a Node.js server or as static files behind any web server.
Switch from adapter-auto to adapter-node:
bun add -d @sveltejs/adapter-node
Update svelte.config.js:
import adapter from '@sveltejs/adapter-node';
const config = {
kit: {
adapter: adapter()
}
};
export default config;
Build and run:
bun run build
# The output is in the build/ directory
VITE_API_URL=https://your-api.example.com node build
The server listens on port 8711 by default. Set the PORT environment variable to change it.
If you don't need SSR, switch to adapter-static:
bun add -d @sveltejs/adapter-static
Update svelte.config.js:
import adapter from '@sveltejs/adapter-static';
const config = {
kit: {
adapter: adapter({ fallback: 'index.html' })
}
};
export default config;
Build and serve with any web server (nginx, caddy, etc.):
bun run build
# The output is in the build/ directory
# Serve with your preferred web server
When running behind a reverse proxy, make sure to:
VITE_API_URL to your backend's public URL at build time (it's baked into the client bundle)server {
listen 80;
server_name blending.example.com;
location / {
proxy_pass http://localhost:8711;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
| Action | Method | Endpoint |
|---|---|---|
| Fetch graph | GET |
/graph |
| Node detail | GET |
/graph/node/:id |
| Expand subgraph | GET |
/graph/node/:id/expand |
| Update node | PUT |
/graph/node/:id |
| Create edge | POST |
/graph/edge |
| Update edge | PUT |
/graph/edge |
| Delete edge | DELETE |
/graph/edge |
| Keyword search | GET |
/search/keyword?q=... |
src/
├── routes/ # SvelteKit pages
├── lib/
│ ├── components/ # Svelte components (GraphCanvas, SidePanel, TopBar, ...)
│ ├── graph/ # Cytoscape config, styles, events, context menu
│ ├── stores/ # Svelte 5 runes stores (graph, ui, search, auth, toast)
│ ├── api/ # Fetch wrapper + endpoint modules (graph, node, edge, search)
│ ├── types/ # TypeScript type definitions
│ ├── mock/ # Mock data for development
│ └── utils/ # Utilities (edge-id, debounce)
pitch black, amber-lit.