Animated banners · shields-compatible badges · typing text · 3,400+ tech icons · GitHub stats, streak & trophy cards
Free. No token. No signup. One URL per image.
Open the studio →
Every image in this README is a live URL served by Mark. Paste a URL into any README, issue, or site and it renders — nothing to install, no account, no API key.
Already using shields.io, capsule-render, skill-icons, readme-typing-svg or github-readme-stats? Keep your URL and change only the host (dialects).
Styles: waving aurora mesh spotlight grid minimal terminal transparent.
Themes: dark light ocean sunset forest grape mono paper — or your own colours with color=.
Motion is quiet by default: the light drifts slowly and the text stays still. fade, rise and type play once; none is a still image.
A progress ring and automatic color grading (red → bright green) from value and max.



Dynamic badges use shields' paths:
| Source | Paths |
|---|---|
| GitHub | /github/{stars,forks,license,last-commit}/{owner}/{repo}, /github/v/release/{owner}/{repo}, /github/actions/workflow/status/{owner}/{repo}/{file} (?branch=, ?event=) |
| npm | /npm/{v,dm,dw,dt,l}/{package} (scoped too) |
| pub.dev | /pub/{v,likes,points,dm}/{package} |
| Packagist | /packagist/{v,dm,dd,dt}/{vendor}/{package} |
| Bundlephobia | /bundlephobia/{min,minzip}/{package} |
| Chrome Web Store | /chrome-web-store/{v,users,rating,stars,rating-count}/{id} |
A star-history.com URL works with only the host changed. GitHub shares star dates only with the people who can manage a repository, so the chart draws a curve for repositories Mark's server can read; for any other repository it shows today's total.
Mark reads the URL formats you already use. Keep the path and query, change the host:
| You have | Change it to |
|---|---|
img.shields.io/badge/build-passing-brightgreen |
mark.sylphx.com/badge/build-passing-brightgreen |
img.shields.io/github/stars/owner/repo |
mark.sylphx.com/github/stars/owner/repo |
img.shields.io/npm/v/package |
mark.sylphx.com/npm/v/package |
capsule-render.vercel.app/api?type=waving&text=Hi |
mark.sylphx.com/api?type=waving&text=Hi |
skillicons.dev/icons?i=rust,ts |
mark.sylphx.com/icons?i=rust,ts |
readme-typing-svg.demolab.com?lines=Hello;World |
mark.sylphx.com/?lines=Hello;World |
github-readme-stats.vercel.app/api?username=you |
mark.sylphx.com/api?username=you |
github-readme-stats.vercel.app/api/top-langs?username=you |
mark.sylphx.com/api/top-langs?username=you |
github-readme-stats.vercel.app/api/pin?username=you&repo=r |
mark.sylphx.com/api/pin?username=you&repo=r |
streak-stats.demolab.com?user=you |
mark.sylphx.com/?user=you |
github-profile-trophy.vercel.app/?username=you |
mark.sylphx.com/?username=you |
api.star-history.com/svg?repos=owner/repo |
mark.sylphx.com/svg?repos=owner/repo |
Or paste any of those URLs into the studio and edit it there.
- Free, with no token. You never paste a personal access token. Live cards read public GitHub data on the server, with caching.
- Never a broken image. Unknown parameters fall back to defaults. If GitHub is slow or rate limited, you get the last good card; if there is none yet, a calm "temporarily unavailable" card, never a broken-image icon.
- Fast. Rendering takes microseconds, not milliseconds (see Performance). Static images are immutable and cacheable for a year, and
.svgURLs are served from the edge. Live cards are cached for hours. - Pretty by default. Every default is designed. Themes work across banners, badges and cards.
- One host for everything instead of five services with five different uptimes.
- Safe to embed. All text is escaped, colors are validated, and every SVG response forbids scripts.
- Open source (MIT), one Rust binary. Run your own instance with a single
docker run.
Banner — /api/v1/mark/hero
| Param | Values | Default |
|---|---|---|
text, desc |
Title and subtitle. Use -nl- for a new line. |
— |
type |
Style: waving aurora mesh spotlight grid minimal terminal transparent |
waving |
theme |
dark light ocean sunset forest grape mono paper |
dark |
color |
One colour, or gradient stops like 0:0F172A,50:5B8CFF,100:FF8A3D (used when no theme is set; a dark first stop becomes the background). gradient picks a theme from the text. |
— |
layout |
default (centered) left |
default |
animation |
ambient (the light drifts) fade rise type (play once) none |
ambient |
font |
sans mono |
sans |
width, height |
Pixels, up to 1600 × 900. Type scales with the canvas (1280×640 makes a social preview). | 880, 220 |
transparent draws text only, in GitHub's text colours for the viewer's light or dark scheme. Names from earlier versions (plasma, constellation, tokyonight, glitch, plate, …) still render: each maps to the closest style, theme, motion or layout above.
Badge — /badge/{label}-{message}-{color}, /static/v1
Uses shields.io static-badge syntax: -- is a dash, __ is an underscore, _ is a space, and {message}-{color} alone drops the label.
| Param | Values |
|---|---|
style |
flat flat-square plastic for-the-badge social |
logo |
Any Simple Icons slug (rust, github, npm…) or a base64 data: image |
logoColor, color, labelColor |
shields color names, hex, rgb(), hsl() |
label |
Overrides the label from the path |
Score — /api/v1/mark/score
label, value, max (default 100), style, logo, color (overrides the automatic grade), theme.
Typing — /typing (also /?lines=)
The same parameters as readme-typing-svg: lines (separated by ;), font, weight, size, color, background, center, vCenter, multiline, width, height, duration, pause, repeat, random, letterSpacing, separator.
Icons — /icons?i=
i (or icons): comma-separated skill-icons ids or Simple Icons slugs. theme is dark or light. perline is 1–50 (default 15). The native row is /api/v1/mark/strip?icons=….
GitHub cards — /api, /api/top-langs, /streak, /api/pin, /trophy
github-readme-stats parameters: username, theme, show_icons, hide, hide_title, hide_rank, hide_border, border_radius, title_color, text_color, icon_color, bg_color, border_color, custom_title, card_width, layout (normal compact donut donut-vertical pie), langs_count, exclude_repo. The native routes are /api/v1/card/{stats|langs|streak|repo|stars}. Trophies (/trophy, or /?username=) take github-profile-trophy's theme, column, row, margin-w, margin-h, no-bg, no-frame, title and rank.
Live cards are cached on the server (about 4 hours) and at the edge. They are served stale while they refresh, and stale when GitHub is unavailable.
Profile card and deploy mark
/api/v1/mark/profile?text=Name&desc=Tagline, with theme, color, type (an art background), width and height.
/api/v1/mark/deploy?service=name renders a "deployed on Sylphx" badge.
Append .svg to any image path (/badge/a-b-c.svg, /api/v1/mark/hero.svg?…) and it is edge-cached by file type. The full vocabulary is at /api/v1/catalog.
In-process render latency (release build, 400 runs per URL, p50). The Bench workflow re-measures on every change to main and publishes the table to its job summary:
| Image | Size | p50 |
|---|---|---|
Badge (/badge/build-passing-brightgreen) |
1.3 KB | 8 µs |
| Banner, waving, 880×220 | 2.5 KB | 20 µs |
| Banner, aurora, 1200×320 | 2.6 KB | 17 µs |
| Tech strip, 8 icons | 23 KB | 41 µs |
| Profile card | 2.0 KB | 11 µs |
Live readback on 2026-09-25 from a server in Europe with scripts/measure-live.sh (15 requests per URL, p50). "Wait" is the time from sending the request to the first byte, not counting DNS, TCP or TLS:
| URL | Wait | cf-cache-status |
|---|---|---|
/badge/build-passing-brightgreen.svg |
31 ms | HIT |
/api/v1/mark/hero.svg?type=waving&text=… |
32 ms | HIT |
/badge/build-passing-brightgreen |
63 ms | DYNAMIC (origin) |
/api/v1/mark/strip?icons=rust,ts,docker |
57 ms | DYNAMIC (origin) |
Use the .svg form to be served from the edge. Both forms return identical bytes with a strong ETag, and If-None-Match returns 304.
docker build --build-arg GIT_SHA="$(git rev-parse HEAD)" -t mark .
docker run --rm -p 8787:8787 mark # → http://localhost:8787| Variable | Default | Notes |
|---|---|---|
PORT / HOST |
8787 / 0.0.0.0 |
|
PUBLIC_BASE_URL |
derived | The host the studio writes into copied URLs |
GITHUB_TOKEN or GITHUB_TOKENS |
— | Optional. Raises the GitHub rate limit for live cards; comma-separate several tokens to rotate them. |
DEFAULT_CREDIT |
0 |
1 adds a small watermark |
RUST_LOG |
mark=info |
Development: cargo run, cargo test. After reviewing a visual change, refresh the snapshots with UPDATE_SNAPSHOTS=1 cargo test --test visual_snapshots.
Mark stands on ideas from shields.io, capsule-render, readme-typing-svg, skill-icons, github-readme-stats and github-readme-streak-stats, and speaks their URL formats so you can switch without rewriting. Brand icons come from Simple Icons (CC0). Brand names and logos are trademarks of their owners; their use here does not imply endorsement.
Decisions: docs/vision.md · docs/capabilities.md · ADR-0005.
MIT © Sylphx