/intro
open a /path, read the world.
omnifs lets you access the world through your filesystem. APIs and data sources become files and directories you can ls, cat, grep, pipe, and hand to an agent.
The omnifs host handles the hard parts: filesystem protocols, caching, auth, network access, pagination, and rate limits. You attach new systems by writing lightweight Wasm providers with the omnifs SDK.
omnifs shell
/ $ ls /github/0xff-ai/omnifs
actions issues pulls repo
/ $ ls /github/0xff-ai/omnifs/issues/open | wc -l
47
/ $ grep -rl "ROCm" /github/0xff-ai/omnifs/issues/open
/github/0xff-ai/omnifs/issues/open/1432/body /github/0xff-ai/omnifs/issues/open/1450/body
/ $ cat /github/0xff-ai/omnifs/issues/open/1432/title
Crash on long context with quantized model
The omnifs host handles the hard parts: filesystem protocols, caching, auth, network access, pagination, and rate limits. You attach new systems by writing lightweight Wasm providers with the omnifs SDK.
quickstart
01 $npm install -g @0xff-ai/omnifs
02 $omnifs setup
03 $omnifs up && omnifs shell
04 $ls /github
every system already speaks omnifs
catlsgrep -rfindtail -fjqrsynctarvimdiffxargsheadwcmd5sum
/glue
One namespace to access everything.
APIs made systems and platforms programmable, but they did not give us a shared substrate. In fact, they encouraged fragmentation.
Each service exposes its own API, schema, auth model, terminology, error table, pagination rules, rate limits. Often, each requires a dedicated SDK.
Conversely, the filesystem is the most durable interface in computing. Every program, agent, language masters disk and file I/O. Semantics are strict and universally understood, and /filesystem/paths offer hierarchical addressing.
today, per vendor ts
const octokit = new Octokit({ auth })
const { data } = await octokit.rest
.issues.get({ owner, repo, issue_number })
console.log(data.title)
// + install the sdk
// + implement the auth flow
// + paginate, retry, rate-limit
// + repeat for every other vendor with omnifs
/ $ cat /github/0xff-ai/omnifs/issues/open/56/title
Implement object cache before provider SDK polish
How does omnifs relate to MCP? MCP gives models tools to call. omnifs gives them API-backed resources as paths. A path can be traversed, grepped, diffed, cached, and piped to any other process.
/paths
Paths are the unified interface.
/omnifs mounts systems, services, data sources (really, anything), onto the local filesystem. Instead of teaching humans, agents, and programs how to deal with every API, they can all rely on the same stable interface we've known and loved for decades: files and directories.
Every provider translates its service into directories, files, fields, rendered views, and searchable trees.
The common layer is not a universal schema. The common layer is the filesystem: paths that humans, scripts, agents, caches, and traces can all operate on without learning the upstream API.
/github provider
/ollama owner
/ollama repo
/issues collection
/open filter
/12959 object
/title field
/linear provider
/teams scope
/ENG team
/issues collection
/open filter
/ENG-204 object
/state field
/docker provider
/containers collection
/by-name index
/api object
/state field
/pipe
Pipe data and state across systems.
Once services share a filesystem substrate, pipes can cross system boundaries. Read a CI run, inspect a container, grep the ticket queue, or sketch new providers for the systems you wish were files.
# provider sketch $ cat /cloudflare/zones/0xff.ai/firewall/events/latest/client_ip \ | xargs -I% cat /dns/reverse/% census-12.shodan.io
cloudflarenextdns
/providers
A growing pool of providers.
The provider catalogue is the source of truth for documented provider path surfaces. Providers are the extension point: if a system has an API, socket, repository, database, object store, or control plane, it can have a path.
/ github issues, PRs, CI, and repo trees reposissuesPRsCI runsrepo tree /github/ollama/ollama/issues/open/2853/title
/ dns records over DNS-over-HTTPS, dig without dig AAAAAMXNSTXT /dns/example.com/MX
/ arxiv the arXiv corpus, by id or search papersmetadataPDFsourceversions /arxiv/papers/1706.03762/paper.json
/ docker Docker daemon metadata through a host socket containersstatesystem /docker/containers/by-name/postgres/state
/ linear teams, issues, state, and descriptions teamsissuesstateprioritydescription /linear/teams/ENG/issues/open/ENG-1421/state
/ db a read-only SQLite database schemastablessample rows /db/tables/Album/schema.sql
next up /huggingface /kubernetes /s3 /slack
/architecture
Providers ask. The host acts.
Capabilities replace ambient authority. Providers answer filesystem requests inside a Wasmtime sandbox, with no ambient network, disk, environment, credentials, or access to other providers.
When a provider needs the outside world, it asks the host for a declared, capability-gated callout. The host enforces reachability, attaches credentials, performs the effect, and resumes the operation.
user / agentshell & tools
lscatgrepfindtarrsyncvim
read(path)
OMNIFS HOSTauthority boundary
path resolutioncachecredentialsnetwork calloutsinode identityprovider lifecycle
sandbox (wasmtime)
PROVIDER .wasmno ambient authority
lookup_childlist_childrenread_filesuspended calloutseffects
capability-gated callouts
upstream resource https, unix sockets, tcp, quic, p2p
apidatabasereporegistryqueue
a provider can
- render bytes for a path
- request a capability-gated callout (HTTPS, git, a unix socket)
- declare which hosts, sockets, and auth schemes it needs
a provider cannot
- grant itself new capabilities
- see the credential behind a call
- open its own socket or touch the network
- browse arbitrary host files
- read another provider's state
/sdk
Bring your own system.
The omnifs SDK is how your world enters the filesystem.
Internal APIs, queues, deploys, incidents, databases, model gateways, billing, feature flags, customer state: mount the systems that matter to you, then let tools and agents work through paths.
github/provider.rs rust
use omnifs_sdk::{browse::FileContent, prelude::*};
#[omnifs_sdk::object(kind = "github.issue", key = IssueKey)]
#[derive(Clone, Serialize, Deserialize)]
struct Issue { title: String, state: String, body: String }
impl Issue {
fn title(&self) -> Result<FileContent> { Ok(FileContent::new(self.title.as_bytes())) }
fn state(&self) -> Result<FileContent> { Ok(FileContent::new(self.state.as_bytes())) }
fn body(&self) -> Result<FileContent> { Ok(FileContent::new(self.body.as_bytes())) }
}
#[path_captures]
struct IssueKey { owner: OwnerName, repo: RepoName, filter: Facet<StateFilter>, number: u64 }
impl Key for IssueKey {
type Object = Issue;
type State = State;
async fn load(&self, cx: &Cx<State>, since: Option<Validator>) -> Result<Load<Issue>> {
load_issue(cx, self, since).await
}
}
#[omnifs_sdk::provider(
metadata = "omnifs.provider.json",
resources(endpoints = [api::GitHubApi], git = true),
)]
impl GithubProvider {
type Config = Config;
type State = State;
fn start(_cfg: Config, r: &mut Router<State>) -> Result<State> {
r.object::<Issue>("/{owner}/{repo}/issues/{filter}/{number}", |o| {
o.representations("item", (Markdown,))?;
o.file("title").project(Issue::title)?;
o.file("state").project(Issue::state)?;
o.file("body").lazy().project(Issue::body)?;
Ok(())
})?;
Ok(State::default())
}
} /uses
A new paradigm to interact with services.
Files can move, cache, replay, and leave traces. Put remote state behind paths, and those behaviors open up to agents, scripts, notebooks, and people.
/lineage
9p, realized with modern tech.
Plan 9 made every resource a file reached through a tiny, uniform set of operations, served by a file server per resource. omnifs keeps the idea and swaps the 1990s mechanics for a sandboxed Wasm and FUSE stack, capability-gated callouts, and today's services.
Bell Labs Plan 9 everything is a file; 9P
2002 9P2000 the revision Linux v9fs speaks
2005 FUSE userspace filesystems in the kernel
2017 Wasm portable sandboxed bytecode
2020s WASI components sandboxed code, explicit capabilities
today omnifs external services, projected as files
/roadmap
Paths today. Git-shaped writes later.
9 shipped 3 in progress 7 planned
shipped47%
- providers: github dns arxiv docker linear db
- Linux FUSE mount
- macOS through a Linux container shell
- sandboxed wasm32-wasip2 providers
- capability-gated HTTP, Git, and unix-socket callouts
- host-held credentials
- object and view caches with explicit invalidation
- canonical object model: one fetch, many rendered files
- Linux toolbox compatibility checks
- live inspector TUI
in progress16%
- provider SDK ergonomics
- cache behavior and invalidation polish
- setup, auth, and status reporting
plannedqueued
- Git-shaped mutations
- more providers
- runtime frontends beyond Linux FUSE
- background indexing and semantic search
- community provider catalog and provider docs
- persistent inode identity across remounts
- signed provider capability manifests
/roadmap
dr-- shipped/read-only · done
r-- providers: githubdnsarxivdockerlineardb
r--Linux FUSE mount
r--macOS through a Linux container shell
r--sandboxed wasm32-wasip2 providers
r--capability-gated HTTP, Git, and unix-socket callouts
r--host-held credentials
r--object and view caches with explicit invalidation
r--canonical object model: one fetch, many rendered files
r--Linux toolbox compatibility checks
r--live inspector TUI
drw- in-progress/being written
rw-provider SDK ergonomics
rw-cache behavior and invalidation polish
rw-setup, auth, and status reporting
d--- planned/not yet mountable
---Git-shaped mutations
---more providers
---runtime frontends beyond Linux FUSE
---background indexing and semantic search
---community provider catalog and provider docs
---persistent inode identity across remounts
---signed provider capability manifests
$ npm install -g @0xff-ai/omnifs
Open source under MIT OR Apache-2.0. If you would rather cat a path than learn another SDK, or you are shipping a provider against omnifs:[email protected], say hello.
Website inspired by commitmono.com.