labelito
labelito
lah-beh-LEE-toh · /la.beˈli.to/ · Spanish for “little label”
brand guidelines · v1.0

POST a label.
Peel it off.

The visual system for a small, self-hosted print service that turns a YAML file and an HTTP request into a real label — in under a second.

self-hosted containerized Brother QL FastAPI
01 / brand story

Homelab-grade tooling that respects your time.

labelito is for the tinkerer who runs their own stack. It does one thing — print labels on a Brother QL — and does it cleanly: declarative templates, a live preview, a tidy HTTP API. No cloud account, no app store, no lock-in. The brand should feel the same way it works: precise, unfussy, and quietly friendly.

// one line
The elevator pitch

"Self-hosted, declarative label printing for Brother QL printers — a YAML template and one HTTP call away from a printed label."

// who it's for
The audience

Homelabbers, Home Assistant users, makers, and small teams automating physical labels — freezer bags, cables, asset tags, shelves.

// the feeling
The vibe

A well-labeled workshop. Everything in its place, nothing precious. Confident but never corporate.

Declarative, not clicky

A label is data. Define it once, print it forever.

Fail closed, speak plainly

Safe defaults, honest errors, no phantom success.

Yours to run

On your hardware, your network, your terms.

Small on purpose

Does one thing well; refuses to sprawl.

03 / color

Palette & tokens

Two brand hues pulled straight from the mark — a bright sticker blue and a peel green — over a cool slate neutral ramp. Blue leads; green is the accent that signals success and "done".

Brand
Sticker Blue
--blue · #0478ED
Blue Light
--blue-light · #4FA3F5
Blue Deep
--blue-deep · #0159B0
Peel Green
--green · #12A050
Green Light
--green-light · #54BD82
Neutrals — slate ramp
--bg
#0B1220
--panel
#111A2B
--line
#223047
--ink-3
#8A94A6
--ink-2
#B4BECD
--ink
#F4F7FB
Semantic / status
Success · printed ✓
--green · #12A050
Info · preview / links
--blue · #0478ED
Warning · media mismatch
--amber · #F5A524
Error · print failed
--red · #F0506E
Copy-ready tokens
:root {
  --blue:       #0478ED;
  --blue-light: #4FA3F5;
  --blue-deep:  #0159B0;
  --green:      #12A050;
  --green-light:#54BD82;
  --bg:         #0B1220;
  --panel:      #111A2B;
  --line:       #223047;
  --ink:        #F4F7FB;
  --amber:      #F5A524;
  --red:        #F0506E;
}
04 / type

Typography

Two typefaces, clear jobs. Inter carries every interface and headline. JetBrains Mono carries anything that is code, data, or a machine talking — commands, tokens, hex, kickers, timestamps.

Aa
Inter
UI · headings · body · 400 / 500 / 700 / 800
The quick brown fox jumps over 13 lazy dogs.
Aa
JetBrains Mono
code · data · labels · 400 / 500 / 700
POST /print {"template":"freezer"}
DisplayInter 800 · 76px · -4% · 1.0
Heading 1Inter 800 · 44px · -3% · 1.08
Heading 2Inter 700 · 28px · 1.2
Body large — the readable lead paragraph.Inter 400 · 20px · 1.55
Body — default running text for descriptions and cards.Inter 400 · 15px · 1.6
Mono Kicker / CaptionJB Mono 500 · 12px · +14% · caps
05 / iconography

Icons that survive a label

labelito prints at 300 dpi in pure black-on-white, so its icons are bold, solid, single-weight glyphs — legible at 12 mm. They come from three bundled collections; no bespoke drawing. In the UI they sit on blue; on a label they render 1-bit.

Font Awesome
collection: fontawesome
solid / regular / brands
Material Symbols
collection: material
Apache 2.0
Octicons
collection: octicons
MIT
in the UI — solid, on blue
on a label — 1-bit black on white
✓ solid weight, high contrast ✓ one icon per label, aligned ✗ no thin outlines below 24px ✗ no multi-color glyphs
06 / voice & tone

How labelito talks

Like a helpful maintainer in a good README: direct, concrete, a little dry. It assumes you're capable, skips the marketing, and always tells you what actually happened.

Plain

Short words, real nouns. "Print", not "initiate a print job".

Precise

Name the media, the endpoint, the code. Numbers over adjectives.

Honest

Say when something failed and why. Never fake success.

Warm

A dry aside is fine. Condescension never is.

✓ say this
"Printed on QL-810W in 0.4s."
"Loaded roll is 62mm continuous — this template needs 62×29 die-cut."
"Drop a .yaml in templates/ and hot-reload — no restart."
✗ not this
"Your print job has been submitted successfully!"
"Oops! Something went wrong. Please try again later."
"Unlock powerful, seamless labeling solutions today."
07 / product

In the interface & on the roll

The web UI is a calm control surface: pick a template, fill the fields, watch the live preview, print. The label itself is the real product — high-contrast, content-driven, dated automatically.

labelito · localhost:8765
Template
freezer-icon ▾
Title
Bolognese sauce
62mm continuous loaded · match
Print label
Live preview
Bolognese sauce
Frozen: 01/07/2026
  Freezer
Chicken stock
best before 01/01/2027
Rack · A3
SW-CORE-02
Storage box 14
winter gear · attic
08 / code & cli

Code & CLI style

Code is a first-class brand surface. Terminals and snippets always use JetBrains Mono, a green $ prompt, blue strings, and a green → ✓ for results. Keep examples runnable and short.

terminal
$ curl -X POST localhost:8765/print \
    -d '{"template":"freezer-icon",
         "fields":{"title":"Bolognese"}}'

→ rendered + printed on QL-810W ✓ 0.4s
templates/62-freezer-icon.yaml
name: freezer-icon
label: "62"
layout:
  - {type: icon,  name: snowflake}
  - {type: title, text: "{{title}}"}
  - {type: text,  text: "[[frozen]]: {{date}}"}
prompt = $ strings = blue result = → ✓ comments = // muted