The ingest service now supports optional per-session graphs, so multiple apps or users behind a reverse proxy can each load their own graph instead of overwriting one shared global graph.
?session=<id>query param accepted onPOST /api/graph,GET /api/graph, andGET /api/events; each session has its own graph and its own set of live viewers- Omitting
sessionuses a shared"default"session — the original single-graph behaviour, so existing callers and proxies need no changes POST /api/graphresponse now includes the resolvedsessionand the livesubscriberscount- The live viewer reads
?session=<id>from its own URL and subscribes to the matching stream (works at the service root and behind a reverse-proxy sub-path) - Session ids are bounded (
^[A-Za-z0-9_-]{1,64}$,400otherwise) and the server holds at most 64 sessions with least-recently-used eviction; the live-viewer cap (100) spans all sessions - Handoff pattern documented in API.md §2.1 and SERVICE.md
- Authored payloads with empty/missing node positions are now force-laid-out instead of rendering collapsed at the origin
- Live viewer connects to the events stream via a relative URL so it works behind a reverse-proxy sub-path
Standalone HTTP service (npm run serve:api) that lets other applications push graphs and watch them render live in a browser. Independent of the Electron desktop app — the desktop build never starts a server.
POST /api/graphingest endpoint protected by a bearer token; replaces the current graph and pushes it to connected viewers- Live viewer over Server-Sent Events (
GET /api/events) — pushes render immediately and replace the current graph without a reload GET /api/graph(latest graph,204until first ingest) andGET /health(liveness with version) endpoints- Environment-based configuration:
GLL_API_TOKEN,GLL_API_PORT,GLL_API_HOST,GLL_MAX_BODY_BYTES,GLL_STATIC_DIR(see SERVICE.md and.env.example) - Payload reference for external apps and agents documented in API.md
- Cross-origin browser
POSTs rejected (403on anyOriginheader) as a CSRF defence - Incoming JSON sanitized against prototype pollution —
__proto__,constructor, andprototypekeys stripped at every level
- Fixed pushed graphs not rendering reliably in the live viewer
Local Ollama-powered chat panel with a live context snapshot of your graph, selection, and metric values.
- Safe, structured query generation — produces guaranteed-valid GLL queries grounded in your real property hierarchy, so the assistant can't invent property names or emit broken syntax
- Suggested Queries panel with Copy / Select / Open-in-editor; Select pans and zooms to matches
- Live budget meter next to Send with per-section breakdown and a pre-send modal when you'd exceed the context window
- First-run setup and settings modal with model picker, endpoint probing, and
http(s)-only validation with local/private-IP detection - Reasoning-trace visualization for thinking models with a live token counter
- Empty-state starter chips, resizable sidebar, and clickable in-reply action glyphs
- GFM markdown rendering with DOMPurify sanitization and per-code-block copy buttons
- Guided tour step covering query suggestions, setup, and the budget pill
- Fixed tooltip
z-indexrendering below overlay UI - Fixed guided-tour teardown where
Popup.close()could tear down open panels mid-transition
- Replaced lasso SVG mask with curly-loop glyph
- Added toggle button for hover highlight effect with hotkey (H) and auto-clear of highlight/dim states on disable
- Added fine-grained bubble-set label controls with tabbed UI
- Show data source label in header and improve export filenames
- Fixed edges rendering on top of nodes after dragging a node and then hovering — reset zIndex elevated by G6's
frontElementafter drag ends - Fixed group-contiguous column order in Excel export
- Fixed new columns being inserted at end instead of next to their group
- Fixed apply button not enabling after row deletion in data editor
- Added full-page landing screen with hero layout, network background, and action cards
- Added guided tour with sample dataset and step-by-step UI walkthrough, including highlight clipping, metrics step, and panel transitions
- Redesigned popup with scrollable body, maximize/restore toggle, and smooth CSS transitions
- Redesigned tooltip header with pill badge, clean title hierarchy, and fixed positioning
- Added close button to tooltips and auto-hide expand when content fits
- Made tooltips scrollable, draggable by header, and expandable with toggle button
- Made sidebar resizable and improved filter row layout
- Added panel headers with integrated action buttons and improved layout
- Added in-app version display with automatic injection from
package.json - Increased default bottom bar height and persist resized height across sessions
- Added Delta4 icon to header and made header compact when data loaded
- Added screenshot tool with portrait mode, scale 1x–10x, and browser size options
- Hide file input after load and make header clickable to reload app
- Fixed filter sliders snapping to integers for properties with float values between integer min/max
- Fixed tooltip jump and disappear when dragging
- Fixed popup footer cutoff on short screens
- Fixed tour overlay z-index above selected elements container
- Fixed selection panel button alignment and use opaque background
- Fixed cross-browser checkbox alignment in Safari and deduplicated CSS
- Fixed
fitViewrespecting hidden disconnected nodes with G6translateTobug workaround - Fixed query editor cursor jumping, bracket processing, caret flicker, and overlay alignment
- Persisted hide-disconnected-nodes state per workspace across JSON save/load
- Fixed selection visual feedback using
setElementStatewith halo styles and preserved visibility during style updates - Fixed lasso wrapper staying visually active after data editor updates
- Persisted node positions in Excel export from data editor
- Persisted data editor warning dismissal via
localStorage - Fixed inline Delta4 icon in standalone HTML bundle
- Added right margin to filter lock status bar to avoid overlapping edit button
- Redesigned color scale and numeric scale picker popups to use the app's
Popupsystem with consistent header, footer, buttons, and overlay styling - Reordered header buttons to place export functions at the end
- Moved edit button to filter container and positioned it in top-right corner