A dynamic GitHub README widget that shows information about the last person who clicked it — their location, browser, OS, language, and local time.
No raw IPs are stored. No emojis. No fluff. Just clean, privacy-safe visitor data rendered as a live SVG.
- A visitor sees the widget on your GitHub profile and clicks it.
- Your server captures their HTTP headers, looks up their location (then discards the IP), and saves the data.
- The visitor is redirected back to your profile.
- On refresh, GitHub fetches a fresh SVG from your server showing the new data.
Add this to your GitHub profile README.md:
[](https://your-app.onrender.com/click)Replace your-app with your actual Render app name.
- Sign up at upstash.com (free, no credit card)
- Create a Redis database
- Copy the REST URL and REST Token
- Push this repo to GitHub
- Go to render.com → New → Web Service
- Connect your GitHub repo
- Set Build Command:
npm install - Set Start Command:
npm start - Add environment variables:
UPSTASH_REDIS_REST_URL— from UpstashUPSTASH_REDIS_REST_TOKEN— from UpstashGITHUB_PROFILE_URL—https://github.com/ZyAzOsK
- Deploy
Render's free tier sleeps after 15 minutes of inactivity. To prevent this:
- Sign up at uptimerobot.com (free)
- Create a new HTTP(s) Monitor
- URL:
https://your-app.onrender.com/health - Interval: 5 minutes
This pings your /health endpoint every 5 minutes, keeping the server awake.
- Node.js + Express — web server
- Upstash Redis — stores last visitor data (1 key)
- ua-parser-js — parses browser and OS from User-Agent
- ip-api.com — converts IP to location (IP discarded after lookup)
- express-rate-limit — flood protection (1 click per IP per minute)
- IP addresses are never stored — used only for geo-lookup, then discarded
- Only derived data is saved: city, region, country, timezone, OS, browser, language
- Rate limiting prevents abuse (1 click per IP per minute)
- Referer check — only clicks originating from
github.comare accepted
MIT