Agents that don't bleed tokens on tool descriptions.
One toolbox the model already speaks. No per-vendor SDK, no schema dump in the system prompt.
Open a path, read the world.
Agents and humans shouldn't deal with APIs. omnifs projects external services into local paths you can cat, ls, grep, and pipe.
A live session
Mounts are WASM components the host loads at startup. New ones ship without recompiling the runtime.
The provider catalog, growing every day
Every provider answers the same read ops, so every row is reachable with ls and cat. 5 live, 13 in progress, more landing every week.
| # | Color | Provider | Summary | Paths |
|---|---|---|---|---|
| 01 | /github→ | repos, issues, PRs, CI as files | /github/{owner}/github/{owner}/{repo} | |
| 02 | /docker→ | containers and compose, projected | /docker/system/info.json/docker/system/version.json | |
| 03 | /arxiv→ | papers at a path | /arxiv/papers/{id}/arxiv/papers/{id}/paper.pdf | |
| 04 | /linear→ | issues as files | /linear/teams/linear/teams/{KEY}/issues/_open | |
| 05 | /dns→ | dig, without dig | /dns/{name}/dns/{name}/{type} | |
| // wip | ||||
| 06 | /cloudflare | the edge, locally | /cf/zones/cf/zones/{zone}/records | |
| 07 | /discord | servers on disk | /discord/{server}/channels/discord/{server}/{channel}/latest | |
| 08 | /huggingface | models you can cat | /hf/models/{owner}/{model}/hf/models/{owner}/{model}/files/{path} | |
| 09 | /kubernetes | kubectl, but cat | /k8s/{context}/namespaces/k8s/{context}/{ns}/pods | |
| 10 | /mcp | tools and other agents as files | /mcp/{server}/mcp/{server}/tools | |
| 11 | /oci | images, manifests, layers | /oci/{registry}/{repo}/oci/{registry}/{repo}/tags/{tag}/manifest | |
| 12 | /postgres | tables as directories | /pg/{db}/tables/pg/{db}/{table} | |
| 13 | /redis | keys at your fingertips | /redis/{db}/keys/redis/{db}/{key} | |
| 14 | /s3 | buckets you can browse | /s3/{bucket}/s3/{bucket}/{key} | |
| 15 | /slack | grep your channels | /slack/{workspace}/channels/slack/{workspace}/{channel}/latest | |
| 16 | /spotify | playlists at a path | /spotify/playlists/spotify/playlists/{id}/tracks | |
| 17 | /stripe | payments, projected | /stripe/customers/stripe/customers/{id} | |
| 18 | /vercel | deploys you can ls | /vercel/{project}/deployments/vercel/{project}/deployments/{id} | |
Anatomy of a path
A host runtime plus a catalog of WASM components. Three operations on the wire. Cache and credentials live in the host.
What's behind a path
A provider is one component: the code that maps a single service into paths. A mount is that provider, attached under /omnifs. The path is the surface; the provider is what answers.
$ ls /omnifs/github/0xff-ai/omnifs list_children(/0xff-ai/omnifs) $ cat /omnifs/github/…/_issues/1432/title read_file(…/1432/title, text/plain) $ stat /omnifs/dns/ethereum.org/a lookup_child(/ethereum.org/a) Securely sandboxed
Each provider is a Wasm component behind a strict WIT interface: a pure function from a path to bytes. It holds no state, and reaches upstream only through capabilities the host grants. Credentials never enter it; the host keeps auth and injects it behind every call.
Cached at the edge
rg, find, and vim seek, stat, and re-read without thinking; point them at a remote API naively and you would melt it. So omnifs fetches each object once into a content-addressed cache and serves every read from there. Bounded by capacity, invalidated by events, never by a clock.
Rendered, not stored
A path's bytes are rendered, not stored. Read issue.md, then issue.json, then issue.raw: one object, one cached canonical model, rendered three ways. The extension picks the content type; the second read never touches upstream. Live things, like a tail -f log, skip the model and stream straight through.
bring your service
A provider is a Wasm component behind one small interface. Implement it in any language that targets wasm32-wasip2, mount it locally with omnifs dev, and point real tools at it. The SDK does the heavy lifting; an open catalog is next.
What it unlocks
One toolbox the model already speaks. No per-vendor SDK, no schema dump in the system prompt.
rg, vim, pipe — the cross-service grep your CLI soup never got around to. Edit lands with mutations.
Mirror, archive, version-control, snapshot, pipe. The exit door is cp -r.
Capacity-bounded caching, event-driven invalidation, content-addressed bytes. Build the interesting half.
Pods, namespaces, logs as files. ls a namespace, tail a pod — no context to juggle.
A failing CI run, the container, the open issue — github, docker, linear in one shell.