Generate a Neofetch-style SVG card for your GitHub profile README.
The card renders as an SVG served by the app, so it stays up to date every time your profile is viewed — set the URL once and leave it.
- Neofetch-style SVG card that embeds directly in a GitHub README
- ASCII art generated from any uploaded image (logos, avatars, silhouettes)
- Customizable fields, sections, colors, and layout
- Optional GitHub stats — repos, commits, lines added/deleted
- Runs locally, no hosting required
go install github.com/matte-realize/mefetch@latest
mefetchgit clone https://github.com/matte-realize/mefetch
cd mefetch
cp .env.example .env # optional, for a GITHUB_TOKEN
make run # or: go run main.godocker build -t mefetch .
docker run -p 8080:8080 mefetch- Run the app — your browser opens to
http://localhost:8080 - Fill in your details and customize the card
- Upload an image to generate ASCII art
- Copy the embed URL into your GitHub profile README
To pick up where you left off, click import and select a previously downloaded .svg — your fields, colors, sections, and ASCII art are restored from metadata embedded in the file. Use remove loaded svg to clear the imported art and start fresh.
Set PORT to run on a different port.
- Customize your card in the app and click download svg.
- Add the downloaded
.svgfile to your repo (e.g.assets/card.svg). - Reference it in your README:
<p align="center">
<img src="assets/card.svg" alt="Mefetch Card">
</p>This embeds a static export — no running server required.
Every downloaded .svg carries its own configuration, so you never have to rebuild a card from scratch.
On export, Mefetch embeds a <metadata id="mefetch-config"> element containing a base64-encoded JSON snapshot of the card — username, hostname, colors, the show-stats toggle, every custom field/section/spacer in order, and the rendered ASCII art:
<metadata id="mefetch-config">eyJ1c2VybmFtZSI6Im9jdG9jYXQiLCJ...</metadata>The metadata is invisible in the rendered card and is omitted from the live /card.svg embed URL to keep README embeds lean.
To resume editing, click import in the app and select a previously downloaded .svg — the form is repopulated from this metadata exactly as exported. Click remove loaded svg to clear the imported ASCII art and start fresh while keeping your fields and colors.
Imported ASCII art is restored at the resolution it was exported. If you later add many fields, re-upload the source image to regenerate the art at full height.
| param | description | example |
|---|---|---|
username |
your username | name |
hostname |
your hostname | macbook |
field |
custom field (repeatable) | field=OS:macOS |
background |
background color | %230d1117 |
keycolor |
key text color | %2358a6ff |
textcolor |
value text color | %23cdd9e5 |
showstats |
show GitHub stats | false to disable |
- Format — PNG or JPEG
- Shape — square or portrait works best; landscape gets squished
- Size — 200×200 to 1000×1000px
- Contrast — high-contrast subjects on a simple background are clearest
- Transparency — transparent PNG logos are traced by their silhouette, so any color works; opaque images are converted by brightness
Your GitHub avatar is an ideal test image.
GitHub stats come from the public GitHub API. Unauthenticated requests are limited to 60 per hour per IP. Mefetch caches each user's stats for an hour, so editing fields or repeated profile views cost only one fetch per username per hour.
Which budget is used depends on how it runs:
- Local / self-hosted — requests come from your own IP, against your own 60/hr. No setup needed.
- One public instance — every visitor loads the SVG from your server, so all requests share that server's single IP budget. Caching keeps this workable (~60 distinct usernames/hour); busy instances should use a token.
To raise the limit to 5,000/hour, set a token in .env:
GITHUB_TOKEN=ghp_your_token_hereA classic Personal Access Token with no scopes is enough for public data. Never commit your token — keep it in .env (gitignored). Forks should supply their own.
MIT — see LICENSE.