Brandbook · v1.0 · 30.10.2026
One brand for every
screen in the hotel
Logo, color, type, motion and voice for the PMS, ID, Chat, hotel sites and the console. Every app imports the same token file, so a change made here reaches all of them.
- Day and Night themes
- Russian, Kazakh, English
- 1 token file for 5 apps
The idea
Nomero comes from номер, the word guests in Kazakhstan use for a hotel room. The brand draws the hotel the way an architect would: a set of sheets in navy ink on white paper, with one cobalt for whatever matters right now.
Drawn, not decorated
Hairlines instead of shadows. Labels lettered in mono capitals, numbers in mono figures. If an element would not appear on a technical drawing, it needs a reason to be on screen.
One cobalt
Everything is paper and ink except one colour. Cobalt marks the action, the selection and what is happening now, so people learn to follow it.
The plan is the legend
Rooms read like a floor plan everywhere: hatched when booked, solid when a guest is in, dashed when housekeeping or repairs have it.
Talk like a good front desk
Short, specific and polite. Say what happened, then what to do next. Never make the reader guess, and never celebrate routine work.
Каждый номер на своём месте. Брони с сайта, из WhatsApp и с ресепшена ложатся на одну шахматку.
Every room in its place. Bookings from the website, WhatsApp and the front desk land on one room grid.
Logo
A cobalt building with nine windows, six of them lit white to spell a lowercase n. It is one floor of the hotel seen from the street, the same grid as the room chart. The wordmark is Geist SemiBold in navy ink, outlined, so it never depends on a font loading.
Construction
Tile 36, corner radius 9, margin 7, window 6, gap 2. Windows keep a radius of 1. Every edge lands on a whole unit, so the mark stays crisp when scaled to pixels.
Clear space and size
Keep 8 units clear on every side: one window plus one gap, about 13px when the logo is 60px tall.
Below 32px the unlit windows turn to noise, so the favicon drops them and keeps only the lit n.
Versions
Each version belongs to one kind of background. Pick by the surface, never by taste.
Please don't
Recolor the windows. Lit ones are always white.
Light other windows. Only the n is lit.
Stretch, squash or crop the mark.
Recolor the building. It is always cobalt.
- Nomero
Retype the wordmark or capitalize it.
Rotate it or add glow, shadow or gradients.
Product names
One master brand. Each app adds a plain lowercase word in Regular weight and keeps the same mark. No product gets its own symbol or color.
The PMS: room grid, bookings, guests, prices, reports, channel manager and the hotel site builder.
nomero.kzpms-frontSign in and staff access for every app. Often the first screen people see, so it carries the full lockup.
sso.nomero.kzidp-frontGuest conversations from WhatsApp, linked to bookings. Replaces the blue chat bubble in BrandMark.vue.
chat.nomero.kzmessenger-frontEach hotel's own booking site. The hotel's name and photos lead; Nomero signs the footer with the badge below.
{hotel}.nomero.kzbooking-widgetInternal superadmin. Replaces the old Hoteler name and its letter H tile.
dashboard.nomero.kzadmin
On a hotel's own site
Guests book with the hotel, not with us, so Nomero stays small: one badge in the footer, in the hotel's language.
Работает на Nomero
Color
Three colors carry the brand: white paper, navy ink and one cobalt. Paper and ink do the work. Cobalt is the only accent, and it always means the same thing: this is the action, this is selected, this is now.
Paper about 75%Ink about 15%Cobalt about 10%
Ramps
Use roles, not ramp steps. The ramps exist so roles have somewhere to point. Click any step to copy it.
Paper to ink
Cobalt
Roles
What components actually use. Contrast is measured against the page background of each theme, or against the fill a role sits on.
| Role | Day | Night | Use |
|---|
Status
Status marks come from the floor plan legend: squares for rooms, circles for money, always next to a word, so nothing depends on color alone.
Stays on the room grid
The room grid (шахматка) is the screen people look at most. Each stay has one look in both themes and reads without color: booked stays are hatched like reserved rooms on a plan, a guest in the room is solid cobalt, cleaning and repairs are dashed, cancelled stays are struck through.
Sample data. The cobalt line is now, 01:00 on 30 October; today's column is tinted and weekends sit on a sunken fill. Hover or focus a stay for details.
Typography
One family: Geist, with Geist Mono for every number, code and drafting label. It covers Russian, Kazakh and English and ships under the SIL Open Font License. The pitch site sets its headlines in Manrope; the brand does not, because Manrope has no Ә, Ғ, Қ, Ң or Ұ.
Әә Ғғ Ққ Ңң Өө Ұұ Үү Һһ Іі
KZНөмір дайын, кілт ресепшнде.
RUНомер готов, ключ на ресепшене.
ENYour room is ready, the key is at reception.
MONO401 · 14:00 · #4821 · 30.10.2026
Chat and the hotel sites use Manrope today. It has no Ә, Ғ, Қ, Ң or Ұ, so Kazakh names fall back to a system font in the middle of a word. Geist has every Kazakh letter.
Geist has no tenge sign either. The brand ships Nomero Tenge: six tiny fonts drawn from Geist's own T at each weight, loaded only for U+20B8.
85 500 ₸
85 500 ₸
Scale
Sizes come from the Tailwind scale and nothing else. Weights are 400, 500, 600 and 700 for headings; no italics, no black weights.
| Role | Class | Weight | Sample |
|---|---|---|---|
| Display marketing only | text-6xl 60/60 | 700 | Весь отель как на ладони |
| Page title | text-3xl 30/36 | 700 | Шахматка |
| Drafting label Geist Mono | font-mono text-xs caps | 500 | Заезд · 30.10 · 14:00 |
| Section | text-lg 18/28 | 600 | Заезды сегодня |
| Body sites, long text | text-base 16/24 | 400 | Завтрак с 7:00 до 10:30 на первом этаже. |
| Interface | text-sm 14/20 | 400, 500 | Айгерим Жумабаева · 4 ночи · 114 000 ₸ |
| Caption | text-xs 12/16 | 500 | Изменено 30 окт в 01:12 |
| Data Geist Mono | font-mono 14/20 | 400, 500 | 405 · NM4821 · 14:00 |
How we write numbers
| What | Write | Not |
|---|---|---|
| Money | 85 500 ₸ | 85500 тг, ₸85,500, 85.500 KZT |
| Date in a list | 30 окт | 30.10, Oct 30 |
| Date in a document | 30 октября 2026 | 30/10/26 |
| Stay | 29 окт → 2 ноя · 4 ночи | с 29.10.2026 по 02.11.2026 |
| Time | 14:00 | 2 PM, 14.00, 14ч |
| Phone | +7 701 234 56 78 | 87012345678 |
| Room | Номер 405 | №405, комн. 405 |
Thousands take a narrow no break space, and the ₸ sign follows the number after a no break space. Columns of figures use tabular-nums.
Spacing and shape
Twelve spacing steps and four radii. Nothing in between, so screens built by different people still line up.
Spacing
Keys match Tailwind, so p-3 is 12px and gap-6 is 24px.
Radius
note 4, notes, stays, tooltipsfield 12, inputs and menuscard 16, cards, sheets, dialogspill, buttons and chipsNested corners
Applies when a shape sits less than 32px inside another. If the result is 2px or less, leave the inner shape square.
Surfaces
Backgrounds are flat. No gradients, no noise, no frosted glass on content.
Borders go all the way around or not at all. No accent stripe on one side of a card.
Only two shadows exist: the overlay shadow under menus, dialogs and toasts, and the soft cobalt glow under one featured sheet. Everything else is separated by a hairline.
Night surfaces come only from #000000, #131209, #181818, #1F1F1F, #272727 and #313131.
Icons
Phosphor, Regular weight, at 16, 20 or 24px, colored with the text beside them. The Fill weight marks the current item in navigation. One family for Vue and React: @phosphor-icons/vue and @phosphor-icons/react.
- Шахматка
calendar-dots - Номера
bed - Заезд
sign-in - Выезд
sign-out - Гости
users - Ключи
key - Уборка
broom - Ремонт
wrench - Цены
currency-kzt - Счёт
receipt - Отчёты
chart-bar - Чат
chat-circle-text - WhatsApp
whatsapp-logo - Сайт
globe-simple - Уведомления
bell - Настройки
gear-six
Current item
The current item switches to Fill and gets a sunken background. Icons take a status color only inside a status chip, never as decoration. Heroicons in pms-front and Lucide everywhere else are replaced.
Motion
Things settle into place: a quick start and a long, soft landing. One curve and four durations cover every app.
cubic-bezier(0.22, 1, 0.36, 1)
200msColor and opacity on hover and press.300msMenus, tabs, tooltips, popovers.500msDialogs, drawers, anything that changes position.700msScroll reveals on marketing pages only.
Animate transform and opacity only. Never top, left, width or height.
No bounces, no spinners. Loading is a skeleton shaped like the content that is coming.
With reduced motion turned on, movement becomes a plain fade.
The room grid never animates while someone is reading it; only the stay that just changed moves.
Components
The pieces every app shares come from one stylesheet, ui.css. Below is the same markup forced into Day and into Night. Every component, in every state, with copyable markup, is in the UI kit.
Charts
Reports get their own palette, checked for color blindness in both themes. Series take colors in this fixed order and keep them when a filter hides others.
Categories
Adjacent pairs pass the colorblind check (ΔE 10.3 or more) in both themes. Slot 2 falls under 3:1 on Paper, so charts that use it label values directly or offer a table. More than six series: group the rest as Другие.
Occupancy
One hue for magnitude: the fuller the night, the stronger the color. Sample data for a 41 room hotel, 28 September to 25 October.
One y axis per chart. Two measures with different units become two charts.
Labels, values and legends use text colors, never the series color.
Status colors (paid, unpaid, attention) are never reused as series colors.
Voice
We write like an experienced front desk manager: calm, exact, on the guest's side. Russian first; Kazakh and English when a screen is translated.
Say what happened, then what to do. No exclamation marks, no «Упс», no apologies that explain nothing.
Buttons are a verb and an object: «Отменить бронь», never «ОК» or «Да».
Sentence case for headings and buttons. Address people with «вы», lowercase.
No dashes in interface or marketing copy. If a sentence needs one, write two sentences.
Kazakh uses real Kazakh letters, never Latin or Russian lookalikes.
Never name another PMS in public copy. Write «из вашей текущей системы».
Sell the outcome, not the feature count: «своя цена на каждую дату», not «7 типов ограничений».
Before and after
| Don't | Do |
|---|---|
| Ошибка 500 | Не удалось сохранить бронь. Проверьте соединение и сохраните ещё раз. |
| Успешно! | Бронь #4821 сохранена |
| Вы уверены? | Отменить бронь Айгерим Жумабаевой? Гостю придёт сообщение об отмене. |
| Поле обязательно | Укажите телефон гостя, чтобы отправить подтверждение в WhatsApp |
| Нет данных | Сегодня заездов нет. Следующий заезд 31 октября. |
| Переезд с [название конкурента] | Переезд из вашей текущей системы за одну ночь |
Words we don't use
- революционный
- инновационный
- уникальный
- бесшовный
- супер
- effortless
- supercharge
- world class
- cutting edge
Illustration and photography
Illustrations are technical drawings: floor plans with hatched rooms, wiring diagrams, Gantt bars, maps drawn as hatched outlines with crosshair markers. Cobalt lines on the drafting sheet, flat fills, no gradients, no 3D.
Photography
Real hotels in daylight: white walls, clean lines, the building or the room in the frame.
Staff at work, seen from the side. Nobody posing, nobody looking into the lens.
Screenshots sit on plates with crop marks, never floating at an angle.
Проверено
Generating images
Paste these into Higgsfield or any image model and keep the anchors: daylight, white architecture, one cobalt accent, documentary framing, no text. Generate in the Higgsfield app; the connector available to Claude can browse past generations but cannot create new ones.
Exterior of a mid size city hotel in Almaty on a clear morning, white facade with a regular grid of windows, deep blue sky, documentary architectural photo, 35mm, eye level from across the street, no people posing, no signage text, no logos
Small hotel reception in daylight, white walls and pale oak, receptionist working on a laptop seen from the side, calm, documentary, cool white with one cobalt accent, shallow depth of field, no text on screens, no logos
Rollout
Every app imports the same files from this brandbook. No app keeps its own palette, font file or logo.
| App | Today | Change |
|---|---|---|
| idp-front | shadcn neutral defaults, Lucide icons, no logo on the sign in page. | Replace its :root and .dark blocks with the imports below. The smallest change, so it goes first. |
| messenger-front | Manrope (no Kazakh letters), blue primary, a chat bubble as its mark. Already uses the Night surfaces and the brand curve. | Same imports as idp-front, remove Manrope, turn BrandMark.vue into the nomero chat lockup. |
| admin | Still called Hoteler, zinc grays, Inter in its font stack, Next.js sample SVGs in public/. | Rename to nomero console, add the imports, delete the sample files, add the favicon. |
| booking-widget | Manrope and Inter from Google Fonts, its own amber #F2A93B. | Geist from the brand, keep --nm-accent overridable per hotel, add the footer badge. |
| pms-front | Tailwind 3, Inter, Heroicons, about 3,300 raw gray and 1,000 blue classes; its primary color is defined but unused. | Add the preset and the CSS, move the room grid to the stay roles first, then the rest screen by screen. |
| pitch landings | Two versions: night amber (v1) and white with cobalt (v2). v2 is the reference this brand is drawn from. | Swap the 2 by 2 favicon for the n mark and Manrope headlines for Geist. The night version retires. |
Getting the files into an app
Publish
brandbook/as its own repo,hotelerkz/brand, withdist/committed.Add it to each frontend as a git submodule at
brand/, the way backend-v2 already carries the booking widget, and turn on submodules for that app in Dokploy.Import the CSS once in the app entry and remove the app's own color, font and radius definitions.
@import "tailwindcss"; @import "../brand/dist/fonts.css"; @import "../brand/dist/tokens.css"; @import "../brand/dist/tailwind.css"; /* then: bg-bg text-fg bg-action bg-stay-inhouse rounded-control font-mono ease-brand */
// tailwind.config.js
import nomero from './brand/dist/tailwind.preset.cjs'
export default {
presets: [nomero],
content: ['./index.html', './src/**/*.{vue,js}'],
}
/* src/assets/main.css */
@import '../../brand/dist/fonts.css';
@import '../../brand/dist/tokens.css';@import "../brand/dist/fonts.css";
@import "../brand/dist/tokens.css";
body { background: var(--nm-bg); color: var(--nm-text); font-family: var(--nm-font-sans); }
.book { background: var(--nm-action); color: var(--nm-on-action); border-radius: var(--nm-radius-pill); }
/* Night theme: class="dark" or data-theme="dark" on <html> */Why files in a repo, not a brand portal
We looked for brand portals we could run on our own server. Artbucket (AGPL, Postgres plus S3, with an MCP server) is the most complete and could later hold hotel photos and campaign files on our existing MinIO. Nexbrand is too early to rely on. Frontify and zeroheight are hosted services only.
For tokens, logos and rules, a static site built from one JSON file is enough. It needs no database, deploys on Dokploy like the pitch landing, and the same file feeds the apps directly, so the book and the code cannot drift apart.
Files
Every logo as SVG, generated from Geist outlines by tools/logo.py. Copy one straight into code, or download it from the hosted brandbook.
Code
| File | What it holds |
|---|---|
tokens/nomero.tokens.json | The source. Edit this, then run node build.mjs. |
dist/tokens.css | --nm-* variables. Day on :root, Night on .dark or [data-theme="dark"], islands on .nm-day and .nm-night. |
dist/fonts.css | Geist, Geist Mono and Nomero Tenge, including the cyrillic ext subset that holds the Kazakh letters. |
dist/tailwind.css | Tailwind 4 utilities plus shadcn variable names, so existing shadcn components switch over unchanged. |
dist/tailwind.preset.cjs | Tailwind 3 preset with opacity support. |
dist/tokens.json | Resolved values for chart code and scripts. |