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-devkitWhy 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
→ persistenceWhen 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 validateThe 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-textOn 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:
-
embeddings
-
document ingestion
-
semantic search
-
hybrid retrieval
-
ranking
-
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 recordsTrying 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 → answerto:
State
→ node
→ tool
→ state update
→ conditional branch
→ checkpointThat transition is where AI experimentation starts becoming software engineering.
Development tooling that is already opinionated
The repository standardises the less glamorous but essential parts
-
uvfor 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 validateThe 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
VerificationWithout 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.pyFrom 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 workersThe 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.