Stellar Bounty Board is a contribution-focused Stellar MVP for open source maintainers.
It includes:
- A React dashboard to publish and manage GitHub issue bounties
- A Node.js/Express API with JSON persistence for bounty lifecycle actions
- A Soroban contract scaffold for on-chain escrow and payout logic
- Ready-to-open issue drafts so the repo itself is easy to grow through contributions
Maintainers can fund a GitHub issue as a Stellar bounty, contributors can reserve the work, submit a PR link, and the maintainer can release or refund the escrow.
Current MVP behavior:
- Create issue-linked bounties
- Browse bounty status and urgency
- Reserve a bounty as a contributor
- Attach a PR submission link
- Release payout or refund escrow
- Surface contribution-ready follow-up issues in the UI and docs
Frontend (frontend, default port 3000)
- React + Vite
- Dashboard for bounty creation and lifecycle actions
Backend (backend, default port 3001)
- Express REST API
- File-backed JSON persistence in
backend/data/bounties.json - Validation with Zod
Contract (contracts)
- Soroban Rust contract scaffold
- Escrow-style bounty lifecycle methods
See docs/deployment.md for step-by-step instructions to deploy the backend on Render and the frontend on Vercel, including required environment variables, health check paths, and troubleshooting tips.
For detailed architecture diagrams and data flow documentation, see docs/ARCHITECTURE.md.
The backend includes an isolated worker for indexing Soroban contract events. See backend/worker/README.md for details on running and extending the indexer.
Base URL:
- Local backend:
http://localhost:3001 - Frontend proxy:
/api
Routes:
GET /api/healthGET /api/bountiesPOST /api/bountiesPOST /api/bounties/:id/reservePOST /api/bounties/:id/submitPOST /api/bounties/:id/releasePOST /api/bounties/:id/refundGET /api/open-issues
npm run install:all
npm run dev:backend
npm run dev:frontendOpen:
- Frontend:
http://localhost:3000 - Backend:
http://localhost:3001
Build:
npm run buildBackend tests cover the JSON-backed bounty lifecycle (create, reserve, submit, release, refund, expiration) and the main HTTP routes. They use a temporary store file via BOUNTY_STORE_PATH and disable strict rate limiting when NODE_ENV=test.
From the repository root (after npm run install:all):
npm testWatch mode during development:
npm run test:watchCoverage report (Istanbul via Vitest):
npm run test:coverageThe Soroban contract models the escrow lifecycle:
create_bountyreserve_bountysubmit_bountyrelease_bountyrefund_bountyget_bounty
The backend currently acts as the demo control plane, while the contract gives you a clear path to move the source of truth on-chain.
Contribution-ready issue drafts live in docs/issues.
Suggested first issues:
- Wallet-authenticated maintainer actions
- GitHub webhook sync for PR state
- Event indexer for contract payouts
- Postgres persistence and audit log support