llama.cpp 모델을 위한 로컬 우선 채팅 UI로, 대화 분기와 파일 첨부 기능을 제공합니다
README 링크에서 발견 · 2 days ago
llama.cpp 또는 다른 것을 통해 로컬 LLM과 채팅하기 위한 세련된 브라우저 UI
What they did
llama.cpp WebUI를 더 친근한 데스크톱 스타일 채팅 앱으로 바꾼 포크입니다. 이 포크는 llama.cpp 서버를 모델 백엔드로 유지하면서 DaisyUI 테마, Markdown 및 LaTeX 렌더링, 구문 강조, 모바일과 데스크톱을 위한 반응형 레이아웃을 갖춘 재설계된 인터페이스를 얹었습니다. 대화는 IndexedDB에 저장되므로 기록이 브라우저에 남고, 사용자는 원본 스레드를 보존하면서 이전 메시지를 편집해 대화를 분기할 수 있습니다. 가져오기와 내보내기를 통해 채팅을 여러 기기 간에 옮길 수 있습니다. 첨부 파일은 텍스트, 이미지, PDF를 지원하며, 생성 파라미터는 스트리밍 응답 및 성능 지표와 함께 설정에서 노출됩니다. 이 앱은 오프라인 기능을 갖춘 PWA로도 동작하며 언어 팩을 제공합니다. llama.cpp 외에도 동일한 UI에서 base URL만 변경하면 LM Studio, Ollama, vLLM 또는 OpenAI 호환 엔드포인트를 가리킬 수 있습니다. 두 가지 배포 경로가 문서화되어 있습니다. 하나는 사용자가 base URL을 로컬 서버로 설정하는 호스팅 인스턴스로, HTTPS에서 HTTP로의 브라우저 차단을 위한 mitmproxy 리버스 프록시 우회 방법이 포함되며, 다른 하나는 빌드된 UI가 llama.cpp 서버의 --path 플래그를 통해 직접 제공되는 완전한 로컬 설치입니다. 개발자는 Node 22 이상에서 npm ci, npm run build, 그리고 라이브 개발 서버를 위한 npm start를 사용해 빌드합니다.
How it went
그 결과물은 전적으로 로컬 모델을 대상으로 동작하는, 시각적으로 완성도 높은 채팅 프런트 엔드이며, 대화 분기와 첨부 파일 기능이 돋보이는 특징입니다. 이는 공식 릴리스가 아닌 커뮤니티 포크이므로 완성도는 좋지만, 프로젝트는 업스트림 llama.cpp 서버 동작과 사용자가 base URL 및 인증서를 올바르게 구성하는 것에 의존합니다.
Worth knowing
호스티드 인스턴스 경로는 브라우저가 HTTPS 페이지에서 HTTP 호출을 거부하기 때문에 혼합 콘텐츠 차단에 부딪힌다. 문서화된 mitmproxy 우회 방법은 인증서를 신뢰해야 하며 초보자 친화적이지 않다. 로컬 설치 경로는 이미 llama.cpp 서버 바이너리와 양자화된 GGUF 모델이 있다고 가정한다. 대화 데이터는 브라우저 저장소에 저장되므로, 내보내지 않으면 사이트 데이터를 지울 때 기록이 사라진다. 멀티 프로바이더 지원은 각 백엔드가 OpenAI 호환 API를 노출하는지에 달려 있다.
Wiring
llama.cpp 서버는 모델 런타임으로, 양자화된 GGUF 파일을 로드하고 포트 8080에서 HTTP API를 노출합니다. UI는 npm ci와 npm run build로 빌드되는 정적 프런트엔드로, llama.cpp 서버의 --path 플래그를 통해 서빙되거나 별도로 호스팅됩니다. 별도 호스팅의 경우 UI의 General 설정에 로컬 서버를 가리키는 Base URL 필드가 있으며, 브라우저가 HTTPS 페이지에서의 HTTP 요청을 차단하기 때문에 포트 8443의 mitmproxy 리버스 프록시가 둘을 연결합니다. 사용자는 프록시를 한 번 방문해 인증서를 신뢰한 뒤 UI를 새로고침합니다. 대화는 IndexedDB에 유지되고, 스트리밍은 Server-Sent Events를 사용하며, 동일한 base URL 필드를 Ollama, LM Studio, vLLM 또는 OpenAI 호환 엔드포인트로 다시 지정할 수 있습니다.
Try it yourself
I can't actually inspect your repo or disk from here, so I'll give you the exact commands to run yourself, plus the setup steps and the answers you need. ## 1. Check for a llama.cpp server binary and a GGUF model Run these from the repo root: ```bash # llama.cpp server binary (common names/locations) which llama-server llama-server.exe 2>/dev/null find . -maxdepth 4 -type f \( -name 'llama-server' -o -name 'llama-server.exe' -o -name 'server' \) 2>/dev/null ls -la ./build/bin 2>/dev/null # GGUF models anywhere in the repo or common model dirs find . -maxdepth 5 -type f -name '*.gguf' 2>/dev/null find ~ -maxdepth 4 -type f -name '*.gguf' 2>/dev/null ``` **If nothing turns up, download:** - **llama.cpp server binary** — either build from source (`git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp && cmake -B build && cmake --build build --config Release`) or grab a prebuilt release for your OS from the llama.cpp GitHub Releases page. The binary is `llama-server` (older builds call it `server`). - **A GGUF model** — e.g. a quantized instruct model from Hugging Face, such as `bartowski/Meta-Llama-3.1-8B-Instruct-GGUF` (Q4_K_M is a good default) or a smaller `Qwen2.5-7B-Instruct-GGUF` if you're on limited hardware. Download the `.gguf` file directly. ## 2. Build the UI ```bash npm ci npm run build ``` This produces a static build (typically `dist/` or `build/` — confirm which by checking `package.json` or the output of the build). ## 3. Serve it with llama.cpp Point `--path` at the build output directory (adjust `dist` if your build emits elsewhere): ```bash ./llama-server \ --model /path/to/your-model.gguf \ --path ./dist \ --host 0.0.0.0 \ --port 8080 \ --ctx-size 4096 ``` Notes: - `--path` makes llama-server serve the static UI **and** the API from the same origin, which avoids CORS entirely. - `--host 0.0.0.0` exposes it on all interfaces; use `127.0.0.1` if you only want local access. - `--ctx-size 4096` sets the context window; make sure your model supports at least that. ## 4. Base URL setting in the UI Since the UI is served by llama-server itself, use a **relative/same-origin** base URL: ``` http://localhost:8080 ``` or, if the UI expects an API base path: ``` http://localhost:8080/v1 ``` (Use `http://<your-LAN-IP>:8080` if you're accessing it from another machine.) Because the UI and API share an origin, no CORS configuration is needed. ## 5. HTTPS / certificate issues with the hosted instance If you use a hosted llama.ui instance (served over HTTPS) pointed at your local `http://localhost:8080` server, expect: - **Mixed content blocking** — browsers block `http://` requests from an `https://` page. The UI won't be able to reach your local server at all. - **CORS failures** — the hosted origin differs from `localhost:8080`, so llama-server must send `Access-Control-Allow-Origin` headers (it does by default for `*`, but verify). - **Self-signed cert errors** — if you try to work around mixed content by putting your local server behind HTTPS with a self-signed certificate, the browser will reject it unless you explicitly trust the cert or launch the browser with `--ignore-certificate-errors` (not recommended). - **Private Network Access** — newer Chrome versions may block requests from a public HTTPS origin to a private/local address without the appropriate `Access-Control-Allow-Private-Network` header. **Recommendation:** use the locally-served UI (`http://localhost:8080`) rather than the hosted instance when talking to a local llama.cpp server — it sidesteps all of the above.