Prerelease. ABX FS is early, unaudited software. It may have bugs, and we do not guarantee it is bug-free. What you publish is public and permanent, and on production chains real funds are at risk. Details
ABX FS
Use ABX FS

Quickstart

Put a folder on chain from the web app, and read it back from anywhere.

ABX FS targets Base, Ethereum and Arbitrum One, with Base Sepolia, Sepolia and Arbitrum Sepolia as their testnets. The production chains are real money; the testnets take faucet ETH, and Base Sepolia is the place to try things first. Base is the default.

Base is a production chain. Every command below defaults to Base, where each write costs real ETH and is permanent. To try ABX FS for free first, pass --chain base-sepolia (or another testnet) to every command.

Prerelease, and unaudited. ABX FS is early software and may have bugs; we do not guarantee it is bug-free. Its contracts have had internal reviews but no independent security audit; ABX, which every org is built on, has had none either. Everything you publish is public and permanent: nothing on chain can be edited or deleted, by you or by us. On Base, Ethereum and Arbitrum One you are spending real funds; try things on a testnet first.

Use the web app

fs.abx.io is the whole flow, and it needs no install:

  1. Connect a wallet on Base Sepolia (or Base, once you are ready to spend real ETH).
  2. Drag a folder onto the page. Dragging keeps empty subfolders, so the upload is the same tree, and the same root, as abxfs upload of that folder; the folder picker in some browsers cannot see empty folders.
  3. Publish it. That mints a project NFT and publishes the folder to it. A name and a first tag are optional, and each is one more transaction when you add it; you can name the project later in its settings.

The first time, your own org is created in the same transaction as the project, so there is no extra signature. After that the app reuses the org you last used, and you can pick another or make a new one.

The upload is chunked, deduplicated against what is already on chain, and compressed per chunk with FastLZ by default (the chain inflates it itself). The app shows the transaction plan — how many transactions, grouped by stage, and what they cost — before you sign anything. A big folder is not refused; it is more transactions, and an interrupted publish resumes where it stopped.

When it finishes you get a root CID. That CID is served from its own content host (the root, base32-encoded, as one DNS label):

https://c-<base32 root>.<content domain>/index.html

The https://fs.abx.io/g/cid/<root>/… form redirects to that host.

Read without an account

Reading is permissionless and needs no wallet, no key, and no configuration — the gateway resolves any stored content by CID, whether or not a project points at it:

https://c-<base32 root>.<content domain>/

Two layers, kept separate

The distinction worth learning before anything else:

  • Content is permissionless and immutable. Anyone can write bytes; they are addressable by CID forever; nothing owns them.
  • A project is an ABX NFT inside an org. Its owner publishes root CIDs to it and moves tags. ownerOf is the entire authorization model.

Content does not need a project to exist or resolve. A project is one representation of content, and anyone can build a different one.

The CLI

The abxfs CLI does everything the app does, plus diffing, verifying and pinning. It is not published to npm yet, so today it is built from the repository:

pnpm install
pnpm --filter "@abxfs/cli..." build   # the CLI and the packages it uses
alias abxfs="node $PWD/packages/cli/dist/index.js"

Reads need nothing else; the canonical addresses are compiled in. --chain picks the network (base, ethereum, arbitrum-one, base-sepolia, sepolia, arbitrum-sepolia), and defaults to Base. Project commands need an org:

abxfs read <root> --path index.html --chain base
abxfs info --project-id 0 --org <org> --chain base-sepolia

Writes need a funded key, in the environment only — the CLI never reads one from disk:

export ABXFS_PRIVATE_KEY=0x…
abxfs upload ./site --chain base-sepolia --dry-run          # compute CIDs, spend nothing
abxfs upload ./site --chain base-sepolia --name my-project  # mint and publish

With --name and no --org, the upload uses ABXFS_ORG or the org in your config if you set one, else the newest org you administer, and creates a personal one if you administer none. Before it sends anything it prints the plan (chain, org, transactions, the most it can cost) and asks you to type yes; in a script, pass --yes.

--dry-run runs the whole pipeline offline, so you can see the root CID and the transaction count before committing to either. To try everything against a local chain instead, abxfs dev runs Anvil with the contracts deployed (see the CLI reference).

Next

  • Projects — orgs, versions, tags, and handing one off.
  • Compression — FastLZ per chunk, or a file codec.
  • IPFS — the CID your content also has, and pinning it.
  • Deployments — addresses, and picking an RPC.

On this page