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

Decided lately

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

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

Honest pages16

What a page shows is true, counted and sourced.

1Never show content that is not real.

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.

2An icon name is checked against the set that draws it.

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.

4Calm makes motion smaller and slower. Only Off removes it.

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.

15A number counts exactly what its label says.

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

136A pack, a set or a playlist shows what is in it.

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.

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

141An empty part says what will be there, with its mark, in a small card.

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.

151A burst of the same thing is one card, counted whole, and no card shows twice.

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.

157A service restarting on purpose says so, and nothing latches for it.

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.

159Every number is drawn by ov-metrics, and a number nobody measured is a dash.

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.

Length without hiding8

Pages get shorter by arranging, never by removing.

7A fold shows its first two and fades.

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.

22Shorten a page by arranging it, never by removing content.

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.

23On a phone, a page of sections is tabs; a wide screen shows them all.

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

26One choice, one control; one action, one button.

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.

118A long list of work folds by its state, with counts.

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.

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 motion13

Movement means something is happening.

5An effect is left out by what the device says, never by the size of its screen.

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.

6A control that docks moves to its place.

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.

27The only thing that goes round is the mark’s own O.

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.

91A bar button turns into the tab it opens, and back.

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.

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.

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.

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.

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.

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

149Back from a page you left through the menu opens the menu again, where you were.

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

Navigation and the Frame26

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

3The button that opens it closes it.

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.

8A place is named, not initialled.

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.

9A destination is offered once on a screen.

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.

30One menu button on every site.

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.

38The balances are one pill that shows one balance at a time.

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.

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

41The site's name in the bar opens that site's pages, Home first.

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.

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.

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.

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.

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.

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.

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

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

139There is one menu; your chats, your AI and your agents are places in it, never a second panel.

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

153Any button, link or address can open a place in the menu.

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

Phones first15

Designed on a phone, checked at 320 px.

47What a button did is said beside that button.

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.

52On a watch page the video is first, and stays in view on a phone.

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.

54A messenger on a phone has two levels: the list, then the conversation.

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

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.

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").

161A box floating over the page tucks into a small handle at the edge, and grows as wide as the window.

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.

163A full-screen layout reaches the bottom of the screen; room is kept only for what is shown.

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.

Words15

Plain words, true claims, names that mean something.

10A change is New, Improved or Fixed, and says so with a small mark.

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.

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.

12A link to an @address says @name.

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.

59An AI answer shows only the answer.

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.

95A headline that finishes a sentence takes a doing word.

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

123A label never says the same thing twice.

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.

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.

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

167An AI line about a room says its vibe first, then the specifics, never counts; an old one steps aside.

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.

Look and marks24

One look, many themes, real marks.

14One composer, wherever a person writes.

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.

96The Pair is the only mark, and it does the waiting.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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

146Close, Open and Back are round icon buttons; words are for the one main action.

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

156Every checkbox, radio, switch, field and button is OpenVibe's own, drawn the same on every site.

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

162Nothing is shown twice: one copy of a picture, one button for a job.

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

164A glyph sits inside its tile with room around it, and every tab's glyph fills the same box.

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

166What a message answers, quotes or changes is a part of the box, and Send is quiet until there is something to send.

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

Data, AI and consent8

Where numbers come from, and who agreed.

127A form's defaults follow what the person already chose.

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.

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.

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.

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

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.

Agents10

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

117AI text about a person reads as a person wrote it.

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.

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.

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.

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

158An agent is a blueprint anyone can read, change, share and run anywhere.

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.

Products and their jobs16

One clear job per product and domain.

13A computer is added in one place, and picked everywhere.

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.

77A home’s picture shows the thing the site does, not a diagram of its menu.

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.

78A button is shown only where what it names can be done.

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

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.

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.

97One list of sites, in eight groups of at most seven.

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.

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

105A person is one card on every site.

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.

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.

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.

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.

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

155A robot says what it can do in a manifest its maker versions; the panel and the AI read only that.

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

Building it17

The engineering choices that keep the design whole.

84Never name a site class after a shared one.

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.

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

88Every mail is one frame, in the reader's theme, and says what to do.

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

110Check a style in the order the page loads it.

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.

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.

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.

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.

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.

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

150A place has one search: the menu's own field, saying what it finds there.

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

154Every site's search is the one search field, with suggestions, recent searches and a ghost completion.

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

160What opens from a button is anchored to it, on top of everything, inside the screen.

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.

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.