Ovrin is a Go library. The core module has zero external dependencies and uses no cgo, so it
cross-compiles and builds static. Provider-specific code lives in separate modules, so you pull in
only the vendors you actually use.
Install the core
go get github.com/BAGOMBEKA-JOB-DEV/ovrin@v1.0.0
Ovrin is at v1.0.0, and the API is stable: nothing will break without a v2
(ADR-0032).
That is a promise about compatibility, not about accuracy — release status
says exactly what v1.0.0 does and does not claim.
Add the providers you use
The core gives you Client, Extract, the three provider seams, and the whole pipeline. Every provider
is its own module, so install only the ones you need and nothing else enters your go.sum.
go get github.com/BAGOMBEKA-JOB-DEV/ovrin/model/skyl@v1.0.0 # a model: OpenAI, Gemini, Ollama, …
go get github.com/BAGOMBEKA-JOB-DEV/ovrin/ocr/tesseract@v1.0.0 # local, offline OCR
go get github.com/BAGOMBEKA-JOB-DEV/ovrin/ocr/google@v1.0.0 # Google Cloud Vision
go get github.com/BAGOMBEKA-JOB-DEV/ovrin/ocr/azure@v1.0.0 # Azure AI Document Intelligence
go get github.com/BAGOMBEKA-JOB-DEV/ovrin/ocr/textract@v1.0.0 # Amazon Textract
go get github.com/BAGOMBEKA-JOB-DEV/ovrin/render/pdfium@v1.0.0 # rasterise scanned PDFs
go get github.com/BAGOMBEKA-JOB-DEV/ovrin/otel@v1.0.0 # OpenTelemetry
| Module | Version | What it gives you |
|---|---|---|
ovrin |
v1.0.0 |
The core library. Zero dependencies, no cgo. |
ovrin/model/skyl |
v1.0.0 |
The Model seam, with constructors for OpenAI, Gemini, Ollama and any OpenAI-compatible host. |
ovrin/ocr/tesseract |
v1.0.0 |
Local, offline OCR. Tesseract compiled to WebAssembly, so still no cgo. |
ovrin/ocr/google |
v1.0.0 |
OCR via Google Cloud Vision. Standard library only — no Google SDK. |
ovrin/ocr/azure |
v1.0.0 |
OCR via Azure AI Document Intelligence. The adapter that reports table structure. |
ovrin/ocr/textract |
v1.0.0 |
OCR via Amazon Textract. Standard library only, SigV4 included. |
ovrin/render/pdfium |
v1.0.0 |
The Renderer seam. PDFium under WebAssembly, so rasterising needs no cgo either. |
ovrin/otel |
v1.0.0 |
Turns Ovrin's hooks into OpenTelemetry spans and metrics. |
The modules version independently, each tagged with its own path prefix — model/skyl/v1.0.0, for
example. They all started at v1.0.0 together, but they may diverge from here, so for any one module
"latest" means the latest release of that module.
Using Anthropic
model/skyl has constructors for OpenAI, Gemini, Ollama and OpenAI-compatible hosts, and deliberately
none for Anthropic. Anthropic's SDK lives in its own skyl module, and a constructor here would put that
SDK into the go.mod of every Ovrin user — including the ones running Ollama locally.
Anthropic is fully supported. Wire it explicitly, and the SDK lands in your go.mod, where you can see
it:
import (
"github.com/BAGOMBEKA-JOB-DEV/skyl"
"github.com/BAGOMBEKA-JOB-DEV/skyl/provider/anthropic"
ovrinskyl "github.com/BAGOMBEKA-JOB-DEV/ovrin/model/skyl"
)
model := ovrinskyl.New(
skyl.New(anthropic.New(key)),
ovrinskyl.WithModelID("claude-opus-5"),
// Anthropic requires an explicit output cap.
ovrinskyl.WithMaxTokens(8192),
)
This path needs Go 1.24 or newer. Ovrin's own modules only need 1.22, butgithub.com/BAGOMBEKA-JOB-DEV/skyl/provider/anthropic declares go 1.24, and adding it raises your
module's floor to match.
Go version
Every Ovrin module declares go 1.22. That is a language floor, not a statement that Go 1.22.0 is safe
to run Ovrin on — and a provider you add can raise it, as the Anthropic one does.
Ovrin hands attacker-controlled bytes to archive/zip, encoding/xml, compress/flate and image/*,
so a defect in those packages is a defect in Ovrin's parsing path — and only a newer toolchain fixes it.
Build with the latest patch release of whichever minor version you use. For 1.22 that means
1.22.4 or newer, which fixes GO-2024-2888: a panic on a crafted zip central directory, reachable
from any DOCX, XLSX or PDF Ovrin accepts.
Run govulncheck ./... against your own build. It checks the toolchain you actually use, which is the
only one that matters.
What you actually need
Most extractions need only the core plus a model adapter. You need a renderer only when you are
running OCR locally against a scanned PDF: a cloud OCR provider that accepts a PDF rasterises it
server-side, and image inputs never need rasterising at all.