DEV Community

Cover image for GoBadge v2: From Module Stats to Universal Badges
CinfiniteDev
CinfiniteDev

Posted on

GoBadge v2: From Module Stats to Universal Badges

What started as a tool for Go modules just became something much bigger.

I launched GoBadge a few weeks ago. Three endpoints. Three data sources. All Go-specific.

It worked, but it had a ceiling. Every new badge type meant writing code, deploying, and waiting. Users couldn't badge-ify their own data without me building it for them.

So I flipped the model.


The Problem With Hardcoded Integrations

Every badge service starts the same way: pick the most popular data sources, build endpoints for each one, repeat. They've been doing it for years and still don't cover everything.

For GoBadge, the issue was clearer than most. The service was built for Go developers, but Go developers use npm, Docker, and GitHub just like everyone else. Being locked to Go-specific metrics meant the service was only useful in one context — your Go module's README.

I wanted GoBadge to be useful in any README, regardless of the stack.


The Solution: One Endpoint

Instead of building a new endpoint for every data source, I built one that works with all of them.

GoBadge's dynamic endpoint does one thing: fetch any JSON API and render the result as a badge.

https://gobadge.vercel.app/api/dynamic?url=https://api.github.com/repos/gin-gonic/gin&value=stargazers_count&label=Stars
Enter fullscreen mode Exit fullscreen mode

That's it. One URL pattern replaces dozens of hardcoded endpoints.


What You Can Do With It

Single value from any API

![Stars](https://gobadge.vercel.app/api/dynamic?url=https://api.github.com/repos/gin-gonic/gin&value=stargazers_count&label=Stars&color=yellow)
Enter fullscreen mode Exit fullscreen mode

Multiple values in one badge

![Gin](https://gobadge.vercel.app/api/dynamic?url=https://api.github.com/repos/gin-gonic/gin&value=stargazers_count&value=forks_count&label=Gin&sep=%20%E2%9C%A6%20)
Enter fullscreen mode Exit fullscreen mode

Nested JSON with dot notation

![License](https://gobadge.vercel.app/api/dynamic?url=https://api.github.com/repos/gin-gonic/gin&value=license.spdx_id&label=License&color=blue)
Enter fullscreen mode Exit fullscreen mode

Any color you want

?color=ff6600
Enter fullscreen mode Exit fullscreen mode

What This Unlocked

The same endpoint handles every use case:

  • GitHub — stars, forks, issues, license
  • npm — weekly download counts
  • PyPI — package downloads
  • Docker Hub — pull counts
  • Crates.io — version and downloads
  • Any custom API — internal metrics, SaaS dashboards, anything

Before, adding a new data source meant editing code, redeploying, and updating docs. Now users just change the URL parameter.


Parameters

Param What it does
url HTTPS JSON endpoint
value Key to extract (repeat for multiple values, use dots for nested keys)
label Text on the left side
color Name or hex (e.g. ff6600)
sep Separator between values

What's Next

GoBadge is no longer a Go module tool. It's a general-purpose badge service that happens to have really good Go support.


Try it: https://gobadge.vercel.app

![Stars](https://gobadge.vercel.app/api/dynamic?url=https://api.github.com/repos/user/repo&value=stargazers_count&label=Stars&color=yellow)
Enter fullscreen mode Exit fullscreen mode

This is GoBadge v2. One badge service. Every data source.

Top comments (0)