Milestone-based grant management on the Stellar blockchain β on-chain escrow, DAO voting, and contributor reputation, all in one open-source monorepo.
Overview β’ Features β’ Architecture β’ Quick Start β’ Packages β’ Contributing β’ Security
StellarGrants Protocol is a fully decentralized grant-management system built on Stellar (Soroban). It allows grant creators to post milestone-gated bounties, contributors to submit work with on-chain proof, and a decentralized reviewer committee to vote on approvals β with automatic token payouts from on-chain escrow the moment consensus is reached.
All protocol state lives on the Soroban smart contract. The Next.js frontend reads contract state directly from Stellar RPC β no centralized backend is required for any core feature. The contract itself is large and modular (90+ Rust modules covering everything from quadratic funding to multisig escrow β see Smart Contract Modules), and an optional Express API adds indexing, notifications, and OAuth-based accounts on top.
| Role | What they do |
|---|---|
| Grant Creator | Post grants with budget, milestones, reviewer list, and token |
| Contributor | Browse open grants, submit milestone work with IPFS proof |
| Reviewer | Vote approve / reject on milestone submissions |
| Funder | Deposit XLM or any SEP-41 token (e.g. USDC) into a grant's on-chain escrow |
- Milestone-Based Escrow β Funds are locked in the Soroban contract and released only when a milestone is approved by the reviewer quorum
- Standard & High-Security Escrow β
grant_create_high_securitygates payout release behind an on-chain multisig signer set in addition to reviewer voting - Automatic Payout β No admin intervention: the contract executes the token transfer atomically as soon as the vote threshold is reached
- Grant Renewal, Transfer & Forking β Owners can propose renewals, transfer roles (e.g. replace a reviewer), or fork an existing grant record
- Grant Pause & Timers β Grants can be paused independently of the global circuit breaker, and deadline timers can auto-trigger default actions
- Milestone Dependencies & Templates β Milestones can be sequenced as a DAG (later ones unlock only once earlier ones are approved) and created from reusable templates
- Batch Operations β Submit multiple milestones, fund multiple grants, or add/remove a reviewer across many grants in a single transaction
- Multi-Token Support β Grants can be denominated in native XLM or any SEP-41 token (e.g. USDC)
- DAO Voting β Every milestone requires a configurable quorum of reviewer approvals before payout is triggered
- Vote Delegation β Reviewers can delegate their voting power to another address for a grant, which resolves back to the delegator on vote
- Quadratic Voting β Reviewers can be allocated voice credits and cast weighted quadratic votes on milestones
- DAO Proposals β Protocol-level changes (e.g. admin rotation) can be routed through a passed-and-executed DAO proposal instead of direct admin action
- Dispute Resolution & Arbitration β Contributors or funders can raise disputes on rejected milestones; a staked arbitration pool of arbiters votes on outcomes
- Public/Open Review β Non-reviewer community members can leave public review signals and helpful-vote feedback on submissions
- Quadratic Funding Matching Rounds β Admins can create QF rounds with a matching pool; contributions are matched proportionally to broad community support
- Crowdfunding Campaigns β Grants can be crowdfunded with pledge tracking and refunds if a campaign doesn't reach its goal
- Bounty Grants β Simpler bounty-style grants for smaller, single-submission tasks
- Syndication β Multiple funders can co-lead a grant as a syndicate
- Referral Program β Referral codes and on-chain rewards for bringing in new contributors/funders
- Waitlists & Whitelists β Grants can gate contributor/funder participation behind a waitlist or an allow-list
- Streaming Payments β Continuous per-ledger payment streams (create/withdraw/pause/resume/cancel) as an alternative to lump-sum milestone payouts
- Split Payments β A milestone payout can be split across multiple recipients
- Protocol Fees & Treasury β Configurable protocol fee is deducted and split across the reviewer reward pool, revenue-share pool, and treasury on every payout
- Performance Bonds & Collateral β Contributors can be required to post a bond or collateral before submitting milestones, forfeited on abandonment
- Clawback & Lockup β Disputed funds can be clawed back by an authorized arbiter role; tokens can be locked up/vested over time
- Token Swaps β Integration point for swapping tokens (e.g. DEX routing) as part of payout flows
- Contributor Reputation β On-chain reputation scoring tracks completed/rejected milestones, with configurable decay over time
- Soulbound Milestone NFTs β Approved milestones mint a non-transferable NFT certificate for the contributor
- Badges β Automatic badge awards (e.g. first milestone, ten milestones, fifty milestones)
- Reviewer Staking, Rewards & SLA β Reviewers stake tokens to participate in a grant's quorum, earn reward-pool payouts, can be slashed for misbehavior, and are tracked against SLA response times
- KYC / Compliance Gating β Grants can require a minimum verification level (via an identity oracle) before high-value payouts release
- Scoring Rubrics & Checklists β Structured, weighted scoring dimensions and required-criteria checklists gate milestone approval
- Emergency Pause & Circuit Breakers β Global admin pause plus per-module circuit breakers (e.g. pause only the Streaming module)
- Rate Limiting β Per-address, per-action rate limits (grant creation, milestone submission, registration, β¦)
- Reentrancy Guards β Critical state-changing flows are wrapped in a non-reentrant context
- Immutable Audit Log β Every state-changing action on a grant is appended to an on-chain audit log
- Versioned Migrations β Contract storage schema is versioned, with an admin-only migration path and full migration history
- Role-Based Access Control β SuperAdmin/ProtocolAdmin roles gate sensitive operations beyond the single global-admin model
- Provenance & Data Export β Append-only contribution provenance ledger, paginated data export, funder financial reports, analytics snapshots, and protocol-wide metrics
- Cross-Contract & Cross-Chain Hooks β External contract hooks on protocol events, an oracle interface for price feeds, and a grant-bridge/relayer pattern for cross-chain proofs
- Wallet-First UX β Connect Freighter or Albedo today; xBull and Stellar Passkeys (WebAuthn/Secp256r1) are wired in the UI as "coming soon"
- Zero-Backend Core β All state reads can go directly to Stellar RPC; the optional API is additive, not required
- Real-Time Event Streaming β Subscribe to contract events via Server-Sent Events (relayed by the optional API) or direct RPC polling for live vote counts and funding progress
- Multi-Step Grant Creation β Guided form with Zod validation, milestone builder, and budget configurator
- IPFS Proof Submission β Contributors upload milestone evidence to IPFS via Pinata; the CID is stored on-chain
- Leaderboard, Dashboard & Profiles β Contributor reputation board, a per-wallet dashboard, and public contributor profile pages with GitHub handle and skills
- Responsive & Accessible β Mobile-first Tailwind UI with ARIA labels, keyboard shortcuts, and dark theme
- Storybook Component Library β All UI components are documented and previewed in Storybook
- Indexing & Caching β Indexes on-chain events into PostgreSQL for fast, filterable, paginated queries the RPC alone can't do cheaply
- OAuth Accounts β GitHub and Twitter/X OAuth login (via Passport), linked to a Stellar address
- RBAC β A separate role/permission system (
roles,user_roles) for API-level authorization - Notifications & Webhooks β Queued email notifications (SendGrid), outbound webhook subscriptions with delivery logs, and Socket.IO for live push
- Admin & Ops Tooling β Admin routes, protocol analytics, rate-limit alerting (Redis-backed, falls back to in-memory), Prometheus metrics, and Swagger API docs
- Disputes, Appeals & Moderation β Milestone appeals, dispute tracking, comment threads, and community/report entities layered on top of the on-chain state
- Reconciliation β A reconciliation service cross-checks indexed data against on-chain state via checkpoints
StellarGrantProtocol/ β Monorepo root
βββ web/ β Next.js 16 frontend (primary package)
βββ contracts/ β Soroban smart contracts (Rust β WASM)
βββ client/ β @stellargrants/client-sdk (TypeScript SDK)
βββ backend/ β Optional Express + TypeORM caching API
βββ docker-compose.yml β Postgres + API service
βββ .github/workflows/ci.yml β GitHub Actions CI
βββ TUTORIAL.md β Beginner end-to-end walkthrough
βββ CONTRIBUTING.md β Root contribution guide (this repo)
βββ ARCHITECTURE.md β Deep-dive architecture reference
βββ DEVELOPMENT.md β Full developer environment setup
βββ CODE_OF_CONDUCT.md β Community standards
βββ SECURITY.md β Vulnerability reporting policy
| Package | Tech | Purpose |
|---|---|---|
web/ |
Next.js 16, React 19, TypeScript | Full-featured web UI β grant browsing, creation, funding, milestone voting |
contracts/ |
Rust, Soroban SDK | ~90-module smart contract: escrow, governance, funding, reputation, protocol safety |
client/ |
TypeScript, stellar-sdk | @stellargrants/client-sdk β typed SDK + CLI + Vue composables for Node, bundlers, or scripts |
backend/ |
Express, TypeORM, PostgreSQL | Optional layer: indexing, OAuth accounts, notifications/webhooks, RBAC, admin & ops tooling |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Browser (User) β
β β
β ββββββββββββββββββββ βββββββββββββββββββ β
β β Next.js Frontendβ β Wallet Extension β β
β β (React / SSR) β β(Freighter/Albedo)β β
β ββββββββββ¬ββββββββββ ββββββββββ¬βββββββββ β
β β reads contract state β signs transactions β
βββββββββββββΌβββββββββββββββββββββββββΌβββββββββββββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Stellar Network β
β β
β βββββββββββββββββββββββ βββββββββββββββββββββββββββββββββ β
β β Soroban RPC Node β β Horizon API β β
β β (simulateTx / β β (account info / balances / β β
β β sendTx / events) β β trustlines) β β
β ββββββββββββ¬βββββββββββ βββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β StellarGrants Soroban Contract β β
β β grant_create Β· grant_fund Β· milestone_submit β β
β β milestone_vote Β· milestone_payout Β· dispute_raise β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ (optional)
βββββββββββββββββββββββββββ
β Express API (backend/) β β caching, indexing, SSE relay
β PostgreSQL β
βββββββββββββββββββββββββββ
| Decision | Why |
|---|---|
| Zero-backend for core flows | All grant data is on-chain; no server can become a single point of failure or censor data |
| Soroban smart contract | Native Stellar programmability β SEP-41 tokens, events, deterministic execution |
| Next.js App Router with Server Components | SEO for grant pages + streaming data from RPC without client waterfalls |
| TanStack Query for client cache | Declarative loading/stale states, background refetch, and optimistic UI without Redux boilerplate |
| Zustand for wallet state | Minimal, persistent wallet session without prop drilling |
| IPFS for milestone proof | Decentralized proof storage; only the content hash (CID) is stored on-chain |
For a full architecture reference including rendering strategy, state management, and data flow diagrams, see ARCHITECTURE.md.
| Tool | Version | Notes |
|---|---|---|
| Node.js | >= 20 | Use nvm to manage versions |
| npm | >= 10 | Lockfiles committed per package |
| Rust | stable | Required for smart contracts only |
wasm32v1-none target |
β | rustup target add wasm32v1-none |
| Stellar CLI | latest | Required for contract deploy/invoke |
| Freighter Wallet | latest | Browser extension for testing wallet flows |
git clone https://github.com/StellarGrant/stellargrant-fe.git
cd stellargrant-fecd web
npm ci
# Copy environment template and fill in your values
cp .env.local.example .env.local
# See Configuration section below for required variables
# Start development server (Turbopack)
npm run devOpen http://localhost:3000. The app reads from Stellar testnet by default.
To run the frontend alongside a mock API (for offline development):
npm run dev:mock # starts both mock server (port 4000) and Next.js (port 3000)cd contracts
# Add WASM target if not already added
rustup target add wasm32v1-none
# Format check, lint, compile check (mirrors CI)
cargo fmt --all -- --check
cargo clippy --workspace --lib --target wasm32v1-none -- -D warnings
cargo check --workspace --target wasm32v1-none
# Run contract unit tests (not part of CI, but run locally before opening a PR)
cargo test
# Build WASM binary
cd contracts/stellar-grants
make buildcd contracts/contracts/stellar-grants
make build
stellar contract deploy \
--wasm target/wasm32v1-none/release/stellar_grants.wasm \
--network testnet \
--source-account YOUR_ACCOUNT_ALIAS \
--alias stellar_grants
# Initialize contract state
stellar contract invoke \
--id stellar_grants \
--network testnet \
--source-account YOUR_ACCOUNT_ALIAS \
-- initializeCopy the deployed contract address into NEXT_PUBLIC_CONTRACT_ID in your .env.local.
cd client
npm ci
npm run build
npm testcd backend
npm ci
# Set up environment (requires PostgreSQL)
cp .env.example .env
# Edit DATABASE_URL in .env
npm run dev # starts on port 4000Or run the full stack with Docker:
docker compose up # Postgres + APICopy web/.env.local.example to web/.env.local and fill in the values β never commit it.
# ββ Stellar Network βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NEXT_PUBLIC_STELLAR_NETWORK=testnet
NEXT_PUBLIC_CONTRACT_ID=
NEXT_PUBLIC_HORIZON_URL=https://horizon-testnet.stellar.org
NEXT_PUBLIC_STELLAR_RPC_URL=https://soroban-testnet.stellar.org
NEXT_PUBLIC_NETWORK_PASSPHRASE="Test SDF Network ; September 2015"
# ββ Backend API βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NEXT_PUBLIC_API_URL=http://localhost:4000
# ββ IPFS / Pinata βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# JWT from https://app.pinata.cloud/keys
# If omitted, useIPFS falls back to mock mode (no real upload, no crash).
NEXT_PUBLIC_PINATA_JWT=Security: Variables prefixed
NEXT_PUBLIC_are bundled into the client. Never prefix secrets withNEXT_PUBLIC_.
Copy backend/.env.example to backend/.env and fill in the values.
# ββ Server ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
PORT=4000
NODE_ENV=development
# ββ Database ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DATABASE_URL=postgres://postgres:postgres@localhost:5432/stellargrant
# ββ Stellar / Soroban βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
USE_MOCK_SOROBAN=true # true = in-process mock client for local dev/tests
RPC_URL=https://soroban-testnet.stellar.org
CONTRACT_ID= # deployed StellarGrants contract address (C...)
NETWORK_PASSPHRASE="Test SDF Network ; September 2015"
# ββ Admin βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ADMIN_ADDRESSES= # comma-separated Stellar addresses with admin access
# ββ Redis (optional β falls back to in-memory rate limiting when absent) ββββββ
REDIS_URL=
# ββ Metrics βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
METRICS_ALLOWED_IPS=
METRICS_BASIC_AUTH_USER=
METRICS_BASIC_AUTH_PASSWORD=
# ββ SendGrid (email notifications) βββββββββββββββββββββββββββββββββββββββββββββ
SENDGRID_API_KEY=
# ββ IPFS / Pinata βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
PINATA_JWT=
PINATA_GATEWAY=https://gateway.pinata.cloudThe primary user-facing application. Key sub-directories:
app/ Next.js App Router β pages and route handlers (see Pages & Routes)
components/ React components (UI primitives + domain-specific)
ui/ shadcn/ui base components (Button, Card, Dialog β¦)
grants/ Grant cards, creation form, funding progress
milestones/ Milestone list, proof submission, vote panel
wallet/ Wallet connect modal, wallet guard, wallet info/address
contributors/ Contributor profile components
leaderboard/ Contributor reputation table
dispute/ Dispute submission and status
settings/ User preference components
landing/ Landing page sections
layout/ Header, footer, sidebar, notification bell
hooks/ TanStack Query + Zustand powered custom hooks
lib/
stellar/ Stellar SDK wrappers (RPC client, contract calls, event streaming)
store/ Zustand stores (wallet session)
wallets/ Adapter pattern β FreighterAdapter, AlbedoAdapter (xBull/Passkey UI stubs)
schemas/ Zod validation schemas for forms and API responses
ipfs/ Pinata upload helpers
search/ Grant search helpers
tokens/ Token metadata / balance helpers
config/ Runtime env/config accessors
errors/ Typed error helpers
utils/ Misc utilities
types/ Shared TypeScript interfaces (Grant, Milestone, Contributor β¦)
tests/ Vitest unit and component tests
e2e/ Playwright end-to-end tests
stories/ Storybook component stories
mock-server/ Standalone mock API used by `npm run dev:mock`
Available Scripts
| Command | Description |
|---|---|
npm run dev |
Dev server with Turbopack |
npm run dev:mock |
Dev server + mock API concurrently |
npm run build |
Production build |
npm start |
Start production server |
npm run lint |
ESLint |
npm test |
Vitest (watch mode) |
npm run test:run |
Vitest (single run) |
npm run test:e2e |
Playwright E2E tests |
npm run mock |
Start mock API only |
npm run storybook |
Storybook on port 6006 |
npm run build-storybook |
Build static Storybook |
A single Rust crate (contracts/contracts/stellar-grants) compiled to WASM and deployed to Stellar, organized as ~90 internal modules under src/. Core entry points contributors touch most:
| Function | Description |
|---|---|
grant_create / grant_create_high_security |
Create a new grant (standard escrow, or gated behind an additional multisig signer set) |
grant_fund |
Deposit tokens into the grant's escrow |
milestone_submit / milestone_submit_batch |
Submit proof of work for one or more milestones (proof URL + description) |
milestone_vote |
Reviewer (or delegate) casts approve/reject vote; triggers payout when quorum reached |
milestone_reject |
Reviewer rejects a milestone with a reason |
cancel_grant / grant_complete |
Cancel a grant (refunding escrow per the configured refund policy) or finalize completion |
contributor_register |
Register a contributor's profile (name, bio, skills, GitHub URL) |
See Smart Contract Modules below for the full module map β grant lifecycle, governance/voting, funding mechanisms, escrow/payments, reputation, and protocol operations are each implemented as a separate module (e.g. delegate.rs, refund.rs, snapshot.rs, matching.rs, streaming.rs, quadratic.rs).
src/ groups into roughly these areas (each a separate .rs module):
| Area | Modules |
|---|---|
| Grant lifecycle | factory, grant_pause, grant_timer, grant_renewal, grant_transfer, grant_tags, grant_index, fork, milestone_deps, milestone_extension, milestone_template, batch, batch_read |
| Governance & voting | dao, governance, quadratic, delegate, open_review, arbitration_pool, dispute |
| Funding mechanisms | matching (quadratic funding), crowdfund, bounty, syndication, referral, waitlist, whitelist |
| Escrow & payments | escrow, escrow_multisig, multisig, streaming, split_payment, fees, treasury, clawback, lockup, performance_bond, collateral, token_swap, refund, revenue_share |
| Reputation & verification | reputation, reputation_decay, badge, milestone_nft, scoring, checklist, evidence_schema, reviewer_pool, reviewer_reward, reviewer_sla, contributor_verification, compliance, auto_approve |
| Protocol operations & safety | access_control, emergency, circuit_breaker, rate_limit, reentrancy, audit, migration, versioning, config, params |
| Data, interop & reporting | data_export, analytics, metrics, provenance, funder_report, portfolio, merkle, cross_contract, grant_bridge, relay, registry, pagination, notification, hooks, invoice, license, insurance, oracle |
For a deeper dive into individual modules, see contracts/README.md, contracts/THREAT_MODEL.md, and contracts/BENCHMARK.md.
@stellargrants/client-sdk provides a typed interface to the Soroban contract from Node.js, any bundler, or the command line. Useful for scripts, bots, and integration tests.
StellarGrantsSDKβ the core typed client (src/StellarGrantsSDK.ts)- CLI β ships a
sgbinary (src/cli.ts) for scripting contract calls from the terminal - Vue composables (optional peer dep on
vue) βuseGrant,useGrants,useGrantBalances,useGrantHistory,useStellarGrants,useTransactionHistory - Wallet adapters β
FreighterAdapter,AlbedoAdapter,XBullAdapter,WalletConnectAdapter - Batch builder, transaction tracker/retry, optimistic state manager β helpers for building batched calls and tracking in-flight transactions
- Typed errors β
StellarGrantsError,TransactionFailedError,TransactionTimeoutError,MetadataValidationErrorwith parsed Soroban error codes
cd client && npm ci && npm run buildOptional Express + TypeORM + PostgreSQL service. Not required for core read/write flows (the frontend can talk to Stellar RPC directly) β it adds:
- Indexing/caching of on-chain events for fast, paginated, filterable queries (
routes/grants.ts,milestone-*,disputes.ts,analytics.ts,search.ts,stats.ts) - OAuth accounts β GitHub/Twitter login via Passport, linked to a Stellar address (
routes/auth.ts) - Notifications & webhooks β SendGrid email queue, outbound webhook subscriptions + delivery logs, Socket.IO push (
services/notification-*,services/webhook-dispatcher.ts,routes/webhooks.ts) - RBAC, admin & moderation β roles/permissions, admin routes, milestone appeals, community/report entities (
routes/admin.ts,routes/roles.ts,routes/milestone-appeals.ts,routes/communities.ts) - Ops β Redis-backed rate-limit alerting (falls back to in-memory), Prometheus metrics, Swagger docs, a reconciliation service that cross-checks indexed data against on-chain state
USE_MOCK_SOROBANβ an in-process mock Soroban client for local dev and tests without a live RPC dependency
| Route | Description |
|---|---|
/ |
Landing page β protocol stats, featured grants, call to action |
/grants |
Paginated, filterable grant listing with status / token / sort filters |
/grants/[id] |
Grant detail β funding progress, milestone timeline, reviewer panel, event history |
/grants/create |
Multi-step grant creation form (wallet required) |
/grants/[id]/fund |
Fund a grant β deposit XLM or any supported SEP-41 token into escrow |
/grants/[id]/history |
Grant activity/audit history |
/grants/[id]/milestones |
Milestone overview for a grant |
/grants/[id]/milestones/[idx] |
Single milestone β proof viewer, vote panel, payout status |
/dashboard |
User dashboard β my grants, activity feed, pending actions |
/profile |
Connected wallet's profile β skills, reputation, grant history |
/contributors/[address] |
Public contributor profile page |
/leaderboard |
Global contributor reputation ranking |
/review |
Reviewer queue β pending milestones awaiting your vote |
/dispute |
Dispute management interface |
/search |
Full-text grant search |
/settings |
User preferences |
cd web
npm test # watch mode
npm run test:run # single pass with coverageTests live in tests/ and co-located *.test.tsx files. Note: Vitest and Playwright are not currently run in CI (the frontend job only lints and builds) β run them locally before opening a PR.
cd web
npm run test:e2e # headless
npm run test:e2e:headed # with browser visibleE2E tests cover critical user flows: grant creation, funding, milestone submission, and reviewer voting.
cd contracts
cargo testNote: contract tests are not part of CI (CI only runs fmt/clippy/check) β run them locally before opening a PR.
cd backend
npm run test:e2e # end-to-end API tests
npm run test:integration # integration testsGitHub Actions workflow: .github/workflows/ci.yml
contracts, backend, frontend, and client-sdk run on every push to main and every pull request; client-docs runs only when a GitHub Release is published.
| Job | Steps |
|---|---|
| contracts | cargo fmt --check, cargo clippy --target wasm32v1-none (deny warnings), cargo check --target wasm32v1-none β note: does not run cargo test |
| backend | npm install against a real Postgres 15 service container, run migrations, test:e2e, test:integration, test:coverage |
| frontend | npm install, npm run lint, npm run build β note: does not run Vitest or Playwright |
| client-sdk | npm install, npm run test (Jest) |
| client-docs | On release only: build and publish TypeDoc API docs to GitHub Pages |
Because CI doesn't cover contract/frontend tests, always run cargo test (contracts), npm run test:run and npm run test:e2e (web), and npm run lint / npm run build locally before opening a PR.
npm install -g vercel
cd web
vercel # preview
vercel --prod # productionSet all NEXT_PUBLIC_* variables and server-side secrets in Vercel's Environment Variables dashboard. Use separate testnet values for Preview and mainnet values for Production.
docker compose up --buildThe backend/Dockerfile builds a Node 20-alpine image. PostgreSQL is provisioned as a compose service.
The StellarGrants Protocol participates in the Stellar Wave Program on Drips. Frontend and contract issues labeled drips-wave are eligible for Wave Point rewards.
Tips for Wave contributors:
- Comment on an issue to claim it before starting work
- Open a draft PR early to get feedback
- Include before/after screenshots for all UI changes
- Complete the full PR checklist before requesting review
We welcome contributions of all kinds β bug fixes, new features, documentation, tests, and contract improvements. With over 60 contributors, StellarGrants is an active, community-driven project.
- Root contribution guide: CONTRIBUTING.md
- Frontend-specific guide: web/CONTRIBUTING.md
- Contract contribution guide: contracts/ContributionGuide.md
- Architecture reference: ARCHITECTURE.md
- Developer setup: DEVELOPMENT.md
- Code of Conduct: CODE_OF_CONDUCT.md
- Beginner tutorial: TUTORIAL.md
- Run all tests and linters locally before pushing to public networks
- Review access control and numeric safety for every contract change
- Never commit private keys, seeds, or production secrets to this repository
- Report vulnerabilities via GitHub Security Advisories β see SECURITY.md for the full policy
This project is licensed under the MIT License.
Fix. Merge. Earn. | Stellar Wave Program
Made with care for the Stellar ecosystem by 60+ open-source contributors