Skip to content

Repository files navigation

Mark — beautiful README images from one URL

GitHub stars MIT license no token needed built with Rust

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).

Gallery

Banners — 8 styles, 8 themes

waving banner aurora banner mesh banner spotlight banner grid banner minimal banner terminal banner waving banner

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.

![](https://mark.sylphx.com/api/v1/mark/hero?type=aurora&theme=grape&text=Hello%2C%20README&desc=One%20URL%2C%20one%20image)

Badges — shields syntax, plus 3,400+ logos

build passing license MIT made with Rust docker ready discord

![](https://mark.sylphx.com/badge/made_with-Rust-dea584?style=for-the-badge&logo=rust)

Score badges

agent-ready 92 coverage 74 quality 8/10

A progress ring and automatic color grading (red → bright green) from value and max.

Typing text

typing text

![](https://mark.sylphx.com/typing?lines=Hi%20there;I%20build%20tools&center=true)

Tech icons — every Simple Icons brand

tech icons


tech icons, light

![](https://mark.sylphx.com/icons?i=rust,ts,react,docker&theme=dark)

GitHub stats — live, cached, no token

GitHub stats top languages

contribution streak repository card

GitHub trophies

![](https://mark.sylphx.com/api?username=YOUR_NAME&show_icons=true)
![](https://mark.sylphx.com/api/top-langs?username=YOUR_NAME&layout=compact)
![](https://mark.sylphx.com/streak?user=YOUR_NAME)
![](https://mark.sylphx.com/trophy?username=YOUR_NAME)

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}

Star history

star history

![](https://mark.sylphx.com/svg?repos=owner/repo&theme=dark)

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.

Profile cards

profile card

profile card with art

Switch by changing the host

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.

Why Mark

  • 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 .svg URLs 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.

Reference

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.

Performance

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.

Self-hosting

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.

Credits

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.

License

MIT © Sylphx

About

Mark — beautiful README images from one URL: banners, badges, typing text, tech icons and GitHub stats cards. Free, no token, no signup.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages