---
title: "Rules: how OpenVibe decides · OpenVibe.Design"
canonical: "https://openvibe.design/rules"
updated: null
---

# Rules: how OpenVibe decides · OpenVibe.Design

HTML: [Rules: how OpenVibe decides · OpenVibe.Design](https://openvibe.design/rules)

Rules

# How OpenVibe decides.

Every style, design and organization decision behind OpenVibe, one sentence each, with the day it was made and what went wrong without it. [Patterns](/patterns) show how a rule looks in a page; this says what the rule is and why.

- rules: 168
- areas: 11
- last decided: 13 Nov 2026

Rules The register [The system map](/system)

## Decided lately

The newest rules first; each links to its place below.

1. [13 Nov 2026 **A room's summary reads its public messages, minus people who turned AI off; a summary of a person needs their yes.**](#a-room-reads-its-room)
2. [13 Nov 2026 **An AI line about a room says its vibe first, then the specifics, never counts; an old one steps aside.**](#ai-lines-lead-with-the-vibe)
3. [13 Nov 2026 **What a message answers, quotes or changes is a part of the box, and Send is quiet until there is something to send.**](#context-lives-in-the-box)
4. [13 Nov 2026 **Working, the mark is still the logo: its own ring with a bright arc running round it.**](#the-wait-keeps-the-logo)
5. [13 Nov 2026 **A glyph sits inside its tile with room around it, and every tab's glyph fills the same box.**](#glyphs-sit-in-their-tiles)

## Honest pages 16

What a page shows is true, counted and sourced.

### [1Never show content that is not real.](#no-fake-content)

31 Oct 2026 

No sample rows, invented counts, filler testimonials or "coming soon" sections dressed as content. An empty place says it is empty and offers one way forward.

Why Placeholder sections and invented numbers made pages look full and told people nothing.

See [One-line empty states](/patterns/empty-state)

### [2An icon name is checked against the set that draws it.](#two-icon-sets)

10 Nov 2026 

There are two sets: a site’s own mark (live, chat, quest: drawn in the page) and the glyphs (wrench, heart, camera: drawn as SVG). A name from one written as the other draws the fallback mark, a bare "V". A page’s checks fail when it asks for a mark that does not exist.

Why Most of Quest’s icons were a "V": glyph names written as site marks, and the check looked at the wrong list.

See [Icons](/icons)

### [4Calm makes motion smaller and slower. Only Off removes it.](#calm-reduces-off-removes)

10 Nov 2026 

Motion has four settings: Automatic (follows the device), Full, Calm and Off. Under Calm, and on a device that asks for less motion, every effect still plays: a third of the distance, no overshoot, endless loops at 0.6 of their speed. A page never stops an effect because motion is reduced; a rule that stops one belongs to Off (html\[data-ov-motion=off\]). A distance of 24px or more is multiplied by --ov-move. Only what starts by itself and fills the view (a video, a carousel) still waits for a tap under Calm.

Why Reduced motion gave every animation no length at all, so Calm pages looked broken: the owner asked for motion reduced, not removed.

See [Motion](/motion) [Your look](/look) Checked by openvibe-shared test: motion-setting

### [15A number counts exactly what its label says.](#count-what-it-says)

1 Nov 2026 

A count next to a list equals the length of that list. "4 agents working now" must count agents at work, not the agent catalogue.

Why A home page counted its catalogue as "working now".

Checked by site sweep: count checks

### [16A missing number is left out or said in words, never shown or sorted as zero.](#missing-is-not-zero)

9 Nov 2026 

When a source did not report a value, the page says "No traffic yet" or "Not measured", and sorting and picks skip it. In code, null must not become 0.

Why A model with no measured speed was named "Fastest" because null had become 0 ms.

See [A missing number is not zero](/patterns/missing-not-zero) [Open stats](https://openvibe.network/stats) Checked by Report test: picks use measured values

### [17Every number names its source, its date and how much it rests on.](#number-has-source)

9 Nov 2026 

A rating says how many games; a price says whose page and when it was checked; a speed says it is from real traffic over seven days. One tap shows it.

Why Comparison pages showed numbers nobody could check.

See [A number names its source](/patterns/number-names-source)

### [18A starting value is not a result.](#not-a-rating-yet)

9 Nov 2026 

A model with no votes shows "Not rated yet", not the 1000 every entrant starts at. The same goes for any score with no samples behind it.

Why The leaderboard rated models at 1000 on boards that said "No votes yet".

See [A starting value is not a result](/patterns/not-rated-yet)

### [19A column or section appears when something fills it.](#columns-earn-their-place)

9 Nov 2026 

A table shows a column only when some row has a value for it; a section with nothing in it is not drawn. When everything is missing, one plain line says why and what would fill it.

Why Twelve columns of "Not measured yet" buried the three numbers that were real.

See [A column earns its place](/patterns/column-earns-place)

### [20Status is a word, never colour alone.](#state-in-words)

30 Oct 2026 

A dot or colour helps the eye; the word carries the meaning for everyone.

Why Colour alone made live, done and failed look alike.

See [Status badges](/patterns/status-badges) [Status is a dot and a word](/patterns/status-dot)

### [21When the data cannot separate two things, they share a rank.](#bands-not-false-ranks)

9 Nov 2026 

Ranks come with their uncertainty: overlapping intervals share a band ("1–3"), and a tie is shown as a tie.

Why A rank order implied differences the votes could not support.

### [136A pack, a set or a playlist shows what is in it.](#groups-show-their-members)

12 Nov 2026 

A group's card shows its first few members and how many more there are ("+4 more"); its page shows every member, each one opening on its own. A group is never drawn as its first member alone: that says one thing where there are eight. When a member's name is already written on it (a "Look up" button), the tile does not print the name again.

Why The Elements gallery drew the eight-control LOOI pack as one "Look up" button, on its card and on its page.

### [140A list of changes reads as rows with their marks, never as one run of text.](#changes-read-as-rows)

12 Nov 2026 

What changed (coins earned, things bought, quests done) shows one row per kind: its mark in a tile, a short summary ("Quests done ×10"), when, and the amount in its currency's colour. Repeats are counted, not repeated; every single change is one tap away in a fold, each with its own amount. Money and amounts keep the network's number style (a thin space between thousands, "+161k" when large, the full figure in the title).

Why The owner, a phone screenshot of the wallet marked "UGLY": What changed read "for the quest Publish a video · for the quest Share a picture · …" as one paragraph beside "+161k".

Checked by openvibe-shared test: wallet-chrome openvibe-shared test: purse-catchup-chrome

### [141An empty part says what will be there, with its mark, in a small card.](#empty-says-what-comes)

12 Nov 2026 

When a section has nothing yet (no store items, no activity, nothing collected), it shows its mark, one line saying what will appear, and one quieter line saying how; never a bare heading over a grey sentence, and never an empty box.

Why The wallet's Store showed a heading and "New items will appear here after review." in grey, marked "UGLY" by the owner.

Checked by openvibe-shared test: wallet-chrome

### [151A burst of the same thing is one card, counted whole, and no card shows twice.](#a-burst-is-one-card)

12 Nov 2026 

When a source delivers many items at once with no person behind them (a Deals poll, a News import, new jobs), the feed shows one card per site and hour, counted from the whole burst and named by its site, never "System"; a page that ends inside a burst moves past it, and a list never draws a card it already shows. Words are words: a source's Markdown is read as plain text and its first picture as the card's picture, from an address that loads.

Why The owner, 11-12, marking the menu's Feed: "spam" over three "112 new deals" cards, and "broke" over a post printed as Markdown and a picture that did not load.

Checked by OpenVibe.Network test: feed

### [157A service restarting on purpose says so, and nothing latches for it.](#a-planned-restart-is-not-a-loss)

12 Nov 2026 

When Bot restarts for a deploy it closes every link with 1012 and waits for the replies, Link stops a robot's plugins with the cause link\_restart (not link\_lost), and a driver stops its motors without latching a stop of its own that a person would have to clear by hand. Every close is logged with its code and reason, or as a drop with no close frame.

Why Maticus, 11-12: every Bot deploy meant Clear STOP, ARM and Go Live by hand on LOOI, and the logs did not say why the link closed.

Checked by OpenVibe.Link test: TestServerRestartStopsWithLinkRestart OpenVibe.Bot test: restart-close

### [159Every number is drawn by ov-metrics, and a number nobody measured is a dash.](#numbers-drawn-once)

12 Nov 2026 

Report, Exchange, Compare and the admin panel draw AI and usage numbers with openvibe-shared/ov-metrics.js (tiles, a trend line, ranked bars, percentiles, a split, a sortable table) and say them in its words: 540 ms, $0.0042, 86.0 tok/s, 99.4%. A percentile is the median and the 95th on one scale, with how many calls it rests on. Unknown is a dash, never 0, and a delta says in words whether it got better.

Why The owner asked for tokens, caching, model, time and cost per task, tokens per second and time to first token on Report, Compare and Exchange, with the designs reused through openvibe.design. Three sites drawing their own charts would show one number three ways.

See [Metrics](/components/metrics) Checked by openvibe-shared test: ov-metrics-chrome OpenVibe.Design test: changes

## Length without hiding 8

Pages get shorter by arranging, never by removing.

### [7A fold shows its first two and fades.](#a-fold-shows-its-first)

10 Nov 2026 

A list shortened on a phone shows its first two items whole and fades into the third, with one button under it that says how many there are, opens the rest and closes them again. A closed fold that shows only a heading and a count does not read as something to open, and what is in it cannot be seen. Every item stays in the page.

Why Community’s Questions was a heading and "6 questions": the owner did not see that it opened, or a single question.

See [Patterns](/patterns) Checked by OpenVibe.Community test: home-short

### [22Shorten a page by arranging it, never by removing content.](#never-hide-content)

11 Nov 2026 

No "newest only" cuts and nothing left out of the page's HTML. Use sideways rails, "More (N)" pagers, folds that show their count, and on a phone sections as tabs (next rule): every section stays in the HTML, each tab says its count.

Why Pages made shorter lost their videos and clips; every cut had to be put back (10-31). The owner, 11-11: "consolidate these into tabs, self-contained tabs, so the page isn't so freaking huge … at least on mobile", with the HTML kept whole for search and AI crawlers.

See [One card that is also a row](/patterns/card-or-row)

### [23On a phone, a page of sections is tabs; a wide screen shows them all.](#tabs-for-settings)

11 Nov 2026 

At 900 px or narrower (600 on a front page) a page of sections shows one at a time: the tab strip names each with its count, the tab says what the section is so its own heading steps aside, a section loads the first time it is opened, and the choice works with no script where it can (radios). Every section is in the page's HTML. Settings pages keep server-rendered tabs, each with its own address.

Why Content in tabs was content people never found (10-31), so the tabs now carry counts and the HTML carries everything; the owner, 11-11, on a channel's page of sections: "self-contained tabs".

See [Tabs, not folds](/patterns/tabs-not-folds)

### [24A front page is a taste and a door: about six phone screens.](#taste-and-door)

29 Oct 2026 

Two hero actions, figures as one strip, cards as sideways rows, explainers in one fold, and no closing call that repeats the hero.

Why Homes ran to fifteen screens on a phone.

### [25Do not keep a section whose only content is that it has none.](#placeholders-are-not-sections)

9 Nov 2026 

"Not published yet" four times is length, not information. Keep the sections that hold something; name what is pending in one line.

Why A model page was mostly "not available yet".

### [26One choice, one control; one action, one button.](#say-it-once)

9 Nov 2026 

A setting has a single control, and an action a single button on the page. When a picture of the choices can be pressed, the pictures are the control: no second switch beside them saying the same thing.

Why Your look had the icon style as a row of three words and again as three screens; Themes asked people to sign in twice on one screen.

See [Your look](/look)

### [118A long list of work folds by its state, with counts.](#lists-fold-by-state)

11 Nov 2026 

A dashboard of jobs, tasks or runs groups them by state (running, queued, needs attention, today, earlier), each group a fold with its count: what is happening and what needs you open, the rest folded, the choice kept. A long group shows ten and a "Show N more"; what is running always shows whole. A search or a filter opens every group. Rows are one line of what and one of where it is.

Why The owner, on the agent portal: the page was long; "collapsible elements … improve openvibe.design as well."

### [120A long directory folds by its natural group, and every entry stays in the page.](#directories-fold-by-group)

11 Nov 2026 

Hundreds of entries (models, engines, sites) are grouped by what a person looks for first (the provider, the kind), each group a fold whose summary says how many, how many are free and from what price. A search, a filter or a short list opens the folds. Every entry is still in the HTML for crawlers and find-in-page; an entry is one line: its name first, then status, size and price at the end (under the name on a phone).

Why Exchange's /models was about sixty phone screens: nine callable models, then 934 registry models as one plain list (the owner's provider card, ask 361).

## Loading and motion 13

Movement means something is happening.

### [5An effect is left out by what the device says, never by the size of its screen.](#effects-by-device-not-screen)

10 Nov 2026 

A site may leave out an effect a device cannot afford, by what the device says about itself: 2 GB of memory or less (navigator.deviceMemory), or a person saving data (navigator.connection.saveData). It never does so because the screen is narrow or the pointer is coarse, and never by overriding the person’s Motion setting. What follows a pointer (a spotlight, a tilt) may be left out where there is no pointer; a layout rule under a width (a collage that has no room) is not a motion rule.

Why OpenVibe.Live marked every phone "lite" and switched its home’s animations off whatever the Motion setting said: on a phone nothing moved, and the owner asked why with motion on.

See [Motion](/motion) Checked by OpenVibe.Live test: home-lite

### [6A control that docks moves to its place.](#a-dock-travels)

10 Nov 2026 

An action that pins itself to the screen’s edge while its real control is out of view rises into place, and when the real control comes back into view the pinned one travels to it and hands over. It never appears and vanishes in one frame. Once the page’s footer is on screen it rides above the footer instead of lying over it. With Motion off it is simply there or not.

Why The Go live bar on a phone flashed in and out as the page scrolled, and sat over the footer at the page’s end.

See [Motion](/motion) Checked by OpenVibe.Live test: golive-setup

### [27The only thing that goes round is the mark’s own O.](#no-spinners)

10 Nov 2026 

A wait shows the shape of what is coming (a placeholder of the right size) or the mark at work: its O breaks into dots that go round, and three dots rise inside it while an agent thinks or writes. No borrowed spinner, and no ring chasing its tail round an icon. A finished or idle thing is still.

Why Spinning rings round icons everywhere looked cheap and said nothing (2026-10-31). Then the mark only breathing did not read as loading, so its own O became the one thing that goes round.

See [Loading](/loading) [The mark at work](/patterns/mark-system) Checked by test/no-spin.test.js

### [28A live list changes only where it changed.](#streams-hold-still)

30 Oct 2026 

Patch rows in place, keep the reader’s place, follow the bottom only when they were there, and fade in only what is new.

Why Rebuilding a stream on every event reset what people were reading.

See [Patch in place](/patterns/patch-in-place) [Keep the anchor](/patterns/keep-anchor)

### [29Every site moves on the same timings and honours reduced motion.](#shared-timing)

30 Oct 2026 

180, 260 and 360 ms with the shared curves; the system setting for reduced motion turns entrances off.

Why Components used unrelated durations and felt like different products.

See [Motion](/motion)

### [91A bar button turns into the tab it opens, and back.](#button-becomes-its-tab)

10 Nov 2026 

The pressed button (the menu button, the bell, the picture, a balance) flies to its tab in the menu and becomes it, its picture fading into the tab's along one short arc; a count rides along; closing flies it home. Reduced plays it short and straight; Off removes it. A flying button stays pressable.

Why The owner: "when you click this button, I want it to animate into the tab it becomes. Same with the other buttons … if you click notifications, it should merge into the notifications tab."

### [115A picture-in-picture goes anywhere, tucks aside and waits with the mark.](#pip-goes-anywhere)

11 Nov 2026 

It follows the finger or the mouse each frame and lands with a spring; dropped over the player it sits in the player, anywhere else it floats over the page and stays on screen while it scrolls; a flick carries on; near an edge it snaps. Thrown past a side it tucks into it, a tab with its picture still going. While it connects or its picture stops it shows the mark at work over its last frame (never a black box) and tries again by itself. Its place is kept per slot, in the browser and in the account (newest wins).

Why The owner: "move it anywhere … on mobile and desktop … more solid feeling … that black thing that’s just stuck there … use the OV animations … saved and synced to the OpenVibe account."

### [121A card plays its short preview when a person rests on it, and only then.](#cards-preview-on-rest)

11 Nov 2026 

A video, clip or live card with a preview plays it, muted, inside its own picture: after a short rest of the mouse or keyboard focus on a computer, and for the one card that settles in the middle of the screen on a phone. The picture stays until the video really plays, the badges stay on top, a thin line shows how far it has played. Motion Off and Save-Data play nothing; Calm and reduced motion keep the rest-to-play but not the scroll one; an 18+ card never previews.

Why Ask 355: Media makes six-second previews for every recording and clip; the cards had none (the owner: hover and centred previews).

### [129What moves looks exactly like what it came from.](#motion-copies-keep-their-look)

11 Nov 2026 

A copy that flies, morphs or lands (the menu button into its tab, a card into a sheet) carries the source's own computed colour, size and state from before the press, and turns into the target's on the way. It never falls back to a default colour once it leaves its own CSS.

Why The menu button flew whiter than it was idle: the copy lost the navbar's colour rules and caught the pressed state.

### [130A moving thing lands.](#arrivals-land)

11 Nov 2026 

Motion that carries something somewhere ends with a landing the eye can read: a short give (a squash that settles) and a ring at the target, and the same on the way back. Calm keeps the path, short, without trail or glow; only Off removes it.

Why The owner: "added animations and effects as well when it lands where it should, and improve both the open and close transitions."

### [144Tabs and switches are one segmented control whose ink slides to the chosen one.](#one-segmented-control)

12 Nov 2026 

A set of tabs or a switch (You's Apps · Notifications · Recent, Vibe's Chat · Code · Agents) is one rounded track; the chosen one sits on an ink that slides there from the last one, and the content slides in from that side. Calm fades instead; only Off removes the movement. Arrow keys move along it. On a phone only the chosen tab says its name when the others would not fit; each keeps its glyph and count.

Why The owner, 11-12, on Vibe's Chat · Code · Agents row: "these can be aligned more perfectly … bigger font size and better icon size … animations, effects to the tabs that look nice, both on mobile and desktop".

Checked by openvibe-shared test: menu-places-chrome openvibe-shared test: menu-home-screen-chrome

### [149Back from a page you left through the menu opens the menu again, where you were.](#back-returns-to-the-menu)

12 Nov 2026 

Following a link in the menu marks where it was (its place, its door, its scroll) on its history entry. Back to that page opens the menu there, whether the page returns from the browser's cache, loads again, or is swapped in place; it reuses that entry, so Forward still works, and closing it then leaves the page as it was. Links in the menu warm up as a finger lands on them.

Why The owner, 11-12, on the menu: "fix the history back button so it properly brings you back to this GUI rather than the page behind it" and "when you click links … it loads async dynamically and is highly optimized".

Checked by openvibe-shared test: menu-back-chrome

### [165Working, the mark is still the logo: its own ring with a bright arc running round it.](#the-wait-keeps-the-logo)

13 Nov 2026 

The busy mark keeps the O at its full weight as a faint track while a bright arc runs round it, growing as it goes and drawing in behind; the V lifts a little in time and the glow behind breathes, one 1.25 s rhythm. Nothing is drawn thinner than the logo, and the V stays level with the O.

Why The owner, 11-13: "improve the O so it actually looks like the original, aligned properly … a better cool animation". Eight thinner dots sat inside the ring's line and the V bobbed off it.

Checked by openvibe-shared test: ov-mark

## Navigation and the Frame 26

One bar, one menu, the same on every site.

### [3The button that opens it closes it.](#opens-it-closes-it)

10 Nov 2026 

A panel that covers the screen grows out of the button that opened it, and that button, in the same place, is its close button: the menu button turns into the close mark and back, and the panel folds back into it. The panel carries no second close button of its own; a different one somewhere else is a second answer to one question.

Why A phone’s Dock slid up from the bottom carrying its own close button, while the menu button it belongs to sat untouched in the bar.

See [The menu button, opening](/brand/explore#menu) [Motion](/motion) Checked by openvibe-shared test: menu-home-screen-chrome

### [8A place is named, not initialled.](#the-rail-names-its-places)

10 Nov 2026 

A strip or rail of places a person switches between carries each place’s name: beside its mark where there is room (a phone’s strip is named chips), and as a label that follows the pointer where the rail is a column of tiles. Two initials in a circle are a mark, not a name. A place that can be managed opens its sheet when held, right-clicked, or tapped again while open: what it is, the person’s rank in it, and what that rank may do.

Why Chat’s server strip was circles reading "O" and "T": the owner did not know what they were or how to remove one.

See [Patterns](/patterns) Checked by OpenVibe.Chat test: shell

### [9A destination is offered once on a screen.](#one-place-once)

10 Nov 2026 

Where a phone has the bottom bar, a strip above the page does not repeat the bar’s places, and one icon means one thing on a site: the globe is not both "Servers" and "Global chat". A link in a bar goes to a page that exists.

Why Chat showed Vibe at the top and at the bottom, used the globe for two places, and its Activity button opened a page that had never existed.

See [The Frame](/system) Checked by OpenVibe.Chat test: shell

### [30One menu button on every site.](#one-menu-button)

8 Nov 2026 

The menu button at the top of the page opens the OpenVibe menu; there is never a second button that does the same thing.

Why Two buttons opened the same menu, and the custom orb had been hidden.

See [One menu button](/patterns/one-menu)

### [31One navbar per page, owned by the shared Frame.](#one-bar)

30 Oct 2026 

A site’s own section links go in the page body, never in a second header under the bar.

Why Page headers under the bar doubled the navigation.

See [One navbar per page](/patterns/single-navbar)

### [32Six places in a site’s bar; the rest under More.](#six-places)

1 Nov 2026 

Each place has an icon and one or two words that never wrap; the brand is the way home.

Why Bars grew until labels wrapped and buttons shrank.

See [Six places in the bar](/patterns/six-places)

### [33Signing in and out happens in the shared bar only.](#one-account-ui)

24 Sep 2026 

A site’s own account links go into the bar’s menu; its own account bar exists only for no-JavaScript visitors.

Why Sites showed "Sign in" while the bar said you were signed in.

### [34Your messages, balances and status are in every bar.](#your-things-everywhere)

1 Nov 2026 

The same three things in the same places on every site, for anyone signed in.

Why Each site showed a different subset, so nothing was where people looked.

See [Your things in every bar](/patterns/your-things)

### [35A page that needs an account says why in one sentence and offers one button.](#ask-with-a-button)

1 Nov 2026 

The button signs in and comes straight back to the same place. Never a bare link inside a sentence.

Why Ten sites hid sign-in inside paragraphs.

See [Ask with a button](/patterns/ask-with-a-button)

### [36The menu button opens on the site you are on.](#menu-opens-here)

10 Nov 2026 

Its first tab is this site: its pages as tiles under "Pages on <site>", the page you are on marked. No tab is remembered between openings; only the picture asks for another tab (You). The current site is first in its group of sites.

Why The owner: "this button should open the first tab so people can switch between pages on the site they're on … make it clear that those are pages on the site you're on."

### [37The menu and the Dock lead to each other and wear one head.](#menu-and-dock-meet)

10 Nov 2026 

Under the menu's tabs a row opens the Dock on Vibe, Agents, Messages or Activity; the Dock's head has "Menu". Both open out of the same button, close with the same cross in the same place, and mark the chosen tab with the theme's accent.

Why The owner, in the menu: "how are you supposed to get to the other menu from this area?" and, of the Dock's head: "buggy and kind of ugly … more consistent, cohesive."

### [38The balances are one pill that shows one balance at a time.](#one-pill-for-balances)

10 Nov 2026 

Only the balances a person has, the largest first. It turns through them on the first page of a visit and now and then. When one changes, the pill turns to it, counts the number and its pieces fly in or out. Each currency has one drawn icon, used wherever that currency is named.

Why The owner: "we just show one, but it can animate between all three … it only needs to show the things you have … nice icons that are animated, designed for the three currencies."

### [39The account lives in the menu's You tab, not in a dropdown.](#account-in-the-menu)

10 Nov 2026 

The picture is the last thing in the bar and opens the menu on You: who you are, your other accounts, add an account, settings, sign out, this site's own items and Display.

Why The owner: "this user drop down is just redundant … move it into the You tab of the menu … consolidate the two into one menu."

### [40The menu button is at the right end of the bar on every width.](#menu-button-at-the-right)

10 Nov 2026 

The left end is the logo, which opens the network's sites, and the site's name, which opens its pages; the right end is the menu button and then the person. The same on a phone and a computer.

Why The owner: "The menu button should be on the right, even on desktop … there's like a duplicated icon."

### [41The site's name in the bar opens that site's pages, Home first.](#the-name-opens-its-pages)

10 Nov 2026 

One small list drops from the name, with each page's icon and the present page marked. It is the network's one dropdown, used wherever a short list opens from what was pressed.

Why The owner: "clicking the actual name of the domain should have a sleek little minimalist drop down … that just shows the pages … have the home button as an option."

### [42The bar holds one row at every width.](#the-bar-holds-one-row)

10 Nov 2026 

When the row is too narrow its last links step out whole into More, then labels shorten; nothing wraps under the bar and the site's name is never cut mid-word.

Why Chrome's desktop mode on a phone put "Global chat" on two lines and dropped the bell under the bar.

### [43A count means it is for you; a dot means there is something new.](#two-badges-two-meanings)

10 Nov 2026 

The bell carries a red number for things addressed to you. The feed carries a small calm dot in the theme's colour, with no number, that goes when the feed is opened.

Why The owner: "don't make the badge red for the feed … the actual notifications bell … should be \[the\] red badge. The other one should be … not as bothersome to the eye."

### [44A change to the Frame is shipped when every site shows it.](#shipped-means-every-site)

10 Nov 2026 

A release of the shared library is followed by its pin on every site the same day; the plan names any site still behind and why.

Why The owner: "how come the new nav bar … aren't deployed to all sites? It's … a mix-match." Twenty-five sites were held back by a size budget.

### [92The menu's places: Here, Feed, Chat, Vibe, You; Vibe holds Chat and Agents.](#places-say-what-they-hold)

10 Nov 2026 

Messages is called Chat (on openvibe.chat, whose own tab is Chat, it stays Messages so a row never shows one word twice); the AI place is Vibe, with a two-part switch Chat · Agents. Notifications live in You, whose tab carries their red count; the bell opens You.

Why The owner: "instead of having this called AI as the tab, let's call it Vibe, and then under Vibe is Chat and Agents"; "rename this Chat"; "there should just be a notifications tab … in You … a badge … but it's red."

### [93A place's actions are icons, not rows.](#actions-as-icons-in-the-pill)

10 Nov 2026 

New (+) and Open in Chat (↗) are icon buttons with a label for screen readers and a tooltip; inside the menu they sit in the search pill beside the close button, so they cost no row; a floating panel keeps one slim row of them. No heading that repeats the tab's name.

Why The owner, on the Vibe list: "remove the text of Vibe conversations … the new conversation button can … move to an icon plus button that looks nice and integrated. Open in chat should be … a little button icon."

### [94A site's name opens its pages, and a way to every site.](#every-site-from-the-name)

10 Nov 2026 

The dropdown under the name lists the site's pages, then "All OpenVibe sites", which opens the menu scrolled past this site's pages to the list of sites.

Why The owner: "this drop-down menu should have … a way … to view all sites … past the list of pages … to the list of actual domains."

### [99The mark and the name are one button.](#the-brand-is-one-button)

10 Nov 2026 

The bar's left end is one button: the Pair, the site's name and a chevron, 40 px tall (46 px to tap), opening the site's pages and then "All OpenVibe sites". A site's own lead button (a sidebar, back) matches the menu button on the right: its size, its corner, its stroke.

Why The owner: "make it so this whole thing becomes the drop down, not … two separate buttons … especially the left sidebar button … make it kind of match the right side."

### [101Vibe holds Chat, Code and Agents, and they hand work to each other.](#chat-code-agents)

10 Nov 2026 

The menu's Vibe place (and the Dock) has three parts in one row: Chat, Code (start a coding task, follow yours, stop one) and Agents. "Build it in Code" hands a chat's words to Code; Vibe opens again on the part it was left on.

Why The owner: "you can do chat, codes, and agents all in the same place and in one area."

### [128A menu opens above everything, never inside the box that holds it.](#menus-escape-their-box)

11 Nov 2026 

A menu, popover or tip that starts inside a scroller, a rail, a card or anything with a mask, a clip or hidden overflow opens in the browser's top layer (the Popover API; kit-web.js does it for a rail's ⋯ menu) and is placed under its button. No card or rail it came from may cut it.

Why The ⋯ menu on Community's paste cards was cut off: the rail's edge fade is a mask, and it hid even a fixed menu.

### [139There is one menu; your chats, your AI and your agents are places in it, never a second panel.](#one-menu-places-not-panels)

12 Nov 2026 

Everything a person carries from site to site (this site's pages, the Feed, Chat, Vibe with its Code and Agents, You) is a place in the one menu that opens from the bar's menu button, on a phone and on a computer alike. Nothing floats beside it: no pill in a corner, no second card with its own tabs, no window of its own. A place inside the menu has no header band of its own: its actions (+ for a new chat, ↗ to open it in its product) sit in the menu's search pill, and an open conversation keeps only a slim way back and its name. What a floating button used to say (an agent working or needing you, a timer) is a small status on the menu button.

Why The owner, crossing out the floating Dock with its own Vibe · Code · Agents · Chat · Activity tabs: "there should only be the one unified UI … we're supposed to delete … that has the old tab system", and on the first version inside the menu: "part of the one UI instead of having two different areas."

See [The chat component](/components/chat) Checked by openvibe-shared test: menu-places-chrome openvibe-shared test: dock-chrome openvibe-shared test: menu-home-screen-chrome

### [153Any button, link or address can open a place in the menu.](#any-button-opens-a-place-in-the-menu)

12 Nov 2026 

A place in the menu has an address: a place, or place/part (you/notifications, you/apps, feed, here/live, or a door like vibe). An element with data-ov-menu="you/notifications" opens it on a click on any page with the bar, a page address ending #ov-menu=you/notifications opens it as the page loads, and OpenVibeNavbar.openMenu takes the same words. A link that has an address still opens elsewhere with a modifier key, and the address leaves the page's own once used.

Why The owner, 11-12: "other tools and buttons can open specific areas of the menu".

See [The menu](/components/menu) Checked by openvibe-shared test: menu-address-chrome

## Phones first 15

Designed on a phone, checked at 320 px.

### [45Every page fits a 320 px screen without sideways scrolling.](#works-at-320)

17 Oct 2026 

Grids use minmax(min(N, 100%), 1fr); one-column grids use minmax(0, 1fr); long words may break.

Why Six homes scrolled sideways on small Android phones.

Checked by browser smoke at 320, 390, 768, 1280

### [46Everything you can press is at least 44 px.](#targets-44)

30 Oct 2026 

Icon buttons included; spacing is separate from the hit area.

Why Dense icon rows were hard to hit on a phone.

See [44 px targets](/patterns/touch-targets)

### [47What a button did is said beside that button.](#answer-beside-the-action)

9 Nov 2026 

The line that says "Saved" or "Not saved" sits with the buttons it answers. On a phone, where the buttons are a bar at the bottom of the screen, the answer is in that bar.

Why Themes answered a press on the bottom bar in a line two screens further down the page.

See [Themes](/themes)

### [48Views of one thing sit side by side to swipe, with the next one showing at the edge.](#swipe-not-stack)

9 Nov 2026 

Three previews of the same theme, or three sizes of one design, are one row on a phone: each a screen wide less a sliver, so the edge of the next says there is more. What you change stays one screen away from what it changes.

Why Three stacked previews put the colours to edit 1,500 pixels below the theme they edit.

See [Themes](/themes)

### [49Controls that act on a picture keep the picture in view.](#keep-the-picture)

16 Oct 2026 

Camera and drive pad on screen together; the picture sticks under the bar while the controls scroll.

Why Driving a robot meant scrolling its camera away.

### [50Watching or going live owns the phone’s screen.](#watch-owns-the-screen)

31 Oct 2026 

No tab bar and no floating buttons over the picture; its own controls take the edges.

Why Bars and buttons covered the stream.

See [Watch and camera screens own the screen](/patterns/media-owns-the-screen)

### [51On a phone, a wide table becomes labelled cards.](#tables-become-cards)

30 Oct 2026 

Each row is a card; its first cell is the title and every other value says what it is. Nothing is dropped.

Why Phones cut columns or scrolled the page sideways.

See [Wide tables become labelled cards](/patterns/labelled-cards)

### [52On a watch page the video is first, and stays in view on a phone.](#video-first)

10 Nov 2026 

The player runs edge to edge under the bar and stays there while the page moves under it; an upright picture is not pinned. Lists of more to watch are rows beside the player on a computer and come last on a phone.

Why The owner: "why is the video not at the top … more device aware and viewport aware." A list added the day before stood above the player.

### [53Every piece of a page has a named place in its one-column order.](#every-piece-has-a-place)

10 Nov 2026 

A page that reorders itself for a phone lists every piece; a test fails when a new piece has no place, because a piece without one goes first.

Why "More from this channel" had no place in the order and took the top of the page, above the video.

### [54A messenger on a phone has two levels: the list, then the conversation.](#two-levels-in-a-messenger)

10 Nov 2026 

The list level has the rail of places, the list beside it and the app's bar. A conversation is the whole screen: the way back first in its head, the composer at the bottom edge, no strip of places and no bottom bar.

Why The owner, with Chat beside Discord: "it's a little overwhelming having both the bottom and the side and top tabs."

### [55A video that keeps playing while you browse plays in our own small player.](#the-video-comes-along)

10 Nov 2026 

The player's button takes the video along to the rest of the site, from the same second, with its title, a way back and a close. One sound at a time: a page's own video starting closes it.

Why The browser's floating window sat over the page it came from. The owner: "should … actually \[be\] like YouTube where it moves that video."

### [98A player's controls are one row that never runs off the screen.](#player-row-never-runs-off)

10 Nov 2026 

What does not fit steps out in a fixed order (speed and picture-in-picture, then the volume slider, then the length beside the position); play, mute, captions and fullscreen always show. Phone rules sit last in a stylesheet so a later sizing block cannot win over them.

Why At 390 px the fullscreen button was cut off on openvibe.video: the phone rules lost to the bar's sizing block later in the file.

### [138A message's actions are one cluster at its corner, never in its words.](#message-actions-at-the-corner)

12 Nov 2026 

Reply, edit, translate, copy and delete are icon buttons, each with its label, in one cluster that floats just above the message's right end: on hover or keyboard focus on a computer, on a tap of the message on a phone, where each is big enough for a thumb (44 × 40). Nothing about a message shows until asked for. Editing happens in the chat box, under an "Editing your message" bar (Enter saves, Esc puts back what was in the box), never in a browser prompt; replying shows "Replying to …" there. A changed message says "edited" once, quietly, right after its words, with the time as its title; never a line of its own. Every site's chat takes these from openvibe-shared (messages.js, ov-composer.js), so one fix reaches them all.

Why The owner, with phone screenshots of a stream's chat: every one of your own messages carried a full-size "Edit" pill in its words, editing opened the browser's prompt box, and "edited · 06:49 PM" fell onto a line of its own ("The edit button needs improvement … so it never happens again").

See [The chat component](/components/chat) Checked by openvibe-shared test: messages openvibe-shared test: composer-v2-chrome OpenVibe.Live test: chat-msg-actions

### [161A box floating over the page tucks into a small handle at the edge, and grows as wide as the window.](#a-tucked-box-is-a-handle)

13 Nov 2026 

Thrown past a side, a picture-in-picture or a floating panel folds into a 30 × 64 px handle (34 × 72 to a finger) at that edge, its picture still going behind the glass; a tap opens it where it was, a drag up or down slides it along the side, a pull brings it out under the finger. It grows to the window's width: past what its frame holds it lifts over the page and keeps growing. Each device keeps its own place, and a turn of the phone or a keyboard puts it back on the screen.

Why The owner, 11-13: "a small button that lets you pop it in and out … aware where it was … doesn't allow it to be off screen" and "I can't even resize it bigger than it is on mobile". A tucked box left a strip as tall as itself hanging off the screen.

Checked by openvibe-shared test: ov-float-chrome

### [163A full-screen layout reaches the bottom of the screen; room is kept only for what is shown.](#no-dead-bands)

13 Nov 2026 

A layout that fills the screen (a live channel's chat, a robot's panel, an app view) ends at the bottom of the visible screen: it subtracts a bar's height only while that bar is on screen, and the page adds no bottom padding under it. A browser check measures it: the last box's bottom against the screen's, and no band of nothing at the bottom of a full-screen layout.

Why The owner's phone, 11-13: "empty space at the bottom … should be using the full size, like full viewport". The chat ended at 804 of 844 px: a hidden tabs bar still took 40 px and the page kept 32 px of padding.

Checked by OpenVibe.Live test: chat-sheet-fill

## Words 15

Plain words, true claims, names that mean something.

### [10A change is New, Improved or Fixed, and says so with a small mark.](#a-change-has-a-mark)

10 Nov 2026 

A star for New, an arrow up for Improved, a tick for Fixed. An improvement shows the mark alone, because most changes are improvements and the word beside every row is noise. Never "Better".

Why The owner, of Recent changes: "what is this confusing tag … better next to everything?"

### [11A hero does not say the site’s name above its title.](#a-hero-does-not-name-the-site)

10 Nov 2026 

The bar already says which site this is. A line above a hero’s title is there only when it says something the bar does not: a state ("Live now"), a count, a date. A hero shows what the product does, with something real from it, before it describes it.

Why openvibe.exchange opened with "OPENVIBE.EXCHANGE" over its title, under a bar that reads Exchange.

See [Patterns](/patterns)

### [12A link to an @address says @name.](#a-handle-is-written-with-its-at)

10 Nov 2026 

Where a row, a card or a link opens an /@name address and names it by the handle, the handle is written @name: the words are the address. A display name stays a display name, with the @handle on the second line where the row has one. Not in a chat line’s author and not in running text a person wrote.

Why A profile listed "Maticus · Live channel" for a card that opens openvibe.live/@Maticus.

See [Patterns](/patterns) Checked by OpenVibe.Network test: public-profile

### [56Use plain words; keep machinery out of people’s screens.](#plain-words)

9 Nov 2026 

No runtime, harness, lease, placement or vendor tables on pages people use. Say what happens to them.

Why A vendor table of runtimes confused the person it was for.

### [57Name things after what they are to OpenVibe, not borrowed jargon.](#meaningful-names)

24 Sep 2026 

The navbar and footer are the OpenVibe Frame, not "chrome". Renames go through every layer at once.

Why A half-done rename looked like the request was ignored.

### [58A site is named the way its address reads.](#names-say-the-domain)

27 Oct 2026 

If the domain says VIP, the site says VIP.

Why Names that differed from addresses made people unsure they were in the right place.

### [59An AI answer shows only the answer.](#the-answer-is-the-answer)

1 Nov 2026 

A model’s self-check, its plan and its reasoning stay in a Details sheet, folded.

Why Answers arrived wrapped in the model’s notes to itself.

### [60Say "we never" only where it is true, and say who decides.](#true-claims)

31 Oct 2026 

Tell the truth about today, what we hope for later and who chooses. Friendly, and never a promise the code does not keep.

Why Blanket "never" claims limited what people could choose to allow.

### [61What people come for stays in the first screen and the page’s title.](#headline-stays-visible)

28 Sep 2026 

Going live from a browser with no OBS is Live’s headline: never folded behind a toggle, never dropped from titles in a redesign.

Why It is what people ask assistants for, and what they recommend us for.

### [95A headline that finishes a sentence takes a doing word.](#a-sentence-finishes-with-a-doing)

10 Nov 2026 

"Small tools that …" ends in what a tool does ("check a domain or IP address"), never in what it is; a phrase that would not finish the sentence is left out, not bent into it.

Why The home read "Small tools that one reputation report for a domain or IP." The owner: "the wording is kind of awkward."

### [122A time on a page reads the way a person says it; the exact time is one hover away.](#time-said-like-people)

11 Nov 2026 

Feeds, rows and cards say "3 min ago", "2 h ago", "yesterday", "Nov 3" in a <time> element whose datetime is exact and whose title is the full date. A raw timestamp ("2026-11-11T16:10:38.000Z") never reaches a person.

Why Community's feed printed ISO timestamps under every card.

### [123A label never says the same thing twice.](#labels-never-repeat)

11 Nov 2026 

A card's line of who, what, where and when leaves out a part that repeats another ("Quest · Quest", "Live · video" for a recording on Live); a section with one side drops the side label its card already carries ("As a streamer" over "AS A STREAMER").

Why Community's feed ("Quest · quest") and Live's AI timeline ("As a streamer" twice) on 2026-11-11.

### [126A length counter shows only near the limit.](#counts-near-the-limit)

11 Nov 2026 

A box with a limit says how much is left only in its last part (the last 15%, at most 200 and at least 20 characters). An empty search box saying "120 left" is noise.

Why Exchange's model search showed "120 left" while empty.

### [143Names are set in the brand face; the words you read are in the UI face.](#names-in-the-brand-face)

12 Nov 2026 

The name of an app, a site, a tab, a section or a person in a list is set in OV Brand (Nunito 800, which the navbar loads on every site); times, notes, messages and every sentence stay in the UI face. A name wraps to two balanced lines and never ends in "…"; a section head is a name in sentence case, not small capitals.

Why The owner, 11-12, on the menu's app names: "improve the fonts … it looks kind of unplanned … the text could be improved"; and "try and prevent labels that end with dot dot dot … align them better".

Checked by openvibe-shared test: menu-home-screen-chrome

### [167An AI line about a room says its vibe first, then the specifics, never counts; an old one steps aside.](#ai-lines-lead-with-the-vibe)

13 Nov 2026 

The first sentence is the room's mood and what it is about, in a few words; the second who is driving the talk and what was decided or asked. Counts are the page's to show. A one-line strip reads like a ticker: a sentence at a time, a long one panning to its end, still under a pointer. A read older than twelve hours is not shown as now.

Why The owner, 11-13: "300 messages from 26 chatters in 12 rooms … that's like a dumb AI overview. It doesn't even say the general kind of vibe … make it scroll … click it to expand". That line was three days old.

Checked by OpenVibe.AI test: live-templates OpenVibe.Live test: chat-box-and-ticker

## Look and marks 24

One look, many themes, real marks.

### [14One composer, wherever a person writes.](#one-composer)

10 Nov 2026 

Every place a person writes to people or to an assistant uses the shared composer: one box with the text in it, Add on its left where the place takes files, what the place offers (tools, a model) in a row inside it, Send on its right, lit while there is something to send. What is being added waits in a tray above the text with its progress. A feature added to the composer arrives on every site; a site does not grow a composer of its own.

Why Chat had four hand-written composers and a picture button outside the box; Actor and Vibe had two more shapes of the same thing.

See [Patterns](/patterns) Checked by OpenVibe.Chat test: shell

### [62The default look is blue; other themes are a choice.](#blue-by-default)

19 Sep 2026 

Vibe (deep blue) is everyone’s default; the violet original is its own theme, Violet Hour.

Why The owner prefers blue as the platform default.

See [Themes](/themes)

### [63Seasonal looks dress the default and can be turned off.](#seasons-are-optional)

25 Oct 2026 

A season shows only for people on the default theme, as a touch on the mark, never a badge taking bar space.

Why A pumpkin badge wasted bar space and the season’s palette did not read well.

### [64The mark is the Pair: a ring O and a round V, with names in Nunito.](#the-pair)

31 Oct 2026 

The gap where the V crosses the ring is a mask, so it holds on any ground; a heavier form serves 22 px and below.

Why Chosen from the mark studies as the network’s logo.

See [The mark](/brand)

### [65An AI maker is shown by its own mark, never initials in a circle.](#real-maker-marks)

9 Nov 2026 

Unknown makers get the neutral spark; a mark is chosen by the maker’s id, so a name saying "OpenAI-compatible" never draws OpenAI’s.

Why Home-drawn model glyphs read as "what is it even supposed to be?"

### [66A word in colour is the colour mixed with the text, about half and half.](#coloured-words-mix)

1 Nov 2026 

It reads on dark and light themes; fills and borders keep the pure hue.

Why Pure hues failed contrast on one side or the other.

See [Coloured words mix with the text](/patterns/mixed-words)

### [67Design so real Android and iOS apps can follow, not web views in a frame.](#native-ready)

29 Oct 2026 

One token source compiled to CSS, Compose and SwiftUI; components specified by anatomy, states and roles, not HTML.

Why A web-only kit would force a kiosk app.

See [Tokens](/tokens) [Apps](/native)

### [96The Pair is the only mark, and it does the waiting.](#only-the-pair)

10 Nov 2026 

Every logo, favicon, app card and share image is the Pair from openvibe-shared/mark; a page at work shows the mark's own wait (ov-mark.js), never a generic spinner.

Why The owner, with an old round V on a sign-in card: "why is there still remnants of the old logo … why isn't the logo animations used everywhere."

### [103Every little interface opens in the one window.](#one-window)

10 Nov 2026 

Dialogs, sheets and panels share one frame (head, body, foot), one motion (they grow out of what opened them), one set of keys (Escape closes the top one, the focus stays inside and goes back), a sheet on a phone that a swipe down closes, and the person's window style (Glass, Solid, Outline), set once for all of them.

Why The owner: "a system that's used for all the windows \[in\] harmony … people can make their own or … custom … everything … feels connected … matches."

### [104A live person's card looks live.](#live-looks-live)

10 Nov 2026 

Their own frame as a soft backdrop under the card (blurred, under a scrim of the card colour so words stay readable), a LIVE pill with a beating dot, a red ring on the face; hovered, or centred on a phone, the frame drifts closer. Never a backdrop from an address that is not ours, never on an NSFW card.

Why The owner: "when they're live … sets the background based on … their thumbnail … modern, stand out, unique."

### [106A button says what it does and shows what is happening.](#buttons-show-state)

11 Nov 2026 

Its kind is its importance: hero for the one thing a page is for, primary, soft for a second choice that matters, quiet, ghost, danger, live. It shows its state on itself: busy keeps its words and adds the wait, then a check or a shake and red; a count badge, a status dot, a toggle's fill, a progress fill. The one next step on a screen may glow now and then (attention) until it is pressed; destructive ones can ask for a press and hold. Every motion follows the motion setting. kit.button() and OpenVibeKitWeb.busy().

Why The owner: "improve our buttons across the site … animations and effects … indicators or statuses … idle animation … more important buttons … more intuitive … shared across everything through openvibe.design."

### [107A section's head is one row: its icon, its name, its count, its tools.](#section-heads-one-row)

11 Nov 2026 

The icon in a tinted tile, the name, the count as a quiet pill; the section's tools (filter, order, select, open elsewhere, view all) as one family of buttons in the same row: on a wide screen each says what it is (a picker says the value it holds), on a phone the icon carries it (the order's icon is the order, a filter shows a dot while it filters). Never a second row of buttons under the heading.

Why The owner, on a channel's Videos: "buttons need to be moved to where the title bar is … use icons … add an icon for the header … better font sizing."

### [109On a phone the stream's chat reaches the player.](#chat-reaches-the-player)

11 Nov 2026 

Upright, while live, the chat is one sheet right under the player with one header row (Chat, Robot when there is one, its tools, the fold) and the grip lying over its top edge. Open, it is the whole screen under the player: nothing peeks under it and the page does not scroll away. It has two heights: all the way up, or just under the channel line (measured, never a line cut in half); most of the way down folds it to a round chat button, and folding it folds the robot's controls with it. Compact view (chat settings) slims its header, goal bar and composer.

Why The owner: "the chat should actually go all the way up to the video … resize how tall the chat is"; then "a gap in between the top of the chat and the top of the player … if you collapse the chat … collapse the controls … the same button."

### [111A featured stream’s labels ride on its picture.](#labels-ride-the-picture)

11 Nov 2026 

LIVE, the watching count and frames sit on the picture’s top edge; its title, who and how long on a shade at its foot; hide and sound are round buttons on it. No "Featured live" row of its own. A wide screen repeats the title beside the picture, where the panel has room.

Why The owner, on the home page: "you don’t need the featured live text on that area … have it floating on top of it."

### [112A name wraps before it is ever cut.](#names-are-never-cut)

11 Nov 2026 

A person’s or a channel’s name has a line of its own and wraps (overflow-wrap: anywhere); a status chip ("Live now", "3 h ago") goes on the line under it, never beside it in a narrow card. Titles under a picture take two lines before an ellipsis.

Why The owner, on Recently Online: "@Matic…" beside a Live now chip — "labels and text … don’t get cut off so easily, especially usernames."

### [113A number holds its tile at a phone’s width.](#a-number-fits-its-tile)

11 Nov 2026 

Round before it overflows (15 h, not 15.3 h), and the icon steps aside first (a container query on the card). Counts that belong together are one strip of cells, a number over what it counts with its change beside it (green up, red down), never four boxes of empty space.

Why The owner: "15.3 h" ran out of its tile, and the visit digest’s four big tiles were "all that wasted space for those metrics."

### [124What something pays is one row of small chips with marks, the meaning in the chip.](#rewards-as-chips)

11 Nov 2026 

A badge with its own mark and name, an item with its emoji and name, an amount with its coin: one row of chips, never a list of sentences. What each chip is ("a badge on your profile", "a hat for your inventory", "OpenCoins start soon") is its title and screen-reader text; a promised amount that is not paid yet stays visible, dashed.

Why The owner (asks 61-62): "turn the ugly badge text list into condensed icons with hover/tap effects."

### [134A filter chip shows an icon, its name and its count.](#filters-say-what-they-hold)

11 Nov 2026 

Quick filters are chips with an icon in the kind's own tint, the name, and the count beside it in a quieter weight, never one run of text ("Images 200"). A kind the system could not name is "Other", not the picker's word for guessing.

Why The owner, on the paste kinds under Community's newest: "improve design and add icon."

### [142An app or site icon is its own hue on a rounded square, with the glyph at 58% of it, centred.](#app-icon-fills-its-square)

12 Nov 2026 

Every place an app or a site is drawn (the menu, You, the site list, search rows, the feed, a card) uses the same app icon: the site's steady hue (from its id) as a soft gradient on a square with 29% corners and a hairline in that hue, and the glyph drawn at 58% of the square, placed absolutely so no hover or animation can move it off centre. A folder shows its first four apps in an even 2×2 at two thirds of their cell. A press sinks an icon; a mouse lifts it and lights it in its hue. Never a small glyph inside a ring, and never one sized by guesswork per page.

Why The owner, 11-12, circling the menu's folders and app tiles: "these icons are offset and kind of broken … they don't take the full space"; "make the icons bigger so they actually take up more of the square … fix the alignment"; and "they're so small everywhere across the board".

See [The menu](/components/menu) Checked by openvibe-shared test: menu-home-screen-chrome openvibe-shared test: kit-layout-chrome

### [146Close, Open and Back are round icon buttons; words are for the one main action.](#actions-are-round-icons)

12 Nov 2026 

A control that every person knows by its shape (close, open, back, more, edit) is a round icon button with its name for readers and as a tooltip, sized to a finger. Words are kept for the one main action of a place (Post, Set it up, Answer). Edges are hairlines in a soft tint; a thick bright ring or a wide bordered pill around an icon is never used.

Why The owner, 11-12, marking the menu: "Close … ICON", "Open … ICON"; and on the phone's close button: "these buttons and borders … get extra wide, are kind of ugly … make that more sleek and modern".

Checked by openvibe-shared test: menu-close-chrome

### [156Every checkbox, radio, switch, field and button is OpenVibe's own, drawn the same on every site.](#every-control-is-ours)

12 Nov 2026 

openvibe-shared's ov-forms.css draws them all, in the site's colours: a box whose check pops in, a ring whose dot grows, a switch that glows when on, a field that glows with focus, a button that answers a press. A setting that is on or off is a switch, not a box. A site's own rule wins over the system's, data-ov-native keeps the browser's control where it must, and motion follows the person's setting.

Why The owner, 11-12, on the machines page's grey boxes: "improve the selection boxes to use a more customized look integrated into openvibe.design and themed better with animations and effects for all inputs and buttons".

See [Form controls](/components/form-controls) Checked by openvibe-shared test: ov-forms-controls-chrome

### [162Nothing is shown twice: one copy of a picture, one button for a job.](#shown-once)

13 Nov 2026 

A picture popped out into the browser's own window leaves the page until that window closes. A message box holds what goes into a message (the site's emote and emoji picker in its row; extras such as a GIF in its + sheet) and the row under it holds only the place's own actions (sound, coins, tips); the + sheet never repeats a tool the row shows.

Why The owner, 11-13: "it just goes twice like this and ugly" (a pop-out) and "you have a duplicated emoji button … use the built-in modular composer shared one".

Checked by OpenVibe.Live test: chat-box-and-ticker OpenVibe.Live test: pip-camera-slot openvibe-shared test: composer-v2-chrome

### [164A glyph sits inside its tile with room around it, and every tab's glyph fills the same box.](#glyphs-sit-in-their-tiles)

13 Nov 2026 

An OV glyph draws at 100% of its element, so a tile sizes the glyph inside it: 62% of the tile. Tab icons share one 20 px box and are sized to look the same weight (a wide, short glyph such as the robot a size up). AI is the sparkles, never a wand. A sheet folds down with the set's solid chevron, beside solid glyphs.

Why The owner, 11-13: "the icons … need a tiny bit of padding", "what is this AI summary icon … it looks wrong" and "the robot icon is so much smaller … inconsistent".

Checked by OpenVibe.Live test: chat-box-and-ticker OpenVibe.Live test: chat-sheet-fill

### [166What a message answers, quotes or changes is a part of the box, and Send is quiet until there is something to send.](#context-lives-in-the-box)

13 Nov 2026 

Replying, quoting, editing or answering a file is one bar inside the message box, above the words, with a rail of the accent at its start (editing in its own colour) and its own ×; one at a time, from the box's API (reply, edit, bar). Send with nothing to send is a quiet outline round its arrow; with something to send it fills with the accent on a spring.

Why The owner, 11-13: "improve the composer so that it can support … a replying to area or different content above … more connected to the actual composer, and improve the send button".

Checked by openvibe-shared test: composer-bar-send OpenVibe.Live test: chat-box-and-ticker

## Data, AI and consent 8

Where numbers come from, and who agreed.

### [68A price comes from the provider’s own page, with the day it was checked.](#own-page-prices)

8 Nov 2026 

Never an aggregator’s price; a price older than its check window says it may have changed.

Why Second-hand prices drifted from what providers charged.

See [A price says when it was checked](/patterns/price-freshness)

### [69Speed, errors and uptime are measured on real requests.](#measured-on-real-traffic)

9 Nov 2026 

Synthetic probes fill gaps only where traffic is thin, and say so.

Why Real traffic is the number a person will actually get.

### [70AI uses of a person’s data are opt-in, per person, off by default.](#opt-in-consent)

31 Oct 2026 

Training on their content, a public dataset, recognising their face: each is a yes they gave and can take back.

Why Blanket bans limited people; silent use would break their trust.

### [71The uncensored tier is 18+ and keeps its floor.](#adult-floor)

31 Oct 2026 

Lawful adult content is fine for adults; anything sexual involving a minor is always blocked.

Why Adult freedom and child safety both hold, without exceptions.

### [127A form's defaults follow what the person already chose.](#defaults-follow-the-choice)

11 Nov 2026 

When one field narrows another (a kind narrows the engines, a site narrows the categories), the defaults come from the narrowed set: Web picks two web engines, never two picture engines that happened to come first.

Why Exchange's compare form picked Openverse and Wikimedia Commons with Web selected.

### [137A log keeps each cause with what it caused.](#logs-keep-cause-and-effect)

12 Nov 2026 

Who did it (or what was said) leads a turn, and what happened sits indented under it, each outcome with its own icon and tint; a refused turn is marked as refused. A log is never a run of equal boxes where the reader pairs "Ada presses" with the line after it, and words every row already implies ("(simulated)" on a page that says it is a sample) are said once, above the log.

Why The element preview's sample run showed six presses and their six results as twelve equal boxes, cut off by a scroll box.

### [148APIs send times with their zone; a time without one is read as UTC.](#a-time-without-a-zone-is-utc)

12 Nov 2026 

Every API returns times as ISO 8601 with a zone (2026-11-12T05:01:02Z). A client that meets "2026-11-12 05:01:02" reads it as UTC, never as the reader's local time, and every relative time ("3 h ago") stays current while it is on screen.

Why The owner, 11-12: "how come everything in the history is just now? … the time doesn't update". Network's history sent zone-less UTC times, which browsers read as local time, so every visit west of UTC was hours ahead.

Checked by openvibe-shared test: menu-home-screen-chrome

### [168A room's summary reads its public messages, minus people who turned AI off; a summary of a person needs their yes.](#a-room-reads-its-room)

13 Nov 2026 

Opt-in is for training, public datasets, faces, looks and apps. A room's summary of its public messages, shown back to that room, is none of those (as the Rundown's write-ups of what streamers said are not): it reads every message in its window except from people who turned "leave my chat out of AI" on, and reads nobody if it cannot read that switch. A profile of one person still asks Network for their consent. Private rooms are off unless their people turn it on.

Why The room summaries read only people who had allowed AI training, so they read nobody and Global showed a three-day-old line; the owner's 10-31 rule names what needs a yes.

Checked by OpenVibe.Chat test: chat-ai OpenVibe.Chat test: room-insight-rooms

## Agents 10

How an agent works for a person without wasting their attention.

### [72An agent asks one concrete question at a time.](#one-question)

9 Nov 2026 

In a structured form, where the person asked, and it keeps working on what it may do meanwhile.

Why Questions buried in long reports never reached the person.

### [73Agent work reports one of six honest states.](#six-states)

9 Nov 2026 

Working, waiting, ready, blocked, failed, dropped. Opening a pull request is not "ready"; a draft is "blocked".

Why Work looked finished when it was not.

### [74Anything an agent does unasked starts by recording what it would do.](#observe-before-acting)

9 Nov 2026 

The person reads those decisions, then turns acting on.

Why Proactive work that acts at once spends other people’s attention.

### [75An agent speaks when a person must act or can use a result.](#quiet-by-default)

9 Nov 2026 

One confirmation that names the task, silence while working, then the result, a decision or a failure.

Why An agent for a team can waste the whole team’s attention.

### [76An agent’s freedom is four levels in plain words, above a floor that never moves.](#levels-with-a-floor)

1 Nov 2026 

Asks first, edits on its own, a second model checks, full trust; the floor of what it never does is always in view.

Why Permission screens in jargon were skipped, not understood.

See [Levels with a floor](/patterns/levels-with-a-floor)

### [117AI text about a person reads as a person wrote it.](#ai-text-sounds-like-a-person)

11 Nov 2026 

A card line is what a friend who watches would say in one breath: one sentence, specific to this channel, starting with the thing itself (not "Streams", "A channel", "Join"), without the name the card already shows. The stock words that make every channel sound the same stay out: focus, content, engaging, various, a mix of, dive into, showcasing, vibrant, dynamic, journey, immersive, a blend of. A line that fails falls back to the overview reshaped.

Why The owner: "improve the AI description so they’re not all so generic sounding, make it a little more human feeling and nice" (the cards read "Streams a multi-camera, tech-robot focus …").

### [119An AI task shows which model did what, and the person can change it.](#ai-shows-who-did-what)

11 Nov 2026 

A task that uses several models says so on its record: each role (plan, build, review, verify) with its model, its reasoning level, its time and its cost, as steps in the one step view. The plan behind it is a setting a person can read, copy and edit (presets first, then every role), the same plan through the page, the API and the SDK.

Why The owner: "a really sophisticated multi-model system with enhanced reasoning … modular configuration … SDK API … OpenVibe.design connected."

### [135Every set of controls can be remade by the person using it.](#people-make-their-own-controls)

11 Nov 2026 

Controls and panels are built from parts a person can move, resize, restyle, hide and add, by hand or by asking OpenVibe's AI ("put Stop on the left, make the stick bigger"). The result is theirs, kept with their account, shareable as a layout others can use, and one tap brings back the default. A layout only arranges and styles the controls that exist; it never adds a power the person does not have.

Why The owner: "All controls and other interfaces should use a system where the user can make their own completely how they want it using our AI systems."

### [147An agent's face shows what it is doing now.](#an-agent-shows-what-it-does)

12 Nov 2026 

Wherever an agent appears (You, Vibe, a run card, a notice), its face carries a glyph for what it is doing: reading, searching, writing, coding, streaming, shopping, thinking, waiting for you, paused. An agent may name its own glyph from the registry; otherwise its current step's words choose one. A working agent breathes softly (Calm slower, Off still); one waiting for you turns amber. Where the registry has no fitting glyph, the design system makes one (openvibe.design's icon maker through Exchange) and adds it for everyone.

Why The owner, 11-12, on the AI strip under You: "put an icon depending on the agent status … custom for the agent … it can generate its own status icons if they don't exist already".

Checked by openvibe-shared test: menu-home-screen-chrome

### [158An agent is a blueprint anyone can read, change, share and run anywhere.](#agents-are-blueprints)

12 Nov 2026 

What a person makes is one small document of ten parts (face, brain, knows, hands, places, memory, rules, when, makes, team), each part a slot fed by the product that knows it best: Design for the face, Exchange for the models and prices, Tools and every product for the hands, Link for the machines, Events and Sources for what starts it. Vibe is one too. A blueprint asks and never grants: installing shows every ask in words, a new version that asks for more waits for a yes, it carries no key or token, and money, passwords, deletions, new recipients and posting in a person's name always ask. Made on Design (Create, Agent), shared and remixed in Design's gallery, run from any chat, composer, schedule, event or machine.

Why The owner: one agent system, "multi purpose reusable in a modular and API/sdk driven way", the same one other people use, with Exchange, Link, Design, Chat, Codes, Tools and shared hardware all part of it.

Checked by openvibe-contracts test: agents.blueprint fixtures openvibe-sdk test: agents-blueprint

## Products and their jobs 16

One clear job per product and domain.

### [13A computer is added in one place, and picked everywhere.](#a-computer-is-added-once)

10 Nov 2026 

A person adds a computer at openvibe.link. Every other site picks from the person’s Link machines with the one shared picker and never asks anyone to type a machine’s id. A site may show which machine it uses and what it is doing there; it keeps no list of its own, no "add a machine" of its own and no machines tab.

Why Actor asked for a "Link machine ID" in a text field, beside other sites with machine pages of their own.

See [The system](/system)

### [77A home’s picture shows the thing the site does, not a diagram of its menu.](#the-picture-is-the-product)

10 Nov 2026 

The hero’s picture is the product at work: Tips shows a tip landing on a stream and the goal moving, Work the newest listing with its board, Run a job on a paired computer, Space a request and the app it becomes, Events the bus’s own week. Real rows and counts where the site has them (and no picture when it has none); otherwise an example, labelled "An example" in its caption. It moves once, then rests, and is still under reduced motion.

Why The owner: no more "generic circled" homes. Five homes drew the same ring of icons round a word.

See [OpenVibe.Work](https://openvibe.work/) [OpenVibe.Tips](https://openvibe.tips/)

### [78A button is shown only where what it names can be done.](#a-button-keeps-its-promise)

10 Nov 2026 

"Edit in Studio" appears when the editor can edit that kind of thing; until then the page offers what it can really do, under its real name. A button that opens a page which cannot do the verb is a broken promise, however good the page will be later.

Why Video showed "Edit in Studio" for a page that could only preview a video and publish an unedited copy.

### [79Each product does one job, and its domain says which.](#one-job-per-product)

7 Nov 2026 

Report reads (rankings, numbers, evidence); Exchange does (try a model, get a key, route). Design makes interfaces, icons, fonts and themes; Studio edits photos, video and sound. Codes is coding with any agent; Services is the developer console.

Why Merged products muddle both markets and both pages.

### [80A product has one human-facing home.](#one-human-home)

8 Nov 2026 

AI’s pages, console and per-person settings live on openvibe.exchange; ai.openvibe.services keeps only the API.

Why A console on a machine host sent people to the wrong place.

### [81Build what was asked first; never ship an easier stand-in as the feature.](#build-the-stated-core)

8 Nov 2026 

Party is a shared desktop people drive together, not an embed sync; the stated core comes before extras.

Why A safer variant shipped first and wasted the time the real one needed.

### [82Prefer clean cuts to compatibility layers.](#clean-cuts)

28 Sep 2026 

With few users, rename and move in one pass; keep a redirect for addresses, not code that carries both shapes.

Why Aliases and remnants outlived their reasons.

### [97One list of sites, in eight groups of at most seven.](#one-list-of-sites)

10 Nov 2026 

Watch & stream, Talk & belong, Play, Read & ask, Shop & money, Free tools, Make with AI, For developers: the menu, its folders, the footer and every home page read the same list; a site whose visits are not visits (an API, a section) is a section of another, not a tile.

Why The owner: "a huge cleanup and re-analysis across all sites … what's the most intuitive way to have everything advertised." Three groupings disagreed; usage and co-use (site-inventory, 2026-11-10) set the eight.

### [100The one composer does the same things everywhere.](#the-composer-does-it-all)

10 Nov 2026 

Files by the picker, a paste or a drop, as chips (a long paste becomes a file you can put back, where the box takes files); "/" for the site's commands and your own; "@" for people; voice; a draft kept until sent; your settings (what sends, voice, compact, your commands) the same on every site. A site adds to it with a mod; it never builds its own. (Its shape: one-composer.)

Why The owner: "how come on this composer there's no file attaching system and all the other features … a better composer system unified across all sites … moddable and fully customizable."

### [102A field that searches is a real dropdown, never a datalist.](#fields-that-search)

10 Nov 2026 

An input that finds things (a repository, a person, a place) opens a listbox under it (above it near the bottom): sections, the match marked, arrows and Enter, a skeleton while it reads, a word when a source fails, and "Create … on OpenVibe Git" when a name is new. Without script it is a plain input.

Why The owner, on the Git URL field: "a completely custom drop-down system … async or dynamic fetching or search … create the new repository or project through this UI."

### [105A person is one card on every site.](#the-user-card)

10 Nov 2026 

Pressing a face or an @mention opens their card beside it (a sheet on a phone): a banner from their picture, the live ring and Live now first when they stream, level, streak, badges and followers as chips, the sites they used this week, then Profile and Channel.

Why The owner: "one user card … across all sites … level … live streams … like Discord, but way better."

### [108Controls go where the viewer puts them, and always come back.](#controls-where-you-put-them)

11 Nov 2026 

A robot's (or any device's) controls on a stream page have one switch of places: on the video, a row under it, the full panel, in a window you move and size, hidden; the choice is kept per channel and device. Hidden keeps the switch in view, so nothing is lost. A locked control takes the controls when pressed (it asks, as Drive does). On a phone the full panel shares the chat's sheet as a Robot tab.

Why Maticus: "i clicked hide on the controls … i don't see how to unhide them"; and the controls "don't seem to work" (they were waiting for Drive).

### [114Every live slot is a stream, and every one is listed.](#every-live-slot-is-listed)

11 Nov 2026 

Live now lists each live slot, one that is also its streamer’s picture-in-picture included; the featured stream stays in the list when another is live. A person live on two slots is one row in a digest that says so ("Live now on 2 streams").

Why The owner: "Maticus is live on 2 accounts, but under live now it only shows 1 … those are 2 different streams."

### [116A device’s controls are one family, arranged per person.](#controls-one-family)

11 Nov 2026 

The stick has its four marks and lights when it drives; Stop is one plain little button a person may add; a slider says its value with − and + to step it; battery and latency are slim readout rows. Each person arranges the pad (the pad’s size, the readouts shown or folded, and whether Stop is there) and the arrangement works while the device is offline. A device that is offline says so in a sentence.

Why The owner, circling the pad, the Stop, the head slider and the readouts: "redesign … polish … more consistent … on a per user basis."

### [152A picture is enough to post or comment; words and descriptions are optional, and AI can write them.](#a-picture-alone-is-a-post)

12 Nov 2026 

Every composer takes a picture with no words, as any social app does. A picture's description is asked for, never required: ✨ on the picture writes a caption and alt text with AI on the person's own allowance (one tap, never on its own), and a post sent without a description gets one written as it goes when it can.

Why The owner, 11-12, on a comment refused for having only a picture: "it shouldn't require you to type text if you just put a picture … like other social media … auto caption using OpenVibe.Exchange".

See [The composer](/components/thread-composer) Checked by openvibe-shared test: composer-caption-chrome OpenVibe.Community test: comments

### [155A robot says what it can do in a manifest its maker versions; the panel and the AI read only that.](#a-robot-declares-its-controls)

12 Nov 2026 

A robot's driver publishes a manifest (bot.robot-manifest@1): each command's kind, class, ranges, lifetime, delivery window, what it does when released and how often it may be sent, and each reading's fields and source. The panel draws a control for each, people arrange them, and OpenVibe AI reads the same facts when it suggests a layout or writes a control, so nothing it makes can ask for more. A checked version is frozen; a change is a new version, not an edit, and needs no OpenVibe release.

Why Maticus's P7 command list for LOOI (11-12) became its first frozen manifest, with the owner's "use this list for the manifest … and AI control generation".

Checked by openvibe-contracts: bot.robot-manifest fixtures

## Building it 17

The engineering choices that keep the design whole.

### [83Build pages from the shared kit, and keep its names.](#kit-first)

9 Nov 2026 

Buttons are ovk-btn ovk-btn--primary or --quiet; sections, tables, stats and folds come from the kit, so every site moves together.

Why Hand-made variants (and misspelt class names) drifted from the system.

See [Kit](/kit) [Components](/components)

### [84Never name a site class after a shared one.](#reserved-prefixes)

9 Nov 2026 

ovg belongs to the glyphs and ovf to the footer; a site’s own class takes its own prefix.

Why A bare .ovg pinned every icon to a corner; a Feed took the footer’s margins.

### [85What a tool can do is offered as choices in its composer, each showing what is chosen.](#choices-in-the-composer)

10 Nov 2026 

A choice is a button in the composer's tray with its name and its present value (a theme shows its colours). Its options open under it on a computer and rise from the bottom on a phone; choosing closes them. Nothing the server accepts stays unoffered, and the last choices come back.

Why openvibe.design/create took a kind, a theme and four ways to pick the designer, and offered two boxes. The owner: "make it more like modular selection."

See [Create](/create)

### [86A site styles with its own theme tokens, never invented names with fallbacks.](#own-tokens)

9 Nov 2026 

A variable the site does not define falls back silently: cards turned white on the dark theme.

Why A sheet written against names the site never defines drew white cards on dark.

### [87First paint never depends on another service.](#first-paint-alone)

17 Sep 2026 

The theme’s first frame is inline; shared scripts load deferred, so a Network deploy cannot blank another site.

Why Pages opened white while the Network restarted.

### [88Every mail is one frame, in the reader's theme, and says what to do.](#mail-is-one-frame)

10 Nov 2026 

A title that says what happened and where, plain sentences, the facts as a list, one button and quieter links, what happens next, and why you got it. Text only, safe links only, no emoji for a logo.

Why An alert said "Browser check failed · domains · 1 failing check" and nothing else. The owner: "I don't even understand … explain more details … what they can do, what they can click."

### [89A page asks for the camera, microphone or screen only when a person presses for it.](#ask-before-the-camera)

10 Nov 2026 

Never on load, on a route change or from a remembered setting; a remembered choice may select the device, not open it.

Why The owner: "the camera shouldn't automatically request permission when you … refresh … You should have to click allow."

### [90Assets are addressed by their content, so people always get the current one.](#content-hashed-assets)

7 Nov 2026 

Hashed file names, never a hand-written ?v=; a shared sibling file is busted by its own hash.

Why Menus shipped but browsers kept the old files.

### [110Check a style in the order the page loads it.](#cascade-in-order)

25 Oct 2026 

A preview that appends a rule last proves nothing about a rule that loads first; measure on the real page.

Why A phone rule looked right in a preview and lost to a later file in production.

### [125An icon is drawn by the page itself; an icon-font class with no font is a blank.](#icons-draw-without-a-font)

11 Nov 2026 

A page that loads no icon font draws its icons as the shared icons' inline SVG (a site's own mark through the icon helper) or a small inline SVG. A server-rendered \`fa-\*\` class works only on a page that loads the glyph font for it; the browser test looks for empty icon boxes.

Why openvibe.network's home showed blank marks on its popular rows, its play discs and its chevrons (no icon font on that page).

### [131A redesign names the views it changes.](#variants-keep-their-own-rules)

11 Nov 2026 

A change to one view (the full robot panel) is scoped to that view in its selectors; the overlay, the one-row controls and every embed keep their own rules unless the change is meant for them too, and each view is checked at its own sizes before it ships.

Why Controls v2 styled every #panel stick, so the overlay's joystick drew at the full panel's size. Maticus: "the previous size and position was perfect."

### [132A state never moves a control.](#states-never-move-controls)

11 Nov 2026 

A badge, a lock, a hover or a pressed state is drawn on top of a control (a pseudo-element, an outline, its own layer). It never changes the control's position, size or layout: a placed control stays where it was put.

Why A lock badge set position: relative on the overlay's stick and slider and dropped them to the top of the stream.

### [133A picture in a page's CSS is a file from its own origin.](#assets-are-files-under-csp)

11 Nov 2026 

Where a page runs a strict content policy (default-src 'self'), an icon or picture is a same-origin file, never a data: URL the policy refuses. A test keeps data: out of those stylesheets.

Why The robot panel's lock badge was a data: image and drew as a bare blue dot.

### [145In every composer the mic comes first, and the + opens every tool of that box.](#the-plus-holds-every-tool)

12 Nov 2026 

A box to write in (a post, a chat, Vibe, a comment, an agent's task) is the one shared composer. Its row starts with the mic, then the +; the + opens all of the box's tools as big named tiles: its own (pictures, camera, files, emoji), its site's and its mods', and the extras every box has (Timer). On a phone the row keeps the mic, the + and the first tool; a wide box shows more. While empty, the box shows what people do with it, one example at a time. A tool is a module any site or mod adds once for every box.

Why The owner, 11-12, on Vibe's box: "the mic … it's not even on the right spot. Fix it to the left and redo the composer … the same shared harmony, unified composer across sites … the timer should be in the plus thing … usable on all composers across all sites"; and "it should show different things people do".

See [The composer](/components/thread-composer) Checked by openvibe-shared test: composer-v2-chrome openvibe-shared test: dock-chrome

### [150A place has one search: the menu's own field, saying what it finds there.](#one-search-per-place)

12 Nov 2026 

Inside the menu nothing adds a second search box under the menu's field. A place that can be searched (the Feed, All apps) turns the field to it, with words that say so ("Search the feed", "Find among 64 apps"), and filters in place; leaving the place gives the field back to searching OpenVibe. The place's head is its name, its count and a quiet hint.

Why The owner, 11-12, circling All apps' own box under the menu's search: "confusing … improve".

Checked by openvibe-shared test: menu-home-screen-chrome

### [154Every site's search is the one search field, with suggestions, recent searches and a ghost completion.](#one-search-field-everywhere)

12 Nov 2026 

A site's search box is openvibe-shared's ov-searchbox: a pill with the search mark, a clear button and a "/" key on a computer, its edge glowing with focus. Its placeholder names examples in turn while idle; as you type it suggests from the site, with the first suggestion's rest as a ghost that Tab or → takes; while empty it shows your recent searches here. Enter searches the words, the arrows choose a row, Escape closes then clears. Its list is the one dropdown every field uses.

Why The owner, 11-12: "improve the search field … autocomplete, dropdown, animated effects … a shared, universal, reusable search input component across all sites".

See [The search field](/components/search-field) Checked by openvibe-shared test: ov-searchbox-chrome

### [160What opens from a button is anchored to it, on top of everything, inside the screen.](#opens-from-its-button)

13 Nov 2026 

A menu, a pop-over or a settings panel opens with openvibe-shared OVSurfaces.anchor (or OVSurfaces.popover with its menu): in the browser's top layer, so no clipped layout, rail or stacking context hides it; beside its button, on the side with room, shifted to stay inside the visible screen (the keyboard and a pinch zoom count), never taller than that room; placed again on a scroll, a resize or a turn of the phone. A long one is a sheet at the bottom of a phone. A site never places its own.

Why The owner, watching a live stream on a phone, 11-13: "the little three dots doesn't actually open a menu, at least not on mobile … the same unified cross-site shared UI system". The live layout clipped it.

Checked by openvibe-shared test: surfaces-chrome OpenVibe.Live test: chat-sheet-fill

## Use the rules

The register is data too: read it from code, hand it to an AI assistant before it designs for OpenVibe, or link one rule by its address.

[As JSON](/api/v1/rules) [As Markdown](/rules.md) [The patterns](/patterns)
