ozc
// ozcv0.2.3
one host, plugins by name

Your infrastructure, from one file.

ozc is a small command that hosts plugins. Install one by its name and it is there: a k3s cluster over SSH, apps as tables in a TOML file, certificates, secrets, storage. The host keeps them on one version and brings them up to date together.

ozc
01 / 04
release
// pluginscount: 7

Seven plugins, one version

They are published with ozc, at its version, and installed by name: ozc install kube. A plugin loads only in the host it was built for, so an upgrade is one line and never a mismatch.

kube

A k3s cluster over SSH, from one node to a server with agents; kubectl-style access, logs and port-forwards.

app

Apps as tables in a TOML file, rendered to Deployments, Services, Ingresses and volumes; deploy, restart, back up.

cert

cert-manager and a Let’s Encrypt issuer, so a domain on an app is a certificate.

secret

Secrets set from the terminal, by key, never written into a config file.

storage

The local-path provisioner, or Longhorn with snapshots and an S3 backup target.

ingress-nginx

The ingress-nginx controller, for a cluster that does not keep k3s’s Traefik.

config

Read, set and explain the hierarchical ozaco.toml a project is driven by.

02 / 04
deploy
// flowsteps: 4

A file, then four commands

Everything ozc does is written down first, in a directory of TOML files beside the project. The commands read it; nothing is typed twice, and a second machine runs the same lines.

  1. Declarecompletethe node and the app, in .ozaco/
  2. Bring upcompleteozc kube up
  3. Certificatescompleteozc cert install · issuer
  4. Deployozc app up
[app.web]
namespace = "ozaco"
image = "ozaco/web"
tag = "2026-10-12"
port = 80
domain = ["ozaco.com", "www.ozaco.com"]
tls = "web-tls"
issuer = "letsencrypt"

What that table becomes

A Deployment and a Service for the image, an Ingress for both names with one certificate issued into the secret, and a namespace made when it is missing. Add a volume, a dependency such as Postgres, or a one-shot job, and the table grows by a few lines; the objects follow.

03 / 04
setup
// installby name

Install

Homebrew keeps ozc on macOS; a script keeps it on Linux and Windows. Everything else is installed by ozc itself, by the name it is released under.

once, before the first install: make the tap known to Homebrew

brew tap ozaco/apps https://github.com/ozaco/apps

ozc, as a formula — Homebrew brings it up to date

brew install ozc

then a plugin, by name

ozc install kube

or ozaOS, the same way — the daemon and the command, and off macOS the window too

ozc install ozaos
about ozaOS
04 / 04
ozaco.com
~/ozaco

Runtime-agnostic TypeScript packages, and two things built on them.

MIT