Control plane for Motus multi-agent operations.
- Next.js + TypeScript
- Convex (database/runtime)
- Human.tech auth boundary
- Wallet/account abstraction permissions model
npm install
npm run devChat API routes call Convex from the Next.js server using a shared secret so Convex is never exposed to the client.
CONVEX_SERVER_SECRET(required for chat): Set the same value in your Convex deployment and in.env.local:- Generate a secret once:
openssl rand -base64 32 - Convex: Dashboard → your deployment → Settings → Environment Variables, or
npx convex env set CONVEX_SERVER_SECRET "<your-secret>" - Next.js: add
CONVEX_SERVER_SECRET=<same-secret>to.env.local
- Generate a secret once:
- Default organization is created automatically the first time a chat is created (no manual bootstrap step).
verifyHumanTechSession() in src/lib/humantech.ts can verify a wallet address via Human Passport (Stamps API v2). To enable it:
PASSPORT_API_KEY– API key from developer.passport.xyz (API Keys section).PASSPORT_SCORER_ID– Scorer ID from the same portal (Scorers section).PASSPORT_SCORE_THRESHOLD(optional) – Minimum score to consider verified; default20.
Pass the wallet address (e.g. from your session) to verifyHumanTechSession(address); it returns a HumanTechIdentity if the address has a passing score, or null otherwise. If these env vars are not set, the function returns null (no verification).
The app can register an onchain agent identity on Celo using the global ERC-8004 registry. Registration JSON and logo are hosted in this repo and served on Vercel.
Setup:
-
Deploy to Vercel (or use your deployed URL). Set in
.env.local:NEXT_PUBLIC_APP_URL=https://agents.motusdao.org(no trailing slash)NEXT_PUBLIC_AGENT_REGISTRATION_URI=https://agents.motusdao.org/agent-registration.jsonNEXT_PUBLIC_CELO_RPC_URL=https://forno.celo.org(optional; used when adding Celo in wallet)- Identity registry contract (Celo mainnet):
0x8004A169FB4a3325136EB29fA0ceB6D2e539a432
-
Register onchain: Open Wallets in the app → use “Register ERC-8004 identity on Celo”. Sign the tx with your WaaP wallet (you’ll be switched to Celo if needed).
-
Domain proof: After the first registration, set in Vercel (or
.env.local):NEXT_PUBLIC_ERC8004_AGENT_ID=<tokenId>(from the registry / tx logs)NEXT_PUBLIC_ERC8004_AGENT_OWNER=<0xYourWallet>
Hosted in this repo:
- Logo:
public/agent-logo.svg(MotusDAO Hub icon). Served at/agent-logo.svg. - Registration JSON:
GET /agent-registration.json(dynamic; usesNEXT_PUBLIC_APP_URL; defaulthttps://agents.motusdao.org). - Agent card (A2A):
GET /.well-known/agent-card.json. - Domain proof:
GET /.well-known/agent-registration.json(usesNEXT_PUBLIC_ERC8004_AGENT_IDandNEXT_PUBLIC_ERC8004_AGENT_OWNER).
Where to go when needed
| Need | Link |
|---|---|
| Deploy / env vars | Vercel Dashboard → your project → Settings → Environment Variables |
| Convex backend / env | Convex Dashboard → your deployment → Settings → Environment Variables |
| Human Passport (scores) | developer.passport.xyz (API Keys, Scorers) |
| WaaP (wallet) | docs.wallet.human.tech – config in code (initWaaP), no dashboard |
| Celo tx / contract | Celoscan – look up your tx or 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 (IdentityRegistry) |
| ERC-8004 spec / resources | eips.ethereum.org/EIPS/eip-8004, 8004.org |
Celo On-chain Activity
The dashboard has successfully registered an onchain agent identity on Celo.
| Name | Value |
|---|---|
| Chain | Celo mainnet |
| Registry | 8004: Identity Registry |
| Agent identity (token ID) | 1849 |
| Registration tx | 0xc7082bdae53cf295a97af538a5a9df3b86071fb3181b3df5ef0609091c0c19b9 |
| Agent URI | https://agents.motusdao.org/agent-registration.json |
| Domain proof | https://agents.motusdao.org/.well-known/agent-registration.json (after setting NEXT_PUBLIC_ERC8004_AGENT_ID=1849 and owner in env) |
- Modular architecture scaffold
- Convex schema for orgs/users/roles/tasks/chats/agents/wallets/audit
- RBAC starter
- Human.tech adapter boundary
- Vertical slice demo route (
/dashboard) - Docs, ADR starter, PR checklist