At a global digital assets firm, our founder wore three hats. Hiring wasn’t an option, so he became his own Chief AI Officer.
Over 24 months, he studied, tested, and built. That work became harperOS.
Design system
The block library
A page uses what is here, and only what is here. Every entry reads the same way: its name, one line on what it is, a sample, and its parts.
Atoms
Ponomar sets the headlines, Inter titles and says things, JetBrains Mono labels things. The atoms are the smallest pieces a block is made of.
Type
Every text size a page may use, largest first. Each one has one job.
| Name and class | Sample | Treatment, and when to use it |
| H1 · page title h1 | One company, one system. | Ponomar 400. Once per page: the page’s headline. On a private overview the cover is the page title, so the H1 takes the section size, clamp(32, 4.8vw, 48); elsewhere clamp(40, 8vw, 64). |
| H2 · section title h2 | A section opens here. | Ponomar 400, clamp(32, 4.8vw, 48). Opens every section. The green words are .accent. |
| H3 · sub-section title h3 | A step inside a section | Inter 600, clamp(20, 2.6vw, 24). A titled part inside a section, on report pages. |
| Subhead .body | The line under a section title, two rendered lines at most. | Inter 400, clamp(16, 1.8vw, 18), gray, two rendered lines at most, in a 720px column. About a third of its title, the ratio Anthropic uses. |
| Box title .nm | System | Inter 600, 16, gray. Names the thing a white box holds, in four words or fewer: a point title in a box. |
| Point title .phrase | Knowledge compounds | Inter 600, 16, gray. The bold first line of a point. |
| Body text p | Every correction makes the whole system better. | Inter 400, 16. Running text. |
| Box text .ln | Text inside a box sits one step smaller. | Inter 400, 15, gray. Any text inside a white box. |
| Section label .eyebrow | The problem | JetBrains Mono 500, 12, capitals, green. Names the section’s topic, above its title, in plain words. |
| Diagram label .wflow .nm | Your agent | JetBrains Mono 500, 12, capitals, black. Names a step inside a diagram. A diagram labels its steps; a card titles its thing. |
| Row label .lk | Business intelligence | JetBrains Mono, 11, capitals, gray. Names a row, a field or a column. |
| Step number .nmark | 3 | JetBrains Mono 500, 12, in a 24px square. Takes an icon’s place when the order matters. |
| Figure .sv | 300+ People | JetBrains Mono, clamp(26, 4vw, 34). A number that is the point. |
Icon
A 24px line drawing that stands for one idea. It marks a point or a box so the eye has somewhere to land. Every icon comes from one registry and keeps one meaning.
| Icon | Name | The one idea it stands for |
grid | The functions of a company, the whole company | |
doc | What people know, written down | |
step | Getting better, one step at a time | |
person | Expertise, what one person knows | |
bolt | Getting the work done | |
check | Quality, done right | |
cycle | Learning, the loop that repeats | |
archive | Kept by the company | |
moon | Outside the working day | |
sun | During the working day | |
compass | Direction, people direct | |
play | Execution, agents run the work | |
layers | Compounding, knowledge that builds on itself | |
chat | A conversation, a message | |
key | Ownership, the permission to change | |
sliders | Control, deciding what runs on its own | |
scale | Parity, as good as your person | |
shield | Verification, work that has been checked | |
search | Evidence, the sources behind an answer | |
globe | The website, and being found in search | |
wave | Voice | |
calendar | Time, how soon | |
dash | General management | |
trend | Sales, growth | |
megaphone | Marketing | |
package | Operations, the goods that move | |
banknote | Finance | |
people | People and HR, the team | |
plus | More of the same kind | |
quote | Someone else's words | |
chip | The system the work runs on | |
cap | Training, people learning the work | |
pause | Waiting for a person | |
book | The rules the system runs by | |
lock | Private, data that stays yours | |
addperson | Adding a person to the system | |
badge | A person's own access | |
segments | Customers, grouped by what they do | |
film | Content, the series a studio makes | |
app | The app, the product people use | |
agent | An agent, one role the system runs (every agent card carries it) | |
delivery | Delivery, the client work the firm sells | |
data | Data, the systems it is read from | |
harp | Holding and passing on knowledge, the harper (the name's origin) | |
arrow | Direction of travel: the diagram arrow and the next step |
| Part | What it is |
| .ico | the icon |
| data-icon | the registry name it is drawn from (content/brand/icons.mjs) |
Arrow
The one direction mark. It joins the steps of a diagram, pointing right, down or up.
| Part | What it is |
| .arw | the arrow, pointing right |
| .down | turned to point down |
| .up | turned to point up |
White box
The container: a white fill inside a hairline border. Anything that is not running text sits in one. A white box holds a card, a diagram, a logo panel or a product screen. A card’s box has three parts: the box title line, the box text, and sometimes a box footer.
Box title
| Part | What it is |
| .t | a white box holding a card |
| .wnode | a white box holding one step of a diagram |
| .figbox | a white box holding a picture: a diagram, a logo panel or a product screen |
Box footer
A small green label under a hairline at the bottom of a card. It ties the card to an idea named elsewhere on the page. It is a line inside a white box, never a box of its own.
System
| Part | What it is |
| .tag | the box footer |
Blocks
A section is a lockup and the blocks under it. Each block has a name, one job and one treatment. The samples below are drawn by the renderer that builds the pages.
Lockup
The top of every section, always in this order: section label, section title, subhead. The label and the subhead sit in a 720px column; the title may run to 816px.
What we build
Three things have to run together: your expertise, your data and the model.
| Part | What it is |
| .eyebrow | the section label |
| h2 | the section title; its green words are .accent |
| .body | the subhead |
Cover
The first thing in a private overview, between two rules: who it is for, who prepared it, and when. It is what makes the page a document sent to someone rather than a web page. A cover naming its reader says what the document is by naming them, so it carries "Prepared for" and not "What this is"; the generic line is for the overview prepared for no one (MC, Sep 22, 2026).
| Part | What it is |
| dl.meta-grid | the cover |
| dt | a row label |
| dd | its value |
| .name | the company’s name, set larger |
Point row
Two or three ideas side by side, with no box. Each point is a marker (an icon, or a step number when the order matters), a point title, and its text.
People direct
You are the one thinking and deciding what comes next.
Agents execute
A person plus their own agent, and one plus one makes three.
Knowledge compounds
What your best person knows, captured once, for everyone.
First, parity
The agent does the task as well as your person did.
Then, verification
A second agent checks the work.
We set up your workspace in your own environment and connect your systems.
| Part | What it is |
| .pointrow | the row |
| .point | one point |
| .phrase | the point title |
| .detail | the point’s text |
| .two | two points instead of three |
| .stack | keeps the points stacked at every width, for the text side of a split |
| .inline | stacked, with the marker beside the title: a long list read in order, such as the seven pillars, each title linking to its section |
Card grid · parts
Three cards that name the things a company buys. Each card has its icon and box title on one line, its box text, and a box footer. Where the cards run in an order, a step number takes the icon’s place.
System
Functions
People
| Part | What it is |
| .trio | the card grid: three white boxes in a row |
| .t | one card |
| .cardhead | the line that holds the icon and the box title |
| .nm | the box title |
| .ln | the box text |
| .tag | the box footer |
Card grid · compare
A before and after, one card per aspect. Inside each card: the word From and what it was, then the word To and what it becomes, both in the same gray.
Expertise
Getting the work done
Quality
| Part | What it is |
| .trio | the card grid: three white boxes in a row |
| .t | one card |
| .cardhead | the line that holds the icon and the box title |
| .nm | the box title |
| .fromto | the From-and-To pair |
| .frk | the word From or To |
| .frv | the sentence after it |
Card grid · shift
The compare cards as one line each, for a page that tells the before and after in less height: the aspect, the old way in gray, a green arrow, the new way in ink. Stacked on a phone.
Expertise
From Living in a few key people’s heads
To Captured from your best people
Getting the work done
From By hand, or in each person’s own AI chat
To Agents running the encoded way
Quality
From Not always predictable
To Your best way every time
| Part | What it is |
| .shift | the list |
| .srow | one aspect |
| .sfrom | the old way, in gray |
| .sarr | the arrow |
| .sto | the new way |
Card grid · org
The functions as a line-drawn org chart: the company node on top, a line to each function's node, and under each function a spine with a tick to each agent. Nodes are the only boxes; every line is a 1px rule, drawn orthogonally. Six columns from 1024px, stacked below.
| Part | What it is |
| .org | the chart |
| .onode | the top node |
| .ocol | one function |
| .ofn | the function's head |
| .rolelist.oagents | its agents |
Card grid · roster
The function cards as one line each, for a page that names the functions and their agents in little height: the function with its icon, then its agents in equal cells, each with the agent icon. Stacked on a phone.
Sales
Marketing
Finance
| Part | What it is |
| .roster | the list |
| .rrow | one function |
| .rolelist.ragents | its agents, equal cells |
Card grid · function
One card per business function, each agent it holds a box carrying the agent icon, and an optional line on what they would do first. The agent names come from the role library. Every page draws them the same way: on an overview the boxes are plain, since nothing below them to link to; on an approach or proposal the scope sets two cards across, each box links to its agent's card, and an odd last card spans its row.
Sales
Marketing
Finance
| Part | What it is |
| .trio | the card grid: three white boxes in a row |
| .t | one card |
| .cardhead | the line that holds the icon and the box title |
| .nm | the box title |
| .ln | the optional line |
| .rolelist.boxes | the agents, one box each |
| .bxi | a plain box, on an overview |
| a | a linked box, on an approach or proposal |
| .trio.two.fill | two across, the odd last card spanning the row |
Card grid · quote
Someone else’s words in a card: a quote mark, the words, and who said them. Never the words of the company the page is written for.
Six weeks of work, done in three hours.
Viral Shah · CFO, Advanced DRI
1,400 companies — no one’s doing it. Not even close.
Matt Lipman · CEO, Capstone
Things that used to take days now take five or ten minutes.
Greg Boatwright · CEO, ADRI
Six weeks of work, done in three hours.
Viral Shah · CFO, Advanced DRI
| Part | What it is |
| .trio.two | a card grid of two |
| .t | one card |
| .said | the quoted words |
| .saidby | who said them, and their role |
| .withav | the speaker’s line when it carries their photo, the byline’s 44px avatar |
Split
The text on the left and the picture that shows it on the right. On a phone the picture follows its text.
During your day
You direct the work and approve it.
Outside your day
What you set to run keeps going, and waits for you in the morning.
Weekly sales report
Drafted overnight
Four supplier follow‑ups
Drafted, waiting for your yes
| Part | What it is |
| .textfig | the split |
| .pointrow.stack | the text side |
| .figbox | the picture side |
| .flip | puts the picture on the left; kept for a page that needs it |
Product screen
A simplified picture of what the system shows you, such as the morning review. It is always marked as an example: the renderer refuses a screen whose header does not open with “Example”. The split above carries one.
| Part | What it is |
| .pview | the product screen |
| .pvh | its header line |
| .pvr | one row |
| .pvn | the row’s name |
| .pvs | the row’s status |
| .state | the tag at the right of a row |
| .go | a tag that needs you, in green |
Logo panel
Other companies’ products, shown by their own logos in their own colors, one category to a row. It shows which systems we connect.
Communication
Email and SMS
| Part | What it is |
| .logorows | the logo panel |
| .lrow | one category |
| .lk | the row label |
| .marks | the logos |
Logo panel · clients
The companies that run on harperOS, by their logos in their own colors, with no row label.
| Part | What it is |
| .lrow.brands | the clients’ row |
Stats
A few short numbers, each over a label. The number is the point.
| Part | What it is |
| .stats | the row of stats |
| .st | one stat |
| .sv | the figure |
| .sl | its label |
| .held | keeps three across on a phone |
| .stats4 | four across from the tablet up |
Type specimen
The type scale shown at size. Each row names its rung, states its value and draws a sample with the real rule: a real heading, or the real block’s own renderer. The design-system page builds the rows from the canon’s scale table, so a sample cannot drift from what pages set.
Section title (H2)
Ponomar clamp(36px, 6vw, 60px)
Body
Inter 16px
Body text carries the argument, one idea to a sentence.
Labels
JetBrains Mono 12px
| Part | What it is |
| .tspec | the set of rows |
| .tsr | one rung |
| .tsn | its name |
| .tss | its value |
| .tsx | the sample, drawn by the real rule |
Space scale
The ten spacing steps, each drawn as a bar at its own token’s width. Every distance on a page is one of these steps.
--s28px--s524px--s864px--s10128px| Part | What it is |
| .spscale | the scale |
| .spr | one step |
| .spbar | the bar, at the step’s own width |
Marks
The brand’s own assets, each on the ground it is made for, with what it is for and its file. A mark whose file is not in public/ is refused, so a page cannot show a dead asset.

Wordmark
The wordmark on a light page
harperos-wordmark-light.png

Wordmark, reversed
The wordmark on the ink footer
harperos-wordmark-dark.png
| Part | What it is |
| .marks | the set, in whole rows |
| .mk | one mark |
| .mkimg | the ground it sits on |
| .swn | its name |
| .swv | its file |
Actions
Buttons in a row outside the hero: one primary at most, one ghost at most, and a text link. The renderer refuses a second primary.
| Part | What it is |
| .ctas | the row |
| .btn | the primary button |
| .btn.ghost | the ghost button |
| .tlink | the text link |
Swatches
A design system’s colors, each chip filled from its own token, with the value and what the color is for. The design-system page builds them from the canon and refuses a value that differs from the brand overlay. They fill whole rows, like any set.
Field
--field #F7F7F6
The page on a screen
Ink
--ink #181428
Headlines, strong text, the footer
Accent
--accent #00AF7B
The one mark that carries the signal
| Part | What it is |
| .swatches | the set, in whole rows |
| .sw | one color |
| .chip | the color itself, filled from its token |
| .swn | its name |
| .swv | its token and value |
| .swu | what it is for |
Buttons
The primary button carries the page’s one main action. A ghost button beside it is the quieter way to read further; a hero carries one primary and at most one ghost.
| Part | What it is |
| .ctas | the row that holds them |
| .btn | the primary button |
| .btn.ghost | the ghost button |
Next step
The page’s one action, at the end of its section: a label, the action, and one line on what happens next.
The next stepBook a demo→We show you the system at work, and what it would look like in your company.| Part | What it is |
| a.continue | the next step |
| .ck | its label |
| .cn | the action |
| .cl | the line under it |
Workflows
Every workflow is numbered steps in white boxes, joined by arrows. A step is labeled in JetBrains Mono; a sentence belongs in a box, never under the diagram.
Workflow · across
Steps left to right, joined by arrows. Use it for a sequence of three to five steps. On a phone it stacks.
Parity
The agent does the task as well as your person did.
Verification
A second agent checks the work.
Evidence
The sources come back with the work.
| Part | What it is |
| .wflow | the workflow |
| .wnode | one step: a white box |
| .cardhead | the line that holds the step number and the diagram label |
| .nmark | the step number |
| .nm | the diagram label |
| .ln | the box text |
| .wjoin | the arrow between two steps |
Workflow · branch
One step hands the work to several boxes at once, and they hand it back. The column of boxes is a numbered step of its own, held together by a thin rule. On a phone it becomes a tree.
You
Ask for what you need.
Your agent
It sends the work to the function it belongs to.
Function agents
Sales
Marketing
Finance
Back to you
It comes back done. You approve it, or you correct it.
The shared record
Everything lands here, available to everyone.
| Part | What it is |
| .wfan | the column of boxes that share one step |
| .wfan .cardhead | the column’s step number and label |
| .wtie | the lines into and out of the column |
Workflow · stacked
Steps top to bottom at every width. Use it when the steps carry long text.
You
Ask for what you need.
Your agent
It routes the work to the function it belongs to.
Back to you
It comes back done.
Workflow · returns
Steps left to right where the last one feeds back into the first: a loop, drawn as boxes.
Run
The agent runs the task.
Review
You read what came back.
Calibrate
Your correction is kept.
Back to 1
| Part | What it is |
| .returns | the return path under the row |
| .wreturn | the “back to 1” note shown when the steps stack |
The client pages’ blocks
Every generated client page is made of these. Each one carries the type name a content file uses.
List
Points inside running text, each behind a small green square.
| Part | What it is |
| ul.blist | the list |
| li | one point, a whole sentence; on a private overview a point with a title is a point row or a card grid, never a bold lead |
| .catlabel | an optional label above the list |
Cards
The portal’s card: a small label, a name, and its text, in pairs.
| Part | What it is |
| .grid.cols-2 | two cards in a row |
| .card | one card |
| .kick | the small label |
| .nm | the card’s name |
| .ln | its text |
| .cmeta | a line of detail at the foot |
Cards · agent
One card per agent: its function, its name, what it does, and who owns it.
Sales
Account manager
Sales operations
Finance
Controller
Financial analyst
| Part | What it is |
| .acards | the agent cards |
| .acard | one agent |
| .ak | its function |
| .anm | its name |
| .aown | who owns it, from the role library |
Cards · people
One card per person: the portrait, the role, the name, what they have done, and a link to their profile. On a public page only; the founders on About.


| Part | What it is |
| .photo | the portrait, a 160px square on the off-white field |
| .kick | the role |
| .nm | the name |
| .ln | what they have done |
| .cmeta | the profile link |
Table
A comparison that has to be read across, row by row.
| Aspect | Today | On the system |
| Learning | Isolated to one person | Every correction improves the whole |
| Dedicated knowledge | Each agent reads from a defined slice of the knowledge layer. |
| Tool access | Scoped access to the systems the function needs. |
| Part | What it is |
| table.ptable | the table |
| tr.head | the header row |
| td.term | the row’s name |
| td.desc | a cell the renderer draws after the name |
Assessment table
The comparison grid of an assessment: one subject held against its competitors, a column per company, a verdict per row. The subject's column carries the accent; the best value in a row is bold. A cell holds a line, a line with its source, or stacked marks. The numeric variant sets the figures in mono.
| Attribute | Example Co | Competitor A | Verdict |
|---|---|---|---|
| Audit-log retentionadmin documentation | 15 months | 365 days | Better (vs Competitor A) — a longer window, stated on both pages |
| Platform list | ExtensioniOSAndroid | DesktopiOSAndroidCLI | Worse on breadth — no desktop app |
| Part | What it is |
| .tbl | the table, scrolling sideways on a phone |
| th.dl / td.dl | the subject’s column |
| .src | the source under a dimension |
| .cb | one mark inside a cell |
| strong.vgood | a verdict that goes the subject’s way |
Compare rows
A long before and after, read as rows rather than cards.
| Part | What it is |
| .vs | the comparison |
| .vs-row | one row |
| .k | the row’s name |
| .one | today |
| .os-v | on the system |
Sequence
Numbered steps with a title and a line each. The inline view puts the title and its line on one row.
| Part | What it is |
| .agenda | the sequence |
| .d-step | one step |
| .sn | its number |
| .st | its title |
| .sd | its line |
| .howsteps .hstep | the inline view |
Flow
The older vertical diagram on live client pages. New pages use a workflow.
| Part | What it is |
| .flowv | the flow |
| .fnode | one step |
| .fk | its label |
| .fjoin | the line between steps |
Function panel
The older list of functions and their agents on live client pages. New pages use the function cards.
01Sales
| Part | What it is |
| .fnb | the panel |
| .fgroup | one function |
| .gl | its name and number |
| .agents .chip | its agents |
Function head
Opens one function inside a longer section: its icon and its name. A head may also carry a number and one line where nothing above has said what the function covers.
Sales
| Part | What it is |
| .fnhead | the function head |
| .fnn.withicon | its icon and its name |
| .fnk | its number, optional |
| .fnl | its line, optional |
Agent spec
One agent, as a proposal or delivery plan specifies it: the agent icon every agent shares beside the role, the purpose in bold, then one question a row, label left and answer right. The workflow row is the hero, Today muted, Tomorrow in ink on an accent rule. The entities it names are boxes carrying their icon. A company-wide build sets the cards under their function heads.
Account manager
Keep every account current, so no client goes a week without a touch.
Each client’s history lives with the person who holds the relationship.
Follow-ups live in one person’s inbox.
Every follow-up arrives drafted and tracked in the morning queue.
Sales operations
| Part | What it is |
| .enc.rail | the spec |
| .ehead | the agent icon, the role and the purpose |
| .erow | one row |
| .el | the row label |
| .erow.hero .flow | the workflow, Today to Tomorrow |
| .ecap .chip | a system or an adversary agent, with its icon |
Agent card · light
An approach’s agent: the full card’s head alone, the agent icon, the role and its purpose, three across under each function head. Turning the approach into a proposal adds the rows under each card; nothing above them changes. The build refuses a full card on an approach and a light card on a proposal.
Account manager
Hold each client’s history, intelligence and next step in one record.
Growth marketer
Make the companies in your target universe know you before they need you.
Controller
Close the books and track spend against the plan.
| Part | What it is |
| .fx.lightgrid | the row of light cards |
| .enc.light | one agent |
| .enm.withicon | the agent icon and the role |
| .egoal | its purpose, verb first |
Proof list
Rows of evidence, each with a label, the proof, and its source.
| Part | What it is |
| .plist | the list |
| .pr | one row |
| .pk | its label |
| .pq | the proof |
| .pw | its source |
Price
The proposal’s price: the figure, one line on it, and its terms.
The build is fixed, never hourly.
| Part | What it is |
| .price | the price |
| .pnum | the figure |
| .plede | the line under it |
| .prow | one term |
Boxes
Quiet boxes that each hold a name and a value.
License
Yours, in your repository.
Subscription
The expertise, kept current.
| Part | What it is |
| .tbox | the boxes |
| .bx | one box |
| .bk | its name |
| .bv | its value |
Ops
Short name-and-value rows, such as a schedule or an approval rule.
Schedule
Every weekday at 7:30
Approval
Waits for your yes
| Part | What it is |
| .ops | the rows |
| .op | one row |
| .on | its name |
| .ov | its value |
Caveat
A strip that tells the reader what to know before reading on.
This page describes the system; the proposal prices it.
| Part | What it is |
| .caveat | the strip |
| .cvk | its label |
| .cvt | its text |
Note
A short qualifier, under the thing it qualifies.
The figures are counted across every deployment.
| Part | What it is |
| p.note | the note |
Chips
Small labels in a row. They are never buttons.
| Part | What it is |
| .chips | the row |
| .chip | one label |
| .toolrow | the tools view |
| .ecap | the caption view |
Quote
The portal’s boxed quote. The overview uses the quote card instead.
“Things that used to take days now take minutes.”
A client CEO
| Part | What it is |
| blockquote.quote | the quote |
| .qby | who said it |
| .qpair | two quotes side by side |
Pull
One large sentence that carries the page’s voice, used once at most.
The model is not the hard part. The wiring is.
| Part | What it is |
| p.pull | the pull |
Entries
An index: each entry one link, its kicker (a date, or a date and the source), its title and a line under it. An entry that leaves the site opens in a new tab and names its source.
Sep 4, 2026
The system takes the work, and the person moves up
What happens to the day once the routine work is gone.
Aug 27, 2026
You bought the tool. Now what?
Why a seat is not a system.
Apr 28, 2026
Two years working inside AI
Ten principles I keep coming back to.
Apr 16, 2026
Train your AI like an employee
The hiring analogy that makes AI deployment click.
Apr 7, 2026
SOPs are dead
The most useful knowledge in your company has never been written down.
Essay · Apr 28, 2026
Two years working inside AI: the foundation
Ten principles I keep coming back to.
What we’re reading
TechCrunch · Sep 29, 2026
OpenAI launches Dots, its agentic avatar
A marker of the shift to always-on agents.
What we’ve written
Patrick Adams · Sep 4, 2026
Own the system your team builds its work in
Why the tools a team works in should be the company’s.
TechCrunch · Sep 29, 2026
OpenAI launches Dots, its agentic avatar
Essay · Apr 16, 2026
Train your AI like you’d train an employee
Michael Chauliac · Sep 1, 2026
What a seat is, and what a system is
Everyone
01The complete picture: the machine, what it can do, how to work it.
| Part | What it is |
| .entries | the index |
| a.entry | one entry, the whole of it a link |
| .ek | the kicker, on the mono label rung |
| .et | the title |
| .ex | the line under it, 16px |
| .earr | the arrow atom, which moves on hover |
| .feature | the view an index leads with: the same entries as white cards, two or three to a row |
| .n2 / .n3 | how many cards the row holds, so every row is full |
| .open | the feature row opened: three items under a hairline, no box, titles medium |
| .etable | the table view: a dated index as rows, date, optional category, title |
| .ccard | the course view: one card per course, its numbered lessons, a start link |
| .lead | the lead view: the one post a blog index opens on, open on the field between two hairlines, its title on the display face |
| .tabs | the tabs view: posts by kind, in the phase-tab idiom, over a hairline list |
| .etr / .etlabels | the tabs: radio inputs and their labels, in the text face |
| .etpanel / .elist | one group's panel and its list |
| a.erow / .edate / .etl / .esrc | one row: the date, the title, the source, the go-arrow |
| .emore | the rest of a group past nine, behind More |
| .elab | an entry's category label, in the text face like the tabs, so the kind of piece reads at a glance |
Product shot
The real product in an app window, never a mock-up: a registered shot copied from our own OS with its commit, its lines numbered, one caption under it.
1# communication-safety2 3Customer communications require coordinator review. Draft first, never auto-send.4 5The pipeline for any outbound communication (email, Slack, Teams): produce a draft → present it in chat for review → wait for explicit approval → send only after approval.6 7"APPROVED" is the only valid approval signal. Silence, nodding, or implicit consent are not approval.8 9Never send a communication that has not been explicitly approved by the user. Never send a communication from a tool call in the same step as drafting it.| Part | What it is |
| .pshot | the shot and its caption |
| .pwin | the app window |
| .pbar | its title bar, with the file's name |
| .ptitle | the file's name |
| .pcode | the file's real lines |
| .pn | a line number |
| figcaption | the one line under it |
Demo
The product at work, one use case at a time: a menu of two to four use cases beside a session in the app it runs in, a row of tabs above it on a phone. It switches without a script.


Shown on example data, with every name and figure changed.
| Part | What it is |
| .demo | the menu and the session |
| .dmenu | the use cases |
| .dt | one use case: its name and one line |
| .dpanes | the sessions |
| .dp | one session, phone and desktop sizes |
| .dcap | the one line under it |
Story
A narrative in two to five short paragraphs, at reading size: the one block on a marketing page that carries running text, because a story is running text.
At a global digital assets firm, our founder wore three hats. Hiring wasn’t an option, so he became his own Chief AI Officer.
Over 24 months, he studied, tested, and built. That work became harperOS.
| Part | What it is |
| .story | the narrative, in the reading measure |
| .story p | a paragraph, 18px |
Byline
Who wrote a piece and when: the author’s photograph, name and role, and the date. At the foot of the piece the sign-off view names the same person.
Written by
Michael ChauliacCo-Founder & CEO
| Part | What it is |
| .byline | the line under an article’s title |
| img.avatar | the author’s photograph, 44px |
| .who | the name |
| .role | the role |
| .when | the date, in the short form |
| .signoff | the sign-off at the foot |
| .label | its label |
Collapse
A card grid behind a labeled toggle, closed until the reader opens it, for a page that points at the detail without spending its length on it.
System
Functions
People
| Part | What it is |
| details.collapse | the toggle and what it holds |
| summary | the label, on the mono rung in green, with a plus that turns to a minus |
Closer
The page’s last line and its one action on a single row, tight: a heading and one row of actions, no subhead.
| Part | What it is |
| section.closer | the closing row |
Band
A section drawn as a strip, ruled above and below, carrying one block and no words of its own: the homepage’s client logos. The section after it drops its own rule.
One block, ruled above and below.
| Part | What it is |
| section.band | the strip |
Sub-label
A label over a hairline that divides a section into parts. On a client document it is the ladder’s fourth step, an H4: a bold line in the body face, sentence case, numbered by its pillar first (1.1, 3.2). Elsewhere it is the green label every entry name on this page uses.
What the agent reads
Your policies, your past work and your data.
| Part | What it is |
| p.sublab | the sub-label |
H3 block
The renderer’s type named subhead. It emits an H3, the sub-section title in the type table above; the name is the renderer’s, kept so content files still read.
| Part | What it is |
| h3 | the sub-section title |
Severity
The report’s high and medium markers.
High
Medium
| Part | What it is |
| p.sev | high |
| .med | medium |
Logos
The gray logo strip on older client pages. New pages use the clients’ logo panel, in color.
| Part | What it is |
| .logos | the strip |
| .logowall | the wall, on older hand-built pages; the renderer does not emit it |
Embed
A registered visual with its own styles, built from the brand tokens. It is shown on the pages that register it.
| Part | What it is |
| .em | the embed |
| .em-{name} | one registered visual (content/embeds/) |
Page chrome
The renderer draws the banner, the menu and the footer on every page.
Banner
The strip above the menu that names who the page was prepared for. A family with a client carries it on every page.
| Part | What it is |
| .banner | the strip: the client’s name and the word Confidential |
Menu
The numbered steps of the family, from the family’s own declaration. The current page is marked, and above 768px the menu stays at the top as the page scrolls.
| Part | What it is |
| nav.ring | the menu |
| .wordmark | the harperOS mark, linking home |
| .steps | the numbered pages of the family |
Site menu
The public site’s menu: the wordmark, its links and one action, folding into a menu button on a phone. The site family declares its links and its action, so every site page carries the same menu.
| Part | What it is |
| nav.site | the site menu |
| .nav-cta | its one action |
| .m-menu | the menu button on a phone |
| .m-panel | the panel it opens |
Footer
The dark band that closes every page: the mark, the line, and the copyright. A public page adds a row of links under the copyright; a client page has none. This page’s own footer, at the bottom, is the sample, because a page carries one footer.
| Part | What it is |
| footer | the band |
| .mark | the harperOS mark |
| .line | the line under it |
| .conf | the copyright |
| .flinks | the links, on a client family that declares them |
| .fcols / .fcol / .fh | the site's directory: every public page one click away, in short columns under a mono heading |
Templates
A template fixes which sections a page has, in which order, and the blocks each one uses.
Private overview
The document sent to a named reader. It is rendered from blocks: content/clients/overview/ builds the staging overview at /staging/overview, the page that goes public when it is approved.
| Section | Blocks |
| Cover and vision | section label · cover · lockup with H1 · point row |
| The problem | lockup · card grid, compare (six) |
| What we’re for | lockup · point row |
| What we build | lockup · card grid, parts |
| Your systems | lockup · logo panel |
| How it works | lockup · workflow, branch |
| When the work happens | lockup · split with a product screen · card grid, quote (one) |
| At team level | lockup · point row |
| Why you can trust it | lockup · workflow, across |
| The functions | lockup · card grid, function (six) |
| The people | lockup · point row |
| The proof | lockup · stats (four) · logo panel, clients · card grid, quote (two) · next step |
| Part | What it is |
| body.overview-doc | turns a page into this template: the cover, the 720px lockup column, the smaller headings |
Approach and proposal
What we would build for a named reader, and how it gets built: one template at two depths. An approach is a proposal before the price and before the detail, so turning one into the other fills fields and rebuilds nothing. The standard sections live in content/templates/approach.mjs; a client fills only its slots: its functions, once, which feed both the scope and the agents.
| Section | Blocks |
| Opening (H1) | scopeHero(): section label · the standard title · one paragraph, the scope formula then the timing (a proposal adds the price) · card grid, function, boxed, two across |
| Parts (H2) | numbered: the engagement, the sequence, pricing, referrals; each a lockup with the full section break |
| The engagement | lockup · point row, inline, one linked numbered point a pillar |
| A pillar (H3) | a chapter inside the engagement: grey label, subheading · numbered H4 sub-labels (1.1), each over a card grid or a point row |
| The agents, pillar 4 | caveat · per function: function head (icon and name) · on an approach, light agent cards; on a proposal, the full agent card for each agent |
| The sequence | lockup · workflow, stacked, one step a stage; a proposal may carry its quoted deal’s own stages |
| Pricing | lockup · boxes · H4 sub-label · proof list, the terms; a proposal adds the figure (price) |
| Referrals | lockup, the ask in the subhead · stats: one introduction, 10%, and on a proposal the figure for their size · next step |
Company read
A page about the reader's own company before anything about us: their world from their own published figures, each function today beside on agents, the workflow they described, what their companies could do together, the plan on their calendar, and the questions only they can answer. Step 02 of a warm family, before the approach.
| Section | Blocks |
| Opening (H1) | section label · cover · label · the standard title · one line |
| Your company | lockup, a dated fact in the heading · stats (four) · card grid, parts, one card per company |
| How the work runs | lockup · compare, one row per function |
| One workflow | lockup · workflow, across, three to five steps, no caption |
| Together | lockup · card grid, parts (optional) |
| The plan | lockup · workflow, across |
| What we would confirm | lockup · list of questions · next step |
Public page
The homepage, About and Articles. They are moving onto these blocks one page at a time: each renders first as a staging draft, and its live page switches once the two have been compared side by side.