Thanks for your interest in contributing to useSend! We’re an open-source email infrastructure platform, and we’d love your help to make it even better. This guide will walk you through how to get started, set up the project locally, and submit contributions.
All contributions begin with setting up the project locally. Follow the steps below to get started.
📖 Refer to the full setup guide:
https://docs.usesend.com/get-started/local
You’ll need:
- A GitHub account
- Node.js v18+
pnpm(usecorepack enableto activate)- Docker (recommended)
- AWS & Cloudflare accounts (free tiers are fine)
git clone https://github.com/YOUR-USERNAME/usesend.git
cd usesendcorepack enable
pnpm installcp .env.example .envThen:
- Generate a secret:
openssl rand -base64 32-
Add this to
.envasNEXTAUTH_SECRET. -
Create symlink for Next.js:
ln -s ../../.env apps/web/.envNext.js requires the
.envfile in its directory. This symlink ensures both root andapps/webcan access the same environment variables.
Set up a GitHub OAuth App:
- Homepage:
http://localhost:3000/login - Callback:
http://localhost:3000/api/auth/callback/github
Add credentials to .env:
GITHUB_ID=your_client_id
GITHUB_SECRET=your_client_secretIf you want to send real emails, add:
AWS_ACCESS_KEY=your_access_key
AWS_SECRET_KEY=your_secret_keyYou can skip this by using the
local-sen-snsimage for local-only email development.
pnpm d- Dashboard: http://localhost:3000
- Marketing Site: http://localhost:3001
To test GitHub login, run:
cloudflared tunnel --url http://localhost:3000Paste the Cloudflare URL in your GitHub App callback settings.
If you're using your own PostgreSQL & Redis:
- Add in
.env:
DATABASE_URL=your_postgres_url
REDIS_URL=your_redis_url- Migrate database:
pnpm db:migrate-dev- Start dev server:
pnpm dev- Use
cloudflaredas mentioned above if needed.
pnpm dev:docsapps/
├── web # Dashboard & Email Infra
├── marketing # Landing page
├── docs # This documentation site
packages/
├── eslint-config # Shared ESLint rules
├── sdk # TypeScript SDK for useSend REST API
├── tailwind-config # Shared Tailwind setup
├── typescript-config # Shared tsconfig
├── ui # Shared UI components (buttons, modals, etc.)
- Create a Feature Branch
git checkout -b feat/your-feature-
Make Your Changes
- Follow the existing project structure.
- Write clean, modular, and reusable code.
- Formatting is enforced with Prettier.
-
Commit Your Work
git add .
git commit -m "feat: your message here"- Push and Open a Pull Request
git push origin feat/your-feature- Open a PR against the
mainbranch - Fill in the PR template
- Discord: Join our server
- GitHub Discussions: Start a discussion
- GitHub Issues: Report issues or bugs
Need help or unsure where to begin? Just ask!
We’re excited to see your ideas and contributions! 💌