The all-in-one developer portfolio platform.
Aggregate your coding stats, projects, certificates, and badges from across the web β and expose them through a clean REST API.
- Overview
- Features
- Tech Stack
- Getting Started
- Project Structure
- API Reference
- Deployment
- Contributing
ProfileForge lets developers build a single, unified profile by connecting their accounts on platforms like GitHub, LeetCode, Codeforces, and Credly. All of your coding stats, open-source contributions, competitive programming ratings, certificates, and badges are pulled together into one stylish dashboard.
You can also generate REST API keys to serve your profile data to any third-party website, portfolio, or bot β no scraping required.
| Feature | Description |
|---|---|
| π Platform Integrations | Connect GitHub, LeetCode, Codeforces, and Credly in one place |
| π Coding Stats | Live problem counts, contribution graphs, and contest ratings |
| π Badges & Certificates | Import Credly badges and track certificates with credential links |
| ποΈ Project Portfolio | Showcase projects with images, tech-stack tags, and links |
| π API Key Management | Generate/revoke API keys and monitor usage quotas |
| πΌοΈ Profile Customization | Upload a profile photo, update your display name, and more |
| π Built-in API Docs | Interactive documentation at /docs and inside the dashboard |
| π Secure Auth | Email/password signup with code-based email verification |
- React 19 β component-based UI
- Vite 7 β fast dev server and optimized builds
- React Router 7 β client-side routing
- Tailwind CSS 4 β utility-first styling
- Radix UI β accessible headless components (Dialog, Tooltip, Separator)
- Framer Motion β animations
- Embla Carousel β smooth carousel for badges
- Lucide React β icon library
- Axios β HTTP client
- Neo-brutalism aesthetic β bold 2 px borders, offset drop shadows
- Custom fonts: Cabinet Grotesk (headings) and Satoshi (body)
- Accent palette: black
#000, white#fff, yellow#ffe17c, sage#b7c6c2
- Node.js 18+ and npm (or yarn / pnpm)
- A running instance of the ProfileForge backend API
# 1. Clone the repository
git clone https://github.com/prammbhs/ProfileForge.git
cd ProfileForge
# 2. Install dependencies
npm installCreate a .env file in the project root:
VITE_BACKEND_URL=http://localhost:3000/api/v1| Variable | Description |
|---|---|
VITE_BACKEND_URL |
Base URL of the backend REST API (should end with /api/v1, no trailing slash) |
Note: Never commit your
.envfile. It is already listed in.gitignore.
# Start the development server (http://localhost:5173)
npm run dev
# Create a production build (output β dist/)
npm run build
# Preview the production build locally
npm run preview
# Lint the codebase
npm run lintProfileForge/
βββ public/ # Static assets (favicon, etc.)
βββ src/
β βββ components/
β β βββ auth/ # Auth guard wrapper
β β βββ docs/ # Embedded API documentation
β β βββ landing/ # Landing page sections (Hero, Features, β¦)
β β βββ layout/ # AppSidebar, DashboardLayout, Navbar
β β βββ ui/ # Reusable UI primitives (NeoButton, Carousel, β¦)
β βββ context/
β β βββ AuthContext.jsx # Global authentication state
β βββ hooks/ # Custom React hooks
β βββ lib/
β β βββ api.js # Pre-configured Axios instance
β βββ pages/ # Route-level page components
β β βββ LandingPage.jsx
β β βββ LoginPage.jsx
β β βββ SignupPage.jsx
β β βββ ConfirmSignupPage.jsx
β β βββ DashboardPage.jsx
β β βββ ProfilePage.jsx
β β βββ ApiKeysPage.jsx
β β βββ ProjectsPage.jsx
β β βββ CertificatesPage.jsx
β β βββ ExternalProfilesPage.jsx
β β βββ PublicDocsPage.jsx
β β βββ DashboardDocsPage.jsx
β βββ App.jsx # Route definitions
β βββ main.jsx # React entry point
βββ .env # Local env (git-ignored)
βββ components.json # shadcn/ui config
βββ eslint.config.js
βββ jsconfig.json # Path alias (@/ β src/)
βββ vercel.json # Vercel SPA rewrite rules
βββ vite.config.js
ProfileForge communicates with a RESTful backend. Below is a summary of the endpoints used by the frontend.
| Method | Endpoint | Description |
|---|---|---|
POST |
/login |
Log in with email and password |
POST |
/signup |
Register a new account |
POST |
/confirmsignup |
Verify email with the code sent on signup |
POST |
/logout |
End the current session |
GET |
/profile |
Fetch the authenticated user's profile |
| Method | Endpoint | Description |
|---|---|---|
PUT |
/profile/name |
Update display name |
PUT |
/profile/image |
Upload a profile photo (multipart/form-data) |
DELETE |
/profile/delete |
Permanently delete the account |
| Method | Endpoint | Description |
|---|---|---|
GET |
/keys |
List all API keys |
POST |
/keys |
Generate a new API key |
DELETE |
/keys/:id |
Revoke an API key |
GET |
/keys/quota |
Check current usage quota |
| Method | Endpoint | Description |
|---|---|---|
GET |
/external-profile/:platform |
Fetch data from a connected platform (github, leetcode, codeforces, credly) |
| Method | Endpoint | Description |
|---|---|---|
GET |
/projects |
List projects |
POST |
/projects |
Create a project |
PUT |
/projects/:id |
Update a project |
DELETE |
/projects/:id |
Delete a project |
POST |
/projects/presign |
Get a presigned S3 URL for image upload |
| Method | Endpoint | Description |
|---|---|---|
GET |
/certificates |
List certificates |
POST |
/certificates |
Add a certificate |
PUT |
/certificates/:id |
Update a certificate |
DELETE |
/certificates/:id |
Delete a certificate |
| Method | Endpoint | Description |
|---|---|---|
GET |
/codingStats |
Fetch aggregated coding statistics |
GET |
/badges |
Fetch earned badges |
Full interactive documentation is available inside the app at /docs.
The project is pre-configured for Vercel.
// vercel.json β rewrites all paths to index.html for SPA routing
{
"rewrites": [{ "source": "/(.*)", "destination": "/" }]
}Steps:
- Push your fork to GitHub.
- Import the repository in Vercel.
- Add
VITE_BACKEND_URLas an environment variable in the Vercel project settings. - Deploy β Vercel will run
npm run buildautomatically.
Contributions are welcome! Please follow these steps:
- Fork the repository and create a feature branch:
git checkout -b feature/your-feature-name
- Make your changes and ensure
npm run lintpasses without errors. - Commit with a clear, descriptive message.
- Open a Pull Request against the
mainbranch and describe what you changed and why.
Made with β and bold borders.