Model or dataset
henomis/lingoose avatar
henomis/lingoose

LinGoose: A Modular Go Framework for LLM Applications, Now Frozen at v0.3.0

🪿 LinGoose is a Go framework for building awesome AI/LLM applications.

833 stars76 forksGoMIT

At a glance

What is it?
LinGoose is an MIT-licensed Go framework that abstracts LLM providers, threads, embeddings, indexes and pipelines behind small composable modules. Its README states it is no longer under active development, so the real question is whether a stable, unmaintained v0.3.0 fits your project.
Who is it for?
Adopt LinGoose if you are building a Go service around chat threads, embeddings or retrieval pipelines and you want a small set of MIT-licensed packages you can import selectively, with the understanding that the README states the project is no longer under active development and the latest release is v0.3.0 from November 2024.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Activity is slowing. The repository last received commits 6 months ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What LinGoose Actually Solves for Go Developers

Calling an LLM from Go is not hard. The hard part is the scaffolding around the call: keeping a conversation history in a shape you can append to and re-send, swapping one provider for another without rewriting your application, turning documents into embeddings, storing them somewhere queryable, and chaining those steps into something repeatable. LinGoose packages those concerns as separate importable modules. The README describes the project in three claims: it is modular, so you import only what you need; it is an abstraction of features, so you pick an implementation or write your own; and it is a complete solution, so you can build an application from the ground up. The audience is Go engineers who want to stay inside the Go toolchain rather than run a Python sidecar for retrieval and prompt orchestration. The topic list on the repository confirms the scope: ai, chatgpt, embeddings, index, llm, openai, pinecone, pipeline, prompt, vector. If your application is a single completion call, none of this earns its keep. If you are assembling a question-answering service over your own documents, the abstractions are the point.

Threads, Providers and Pipelines: the Shape of the Abstraction

The central object visible in the README example is the thread. You construct one with thread.New(), append a message built by thread.NewUserMessage(), and attach content with thread.NewTextContent(). That thread is then passed to a provider, in the example openai.New(), whose Generate method takes a context and mutates the thread in place. The example prints myThread after the call rather than capturing a return value, which tells you the response is appended to the same structure that holds the request history. That design makes multi-turn conversation a matter of reusing the thread object instead of manually concatenating message slices. The rest of the architecture has to be inferred from the module layout and the repository topics. Embeddings and indexes are separate concerns, with Pinecone named among the topics, and pipelines sit above them to sequence steps. The README does not document the pipeline API in the excerpt available, so treat the exact composition rules as something to read from the package documentation before you design around them. The abstraction claim cuts both ways: because features are interfaces, you can supply your own implementation, but you also inherit whatever assumptions the interface bakes in about how a provider behaves.

Getting a First Program Running

The quick start is four steps and uses no configuration file. Create a module, write the program, tidy dependencies, export a key, run. The commands are: mkdir example, cd example, go mod init example, then go mod tidy after adding the source file, then export OPENAI_API_KEY=your-api-key and go run . The only environment variable named in the README is OPENAI_API_KEY. The imports in the example are github.com/henomis/lingoose/llm/openai and github.com/henomis/lingoose/thread, which matches the modular claim: the thread package and one provider package, nothing else. The README shows the expected program output as a goose joke. Because the module path is the repository path, you can pin a version in go.mod the usual way; the releases listed for the repository are v0.3.0, v0.2.1-alpha.2 and v0.2.1-alpha.1, so v0.3.0 is the version to pin if you want the most recent tagged release. Note the versioning history: two alpha tags preceded the current release, which suggests the API moved before it settled. For anything beyond the quick start, the README points to three blog posts covering Claude integration, Q&A pipelines, and Redis-backed retrieval augmented generation. Those posts, not the README, are where the pipeline and index usage appears to be documented.

The Maintenance Question Is Answered in the README

Most reviews have to guess at a project's health. Here you do not have to. The README opens with a notice stating that LinGoose is no longer under active development, that the author wanted to build something new rather than patch something old, and that the successor is Phero, described as a Go framework built from the ground up for multi-agent AI systems. The notice also states that LinGoose will stay available and stable. That is an unusually candid disclosure and it should drive your decision more than any technical detail. The practical consequences: the latest release is v0.3.0, tagged in November 2024, and the repository's last push is dated March 2026, which is consistent with a project that receives no feature work but remains online. The README still invites bug reports through GitHub issues and links contribution guidelines, but a stated end to active development means a fix for your problem is not guaranteed. The failure mode is not that the code stops working. It is that the provider packages wrap external SDKs and external APIs, and those move. A provider that compiled cleanly at v0.3.0 may need attention later, and that attention will have to come from you, in a fork.

Where a Frozen Framework Is the Wrong Choice

If your product depends on a provider feature that did not exist when v0.3.0 was tagged, LinGoose's abstraction will be in your way rather than under you. The abstraction layer is the cost: to reach a new API surface you either extend the interface yourself or bypass the framework and call the provider SDK directly, at which point you are maintaining two paths. The same applies to vector stores. Pinecone is named among the repository topics, but the README does not enumerate which index backends are supported, so if your infrastructure is something else, verify support before you plan around it. There is a second, subtler cost. Because Generate mutates the thread it is given, concurrency requires care: sharing one thread across goroutines is not something the README addresses, and the mutating signature suggests it is not intended. If your workload is high-throughput and stateless, a thin wrapper over the provider SDK will be less code and fewer surprises. LinGoose earns its place when you want the thread, embedding, index and pipeline vocabulary to be consistent across several providers in one codebase.

LangChainGo as the Live Alternative

The obvious comparison in Go is LangChainGo, and the difference is not feature count. It is the maintenance model. LangChainGo is an actively developed port of the LangChain concepts, with a broader set of integrations and a community that keeps pace with provider changes. LinGoose's approach is narrower and more opinionated: a thread object that carries conversation state and is mutated by the provider call, rather than a chain-and-runnable composition model. That narrower surface is easier to read in one sitting, which matters when you are deciding whether to depend on it. The trade is that you get fewer integrations and, per the README, no active development. The honest framing is that LinGoose is a small, stable, readable framework whose author has moved on, while LangChainGo is a larger, changing framework with an active upstream. Neither is correct in the abstract. If you want the smallest dependency that gives you threads and retrieval in Go, LinGoose is defensible. If you want someone else to keep the provider layer current, it is not.

Licence, Upgrades and What Pinning v0.3.0 Means

LinGoose is released under the MIT License, attributed in the README to Simone Vellei with a copyright line running from 2023. MIT is permissive: it allows use, modification and redistribution provided the copyright notice and permission notice are retained. That is a summary of the licence text, not legal advice, and your legal reviewers should read the LICENSE file themselves. Two practical points follow from MIT plus a frozen upstream. First, the licence permits you to fork and maintain your own copy, which is the realistic path if you need a provider fix and the upstream will not take one; the cost then is that you own the merge burden for every future provider change, and there is no upstream to merge from. Second, because the module path is the repository path, a fork means rewriting your import lines or using a Go module replace directive, which is a real but mechanical cost. On upgrades: there is nothing to upgrade to beyond v0.3.0, and the two alpha tags before it suggest the pre-1.0 API was still moving. Pin the exact version in go.mod, read the package documentation for the pipeline and index types, and treat the three linked blog posts as the extended manual. The README's own pointer for new work is Phero, which is where the author's attention now sits.

Editorial conclusion

Adopt LinGoose if you are building a Go service around chat threads, embeddings or retrieval pipelines and you want a small set of MIT-licensed packages you can import selectively, with the understanding that the README states the project is no longer under active development and the latest release is v0.3.0 from November 2024. Do not adopt it if you need a provider surface that tracks new model APIs, or if you want an upstream that will accept fixes for a bug you hit in production. Before committing, verify three things in your own environment: that the provider package you need still compiles against the current SDK it wraps, that the pipeline and index abstractions match how you actually chunk and retrieve documents, and that the MIT licence terms are acceptable to your legal reviewers. If any of those fail, the README points new projects at Phero, the author's successor framework for multi-agent systems.

Official sources

  1. henomis/lingoose on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
Community notes

Community notes