One Tap. Every Profile. Every Platform.
Open Source Developer Profile Exchange Platform
Features • Quick Start • Architecture • Contributing • License
At every developer meetup, hackathon, or conference, the same friction plays out:
"What's your LinkedIn?" → open LinkedIn, search, send request
"Do you have GitHub?" → open GitHub, search, follow
"Are you on Twitter?" → open Twitter, search, follow
Each exchange is manual, error-prone, and slow. DevCard fixes this.
DevCard aggregates all your developer profiles into a single shareable QR code. The receiver opens one screen and can follow/connect on every platform — without switching apps.
- 🔗 Universal Profile Aggregation — GitHub, LinkedIn, Twitter/X, GitLab, Devfolio, and 10+ more platforms
- 📱 QR Code Sharing — Show your QR, they scan, done
- ⚡ One-Screen Multi-Platform Connect — Follow on GitHub, Connect on LinkedIn, all from one card
- 📈 Advanced Analytics — Track who viewed your card, when, and from where (Web, QR, App)
- 🔌 Per-Platform OAuth Integrations — Securely connect accounts for "Silent Follows"
- 🎯 Context Cards — Different cards for different situations (Professional, Hackathon, Community)
- 🌐 Web Backup — Receivers don't need the app — works in any browser
- 🔒 Privacy-First — No tracking, no data selling, your data stays yours
- 🛠️ Open Source — Apache 2.0 licensed, community-governed
- Node.js >= 20
- pnpm >= 9
- Docker & Docker Compose
- React Native development environment (setup guide)
# Clone the repo
git clone https://github.com/Dev-Card/DevCard.git
cd devcard
# Install dependencies
pnpm install
# Start infrastructure (PostgreSQL + Redis)
docker compose up -d
# Copy environment config
cp .env.example .env
# Run database migrations
pnpm db:migrate
# Seed sample data
pnpm db:seed
# Start the backend
pnpm dev:backend
# In another terminal — start the mobile app
pnpm dev:mobiledevcard/
├── apps/
│ ├── backend/ # Fastify + TypeScript API
│ ├── mobile/ # React Native (Bare) mobile app
│ └── web/ # SvelteKit web backup
├── packages/
│ └── shared/ # Shared types, platform registry, utils
├── docker-compose.yml # PostgreSQL + Redis
└── pnpm-workspace.yaml # Monorepo config
| Layer | Technology |
|---|---|
| Mobile App | React Native (Bare) + React Navigation |
| Backend API | Fastify + TypeScript |
| Database | PostgreSQL 16 + Prisma ORM |
| Cache | Redis 7 |
| Web Backup | SvelteKit |
| Auth | OAuth 2.0 (GitHub, Google) |
DevCard uses a three-layer follow engine:
| Layer | Strategy | Platforms |
|---|---|---|
| API Follow | Silent background follow | GitHub |
| WebView Connect | In-app WebView interaction | LinkedIn, Twitter/X |
| Profile Link | Opens profile in browser | GitLab, Devfolio, others |
The API provides the following endpoints (defined by the cardRoutes function in apps/backend/src/routes/cards.ts):
| Method | Endpoint | Description |
|---|---|---|
| GET | / |
List all cards for the authenticated user |
| POST | / |
Create a new card (first card is auto-set as default) |
| PUT | /:id |
Update a card's title and/or links |
| DELETE | /:id |
Delete a card |
| PUT | /:id/default |
Set a card as the default card |
Request:
POST /cards HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "New Card",
"linkIds": [
"223e4567-e89b-12d3-a456-426614174000",
"323e4567-e89b-12d3-a456-426614174000"
]
}Response (201 Created):
{
"id": "623e4567-e89b-12d3-a456-426614174000",
"title": "New Card",
"isDefault": false,
"links": [
{
"id": "223e4567-e89b-12d3-a456-426614174000",
"platform": "github",
"username": "john-doe",
"url": "https://github.com/john-doe"
},
{
"id": "323e4567-e89b-12d3-a456-426614174000",
"platform": "twitter",
"username": "johndoe",
"url": "https://twitter.com/johndoe"
}
]
}Field constraints:
title: String, 1-100 characters (required)linkIds: Array of UUID strings (required, can be empty array)
Request:
PUT /cards/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "Updated Card Title",
"linkIds": [
"223e4567-e89b-12d3-a456-426614174000"
]
}Response (200 OK):
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"title": "Updated Card Title",
"isDefault": true,
"links": [
{
"id": "223e4567-e89b-12d3-a456-426614174000",
"platform": "github",
"username": "john-doe",
"url": "https://github.com/john-doe"
}
]
}Field constraints:
title: String, 1-100 characters (optional)linkIds: Array of UUID strings (optional)
Request:
DELETE /cards/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Authorization: Bearer <token>Response (204 No Content):
(empty body)
Request:
PUT /cards/423e4567-e89b-12d3-a456-426614174000/default HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/jsonResponse (200 OK):
{
"message": "Default card updated"
}The following error cases are implemented:
| Scenario | Status | Response |
|---|---|---|
| Create/Update Card | 400 | { error: 'Validation failed', details: parsed.error.flatten() } — when title or linkIds don't meet constraints |
| Create/Update Card | 409 | { error: 'Username already taken'} — when a user with the same username exists |
| Update Card | 404 | { error: 'Card not found' } — when card ID doesn't exist or doesn't belong to authenticated user |
| Delete Card | 404 | { error: 'Card not found' } — when card ID doesn't exist or doesn't belong to authenticated user |
| Set Default Card | 404 | { error: 'Card not found' } — when card ID doesn't exist or doesn't belong to authenticated user |
| Successful Deletion | 204 | No content |
New to open source? We've got you covered! Check out our Good First Issues, these are specially curated issues that are:
- Well-documented with clear acceptance criteria
- Limited in scope (perfect for a first contribution)
- Mentored by maintainers
- Browse the Good First Issues list.
- Comment on the issue you'd like to work on (e.g., "I'd like to take this on!") and wait for a maintainer to assign it to you.
- If you feel like opening the PR first, you can do that, and you will be assigned accordingly.
- Fork the repo, make your changes, and open a PR.
See CONTRIBUTING.md for setup instructions, coding standards, and PR process.
DevCard is licensed under the Apache License 2.0.
Built with ❤️ by the developer community, for the developer community.