
11.07.2026 - 09:15
Read on dev.to
LM Studio, Ollama, llama.cpp, vLLM — local inference has never been easier to run. But the chat UIs around them? Mostly bare-bones. So I built Liquid Local AI Client : an Angular + NestJS + MongoDB chat app that talks to any OpenAI-compatible inference server, with a pile of features you don't usually get for free.
It's fully open source. Here's what makes it worth a look.
Most local setups that support MCP (Model Context Protocol) rely on the inference server itself to orchestrate tool calls. LM Studio recently disabled that for localhost servers, which broke a lot of setups overnight.
This client sidesteps the whole problem: the NestJS backend runs its own MCP client, lists tools, converts them to plain OpenAI function-tool definitions, and executes tool_calls itself in a loop. Works with any backend that supports standard function calling — not just LM Studio.
On top of the built-in tools (file generation, ZIP bundling, image generation…), users can now register their own custom MCP servers right from the UI — auto-discovers the server's name and tools, lets you toggle individual tools on/off account-wide, and even opt a specific chat out of a server without touching the global config.
llama.cpp added audio input support, so I added a mic button. Record a voice message, it's hand-encoded as WAV client-side (not the lossy webm your browser wants to give you), sent as an input_audio content part, and played back in the chat as a custom-styled audio bubble — no ugly native <audio> controls.
This is the one I'm proudest of. Every other local chat UI I've tried loses your in-progress response if you refresh, switch tabs, or your laptop sleeps. Not here.
Generation is fully decoupled from the HTTP connection that started it:
resume SSE endpoint) and you replay everything you missed, then keep streaming live — tool calls, reasoning, all of it, in the right order.No polling-and-praying. No "please wait, reloading…". It just picks up where it left off.
The model can call generate-image-tool mid-conversation — it submits a job to a local InvokeAI instance, downloads the result, and drops it straight into the chat.
Opt-in per chat: messages are AES-encrypted in the browser before they ever touch your inference server's own logs/message store. The model decrypts via an MCP tool call at inference time — from the user's side, completely invisible.
git clone https://github.com/xsip/liquid-local-ai-client
npm install
npm start
Point it at any OpenAI-compatible server, register, and go. Full setup docs, architecture breakdown, and API reference in the README.
If you're running local models and tired of chat UIs that fall apart the moment you refresh the page — give it a spin. ⭐ the repo if it's useful, issues and PRs welcome.