okf-gem · in Dockerno Docker
docker.okfgem.com
+

The okf CLI,
no Ruby required

A CLI do okf,
sem Ruby nenhum

A portable image that runs the whole toolkit, validate, lint, search, and the graph, live or static, with nothing installed on the host. Mount your bundle at /data and every command reads like the CLI. It is the no-Ruby door into the okf-gem pack: Agent Skill + CLI/Lib + Graph, 100% local.

Uma imagem portátil que roda o toolkit inteiro, validate, lint, search e o grafo, ao vivo ou estático, sem nada instalado no host. Monte o seu bundle em /data e todo comando fica igual à CLI. É a porta sem-Ruby para o pacote okf-gem: Agent Skill + CLI/Lib + Graph, 100% local.

pull and runbaixe e rode
$ docker run --rm -v "$PWD:/data" \
    ghcr.io/serradura/okf validate .

Why an image

Por que uma imagem

The gem is light on purpose: it runs on every Ruby since 2.4, with three pure-Ruby dependencies and no build step. But not every box is a Ruby box. A CI job for a Go or Rust project, a Kubernetes step, a data pipeline, a reviewer who has never typed gem install: for all of them, adding a Ruby toolchain just to reach a Markdown validator is more friction than the tool is worth. A format meant to be portable should be reachable without adopting the language it is written in. The image is that reach.

A gem é leve de propósito: roda em todo Ruby desde o 2.4, com três dependências em Ruby puro e nenhum passo de build. Mas nem toda máquina é uma máquina Ruby. Um job de CI de um projeto Go ou Rust, um passo de Kubernetes, um pipeline de dados, uma pessoa que nunca digitou gem install: para todos eles, adicionar um toolchain de Ruby só para alcançar um validador de Markdown é mais atrito do que a ferramenta vale. Um formato feito para ser portátil tem que ser alcançável sem adotar a linguagem em que foi escrito. A imagem é esse alcance.

See it run

Veja rodando

validate, then serve the graphvalidar, depois servir o grafo

Every command is the CLI you already know, with your directory mounted at /data. For the server, publish the port and bind 0.0.0.0 so the host can reach it.

Todo comando é a CLI que você já conhece, com o seu diretório montado em /data. No servidor, publique a porta e escute em 0.0.0.0 para o host alcançar.

bash · my-app
$ docker run --rm -v "$PWD:/data" ghcr.io/serradura/okf validate .
OKF v0.1 conformance — .
  concepts: 37   index.md: 10   log.md: 1
  ✓ conformant

$ docker run --rm -v "$PWD:/data" -p 8808:8808 \
    ghcr.io/serradura/okf server . --bind 0.0.0.0
serving 37 concepts at http://0.0.0.0:8808 (Ctrl-C to stop)
# open http://127.0.0.1:8808 on the host — the graph is live# abra http://127.0.0.1:8808 no host — o grafo está ao vivo

Every verb, in the image

Todo verbo, na imagem

ghcr.io/serradura/okf

Prefix each with docker run --rm -v "$PWD:/data" ghcr.io/serradura/okf (or install okf and drop the prefix). <dir> is your bundle inside the mount: . for the whole mounted directory, or a subfolder like docs.

Prefixe cada um com docker run --rm -v "$PWD:/data" ghcr.io/serradura/okf (ou instale o okf e dispense o prefixo). <dir> é o seu bundle dentro do mount: . para o diretório montado inteiro, ou uma subpasta como docs.

validate <dir>Is it legal OKF? Conformance to the v0.1 spec (§9). Exit 1 if not.É OKF legal? Conformidade com a spec v0.1 (§9). Sai 1 se não.
lint <dir>Is it well curated? Orphans, missing concepts, stubs, stale timestamps.Está bem curado? Órfãos, conceitos faltando, stubs, timestamps velhos.
search <dir> termRanked retrieval across metadata and bodies.Recuperação rankeada por metadados e corpos.
index <dir>The progressive-disclosure map (§6): bodies, rollups, listings.O mapa de divulgação progressiva (§6): corpos, rollups, listagens.
server <dir> --bind 0.0.0.0The live graph over HTTP. Add -p 8808:8808 to the run.O grafo ao vivo via HTTP. Some -p 8808:8808 ao run.
render <dir> -o /data/graph.htmlThe same page as one static file, written into the mounted bundle. No server, hosts anywhere.A mesma página como um arquivo estático, escrito no bundle montado. Sem servidor, hospeda em qualquer lugar.
catalog · files · tags · types · statsThe browser views, on the CLI.As visões do navegador, na CLI.

Install okf, skip the prefix

Instale o okf, dispense o prefixo

one small scriptum script pequeno

The installer drops a script named okf on your PATH, so the image takes the exact CLI interface with no docker run prefix. It mounts your directory, and for server it publishes the port and opens the bind for you. Because the command is okf, the agent skill and your habits work unchanged.

O instalador coloca um script chamado okf no seu PATH, então a imagem assume a interface exata da CLI sem o prefixo docker run. Ele monta o seu diretório e, no server, publica a porta e abre o bind por você. Como o comando é okf, a skill do agente e os seus hábitos funcionam sem mudança.

Install in one lineInstale em uma linha
$ curl -fsSL https://docker.okfgem.com/install.sh | sh

$ okf validate .
$ okf server .          # port + bind handled# porta + bind resolvidos
$ okf search . "graph server"
Or by hand (same three steps)Ou na mão (os mesmos três passos)
$ curl -fsSL https://docker.okfgem.com/okf \
    -o /usr/local/bin/okf
$ chmod +x /usr/local/bin/okf
$ okf --version

# set OKF_IMAGE to pin a version# use OKF_IMAGE para fixar a versão

On Windows, install with PowerShell instead: irm https://docker.okfgem.com/install.ps1 | iex. The image is Linux, and Docker Desktop runs it through WSL2.No Windows, instale com o PowerShell: irm https://docker.okfgem.com/install.ps1 | iex. A imagem é Linux, e o Docker Desktop a roda via WSL2.

The script is short and readable: fetch docker.okfgem.com/okf and look before you run it. Docker still does the work, so the same privacy and offline story holds. O script é curto e legível: baixe docker.okfgem.com/okf e leia antes de rodar. O Docker continua fazendo o trabalho, então a mesma história de privacidade e offline vale.

How the image ships

Como a imagem é publicada

1Release tagTag de releaserake release pushes vX.Y.Zrake release publica vX.Y.Z
2Built from sourceFeita do códigothe tag's commit becomes the gem, then the imageo commit da tag vira a gem, depois a imagem
3Multi-archMulti-archlinux/amd64 and linux/arm64 via buildxlinux/amd64 e linux/arm64 via buildx
4ghcr.iodocker pull ghcr.io/serradura/okfdocker pull ghcr.io/serradura/okf
no Ruby to installnenhum Ruby para instalar the image matches the gem, exactlya imagem casa com a gem, exatamente 100% local: no account, no telemetry100% local: sem conta, sem telemetria :latest or pin :1.9.0:latest ou fixe :1.9.0