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
Six lit windows spell n

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

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-front

  • Sign in and staff access for every app. Often the first screen people see, so it carries the full lockup.

    sso.nomero.kzidp-front

  • Guest conversations from WhatsApp, linked to bookings. Replaces the blue chat bubble in BrandMark.vue.

    chat.nomero.kzmessenger-front

  • Each hotel's own booking site. The hotel's name and photos lead; Nomero signs the footer with the badge below.

    {hotel}.nomero.kzbooking-widget

  • Internal 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.

RoleDayNightUse

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

Why not Manrope

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.

The ₸ sign

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 ₸

Geist with Nomero Tenge

85 500 ₸

Geist alone: the sign falls back to a system font

Scale

Sizes come from the Tailwind scale and nothing else. Weights are 400, 500, 600 and 700 for headings; no italics, no black weights.

RoleClassWeightSample
Display marketing onlytext-6xl 60/60700Весь отель как на ладони
Page titletext-3xl 30/36700Шахматка
Drafting label Geist Monofont-mono text-xs caps500Заезд · 30.10 · 14:00
Sectiontext-lg 18/28600Заезды сегодня
Body sites, long texttext-base 16/24400Завтрак с 7:00 до 10:30 на первом этаже.
Interfacetext-sm 14/20400, 500Айгерим Жумабаева · 4 ночи · 114 000 ₸
Captiontext-xs 12/16500Изменено 30 окт в 01:12
Data Geist Monofont-mono 14/20400, 500405 · NM4821 · 14:00

How we write numbers

WhatWriteNot
Money85 500 ₸85500 тг, ₸85,500, 85.500 KZT
Date in a list30 окт30.10, Oct 30
Date in a document30 октября 202630/10/26
Stay29 окт → 2 ноя · 4 ночис 29.10.2026 по 02.11.2026
Time14:002 PM, 14.00, 14ч
Phone+7 701 234 56 7887012345678
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, tooltips
    field 12, inputs and menus
    card 16, cards, sheets, dialogs
    pill, buttons and chips

    Nested corners

    Inner radius is the outer radius minus the gap: 16 minus 8 gives 8.

    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
    • WhatsAppwhatsapp-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.

    time done

    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.
    Brand curve, 500ms
    Linear, 500ms (don't)
    • 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'tDo
    Ошибка 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

    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

    Reception

    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.

    AppTodayChange
    idp-frontshadcn 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-frontManrope (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.
    adminStill 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-widgetManrope and Inter from Google Fonts, its own amber #F2A93B.Geist from the brand, keep --nm-accent overridable per hotel, add the footer badge.
    pms-frontTailwind 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 landingsTwo 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

    1. Publish brandbook/ as its own repo, hotelerkz/brand, with dist/ committed.

    2. 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.

    3. Import the CSS once in the app entry and remove the app's own color, font and radius definitions.

    Tailwind 4: idp-front, messenger-front, admin
    @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 3: pms-front
    // 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';
    Plain CSS: booking-widget, landings
    @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

    FileWhat it holds
    tokens/nomero.tokens.jsonThe 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.cssGeist, Geist Mono and Nomero Tenge, including the cyrillic ext subset that holds the Kazakh letters.
    dist/tailwind.cssTailwind 4 utilities plus shadcn variable names, so existing shadcn components switch over unchanged.
    dist/tailwind.preset.cjsTailwind 3 preset with opacity support.
    dist/tokens.jsonResolved values for chart code and scripts.