Yes, 50 lines of code and you have your own custom shield/badge generator for your github READMEs!
And by server, I mean "serverless" - using vercel.
Prerequsites:
If you don't already have one, create a free account at vercel. Then install the Vercel CLI and log in.
npm install -g vercel vercel login
Create a new npm project:
mkdir mybadgeserver cd mybadgeserver npm init
Create the API endpoint:
The square brackets are required!
mkdir -p api/[label]/[value] cd api/[label]/[value] touch index.js
Paste the following code into index.js
module.exports = (req, res) => { const { label, value, ...options } = req.query const svg = makeShield(label, value, options) res.setHeader('content-type', 'image/svg+xml') res.send(svg) } const defaultOptions = { labelColor: 'orange', valueColor: '#777', fontSize: '.8rem', } function makeShield(label, value, options = {}) { label = label ?? 'label' value = value ?? 'value' options = {...defaultOptions, ...options } console.log({options}) return `<svg fill="none" viewBox="0 0 300 50" width="300" height="50" xmlns="http://www.w3.org/2000/svg"> <style> shield { position: relative; margin: 5px; display:flex; color: white; font-size: ${options.fontSize}; font-family: 'DejaVu Sans Mono', Verdana, DejaVu Sans, sans-serif; } label { background-color: ${options.labelColor}; padding: 5px 10px; font-weight: 900; border-radius: 5px 0 0 5px; } value { position: relative; background-color: ${options.valueColor}; padding: 5px 10px; border-radius: 0 5px 5px 0; left: 2px; } </style> <foreignObject width="100%" height="100%"> <shield xmlns="http://www.w3.org/1999/xhtml"> <label>${label}</label> <value>${value}</value> </shield> </foreignObject> </svg>` }
And that's it! Fire-up the local dev server:
vercel dev
Test the endpoint in your browser localhost:3000/api/label/value
Change
label
andvalue
in the url to whatever you like!Change colors by appending
?labelColor=red&valueColor=green
to the url.
When you want to deploy to vercel just type:
vercel
This will give you a different preview url each time you run it.
To deploy to production and get a nice "static" url type:
vercel --prod
Bonus points:
You can eliminate the need for api
in the url by creating a vercel.json
in the project root (not in the api folder) with the following contents:
{ "rewrites": [ { "source": "/:label/:value", "destination": "/api/:label/:value" } ] }
DISCLAIMER: THIS IS GUIDE RATHER THAN A PRODUCTION READY SOLUTION - IT NEEDS TWEAKING - THE GENERATED SVGS ARE SURROUNDED BY TOO MUCH WHITE SPACE AND TEXT MAY CLIP IF TOO LONG.
Top comments (0)