An onchain cap table implementation combining Solidity smart contracts with an off-chain Node.js API server. Implements the Open Cap Table Coalition (OCF) standard.
Read official docs at https://docs.transferagentprotocol.xyz.
This is a pnpm monorepo:
tap-cap-table/
├── app/ # Next.js frontend (landing + /app product workspace)
├── server/ # Express API server + event poller
├── chain/ # Solidity smart contracts (Foundry)
├── docs/ # Nextra documentation site
├── packages/units/ # @tap/units — shared 1e10 scale / UUID / share-caps
└── ocf/ # OCF standard (git submodule)
Plume-first (recommended):
pnpm install
REUSE_TAP_FACTORY=1 pnpm bootstrap # Mongo + API (+ optional Docker app), demo factory in Mongo
# Wallet UI: browser extension + NEXT_PUBLIC_* in app/.env.local. Server PRIVATE_KEY optional
pnpm app:dev # Product UI — http://localhost:3000/app| Service | URL |
|---|---|
| Server | http://localhost:8293 |
| App (host) | http://localhost:3000 — use pnpm app:dev for wallet work (app/.env.local) |
| MongoDB | localhost:27017 |
pnpm bootstrap is idempotent. Prefer host pnpm app:dev for the product UI; Docker app is optional.
The product UI uses a first-party connect modal (TAP design system) on top of wagmi + EIP-6963 browser wallets (Rabby, MetaMask, etc.). No third-party connect-cloud account is required for extension wallets.
Product UI
/app/companies— companies you’ve minted / loaded from wallet/app/mint— create a company (cap table) from the connected admin wallet/app/companies/[issuerId]— holdings, stock classes, shareholders, issue stock, transfer, transactions
Legacy /mint and /manage* redirect into /app.
Who owns what (short): protocol builder owns the shared demo factory on Plume; a licensed transfer agent should deploy their own factory (pnpm deploy-factory); issuers mint cap tables through a factory (wallet UI) and become ADMIN of that table. Mongo factories is a local mirror only. Factory owner ≠ issuer ADMIN ≠ server PRIVATE_KEY — see Three wallets / keys.
Then go read official docs
Environment:
.env.exampledefaults to Plume Mainnet (CHAIN_ID=98866,RPC_URL=https://rpc.plume.org). Copy to.envand put the sameNEXT_PUBLIC_*values inapp/.env.localforpnpm app:dev. Wallets: install a browser extension (no cloud project id required). SetNEXT_PUBLIC_OPERATOR_ADDRESS(address only).PRIVATE_KEYis dev/demo only and optional for the wallet UI (needed for server-signed API / CLI factory deploy). AlignNEXT_PUBLIC_FACTORY_ADDRESSwith Mongofactories.
# Docker (runs all services: MongoDB, server, app)
pnpm docker:up # Start all services
pnpm docker:down # Stop all services
pnpm docker:logs # Stream logs
pnpm docker:build # Rebuild and start
# Local development (hot-reload; prefer this over Docker for app/server code changes)
pnpm dev # API server (+ poller)
pnpm app:dev # Frontend (reads app/.env.local)
pnpm docs:dev # Docs site
pnpm test:units # Shared @tap/units testsFor AI-assisted / agent development, see:
WARP.md— monorepo architecture, commands, patterns, pitfallsapp/WARP.md— frontend conventions (routes, write path, styled-components)AGENTS.md/CLAUDE.md— short pointers to those filesCONTRIBUTING.md— branch and PR conventions
We welcome all contributions. Please give a quick read to our CONTRIBUTING guidelines before submitting new PRs!
This repository is licensed under the Business Source License 1.1 (LICENSE) — PALMER.EARTH CORP.
- Change Date: January 1, 2028
- Change License: AGPL-3.0 or later
Third-party dependencies and the ocf/ git submodule retain their own licenses. For alternative licensing, contact alex@palmer.earth.