TriVec Labs
All posts
Local AISeptember 1, 2026·7 min read

Beating The Black Terminal

For local AI development, the ritual usually involves installing Python, Docker, an inference server, a vector database, several model files, twelve libraries…

Engineering

Every new technology has an initiation ritual.

For local AI development, the ritual usually involves installing Python, Docker, an inference server, a vector database, several model files, twelve libraries with suspiciously similar names, and at least one dependency compiled during a full moon.

By the time the environment works, the original idea has been forgotten.

This is the problem Local AI DevKit is trying to solve ,the friction that prevents developers from reaching the first useful experiment.

The repository provides a lightweight starter environment for local LLM applications, RAG pipelines, and agentic workflows using Ollama, Qdrant, PostgreSQL, Redis, LangGraph, Docker, VS Code Dev Containers, and modern Python tooling.

It also includes examples for RAG, tool-calling agents, persistence, memory, context compaction, and evaluation.

Repository:

https://github.com/uncle-voh-max/local-ai-devkit

Why bother with a local AI environment?

It is fair to ask why we should run models and infrastructure locally when hosted APIs can deliver answers in minutes. When the token bill lands on manager’s desk, not in our payslip.

Hosted models are excellent for production workloads, model evaluation, and experiments requiring frontier capabilities. But relying exclusively on them creates a poor inner development loop.

A useful local environment gives us several engineering advantages.

Faster experimentation

When the model is running on the machine, developers can repeatedly change prompts, tool definitions, chunk sizes, graph transitions, and retrieval settings without worrying about the cost of every invocation.

This foster the right engineering behaviour :- experimenting frequently instead of treating every model call like an international bank transfer.

Better debugging

Agentic applications are multi-stage systems

A request may pass through:

Prompt construction
→ model invocation
→ tool selection
→ retrieval
→ state transition
→ another model invocation
→ persistence

When these components run locally, we can inspect requests, logs, state, databases, and model behaviour without crossing several external service boundaries.

The difference between debugging locally and debugging five managed services is similar to the difference between looking for your keys at home and looking for them across your town.

Privacy and data control

Local execution is useful when experimenting with proprietary code, internal documents, customer-like datasets, or material that should not leave the developer machine.

It does not automatically make the application secure, but it reduces unnecessary data movement and makes the boundaries easier to understand.

Offline resilience

A local development setup does not need to stop because an API key expired, a provider rate-limited the account, or the office Wi-Fi decided to pursue a simpler life.

You can continue testing orchestration, retrieval, persistence, tool calls, and many model interactions without a hosted dependency.

Reproducible onboarding

The greatest value is not that one engineer can eventually configure all the tools.

A senior engineer can usually wrestle a local stack into submission.

The real question is:

Can the next engineer clone the repository and reach a working example without receiving an oral history of your laptop?

That is where a reusable development kit becomes valuable.

The real enemy: initial inertia

Most side projects and learning projects do not fail because the technical idea is impossible.

They fail between:

“That sounds interesting”

and:

“I have a working environment”

This gap contains dozens of tiny decisions:

  • Which Python version?

  • Which package manager?

  • Should Ollama run natively or in Docker?

  • Which chat model should be pulled?

  • Which embedding model should be used?

  • How does a container reach host Ollama?

  • Which ports are required?

  • How should Qdrant be configured?

  • Where should agent checkpoints be stored?

  • How do we confirm that everything is healthy?

  • Which example should be run first?

None of these questions is particularly difficult.

Together, however, they form a surprisingly effective procrastination framework.

Local AI DevKit reduces this initial inertia by turning those decisions into repository defaults.

The setup path is intentionally short : small enough to run during a coffee break, or while enduring the company’s latest mandatory HR training.

git clone https://github.com/uncle-voh-max/local-ai-devkit.git
cd local-ai-devkit
 
make setup
make start
make pull-models
make validate

The setup installs Python dependencies and pre-commit hooks, starts the core Docker services, pulls the configured Ollama models, and validates the environment.

That is the difference between a wiki page and a development platform.

A wiki explains what someone once did.

A platform lets the next person do it again.

What the DevKit gives you

The repository combines several layers needed by modern AI applications.

Local inference with Ollama

Ollama provides the local model-serving boundary.

The default configuration separates chat, tool-use, and embedding models through environment variables:

OLLAMA_CHAT_MODEL=qwen2.5:7b
OLLAMA_TOOL_MODEL=qwen2.5:7b
OLLAMA_EMBEDDING_MODEL=nomic-embed-text

On Apple Silicon, the repository recommends running Ollama natively for hardware acceleration while running the supporting infrastructure in Docker. Containers connect back to the host through host.docker.internal.

This is a sensible boundary.

Containers provide repeatability for databases and services. Native Ollama provides better access to the machine’s acceleration.

Not everything needs to be containerised merely because Docker is nearby and looking enthusiastic.

Qdrant for vector retrieval

Qdrant supplies vector storage and similarity search.

That gives developers a real environment for experimenting with:

  1. embeddings

  2. document ingestion

  3. semantic search

  4. hybrid retrieval

  5. ranking

  6. RAG evaluation

A vector database is one of those components that appears trivial in a notebook and develops opinions once persistence, collections, payloads, indexes, and repeatable setup are involved.

Starting it consistently through Docker removes much of that ceremony.

PostgreSQL, Redis, and SQLite

The kit includes different storage systems for different responsibilities.

PostgreSQL is intended for durable application data such as profiles and long-term memory. Redis supports service and assistant workflows. SQLite is used for lightweight agent checkpoints and context-compaction state.

This is useful because agentic systems rarely have only one type of state.

They may need:

Short-lived execution state
Conversation checkpoints
Long-term memories
Vector representations
Application records

Trying to force all of these into a single storage mechanism generally works until it becomes somebody else’s incident.

LangGraph for orchestration

LangGraph is included for building stateful workflows rather than placing an infinite while loop around an LLM call.

The repository provides examples covering basic agents, tool calling, checkpoint persistence, context compaction, and long-term memory.

This lets developers move from:

Prompt → answer

to:

State
→ node
→ tool
→ state update
→ conditional branch
→ checkpoint

That transition is where AI experimentation starts becoming software engineering.

Development tooling that is already opinionated

The repository standardises the less glamorous but essential parts

  • uv for dependency management

  • Ruff for linting and formatting

  • Pyright for type checking

  • pytest for testing

  • pre-commit hooks

  • VS Code Dev Containers

  • OpenCode configuration

  • a Makefile as the common command surface

These are not decorative additions.

A project that contains a model but lacks formatting, tests, type checks, and repeatable commands is not an AI platform.

It is a notebook that has escaped

Knowing whether the environment actually works

Installation scripts often finish with a reassuring green message while half the services quietly reconsider their career choices.

Local AI DevKit addresses this with two diagnostic paths

make doctor
make status
make validate

The status system checks services, developer tools, Python dependencies, installed Ollama models, PostgreSQL connectivity, SQLite state, Docker, configuration files, and sanitised environment variables.

It also exposes an HTML dashboard and JSON status endpoint.

This is more important than it looks.

A development environment needs both:

Provisioning
and
Verification

Without verification, setup automation merely fails faster and with greater confidence.

The dashboard also makes troubleshooting less mysterious. Instead of saying “the RAG example does not work,” a developer can see that Qdrant is unavailable or the embedding model has not been pulled.

Good diagnostics convert folklore into evidence.

From setup to actual learning

A starter kit becomes useful only when it leads somewhere.

The repository includes runnable examples for:

  • a minimal RAG pipeline

  • a fuller hybrid-search and reranking pipeline

  • a basic LangGraph agent

  • checkpoint persistence

  • context compaction

  • long-term memory

  • LLM evaluation

The first experiment can be as small as

uv run python examples/rag_simple.py

From there, a developer can inspect progressively more advanced examples rather than beginning with a blank directory.

This is good learning design.

A blank project gives complete freedom, which is another way of saying it provides no clues.

A starter kit gives a working path that can later be questioned, modified, and replaced.

What this repository does not solve

A local environment is not production.

It will not automatically answer :-

How the model should scale
How tenants should be isolated
How inference should be secured
How quality should be evaluated
How prompts should be versioned
How traces should be retained
How costs should be controlled in production
How failures should be handled across distributed workers

The repository includes observability and evaluation tools as extension points, but production design still requires deliberate engineering.

That is not a weakness.

A starter environment should shorten the path to learning, not pretend to be a universal production architecture.

Senior-engineering tip: Optimise the starter kit for reversibility. Defaults should help developers begin, but every major component should remain replaceable.

Ollama may later become a hosted provider.

SQLite checkpoints may move to PostgreSQL.

Local Qdrant may become a managed cluster.

The code should depend on contracts, not on the emotional attachment we develop to our first Docker Compose file.