I'm building lilbee, the whole local AI stack in a single executable: it runs and manages the models, and it's a search engine you can talk to. It indexes your files, notes, and code, crawls web pages into your library, and every answer cites the exact file and line. It started as me trying to build an Encarta 99 out of my own stuff that I could talk to privately and terminal first, and that's still the mission.
Onboarding with local AI is painful. A typical stack is a model server, a vector database, a document ingestion pipeline, a web UI, and a Docker Compose file holding it all together. Every piece needs configuring before you can ask a single question.
lilbee is that whole stack in one self-contained executable: model manager, search engine over your own data, MCP for agents, HTTP for GUIs, and a TUI for the terminal. No containers, no networking, nothing else to install. It scales from one laptop to as many GPUs as you have.
I'm trying to democratize local AI, starting with talking to your own stuff, while building the tool I want for myself.
Terminal-first, because I built it for myself and I knew that if the architecture stayed flexible, friendlier surfaces would come easily. TUI, CLI, REST API, MCP server, and Python library, with multi-GPU placement and integrations for opencode and hermes so programmers can put local AI behind their favorite agents. lilbee is its own model manager: you don't need Ollama or LM Studio at all, and the model families it runs are tested end to end on real GPUs, the architectures behind most of the 190,000+ GGUF models on Hugging Face. Already running Ollama or LM Studio? lilbee connects to them and keeps your models.
One of those friendlier surfaces, the gateway for Q&A with local models. My favorite story here is a completely non-technical user who went from the plugin store to talking to his solar panel docs in minutes, without ever opening a terminal.
Extraction is the core of lilbee. You can't search what you can't read, and an answer is only as good as the text that came out of the document, so a scanned PDF that turns to mush or a table that loses its columns is a bad answer waiting to happen. Good extraction is what makes good search possible.
In early iterations of lilbee I built my own extraction layer. When I found xberg I gutted all of that work, and a lot of it became my earliest contributions there. Today I'm a maintainer across the xberg ecosystem, and most of my open source work goes there (all my merged PRs):
| Project | Stars | Contributions |
|---|---|---|
| xberg |
Merged PRs | |
| crawlberg |
Merged PRs | |
| html-to-markdown |
Merged PRs | |
| liter-llm |
Merged PRs | |
| alef |
Merged PRs | |
| tree-sitter-language-pack |
Merged PRs | |
| sceptre |
Merged PRs |
lilbee is built on a lot of open source projects. Stuff I've contributed outside xberg that I'm pretty proud of:
| Project | Stars | What I did |
|---|---|---|
| DBOS Transact (Python, Go) |
Made SQLite migrations safe when several processes open a new database, in Python and Go. | |
| pdf_oxide |
Filed dozens of reproducible bug reports and landed fixes for text extraction, rendering crashes, and nondeterminism. | |
| lancedb / lance |
Made Lance run on older processors, with compatible builds and a source package. | |
| GPUStack / gguf-parser-go |
Reworked the VRAM estimator GPUStack uses to size models, including low estimates that silently ran out of memory. | |
| huggingface_hub / xet-core |
Fixed a download crash in headless programs. | |
| llama-cpp-python |
Fixed models that wouldn't load because of their chat template. | |
| ik_llama.cpp |
Made the server report its memory use per device, so programs don't have to scrape logs. A rewrite of my llama.cpp change for this fork. | |
| SkyPilot |
Four open PRs that help the API server survive a dying process, back off after errors, and cap its log. | |
| llama.cpp |
Made llama-server report its memory use per device, so programs don't have to scrape logs. The port to ik_llama.cpp is merged. | |
| candle |
Fixed DeBERTa-v2 models crashing at half precision. | |
| safetensors |
Fixed large tensors failing to load on 32-bit targets like wasm. |
| Project | Stars | What I did |
|---|---|---|
| mercurius | Fixed a crash in apps with nested loaders. | |
| screenshot-glb | Added a timeout so slow renders can finish. | |
| MetalAPI | My first project, from college: the Metal Archives scraped and served as a REST API. | |
| go-utils | Added unique and fixed reverse in Goldziher's Go library, years before he founded xberg and we ended up working together. |
|
| simpler-cpp-json | Automatic JSON serialization for any C++ struct, years before nlohmann/json shipped the same idea. | |
| openapi-generator | Unity support for the C# generator. |








