Skip to content

Dev-Card/DevCard

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

14 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

DevCard

One Tap. Every Profile. Every Platform.

Open Source Developer Profile Exchange Platform

GitHub Repo

Features β€’ Quick Start β€’ Architecture β€’ Contributing β€’ License


The Problem

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.

The Solution

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.

Features

  • πŸ”— 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

Quick Start

Prerequisites

  • Node.js >= 20
  • pnpm >= 9
  • Docker & Docker Compose
  • React Native development environment (setup guide)

Development Setup

# 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:mobile

Architecture

devcard/
β”œβ”€β”€ 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

Tech Stack

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)

Hybrid Follow Engine

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

API Endpoints

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

POST / - Create a New Card (Example)

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)

PUT /:id - Update a Card (Example)

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)

DELETE /:id - Delete a Card (Example)

Request:

DELETE /cards/123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Authorization: Bearer <token>

Response (204 No Content):

(empty body)

PUT /:id/default - Set a Card as Default (Example)

Request:

PUT /cards/423e4567-e89b-12d3-a456-426614174000/default HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/json

Response (200 OK):

{
  "message": "Default card updated"
}

Error Cases

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

Good First Issues

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

How to Claim an Issue

  1. Browse the Good First Issues list.
  2. 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.
  3. If you feel like opening the PR first, you can do that, and you will be assigned accordingly.
  4. Fork the repo, make your changes, and open a PR.

Contributing

See CONTRIBUTING.md for setup instructions, coding standards, and PR process.

License

DevCard is licensed under the Apache License 2.0.


Built with ❀️ by the developer community, for the developer community.

Releases

No releases published

Packages

 
 
 

Contributors