A feed-style Web3 discussion and tipping platform for multi-chain developer communities.
- Overview
- Features
- Tech Stack
- Architecture
- Project Structure
- Getting Started
- Environment Variables
- Roadmap
- Contributing
- Maintainers
- License
- Acknowledgements
ChainBoard is an open-source, feed-style discussion platform purpose-built for Web3 communities. It bridges the gap between social discourse and on-chain interaction β giving developers, builders, and blockchain enthusiasts a space to share ideas, collaborate on projects, and directly reward high-quality contributions with cryptocurrency tips.
Think of it as Twitter/X meets Reddit, built natively for Web3 β with real on-chain value exchange at its core.
ChainBoard currently supports the Stellar, Ethereum, Polygon, and Solana ecosystems, with a modular architecture designed to expand to additional chains over time.
| Feature | Description |
|---|---|
| π¦ Feed-style posts | Share thoughts, updates, and questions in a familiar social format |
| π Multi-chain support | Stellar, Ethereum, Polygon, and Solana with modular architecture for expansion |
| π Dual authentication | Sign in via GitHub OAuth or a Web3 wallet (Freighter / MetaMask / Phantom) |
| πΈ On-chain tipping | Reward great posts with USDC directly on-chain β no intermediaries |
| π³οΈ Upvote system | Community-driven content ranking to surface the best discussions |
| π·οΈ Chain tags | Filter and discover content by blockchain ecosystem |
| π€ Builder profiles | Showcase projects, contributions, and on-chain activity |
| π Notifications | Real-time updates on replies, tips, and mentions |
| π¬ Messaging | Direct messaging between users for private conversations |
| π₯ Communities | Create and join topic-based communities for focused discussions |
| π€ Follow system | Follow other builders to stay updated on their activity |
| π¨ NFT management | Display and manage NFT collections across supported chains |
| π Reputation system | On-chain contribution scoring for builders |
| π Content series | Organize related posts into series for structured content |
| π Wallet activity | Track and display on-chain wallet activity and transaction history |
| π‘οΈ Moderation tools | Content moderation and community management features |
| β‘ Real-time updates | WebSocket support for live feed and notification updates |
| π Analytics dashboard | Track engagement metrics and community growth |
| π Leaderboard | Display top contributors and most active community members |
| πΎ Tip history | View complete history of sent and received tips |
| Layer | Technology |
|---|---|
| Frontend | React, TypeScript, TailwindCSS, Vite, React Router |
| Backend | NestJS, PostgreSQL, TypeORM |
| Blockchain SDKs | Stellar SDK, Solana Web3.js, Ethers.js |
| Authentication | GitHub OAuth, Freighter Wallet, MetaMask, Phantom |
| Real-time | Socket.io, WebSockets |
| Job Queues | BullMQ, Redis |
| Logging | Winston, Winston Daily Rotate File |
| API Documentation | Swagger/OpenAPI |
| Health Monitoring | NestJS Terminus |
| Task Scheduling | NestJS Schedule |
| Rate Limiting | NestJS Throttler |
| Caching | Cache Manager |
| Payments | Stellar USDC, ERC-20 USDC, SPL tokens |
ChainBoard is structured as a monorepo with three distinct layers:
- Frontend β A React + TypeScript SPA that communicates with the backend REST API and WebSocket server, and interfaces with wallet extensions directly from the browser.
- Backend β A NestJS service responsible for user management, post storage, authentication, and bridging between the frontend and the blockchain. Includes:
- REST API for standard CRUD operations
- WebSocket server for real-time updates
- Job queues (BullMQ) for background processing
- Comprehensive logging (Winston)
- Health monitoring (Terminus)
- Rate limiting and caching
- Blockchain Integration β Modular services for Stellar, Ethereum, Polygon, and Solana that handle wallet connections, transaction signing, and on-chain interactions.
chainboard/
βββ frontend/ # React + TypeScript UI
β βββ src/
β βββ components/ # Reusable UI components
β βββ pages/ # Route-level page components
β β βββ AnalyticsDashboard/
β β βββ Feed/
β β βββ Leaderboard/
β β βββ Messages/
β β βββ ModerationDashboard/
β β βββ TipHistory/
β β βββ UserProfile/
β βββ hooks/ # Custom React hooks
β βββ lib/ # External library configurations
β βββ types/ # TypeScript type definitions
β βββ utils/ # Helper functions and constants
β
βββ backend/ # NestJS REST API
β βββ src/
β βββ auth/ # GitHub OAuth + wallet authentication
β βββ blockchains/ # Multi-chain integration services
β β βββ polygon/
β β βββ solana/
β βββ communities/ # Community management
β βββ common/ # Shared infrastructure
β β βββ cache/ # Caching configuration
β β βββ config/ # Configuration management
β β βββ decorators/# Custom decorators
β β βββ filters/ # Exception filters
β β βββ guards/ # Route guards
β β βββ health/ # Health checks
β β βββ integrations/# Third-party integrations
β β βββ interceptors/# Request/response interceptors
β β βββ logger/ # Winston logging
β β βββ middleware/# Custom middleware
β β βββ monitoring/# Metrics and monitoring
β β βββ queues/ # BullMQ job queues
β β βββ services/ # Shared services
β β βββ utils/ # Utility functions
β β βββ validation/# Request validation
β βββ follows/ # User follow system
β βββ messages/ # Direct messaging
β βββ moderation/ # Content moderation
β βββ nfts/ # NFT management
β βββ notifications/ # Notification service
β βββ posts/ # Post creation, retrieval, and upvotes
β βββ reputation/ # Reputation scoring
β βββ series/ # Content series
β βββ stellar/ # Stellar-specific services
β βββ tips/ # On-chain tipping integration
β βββ users/ # User profiles and settings
β βββ wallet-activity/# Wallet activity tracking
β βββ websocket/ # WebSocket gateway
β
βββ kubernetes/ # Kubernetes deployment configurations
β βββ backend-deployment.yaml
β
βββ scripts/ # Utility scripts
β βββ backup.ps1 # Windows backup script
β βββ backup.sh # Linux/Mac backup script
β βββ restore.ps1 # Windows restore script
β βββ restore.sh # Linux/Mac restore script
β
βββ .env.example # Environment variables template
βββ docker-compose.yml # Docker development setup
βββ Dockerfile # Production Docker image
βββ package.json # Root package.json (monorepo)
Ensure the following are installed on your system before proceeding:
- Node.js v18 or higher
- pnpm
- PostgreSQL
- Redis (for BullMQ job queues)
- Freighter Wallet (for Stellar features)
- MetaMask (for Ethereum and Polygon features)
- Phantom Wallet (for Solana features)
# 1. Clone the repository
git clone https://github.com/chainboard-app/chainboard.git
cd chainboard
# 2. Install all dependencies
pnpm install
# 3. Set up environment variables
cp .env.example .env
# Open .env and fill in the required values (see below)
# 4. Run database migrations
pnpm run migration:run
# 5. Start the development servers
pnpm run devThe frontend will be available at http://localhost:3000 and the backend API at http://localhost:4000 by default.
Create a .env file at the root of the project based on .env.example. The following variables are required:
# βββ Database βββββββββββββββββββββββββββββββββββββββββββββββ
DATABASE_URL=postgresql://user:password@localhost:5432/chainboard
# βββ Redis ββββββββββββββββββββββββββββββββββββββββββββββββββ
REDIS_URL=redis://localhost:6379
# βββ Authentication βββββββββββββββββββββββββββββββββββββββββ
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
JWT_SECRET=your_jwt_secret
# βββ Stellar ββββββββββββββββββββββββββββββββββββββββββββββββ
STELLAR_NETWORK=testnet
STELLAR_RPC_URL=https://soroban-testnet.stellar.org
STELLAR_HORIZON_URL=https://horizon-testnet.stellar.org
# βββ Ethereum βββββββββββββββββββββββββββββββββββββββββββββββ
ETH_RPC_URL=your_eth_rpc_url
# βββ Polygon βββββββββββββββββββββββββββββββββββββββββββββββ
POLYGON_RPC_URL=your_polygon_rpc_url
# βββ Solana ββββββββββββββββββββββββββββββββββββββββββββββββ
SOLANA_RPC_URL=https://api.devnet.solana.com
β οΈ Never commit your.envfile to version control. The.gitignorealready excludes it by default.
ChainBoard includes Kubernetes configurations for production deployment.
- Kubernetes cluster (v1.20+)
- kubectl configured for your cluster
- Docker registry access for pushing images
# 1. Build and push Docker images
docker build -t chainboard/backend:latest .
docker push chainboard/backend:latest
# 2. Create Kubernetes secrets
kubectl create secret generic chainboard-secrets \
--from-literal=database-url="postgresql://user:password@host:5432/chainboard" \
--from-literal=jwt-secret="your_jwt_secret" \
--from-literal=redis-url="redis://host:6379"
# 3. Apply the deployment configuration
kubectl apply -f kubernetes/backend-deployment.yaml
# 4. Verify the deployment
kubectl get deployments
kubectl get pods
kubectl get servicesThe Kubernetes deployment includes:
- Replicas: 3 pods for high availability
- Resources: Configured with requests (256Mi RAM, 250m CPU) and limits (512Mi RAM, 500m CPU)
- Health Checks: Liveness and readiness probes configured
- Service: ClusterIP service exposing port 4000 internally
To scale the deployment:
kubectl scale deployment chainboard-backend --replicas=5ChainBoard includes utility scripts for database backup and restoration.
./scripts/backup.sh.\scripts\backup.ps1The backup script will:
- Create a timestamped backup of the PostgreSQL database
- Store backups in the
backups/directory - Compress the backup file to save space
- Keep the last 7 days of backups by default
./scripts/restore.sh <backup-file>.\scripts\restore.ps1 <backup-file>The restore script will:
- Validate the backup file integrity
- Drop and recreate the database
- Restore data from the backup file
- Run any pending migrations
Backup behavior can be configured by modifying the script variables:
BACKUP_DIR: Directory where backups are stored (default:./backups)RETENTION_DAYS: Number of days to keep backups (default: 7)DB_NAME: Database name (default:chainboard)
For production environments, consider setting up automated backups using cron:
# Daily backup at 2 AM
0 2 * * * /path/to/chainboard/scripts/backup.shThe following features are planned for upcoming releases:
- Additional chain support β Base, Arbitrum, Optimism, and more
- Token-gated communities β restrict access to posts or channels by token/NFT ownership
- ENS & Stellar Federation β display human-readable on-chain identities
- Mobile app β React Native client for iOS and Android
- Decentralized storage β IPFS-backed media uploads
- Advanced analytics β Enhanced community insights and engagement metrics
- Multi-language support β Internationalization for global communities
ChainBoard provides comprehensive Stellar blockchain integration, enabling developers to interact with the Stellar network for tipping, NFT management, and smart contract interactions.
- Account Management: Create, fund, and manage Stellar accounts
- Transaction Operations: Send payments, manage assets, and submit transactions
- Soroban Smart Contracts: Deploy and invoke Soroban contracts
- Federation Support: Resolve Stellar federation addresses (e.g.,
user*stellar.org) - Asset Management: Handle custom assets and NFTs on Stellar
- Wallet Connection: Seamless wallet integration for client-side signing
- Memo Support: Full SEP-0005 memo standard implementation
POST /stellar/keypair- Generate a new Stellar keypairPOST /stellar/fund/:publicKey- Fund a testnet account (friendbot)GET /stellar/account/:publicKey- Get account informationGET /stellar/account/:publicKey/balances- Get account balancesGET /stellar/account/:publicKey/transactions- Get transaction history
POST /stellar/payment- Create a payment transactionPOST /stellar/transaction/submit- Submit a signed transaction
GET /stellar/federation/:address- Resolve a federation addressGET /stellar/asset/:code/:issuer- Get asset metadata
POST /stellar/contract/deploy- Deploy a Soroban contractPOST /stellar/contract/invoke- Invoke a contract method
GET /stellar/network- Get network information
Configure Stellar integration in your .env file:
# Stellar Network Configuration
STELLAR_NETWORK=testnet # or 'mainnet'
STELLAR_RPC_URL=https://soroban-testnet.stellar.org
STELLAR_HORIZON_URL=https://horizon-testnet.stellar.org
STELLAR_FRIENDBOT_URL=https://friendbot.stellar.org// Generate keypair
const { publicKey, secretKey } = await stellarService.createKeypair();
// Fund on testnet
await stellarService.fundTestnetAccount(publicKey);// Create payment transaction
const xdr = await stellarService.createPaymentTransaction({
fromSecret: 'S...',
toPublicKey: 'G...',
amount: '10',
assetCode: 'XLM',
});
// Submit transaction
const result = await stellarService.submitTransaction(xdr);const { contractId, transactionHash } = await stellarService.deployContract(
sourceSecret,
wasmBuffer,
);const accountId = await stellarService.resolveFederationAddress('user*stellar.org');- SEP-0005: Memo format for transactions
- SEP-0001: Stellar account requirements
- SEP-0002: Federation protocol
- SEP-0024: Soroban smart contract interface
ChainBoard defaults to Stellar testnet for development. Use the friendbot endpoint to fund test accounts:
curl -X POST http://localhost:4000/stellar/fund/GPUBLICKEYFor production, update your environment variables:
STELLAR_NETWORK=mainnet
STELLAR_RPC_URL=https://soroban.stellar.org
STELLAR_HORIZON_URL=https://horizon.stellar.orgImportant: Never expose secret keys on mainnet. Use proper key management and hardware wallets for production.
Problem: Connection refused or ECONNREFUSED when starting the backend
Solutions:
- Ensure PostgreSQL is running:
pg_isreadyor check your PostgreSQL service - Verify
DATABASE_URLin.envmatches your PostgreSQL configuration - Check that the database exists:
createdb chainboardif needed - Ensure the user in the connection string has proper permissions
Problem: EADDRINUSE: address already in use :::3000 or :::4000
Solutions:
- Change the port in
.envby settingPORT=3001(backend) or adjusting frontend port - Kill the process using the port:
- Windows:
netstat -ano | findstr :3000thentaskkill /PID <PID> /F - Mac/Linux:
lsof -ti:3000 | xargs kill -9
- Windows:
Problem: pnpm install fails with peer dependency warnings
Solutions:
- Run
pnpm install --forceto bypass peer dependency checks - Update Node.js to version 20 or higher
- Clear pnpm cache:
pnpm store prune
Problem: TypeScript compilation errors or build failures
Solutions:
- Ensure all dependencies are installed:
pnpm install - Check TypeScript version compatibility in
tsconfig.json - Run
pnpm run lintto identify specific issues - Clear build artifacts:
rm -rf backend/dist frontend/dist
Problem: Freighter/MetaMask wallet not connecting
Solutions:
- Ensure wallet extension is installed and unlocked
- Check that you're on the correct network (testnet for development)
- Clear browser cache and try again
- Check browser console for specific error messages
Problem: Browser shows CORS policy errors in console
Solutions:
- Add your frontend URL to
ALLOWED_ORIGINSin.env - Ensure backend CORS configuration includes your domain
- Check that the backend is running and accessible
Solutions:
- Check database connection pool settings in
app.module.ts - Run
ANALYZEon your PostgreSQL database - Add indexes to frequently queried columns
- Monitor slow queries with PostgreSQL logging
Solutions:
- Adjust
DB_POOL_MAXandDB_POOL_SIZEin environment variables - Check for memory leaks in custom services
- Monitor with the
/metricsendpoint - Restart services periodically if needed
Solutions:
- Ensure you're running
pnpm run dev(notpnpm run build) - Check that file watchers are working on your OS
- Try restarting the development server
- Check Vite configuration in
vite.config.ts
Solutions:
- Ensure
.envfile exists in the project root - Verify variable names match those in
.env.example - Restart the server after changing
.env - Check for typos in variable names
Solutions:
- Ensure database migrations are run in CI
- Check that test environment variables are set
- Verify time zone settings match between environments
- Check for race conditions in async tests
Solutions:
- Ensure Jest is configured for coverage in
jest.config.js - Run tests with coverage:
pnpm run test:cov - Check that coverage directory is not in
.gitignore
Solutions:
- Check Docker logs:
docker logs <container_id> - Ensure all required environment variables are set
- Verify network connectivity between containers
- Check that ports are not already in use
Solutions:
- Ensure Dockerfile uses correct Node.js version
- Check that
pnpm-lock.yamlis committed - Verify all dependencies are in
package.json - Try building with
--no-cacheflag
If you encounter issues not covered here:
- Check the logs: Backend logs are in
logs/directory, frontend logs in browser console - Search GitHub Issues: Check if others have encountered similar issues
- Create a minimal reproduction: Simplify your setup to isolate the problem
- Provide context: Include error messages, environment details, and steps to reproduce
- Join the community: Ask for help in Discord (coming soon)
ChainBoard is built in the open, for the community. All contributions are welcome β from bug fixes and documentation improvements to new features and chain integrations.
- Fork the repository on GitHub
- Create a feature branch:
git checkout -b feature/your-feature-name - Commit your changes using conventional commits:
git commit -m "feat: add your feature" - Push to your fork:
git push origin feature/your-feature-name - Open a Pull Request against the
mainbranch
- Follow the existing code style and conventions
- Write tests for new functionality where applicable
- Keep PRs focused β one feature or fix per PR
- Link any related issues in your PR description
New to the codebase? Check out issues tagged good first issue β these are scoped, well-documented tasks ideal for getting started.
Please read our Code of Conduct before contributing.
ChainBoard is actively maintained by its founding team. We are committed to reviewing PRs promptly, triaging issues, keeping dependencies up to date, and supporting contributors throughout the development process.
If you'd like to become a maintainer, start by contributing regularly and engaging with the community.
This project is licensed under the MIT License β see the LICENSE file for full details.
- π¦ Twitter/X: coming soon
- π¬ Discord: coming soon
- π Documentation: coming soon
Built with love for the Stellar and Ethereum developer communities.
Supported by GrantFox β an open-source grants platform empowering builders worldwide.
Made with β€οΈ by the ChainBoard team.