Open-source, self-hostable UI for coordinating multi-signature transactions on Stellar. The coordination layer the ecosystem has been asking for since 2018.
Multi-signature account setup is directly supported by Stellar Core, but coordinating the multiple involved parties is left entirely to wallet and service developers. That was noted as a gap in SEP-0021 (drafted 2018). It is 2026 and the community still has no open-source, self-hostable UI for this.
DAOs, treasuries, and institutional wallets on Stellar are doing this manually or building it from scratch every time.
This project ships what the ecosystem has been asking for.
Create proposal → Share link → Co-signers sign with Freighter → Auto-submits at threshold
- Web App — Next.js UI deployable to Vercel in one click
- TypeScript SDK —
@stellar-multisig/sdkfor programmatic integration - Freighter — native wallet integration, no seed phrases ever touch the server
- No lock-in — self-hostable, MIT licensed, no vendor dependency
git clone https://github.com/stellar-multisig-ui/stellar-multisig-ui
cd stellar-multisig-ui
pnpm install
pnpm devnpm install @stellar-multisig/sdkimport { MultisigSDK } from '@stellar-multisig/sdk';
const multisig = new MultisigSDK({
apiUrl: 'https://your-app.vercel.app/api',
network: 'testnet',
});
// Create a proposal
const proposal = await multisig.propose({
transactionXdr: tx.toXDR(),
description: 'Q1 treasury distribution — 10,000 USDC to ops wallet',
});
// Each co-signer signs via the UI, then:
if (multisig.isReady(proposal)) {
const result = await multisig.submit(proposal);
console.log(result.txHash);
}stellar-multisig-ui/
├── apps/
│ └── web/ # Next.js 14 App Router
│ ├── app/
│ │ ├── page.tsx # Landing page
│ │ ├── create/ # Create proposal flow
│ │ ├── dashboard/ # Proposal list
│ │ ├── proposal/[id]/ # Proposal detail + sign
│ │ └── api/ # REST API routes
│ └── components/
│ ├── proposal/ # Proposal UI components
│ ├── wallet/ # Freighter integration
│ └── ui/ # Shared UI
└── packages/
└── sdk/ # @stellar-multisig/sdk
└── src/
├── sdk.ts # Core SDK class
└── types.ts # TypeScript types
Proposal lifecycle:
pending → collecting → ready → submitted
↘ expired
↘ failed
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/proposals |
Create a new proposal |
GET |
/api/proposals |
List all proposals |
GET |
/api/proposals?account=G... |
Filter by account |
GET |
/api/proposals/:id |
Get proposal by ID |
POST |
/api/proposals/:id/signatures |
Add a co-signer's signature |
GET |
/api/health |
Health check |
By default, proposals are stored in-memory (suitable for testing). For production:
- Vercel KV (recommended for Vercel deploys) — add
REDIS_URLenv var - Upstash Redis — any Redis-compatible store
- Supabase — PostgreSQL via REST API
See docs/storage.md for configuration.
This project implements the coordination layer described in SEP-0021:
- ✅ Transaction proposal creation
- ✅ Co-signer discovery from account signers
- ✅ Signature collection and weight tracking
- ✅ Automatic submission at threshold
- ✅ Shareable proposal URLs
- 🚧 Soroban on-chain coordination (in progress)
- 🚧 SEP-0010 auth for private proposals
PRs welcome. See CONTRIBUTING.md.
Issues for planned work: see the project board.
MIT — see LICENSE