Icons & titles
What happens when you paste a link
monoki's server fetches the page once and reads two things out of it: a name for the tile, and the best icon it can find.
This happens server-side rather than in your browser, and both halves of that matter. Apps on private addresses are reachable from your server but not from a public favicon service; and because the icon bytes are then stored and served by monoki itself, opening your board makes zero third-party requests. No favicon service learns which apps you run.
Choosing the name
In order of preference:
<meta property="og:site_name"><meta name="application-name"><meta property="og:title"><title>— and if that runs long, the part before the first|,—,–or-- the hostname, with a leading
www.removed
A tile caption wants "Grafana", not "Grafana — Kubernetes / Compute Resources / Namespace (Workloads)". That is why the site's own name for itself outranks the current page's title, and why long titles get cut at their separator.
The name is always yours to change afterwards, and monoki will not overwrite a name you typed.
Choosing the icon
monoki collects every <link rel="icon">, rel="shortcut icon">,
rel="apple-touch-icon"> and rel="apple-touch-icon-precomposed">, resolves
each href against the page's real URL, and ranks them.
The grid draws icons at about 64 CSS pixels, so the target is 128px for a
2× display. Ranking prefers the smallest candidate at or above that — an exact
fit beats downloading a 512px image only to shrink it — and falls back to the
largest below it. Ties break by format: SVG, then PNG, WebP, JPEG, GIF, and
.ico last, since .ico is usually 16×16 and often a multi-image container.
An SVG is treated as a perfect fit at any size, because it is one.
rel="mask-icon" is deliberately ignored: it is Safari's monochrome pinned-tab
glyph and renders as a solid black blob on a tile.
If a page declares nothing, monoki tries /favicon.ico at the site's origin.
An icon that fails to download never fails the whole lookup — you still get the name.
When there is no icon
You get a letter tile: the first character of the name, on a coloured wash picked by hashing the hostname. The same site always gets the same colour, and the colours come from a fixed set of eight that belong to the palette, so the fallbacks look like part of the system rather than like something broke.
Plates
Favicons are wildly inconsistent, and the single biggest problem is logos drawn in one colour on a transparent background. A white logo disappears on a light plate; a black one (GitHub's, for instance) disappears on a dark plate.
So each tile has a plate setting:
- Plain — follows your theme. The default.
- Light — a fixed off-white plate in both themes. Use it for dark logos.
- Dark — a fixed graphite plate in both themes. Use it for light logos.
Three named choices, not a colour picker, so a board cannot go rainbow by accident.
Replacing an icon by hand
If extraction picks something ugly, open the tile's menu and choose Edit. An icon you set by hand is marked as such, and Re-read the page will not overwrite it.
Re-reading a page
The tile menu's Re-read the page fetches everything again. It updates the name only when you ask it to, because silently replacing a caption you wrote by hand is a destructive surprise.
There is no background refresh job. A self-hosted tool that periodically fans out HTTP requests to every host you have ever bookmarked, unasked, is a surprising thing to run.
Limits
- Icons are capped at 256 KiB (
MONOKI_MAX_ICON_BYTES). Anything larger is rejected rather than truncated — half a PNG is worse than no PNG. - Accepted types are PNG, JPEG, GIF, WebP, SVG and ICO. The declared type is
checked against the actual bytes, so a server claiming
image/pngfor a shell script gets nothing stored. - SVGs are served back under a
default-src 'none'; sandboxpolicy withnosniff, and the UI only ever renders them through an<img>tag. - Whole-page HTML is read up to 512 KiB, and parsing stops at
</head>.