Docs
Two routes. Put your content in the URL, get an image back. The URL is the API.
Text → banner
<img src="https://shrug.pics/b/HELLO">
<img src="https://shrug.pics/b/HELLO.png">
<img src="https://shrug.pics/b/Ship%20it?font=slant&fg=lime">Rendered live on this page:
Params: font = standard | slant | doom | big | small | ansi | shadow (standard/slant/doom/big/small are classic ASCII-art letterforms; ansi/shadow are solid block letters); fg, bg (6-digit hex like %23f97316 or a CSS colour name); size (8–48).
Photo → ASCII
<img src="https://shrug.pics/a?src=https://example.com/cat.jpg">
<img src="https://shrug.pics/a?src=…/cat.jpg&cols=120&color=1">Params: src (required, a public http/https image URL); cols (20–200, output width in characters); color (1 for per-cell colour); invert; size (6–24); fg, bg.
The src fetch is SSRF-guarded — only public http/https hosts; private and loopback addresses are rejected.
Formats
Every route serves four formats — pick by extension:
.svg— default, crisp at any size.pngand.png@2x— rasterized (retina at 2x).txt— the raw characters, for terminals and READMEs
curl https://shrug.pics/b/HELLO.txtCaching
Renders are deterministic, hashed into a weak ETag, and sent with Cache-Control: public, max-age=86400. Same URL → same image → cache hit.