Design system

Plume

A quiet, paper-white early-Macintosh desktop that comes alive. The canvas stays calm — mono neutrals, crisp type, 1px hairlines — so the personality can be loud: one warm terracotta accent and a cast of pixel birds. Restraint in color and type; energy in character.

Everything below is in service today — on the marketing site and inside the account dashboard. Nothing here is aspirational, and nothing in either surface is missing from this page.

Foundations

Color

Neutrals cover ~90% of every screen. Terracotta is a single pop per section — a primary CTA, the active nav link, a key highlight, or a bird's beak and feet. Sage, amber and brick are states, never decoration: they appear only to report success, a quota running out, or something destructive.

Paper
#F8F6F1
The page itself.
Surface
#FFFFFF
Cards, windows, raised things.
Sunk
#EFEBE2
Recessed wells, icon mats, code chips.
Ink
#1A1813
Primary text & pixel outlines.
Ink-2
#55514A
Body copy.
Ink-3
#8A857A
Muted labels, captions.
Hairline
#E2DDD2
Divider lines.
Border
#CFC8B8
1px component borders.
Accent · fill
#E0915E
Fills only — buttons, active states, beak/feet.
Accent · text
#A85731
Links & accent text (AA on paper).
On-accent
#2A1A10
Ink placed on a terracotta fill.
Success · sage
#8FAA8B
Saved, paid, delivered. Not a 2nd accent.
Warn · amber
#C98A2E
The usage meter from 80% of quota.
Danger · brick
#B4443C
Over quota, errors, delete. No true red.
On-danger
#FFF6F0
Text on a brick fill.
Phosphor · paper
#141210
Dark-mode page. Accent stays terracotta.
Phosphor · surface
#1E1B16
Dark-mode cards & windows.
Phosphor · ink
#F2ECDD
Dark-mode text.
Phosphor · accent
#E8A06F
Terracotta, with a faint glow.
Phosphor · danger
#E2726A
Brick lifted to clear AA on phosphor.
Foundations

Type

Pixel display, clean body. The pixel fonts carry the personality; the body font carries the reading. Never set body copy in a pixel font. Scale: H1 44–52 / H2 28–32 / H3 18–20 / eyebrow 11 (tracked caps) / lede 19 / body 16·1.6 / small 13.

DisplayPixelify Sans
Every group chat, fluent.

Headings and display. A legible pixel face — characterful, not blocky.

Micro-labelsSilkscreen
Smart translation · v2 capabilities

Eyebrows, badges, pills, buttons, and the logo wordmark. Used small and tracked.

BodyKarla
PlumiBot reads the room for context, keeps replies clean, and lets everyone just talk — a calm, humanist grotesque that stays comfortable at paragraph length.

All running copy. Chosen for warmth and readability.

CodeJetBrains Mono
!digest 3h   ·   !login   ·   NT$0

Commands, code chips, balances and pixel numerals in stats.

Iconography

The pixel-bird cast

Instead of generic glyphs, each capability has its own bird — a small guide drawn on one shared front-facing template so the flock reads as a family. They share the ink outline; identity comes from color and one bold feature. The original carrier pigeon stays the sole brand logo; these are its guides. All seven double as the profile picture a signed-in visitor can pick in Settings. Every sprite is downloadable as a 256px transparent PNG.

Swallow

126 languages · global teams · pills

The barn swallow crosses continents — it carries the promise of global reach.

↓ plumi-swallow.png

Dove

clarity & context · couples & families

Olive sprig in its beak — for clarity, context, and the people who love across languages.

↓ plumi-dove.png

Canary

voice → text

The songbird, mid-note — voice notes transcribed and translated.

↓ plumi-canary.png

Owl

image OCR · learners & travelers

Spectacled and studious — it reads menus, signs and documents, and helps you learn.

↓ plumi-owl.png

Parrot

mini-games

Loud, colorful and playful — the face of Word Chain and Translation Duel.

↓ plumi-parrot.png

Magpie

stats & referrals · dashboard

A collector of shiny things — it keeps the tallies, leaderboards and referral counts.

↓ plumi-magpie.png

Plume

summaries · digests · account home

The namesake feather — a quill for summaries and the on-demand digest. It is the brand's glyph.

↓ plumi-feather.png
Iconography

Glyphs & marks

Every icon on both surfaces is drawn by the same engine: an empty span.px that plumibot-pixel.js fills with 1-bit cells. data-art names the sprite; data-cell is the pixel size in CSS px, which is how sprites drawn on different grids end up optically the same size. There are no icon fonts, no SVG icon set and no emoji.

In use

Interface glyphs

Eight non-bird sprites carry the interface: buttons, the account tab bar, and the outcome screens after a payment.

chat
command
bolt
arrow
disk
cassette
face
star
In use

Social marks

Ten platform marks, redrawn on the same 1-bit grid so a third-party logo never breaks the page's own language. Every one renders in the footer — including platforms with no account yet, because a stated absence reads as a decision and an impersonator can't look official.

soc-x
soc-instagram
soc-threads
soc-facebook
soc-youtube
soc-tiktok
soc-github
soc-linkedin
soc-discord
soc-reddit
Building blocks

Components

Sharp UI, rounded windows: 2px on chips and inputs, 4px on buttons and cards, and 1px hairlines on everything — except the signature Mac window, which rounds to 9px. Shadows are hard offsets with no blur; anything you can press depresses to a flush 0,0 on click.

Components

Actions

Buttons

.btn · --primary --ghost --danger --sm --lg --block · :disabled

Terracotta fill for the one primary action; ghost (no border, no shadow) for everything secondary; brick only where something is destroyed. Block is the phone default — the account area stacks full-width buttons.

Icon button & mode switch
Light Dark Auto

.iconbtn (.mode-btn--dark .mode-btn--light · .nav-burger > i) · .mode-row > .mode-opt.is-active

One 44×40 square control, used three times: crescent, sun and phone burger. The two mode buttons are both really in the page and CSS hides whichever one agrees with the palette on screen, so the icon cannot lie and the link still works with JavaScript off — here both are shown at once. The segmented row is the three-state version used in the footer and in Settings; the active segment lifts onto surface.

Components

Labels & chips

Badges & pills
New Active 126 languages

.badge · .badge--quiet · .pill

Badges are Silkscreen caps in a terracotta wash — quiet is the same shape drained of color, for facts that carry no emphasis. Pills are mono and rounded, and a bird can ride one for warmth.

Plan chips
Personal Pro Group Pro Free

.plan-chip · .plan-chip--sm

What plan you are on, stated next to your name or a group's. The small size rides inside a list row, where it sits beside the group name rather than above it.

Commands & micro-labels
!digest 3h !login Appearance © 2026 PlumiBot · v2.29.7

.cmd-inline · .kbd · .tag-os · .mono

Every bot command is a sunk mono chip, in prose as well as in lists — a command should look typed wherever it appears. .kbd labels a control, .tag-os is the mono system-tag voice used for version and copyright lines.

ID box
U4af4980629a1b2c3d4e5f60718293a4b

.idbox

A long identifier you are meant to copy, not read: mono, sunk, breaks anywhere, and selects whole on one click.

Components

Containers

Cards
Hover card

Lifts 2px toward the light on hover.

Sunk card

Recessed, no shadow — a well, not a tile.

Feature card

A 72px sunk mat holds the bird above the heading.

.card · .card--hover · .card--sunk · .feat > .ic

The default surface for anything that isn't a window. Only interactive cards get --hover; a card that lifts but does nothing is a lie.

Mac window
this month

The signature frame: striped title bar, one pixel dot, ~9px top radius. Every panel in the dashboard is one of these.

.win > .win-bar (.win-dot .win-title .win-stripes) + .win-body

Windows group; cards list. If a block has a name worth putting in a title bar, it is a window — the dashboard is a stack of them.

Notices
You're browsing with quick access. To manage billing, sign in via !login in LINE.
Saved. Your choice applies from now on.
That amount is outside the top-up range.

.notice · .notice--ok · .notice--err

A sunk block with a 3px left rule — neutral by default, sage when something worked, brick when it didn't. The rule is the only colored part, so a page of notices never shouts.

Danger window
danger zone
  • cancels your subscription immediately;
  • erases your stored names and preferences.

.win.danger · .danger-list · .btn--danger

The one place brick is allowed to tint chrome. It sits last on the page, behind a disclosure, and asks you to type the word before the button does anything.

Section scaffolding
Rules of thumb

A section head

Eyebrow, heading, one line of lede — the opening of every section on the site.


or

.section (--sunk) > .wrap > .section-head (--center) > .eyebrow · .divider · .acct-or

Every band on the site is a .section holding one .wrap; the sunk variant alternates the background so neighbouring bands separate without a border. The eyebrow's terracotta tick is the smallest unit of accent on the site, and the or-rule separates two ways of doing the same thing, like the two sign-in routes.

Elevation & shape
sm · 2px
md · 4px
lg · 4px
win · 9px

--shadow-sm/md/lg/win · --r-sm/md/win · --bw 1px · --bw-strong 1.5px

Three hard offsets at rest, hover and open — no blur, because the light is a desk lamp. Only the Mac window uses a soft ambient shadow, and it is the only 9px corner in the system.

Components

Forms

Fields

.field > .label + .input / .select / .textarea · .form-row · :disabled

Inputs sit on paper inside a 1.5px border and take a terracotta focus ring. They never drop below 16px: iOS zooms the whole page on a smaller focused field.

Checkbox rows

Keeps you signed in and remembers the choice you make right here.

Remembers the language and the light or dark setting you picked.

.ck-row > input + div (.ck-name .ck-desc) · .ck-actions

A hand-drawn 24px box, checked in terracotta, sunk and uncheckable when the choice isn't yours to make. Allow and Reject are deliberately the same button: a quieter refusal is the dark pattern that invalidates the consent.

Avatar picker
Choose a profile bird

.avatar-pick > .avatar-opt (.is-selected) > .px + .avatar-name · .avatar-none

Radio buttons wearing the cast. The real input is screen-reader-only, so the tile itself is the control — selection is a terracotta border and wash, and the whole fieldset disables together for quick-access visitors. The greeting badge on account home is the same sprite in .acct-avatar.

Components

Data

Stat tiles
128Today
1,9047 days
6,231This month
54,780All time

.tiles > .tile > .tile-num + .tile-label

Four counts, two-up on a phone. The number is display type, the label Silkscreen — the number is the content and the label is furniture.

Scoreboard
126
languages
V2
voice & image
LINE
native
24/7
always on

.scoreboard > .score > .n + .l

The marketing sibling of the tiles: one sunk slab divided by hairlines, terracotta numerals, no card shadows. Facts about the product, not about you.

Usage meter
4,200 / 10,000 tokens42%
8,600 / 10,000 tokens86%
10,000 / 10,000 tokens100%

.meter (--warn --over --mini) > .meter-track > .meter-fill · .meter-row

Barber-striped terracotta in a sunk pill. It turns amber at 80% of quota and brick at 100% — the only automatic color change in the system. Mini is the trackless version inside a group row.

7-day bars
Mon
Tue
Wed
Thu
Fri
Sat
Sun

.bars > .bar > .bar-col > .bar-fill · .bar-label

Server-rendered heights, no charting library and no JavaScript. Scanlined fill so it reads as a CRT plot rather than a corporate bar chart.

Balance & top-up presets
NT$248 ≈ 12,400 messages left
NT$100≈ US$3.10≈ 5,000 msgs NT$300≈ US$9.30≈ 15,000 msgs NT$1,000≈ US$31.00≈ 50,000 msgs
NT$

.acct-balance(-num) · .acct-presets > .acct-preset (.acct-preset-amt .acct-preset-local) · .acct-custom(-row -cur)

Presets are buttons shaped like denominations — they press like a button because they are one. Every NT$ figure carries a live equivalent in the visitor's own currency, except where the visitor already thinks in NT$.

Tables
Rule of thumbToken cost
Text translation~350
Voice transcription~500
Image OCR~1,500
FeatureFreePersonal ProGroup Pro
Text translation
Voice transcription
Image OCR

.tbl-scroll > .tbl (.cmp) · th/td · .c · td.mono · .yes · .no

Silkscreen headers, hairline rows, numbers right-aligned and mono. On a phone the scroller goes full-bleed and fades at the right edge, so it's visible there is more to swipe to.

List rows
rows
Personal Pro

NT$149 · 10,000 messages/month, everywhere you chat.

Design team Group Pro You pay 21,300 / 30,000 tokens (71%)
Top-up · Aug 14, 2026
+NT$300
Usage · Aug 15, 2026
−NT$52

.acct-planrow · .acct-grouprow > .acct-grouprow-main · .tx > .tx-amt (--plus)

Three hairline-separated row types inside a window: an offer with an action on the right, a tappable group with its own mini meter, and a money line where credit is the only entry that gets terracotta.

Pricing plan
Free Start here
NT$0 / month
 
105,000 tokens / mo
≈ 300 messages
  • Text translation, games and digest
Pay as you go Flexible
NT$0.02 / message
 
Flat per message
No monthly commitment
  • Everything — voice, images, link reading
Personal Pro Solo
NT$149 / month
≈ US$4.60
4M tokens / mo
≈ 11,000 text messages
  • Everything — voice, images, link reading

.pricing (--4) > .plan (.plan--featured) > .plan-name + .badge · .plan-price > .per · .plan-local · .plan-tokens · .plan-approx · .plan-feats

Six stacked lines in a fixed order, so four cards line up across even when a plan has nothing to say on one of them — the free plan keeps an empty .plan-local rather than closing the gap. Square terracotta bullets instead of ticks, one featured plan carrying the accent border, and on a phone the grid becomes a column with the featured plan reordered to the top.

Components

Navigation & disclosure

Account tabs

.acct-tabbar--bottom / --top > .acct-tab (.is-active)

The same four tabs in two bodies: fixed to the bottom of a phone, folded into the header from 860px up. Only one is ever on screen. The tab you are on is the big one — inactive sprites dim and shrink, so the icon rendering on whole pixels is the one you're looking at.

Disclosure
How do I add PlumiBot to my group?
Tap “Add on LINE” anywhere on this site, then invite it into any group like you would any LINE friend.
Does it work in a DM, or only in groups?
Both. Change a chat's languages with !lang add <code>.
Show account details

The quieter variant used inside dashboard windows — a Silkscreen caps summary with no plus box.

.qa > summary + .ans · .acct-details > summary

Real <details>, so it works with JavaScript off and is findable by in-page search. The plus square flips to a terracotta minus when open.

Language options
ENEnglish ZH繁體中文 JA日本語 TRTürkçesoon

The bot speaks far more languages than the site does — this picker only changes the pages.

.lang-opt (.is-active) > .lang-code + .lang-name + .lang-soon · .lang-note · .lang-panel · .lang-settings

No flags — this site draws in 1-bit pixel art, and a two-letter code says the same thing without claiming a language belongs to a country. Rows are 44px minimum. The same rows sit behind the nav dropdown and laid flat in Settings.

Numbered steps
1

Add PlumiBot on LINE. Tap the button and say hi.

2

Type !login in the chat. It hands back a link to this dashboard.

.tut-num · .acct-step · .tut-step > .tut-text

A terracotta Silkscreen square, 32px. On the marketing tutorial it sits above the copy beside a phone mock; in the account area the same numeral runs down a hairline-separated list.

QR tile
QR code to add PlumiBot on LINE

.qr > .qr-tile > img

The one element that must not follow the palette: its mat is a literal #EFEBE2 in both modes, because a QR inverted to light-on-dark does not decode.

Rules of thumb

Principles