Dynamic SVG widgets for your GitHub profile README
Stats • Languages • Streak • Profile • Pinned Repos
Profilr is an open-source tool that generates dynamic, customizable SVG widgets for your GitHub profile README. Built with Laravel and designed for free, one-click serverless deployment on Vercel, it connects directly to the GitHub GraphQL API to display real-time contribution stats, streaks, top languages, and pinned repositories, all with dedicated rate limits and support for private repo data.
Tip
Why Deploy Your Own? GitHub README widgets receive traffic from anyone who visits your profile. By deploying your own free instance on Vercel with your personal token, you get:
- Dedicated Rate Limits: A full 5,000 requests/hour GitHub API quota exclusively for your widgets.
- Private Repo Stats: Access to private repository counts and statistics.
- 100% Personal Uptime: Never affected by shared server load.
Pick ONE path — don't mix them. Going to vercel.com/new and typing a repo name that doesn't exist on GitHub yet will fail. Either let Vercel clone for you (Option A), or fork first and then import (Option B).
- Click Deploy with Vercel above.
- Vercel shows Create Git Repository — pick a name and choose Private or Public, then Create. This clones the template into your GitHub account automatically. (This is how you get a private copy — you don't pre-create it.)
- When prompted for env vars, fill in the only one:
| Variable | Required | How to get it |
|---|---|---|
GITHUB_TOKEN |
✅ | Your GitHub Personal Access Token — scopes read:user (public data) + repo (private repo stats) |
That's the only input. Every other environment variable is set automatically when the app boots on Vercel (bootstrap/app.php): the /tmp cache paths, array cache/session drivers, stderr logging, ENABLE_API=true, and APP_KEY (derived per deployment as a stable SHA-256 of your token — the app is stateless, so there's nothing sensitive to encrypt; override it in the dashboard if you want hardening). Forks are API-only by design (ENABLE_UI stays off) — the landing page stays on the main instance. Nothing else needs configuring.
- Click Fork (top right) to copy the repo to your account (choose Private there if you want).
- Go to vercel.com/new → Import your fork (it must already exist on GitHub).
- Add
GITHUB_TOKENas the only env var and deploy.APP_KEYis auto-derived from your token bybootstrap/app.php— no need to set it manually.
Once deployed, embed widgets in your GitHub profile README using <img> tags:
That's it! 🚀
Shows total stars, commits, PRs, issues, and contributions.
<img src="https://your-app.vercel.app/api/stats?theme=dark" alt="GitHub Stats" />Bar chart of most-used programming languages.
<img src="https://your-app.vercel.app/api/languages?theme=dark&limit=8" alt="Top Languages" />Current and longest contribution streak.
<img src="https://your-app.vercel.app/api/streak?theme=dark" alt="Streak Stats" />Avatar, bio, follower/following counts, and join date.
<img src="https://your-app.vercel.app/api/profile?theme=dark" alt="Profile Card" />Showcase your pinned repositories with stars and forks.
<img src="https://your-app.vercel.app/api/pinned?theme=dark" alt="Pinned Repos" />Get a complete README.md with all widgets embedded:
GET https://your-app.vercel.app/api/readme?theme=dark
All widgets support a ?theme= parameter:
| Theme | Theme | ||
|---|---|---|---|
light |
Default light | dark |
GitHub dark |
radical |
Neon pink | dracula |
Dracula purple |
tokyonight |
Tokyo Night blue | gruvbox |
Gruvbox warm |
nord |
Nord cool | catppuccin |
Catppuccin pastel |
onedark |
One Dark | solarized |
Solarized |
rose_pine |
Rosé Pine | ayu |
Ayu dark |
| Endpoint | Description | Extra Params |
|---|---|---|
GET /api/stats |
Stars, commits, PRs, issues | username, theme |
GET /api/languages |
Most used languages | username, theme, limit (max 12) |
GET /api/streak |
Contribution streaks | username, theme |
GET /api/profile |
Avatar, bio, followers | username, theme |
GET /api/pinned |
Pinned repositories | username, theme |
GET /api/readme |
Full README template | username, theme |
Note: If
usernameis omitted, the app uses the authenticated user (fromGITHUB_TOKEN).
- Backend: Laravel 13 (PHP 8.4)
- Templates: Blade SVG rendering
- Deployment: Vercel (serverless PHP via
vercel-php@0.9.0) - API: GitHub GraphQL API v4
- Database: None — fully stateless
# Clone your fork
git clone https://github.com/YOUR_USERNAME/profilr.git
cd profilr
# Install dependencies
composer install
# Setup environment
cp .env.example .env
php artisan key:generate
# Add your GitHub token to .env
# GITHUB_TOKEN=ghp_your_token_here
# Start the server
php artisan serveVisit http://localhost:8000 to see the landing page.
MIT License. See LICENSE for details.