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.