Full Release History · version numbers based on Docker Hub releases
npm audit fix plus tsx 4.21.0 → 4.23.1 (pulls esbuild 0.28.1),
clearing 7 advisories (hono, qs, vite, esbuild, @babel/core) — npm audit reports 0 vulnerabilities.
Chat messages now render in a centered max-w-4xl column. HTML docs (architecture/changelog/roadmap) moved into docs/.
Roadmap corrected: Ollama backend abort is an upstream limitation (ollama#2876), not a Nexus bug; Nexus-as-MCP-server direction dropped.
fetch_url tool added alongside web_search. The LLM can now chain search → fetch → answer in up to 8 tool calls per turn.
Tool-calling path refactored from a single-call branch to a multi-turn agentic loop (MAX_TOOL_ITERATIONS=8).
Fetch behavior: HTML stripped to plain text, content capped at 50 KB, 15-second timeout, SSRF-protected (blocks cloud metadata endpoints; allows LAN).
Shares the globe toggle. Sources panel covers both search results and fetched pages.
think: true to confirmed Ollama instances via the native
/api/chat endpoint; Ollama streams reasoning in message.thinking chunks synthesized server-side into
<think>...</think> tags. Models that natively emit <think> tags (DeepSeek R1) are parsed identically.
Reasoning appears in a collapsible purple section above the response. Global default on, per-chat Brain icon override. Models that reject
think: true (400) silently retry without it. FAST category always excluded.
readConfig, writeConfig, getUserCount, fileURLToPath,
__filename/__dirname, and hasAttachments from server.ts.
Dropped unused ModelCategory import from useConfig.ts. Removed dead ping surface
(runPing, isPinging, pingResult) from useConnection.ts.
Removed totalCount, activeConversationIdRef, and updateActiveConversationMessages
from useConversations.ts. Fixed a no-op ternary and removed isMasked/MASKED_PATTERN
from ProviderConfig.tsx. Removed @types/express-rate-limit dev dependency.
CategoryModel stored the provider URL at assignment time, so renaming a provider left stale hostnames
in category pools causing intermittent routing failures. The fix runs on every config save.
express-rate-limit to ^8.5.1 to resolve ip-address XSS
(GHSA-v2v4-37r5-5v8g).
Added overrides.postcss: ^8.5.10 to patch CSS stringify XSS in the transitive postcss dependency
(GHSA-qx2v-qp2m-jg93).
npm audit reports 0 vulnerabilities.
web_search and fetch_url.
Configure up to 10 MCP servers per user in the Models tab: name, URL, bearer token, and custom headers.
Each server's tools are prefixed as <serverName>__<toolName> so the LLM can target any tool unambiguously.
Tool list is cached per user per server with a 5-minute TTL; a refresh button invalidates the cache immediately.
The agentic loop iteration cap was raised from 4 → 8 to support multi-step MCP workflows.
Mid-response status shows Searching…; completed messages show an MCP error badge (red) on failure.
The Sources panel now lists every MCP tool call with server name, tool name, arguments, error kind, and duration.
Security guardrails: SSRF blocked (cloud metadata hosts, IPv6 loopback); header name blocklist enforced;
CR/LF and non-printable header value characters rejected; cleartext HTTP warning shown for non-LAN MCP hosts;
bearer tokens redacted from structured logs.
New standalone mcpClient.ts module — testable without booting the HTTP server.
28 unit tests + 4 opt-in integration tests (run with RUN_INTEGRATION_TESTS=1).
Uses @modelcontextprotocol/sdk@1.29.0 with Streamable HTTP transport.
think: true to confirmed Ollama instances using the native
/api/chat endpoint; Ollama streams reasoning in message.thinking chunks which are synthesized server-side into
<think>...</think> tags before forwarding to the client. Models that natively emit <think> tags
(DeepSeek R1) are parsed identically. The reasoning appears in a collapsible purple section above the response, capped at a scrollable
max height. Two toggle levels: a global default (on by default) in the System tab, and a per-chat override via the Brain icon.
Models that do not support thinking silently fall back. FAST category always skips thinking.
/api/tags before /v1/models. Previously Ollama's OpenAI-compatible
/v1/models endpoint responded first, causing Ollama instances to be misidentified as generic providers and routed to
/v1/chat/completions instead of the native /api/chat endpoint. This prevented think: true
from ever being sent.
npm prune --production in the Dockerfile builder stage.
Runtime dependencies reduced to 7 packages: better-sqlite3, cookie, dotenv, express, express-rate-limit, pino, zod.
Removed unused node-fetch dependency. Image reduced from 127 MB to ~86 MB.
CONTRIBUTING.md (getting started, project structure, commit format, PR guidelines, design principles),
SECURITY.md (supported versions, reporting via GitHub private advisories, scope definitions),
and GitHub issue templates (bug report, feature request; blank issues disabled).
*. Allow-Credentials only sent when a matching origin is present.169.254.169.254, metadata.google.internal, metadata.internal, kubernetes.default.svc) and IPv6 loopback blocked when saving provider URLs. Private LAN addresses remain allowed.Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Strict-Transport-Security, Referrer-Policy, Permissions-Policy.trust proxy set correctly so req.secure reflects Caddy upstream HTTPS state.PUT /api/admin/settings validates against a strict Zod schema; unknown fields rejected.cookie npm package.x-admin-key verified against ADMIN_API_KEY env var via constant-time comparison, not the stored password hash. Changing admin password no longer breaks API clients.http://localhost:11434 default from the frontend bundle and stripped http:// protocol from
placeholder text. Resolves browser mixed content warnings on HTTPS deployments.
/v1/models for providers whose base URL ends with /v1
(llama-swap, LM Studio, etc.). Previous logic appended /api/models causing 404s and "offline" status.
Model display names from llama-swap shown in UI while routing key sent in API requests. Model IDs trimmed of whitespace at source.
Long model names no longer overflow their grid cards.
CHAT_TIMEOUT_MS env var. Overall request timeout
scales to 4× the per-attempt value. Model-loading retry backoff extended from 3 retries at 5s intervals to 5 retries at 30s intervals
(up to 150s wait) to accommodate providers like llama-swap that take time to swap models.
localProviders: [{ name, url, key }]. Existing localUrl/localKey configs migrate automatically on first load.
ADMIN_API_KEY on startup. Existing data migrated to admin user seamlessly.read() calls. Previously a JSON object split across two network reads would be silently discarded.routerCacheEnabled was missing from the Zod config schema, so the validation middleware stripped it before writeConfig() ran. The toggle appeared to save but reverted on every reload.*.ts glob instead of individual filenames. Prevents missing module errors
when new backend files are added.
GET /api/conversations?limit=50&offset=0 returns metadata only; GET /api/conversations/:id returns full messages.
Retry-After headers.
npm test.
better-sqlite3). Conversations and config stored in data/nexus.db
with WAL mode. Eliminates read-modify-write race conditions, supports atomic transactions, enables future pagination.
Existing JSON files are auto-migrated on first startup and renamed to .migrated.
process.env.PORT instead of hardcoding 3000. SSRF self-loop detection also uses the dynamic port.
ROUTER_MODEL, ROUTER_URL, ROUTER_KEY).
Chat rename — double-click or pencil icon; auto-name from first message. Model loading retry — up to 3× with backoff.
Cookie-based auth — httpOnly session cookies, timing-safe key comparison. CORS middleware. SSRF protection.
KaTeX LaTeX rendering. Structured Pino logging. AES-256-GCM encryption for stored conversations and config.
Docker + Unraid community template support. No hardcoded cloud defaults.