Visualize, customize, and export your GitHub contribution calendar — custom palettes, shapes, and backgrounds. No token required. Available on the web, iOS & Android, with home-screen widgets.
Website · Google Play · App Store (soon) · Web docs · App docs
- What You Get
- Features
- Quick Start
- Project Structure
- Monorepo Development
- Documentation
- Support & Contributing
- Use of AI
Type a GitHub username and get a fully customizable contribution calendar you can pin, embed, or carry on your home screen:
-
Live SVG endpoint — this image is rendered by ContribKit right now:
-
Web app: render any profile, tweak palette and shape, and export as PNG, SVG, or Markdown.
-
Mobile app: native iOS & Android app with home-screen widgets that keep your streak one glance away.
-
README embed: a one-line Markdown snippet that always shows your up-to-date calendar.
- 🎨 11 color palettes: GitHub, Catppuccin, Nord, Dracula, Gruvbox, Sunset, Tokyo Night, One Dark, Rosé Pine, Solarized, Monokai
- 🔷 5 cell shapes: rounded, square, circle, dot, hex
- 📤 3 export formats: PNG for the readme, SVG for the portfolio, Markdown for the bio
- 🔓 No token required: only public contribution data — no OAuth, no PAT
- 📱 Home-screen widgets: small (streak counter), medium (full grid), large (both) — iOS & Android, refreshed daily
- 🗓️ Year selector: any year back to 2005 (GitHub's launch)
- 🌗 Dark/light theme: follows your system scheme, with manual override
- 🧩 Shared design tokens: palettes and shapes defined once in
shared/, used by web and app
- Open contribkit.app
- Type a GitHub username and hit render
- Customize, then copy or export from the export section
- Install from Google Play (App Store coming soon)
- Enter your username
- Add the widget to your home screen
See the embedding guide for palettes, shapes, and background options.
Monorepo with three components sharing design tokens:
| Directory | Component | Stack | Docs |
|---|---|---|---|
web/ |
contribkit.app + SVG/JSON API | Astro · TypeScript · Cloudflare Workers | web/README.md |
app/ |
iOS & Android app with home-screen widgets | Flutter · Riverpod · RevenueCat | app/README.md |
shared/ |
Single source of truth for palettes, shapes, usernames | JSON consumed by both apps | shared/CONTEXT.md |
Both apps follow the same DDD-ish layered architecture (domain → application → infrastructure / ui): the domain is pure, validated value objects guard every boundary, errors are typed Failures (nothing throws across layers), and each layer documents its own rules in a colocated CONTEXT.md.
Tooling that applies to the whole repo:
- Package manager: pnpm workspaces (
pnpm-workspace.yaml) - Git hooks: lefthook (
lefthook.yml) — install once withbrew install lefthook && lefthook install - Commits: Conventional Commits, enforced by commitlint
- Releases: semantic-release per component (
web-vX.Y.Z/app-vX.Y.Ztags) - CI: path-filtered workflows —
ci-web.ymlandci-app.ymlonly run when their component changes
GitHub Environments are namespaced by component (<component>-<stage>) because they are repo-global and hold component-specific secrets:
| GitHub Environment | Component | Stage | Deployed by |
|---|---|---|---|
app-production |
Flutter app | production | release-app.yml (track = production) |
app-development |
Flutter app | development | release-app.yml (track ≠ production) |
web-production |
Astro web | production | ci-web.yml (deploy-production, push to main) |
web-development |
Astro web | development | ci-web.yml (deploy-development, per-PR preview) |
App development and web development map to different things: app development is the internal Play track + RevenueCat sandbox; web development is a per-PR preview Worker on *.workers.dev. The component-scoped configs do not repeat the prefix: wrangler uses [env.production] / [env.development]; Flutter uses production / development flavors.
Component-specific setup, commands, and deploy flows live in web/README.md and app/README.md.
| Guide | Description |
|---|---|
| Web | API reference, embedding guide, architecture, deploys |
| App | Flutter setup, widgets, in-app purchases, releases |
| Shared tokens | Palettes, shapes, and usernames consumed by both apps |
| Legal notice | Privacy · Terms |
If you find this project useful, consider supporting its development:
This project uses AI assistance primarily for documentation and review purposes. AI tools (GitHub Copilot, Claude) were used to:
- Write and improve documentation (READMEs, layer
CONTEXT.mdfiles) - Generate boilerplate code and configuration files
- Assist with code reviews and refactoring suggestions
The core logic, architecture decisions, and implementation were developed by the maintainer. All AI-generated content has been reviewed and validated.
ContribKit is not affiliated with GitHub, Inc.
MIT © Made with 🤘🏼 by Ferran Buireu