Skip to content

Commit 6f9b04f

Browse files
committed
Copy pass: one word for each thing, and plainer text everywhere
Bot everywhere a person reads it (agent only for an outside program), admin rather than administrator, conversation rather than channel, and OpenBot rather than this deployment outside Admin. Shorter headings, descriptions, empty states, errors and server messages that say what happened and what to do next. Adds .claude/skills/openbot-copy, the glossary and style guide. Text written for the model is unchanged.
1 parent f01572b commit 6f9b04f

259 files changed

Lines changed: 1616 additions & 1562 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
---
2+
name: openbot-copy
3+
description: The words and the voice for every piece of text a person reads in OpenBot — screen headings and descriptions, buttons, empty states, notices, chat cards, and the server's error and refusal messages that reach the browser. Holds the glossary (Bot, app, admin, OpenBot) and the style rules. Use when writing or changing any text that is shown to a person, naming a screen, a section, a button or a state, writing an error or refusal message, or reviewing a diff that adds user-facing strings under app/src or server/src. Don't use for text written for the model (tool descriptions, standing instructions, system prompts), for code comments, or for the docs under docs/.
4+
---
5+
6+
# OpenBot Copy
7+
8+
## When To Use
9+
10+
Any string a person reads: a heading, a description, a button, a placeholder, an empty state, a
11+
notice, a chat card, a server error that the browser shows. Server messages count: a 409 that says
12+
what to do next is read by a person as much as any screen is.
13+
14+
Not text written for the model. Tool descriptions, standing instructions and prompts steer how a Bot
15+
behaves, and changing their wording is a behaviour change with its own review. Not code comments,
16+
and not `docs/`, which has its own register.
17+
18+
## The Glossary
19+
20+
One word for one thing, everywhere a person can see it.
21+
22+
| Say | For | Not |
23+
|---|---|---|
24+
| **Bot**, **Bots** (capitalised) | What a person creates, talks to and gives work to. | agent, coworker, assistant, AI |
25+
| **agent** | Only an outside framework's program, in the places that are about connecting one: "an agent you already run", "AG-UI agent". | Bot, when the thing is a Bot |
26+
| **app** | A service a Bot uses: Gmail, Google Drive, Notion. | connector, integration, plugin (outside Admin) |
27+
| **Connections** | The apps and accounts a Bot uses as you, and the page that lists them. | connected accounts, linked accounts |
28+
| **connect / disconnect / reconnect** | What a person does to their own account. | link (except GitHub and Slack identity, where "link" is the vendor's own word) |
29+
| **Capabilities** | Your skills and your Bots' memory of you, and the page with both. | plugins |
30+
| **skill** | A named instruction invoked with `/`. | command, prompt |
31+
| **admin** | The person who runs OpenBot for everybody. | administrator, owner, operator |
32+
| **OpenBot** | The product the person is using. | this deployment, the server, the instance |
33+
| **turn on / turn off** | An admin switching an app or a feature. | enable / disable (in sentences; a switch may still read "Enabled") |
34+
| **conversation** | A thread with one or more Bots. | channel, chat (in sentences) |
35+
36+
**Admin is allowed exact names.** An admin page may name `COMPOSIO_API_KEY`, OAuth and "deployment",
37+
because the admin is the one who sets them. A page anybody can open may not.
38+
39+
## The Style
40+
41+
1. **Say what happened, then what to do.** "Gmail isn't connected. Connect it to let Bots read your
42+
mail." Not why the screen is built the way it is.
43+
2. **One idea per sentence. Short sentences.** A description is one or two sentences, about 20 words.
44+
3. **Plain words.** "use", not "hold a grant on". "can't", not "is unable to". Contractions are fine.
45+
4. **No "rather than", no em dashes, no "which is why", no "so that nothing … that may be wrong".**
46+
These are the marks of text that is explaining itself. Cut the clause or make it its own sentence.
47+
5. **No internals outside Admin.** Composio, OAuth client, credential, token, grant, scope,
48+
deployment, broker, endpoint: say what the person sees instead ("not set up yet", "your account",
49+
"this Bot can use it").
50+
6. **Second person.** "Your apps", "you can". The Bot is "it".
51+
7. **Sentence case** for headings and buttons: "New Bot", "Your connections".
52+
8. **Buttons are verbs**: Connect, Request access, Create, Save. A button never says "Click here" or
53+
"OK" when it does something specific.
54+
9. **Errors**: what failed, in the person's terms, and one next step. "Couldn't load your
55+
connections. Reload the page." No stack of reasons, no blame.
56+
10. **Empty states** say what will appear and how: "No skills yet. Write one with New skill."
57+
58+
## Before And After
59+
60+
| Before | After |
61+
|---|---|
62+
| Your connected accounts could not be loaded, so nothing is listed here rather than a list that may be wrong. Reload the page, and tell an administrator if it persists. | Couldn't load your connections. Reload the page, or ask an admin if it keeps happening. |
63+
| Sent to the coworker it is for. Type @ to choose one yourself. | OpenBot picks the right Bot. Type @ to choose one. |
64+
| Gmail is a Composio app, and this deployment has no Composio key. (to a non-admin) | Gmail isn't set up yet. An admin has to turn it on. |
65+
| The agent is still working on another request. Please wait or stop that task first. | This Bot is still working on something. Wait for it, or stop it first. |
66+
67+
## Red Flags
68+
69+
| Signal | Do instead |
70+
|---|---|
71+
| "agent" or "coworker" for a Bot | Bot |
72+
| "administrator" | admin |
73+
| "this deployment" on a page anybody can open | OpenBot, or say what is missing |
74+
| A sentence over ~25 words | Split it, or cut the clause that justifies the screen |
75+
| "rather than", an em dash, "which is" in UI text | Rewrite as two short sentences |
76+
| An env var, OAuth, Composio or "grant" outside Admin | Say what the person sees |
77+
| A test asserting long explanatory copy | Assert the short sentence, or the role and the key words |

‎CHANGELOG.md‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ Newest first. `Unreleased` is what is on `main` and not yet tagged.
3535
request for an administrator to switch on a work app, grant it to a Bot, or connect a Shared app's
3636
team account is kept, with who answered it and when. It starts empty and nothing is backfilled.
3737

38+
### Plainer words, and one word for each thing
39+
40+
OpenBot now says **Bot** everywhere a person reads it, where screens used to mix Bot, agent, coworker
41+
and assistant; "agent" is kept only for an outside program you connect. It says **admin** rather
42+
than administrator, **conversation** rather than channel, and **OpenBot** rather than "this
43+
deployment" on pages anybody can open. Headings, descriptions, empty states, errors and the
44+
messages the server shows are shorter and say what happened and what to do next, across the home
45+
page, a Bot's pages, Capabilities, Connections, Settings, conversations and Admin. Admin keeps the
46+
exact setting names an admin needs, such as `COMPOSIO_API_KEY`. Text written for the model, such
47+
as tool descriptions and instructions, is unchanged.
48+
3849
### Every settings screen is the same, slightly wider column
3950

4051
Settings, Admin, Connections, Capabilities and each Bot's pages share one column width, now 720px instead of 630px, so

‎app/src/components/admin/admin-sidebar.tsx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ const GROUPS: {
8383
linkOptions: { to: "/admin/skills" },
8484
},
8585
{
86-
title: "Automatic Learning",
86+
title: "Automatic learning",
8787
icon: IconFileText,
8888
linkOptions: { to: "/admin/learning" },
8989
},
9090
{
91-
title: "UI Components",
91+
title: "UI components",
9292
icon: IconLayoutGrid,
9393
linkOptions: { to: "/admin/components" },
9494
},

‎app/src/components/agents/agent-profile.tsx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export function AgentProfile({ agentId }: { agentId: string }) {
5757
if (agent.error || !agent.data) {
5858
return (
5959
<p className="p-8 text-sm text-destructive" role="alert">
60-
Could not load this coworker.
60+
Couldn't load this Bot.
6161
</p>
6262
);
6363
}
@@ -103,7 +103,7 @@ export function AgentProfile({ agentId }: { agentId: string }) {
103103
void navigate({ search: { agent: agentId }, to: "/channel/new" })
104104
}
105105
>
106-
Start new channel
106+
New conversation
107107
</Button>
108108
<Button
109109
className="w-full text-sm!"

‎app/src/components/agents/callback-token-panel.tsx‎

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,19 @@ export function CallbackTokenPanel({
3737
return (
3838
<section className="mt-6 grid gap-2">
3939
<h2 className="font-medium text-muted-foreground text-xs uppercase tracking-wide">
40-
Calling tools back
40+
Key for tools
4141
</h2>
4242

4343
<p className="text-muted-foreground text-sm">
4444
{hasToken
45-
? "This coworker holds a credential, so it can use the tools it has been granted. Rotating replaces it, and the old one stops working straight away."
46-
: "This coworker has no credential, so it can hold a conversation but cannot use any tool it has been granted. Generate one and put it in that agent's configuration."}
45+
? "This Bot has a key, so it can use its tools. If you make a new key, the old one stops working right away."
46+
: "This Bot has no key yet. It can talk but can't use tools. Generate a key and add it to your agent's configuration."}
4747
</p>
4848

4949
{token ? (
5050
<div className="grid gap-2 rounded-lg border border-border bg-card p-3">
5151
<p className="font-medium text-sm">
52-
Copy this now. It will not be shown again.
52+
Copy this key now. You won't see it again.
5353
</p>
5454
{/*
5555
* Selectable and wrapped rather than a copy button alone: somebody pasting this into a
@@ -59,8 +59,7 @@ export function CallbackTokenPanel({
5959
{token}
6060
</code>
6161
<p className="text-muted-foreground text-xs">
62-
The deployment keeps only a hash of it, so nothing here can show it
63-
to you a second time.
62+
If you lose it, make a new one.
6463
</p>
6564
<Button onClick={() => setToken(null)} size="sm" variant="outline">
6665
Done
@@ -77,8 +76,8 @@ export function CallbackTokenPanel({
7776
{issue.isPending
7877
? "Generating…"
7978
: hasToken
80-
? "Rotate token"
81-
: "Generate token"}
79+
? "Make a new key"
80+
: "Generate key"}
8281
</Button>
8382
{hasToken ? (
8483
<Button
@@ -87,7 +86,7 @@ export function CallbackTokenPanel({
8786
size="sm"
8887
variant="outline"
8988
>
90-
{revoke.isPending ? "Revoking…" : "Revoke"}
89+
{revoke.isPending ? "Revoking…" : "Revoke key"}
9190
</Button>
9291
) : null}
9392
</div>

‎app/src/components/agents/handoff-panel.tsx‎

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,21 @@ export function HandoffPanel({ agentId }: { agentId: string }) {
7676
</span>
7777
) : null
7878
}
79-
description="Who this Bot may ask, not who may ask it. What the asked Bot says comes back into the conversation that asked, relayed and attributed."
80-
title="Bots it may ask"
79+
description="The Bots this one can ask for help. This doesn't change who can ask it. Their answers come back into the same conversation, under their name."
80+
title="Bots it can ask"
8181
>
8282
{/* Facts about the deployment rather than rows to act on, so said as sentences. */}
8383
{enabled ? null : (
8484
<PageEmpty>
85-
Switched off for this deployment. These grants are kept but none takes
86-
effect until handing work between Bots is switched back on.
85+
Handing work between Bots is turned off. These settings are kept, and
86+
they apply again once an admin turns it back on.
8787
</PageEmpty>
8888
)}
8989

9090
{grantable ? null : (
9191
<PageEmpty>
92-
This coworker cannot hand work on. This deployment has nowhere to
93-
record which Bots it may hand work to, so there is nothing to grant
94-
it. It can still be asked by Bots that can.
92+
This Bot can't hand work to other Bots. Other Bots can still hand work
93+
to it.
9594
</PageEmpty>
9695
)}
9796

@@ -103,8 +102,8 @@ export function HandoffPanel({ agentId }: { agentId: string }) {
103102

104103
{grantable && total === 0 ? (
105104
<PageEmpty>
106-
No other Bot here yet. When this deployment has more Bots, this is
107-
where this one is allowed to ask them.
105+
No other Bots yet. When there are more, you can let this Bot ask them
106+
here.
108107
</PageEmpty>
109108
) : null}
110109
{candidates.length > 0 ? (
@@ -129,7 +128,7 @@ export function HandoffPanel({ agentId }: { agentId: string }) {
129128
*/}
130129
<ItemDescription>
131130
{candidate.hidden
132-
? `${candidate.title} · hidden from your roster`
131+
? `${candidate.title} · hidden from your Bots list`
133132
: candidate.title}
134133
</ItemDescription>
135134
</ItemContent>
@@ -154,7 +153,7 @@ export function HandoffPanel({ agentId }: { agentId: string }) {
154153
) : null}
155154

156155
{canGrant ? null : (
157-
<PageEmpty>An administrator decides which Bots may be asked.</PageEmpty>
156+
<PageEmpty>An admin decides which Bots this one can ask.</PageEmpty>
158157
)}
159158
</PageSection>
160159
);

‎app/src/components/agents/new-bot-sheet.tsx‎

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ function NewBotFlow({ onCreated }: { onCreated: (agentId: string) => void }) {
194194
const named = name.trim() !== "";
195195
const endpointIssue =
196196
endpoint.trim() === ""
197-
? "An address is required for an agent you run."
197+
? "Enter your agent's address."
198198
: agentFormSchema.shape.endpoint.safeParse(endpoint).error?.issues[0]
199199
?.message;
200200
const busy = checking || createAgent.isPending;
@@ -486,13 +486,13 @@ const VISIBILITY_OPTIONS: Array<{
486486
{
487487
value: "private",
488488
title: "Private",
489-
description: "Only you can see it and start channels with it.",
489+
description: "Only you can see it and talk to it.",
490490
icon: IconLock,
491491
},
492492
{
493493
value: "public",
494494
title: "Public",
495-
description: "Everyone in the deployment can find and use it.",
495+
description: "Everyone in your OpenBot can find and use it.",
496496
icon: IconUsers,
497497
},
498498
];
@@ -562,9 +562,7 @@ function AboutStep({
562562
placeholder={runsHere ? "Finance Operations" : defaultTitle(runtime)}
563563
value={title}
564564
/>
565-
<FieldDescription>
566-
A few words, shown beneath its name in lists.
567-
</FieldDescription>
565+
<FieldDescription>A few words shown under its name.</FieldDescription>
568566
</Field>
569567
<Field>
570568
<FieldLabel htmlFor="new-bot-instructions">
@@ -582,8 +580,8 @@ function AboutStep({
582580
/>
583581
<FieldDescription>
584582
{runsHere
585-
? "How it behaves in every conversation. Left blank, it helps with whatever it is asked."
586-
: "Added to the agent's own instructions, in every conversation it joins."}
583+
? "How it should work. Leave it blank and it helps with anything."
584+
: "Added to your agent's own instructions."}
587585
</FieldDescription>
588586
</Field>
589587
<FieldSet>
@@ -686,8 +684,8 @@ function RuntimeStep({
686684
<span className="block font-semibold text-base">Run it here</span>
687685
<span className="mt-1 block text-pretty text-muted-foreground text-sm">
688686
{builtInAvailable
689-
? "OpenBot runs it for you. Nothing to set up — it can start work as soon as it is made."
690-
: "Not available yet. Whoever set OpenBot up has to switch this on first."}
687+
? "OpenBot runs it for you. Nothing to set up, and it can start right away."
688+
: "Not available yet. An admin has to turn this on first."}
691689
</span>
692690
</span>
693691
</button>
@@ -787,8 +785,8 @@ function EndpointStep({
787785
/>
788786
) : (
789787
<FieldDescription>
790-
Anything that speaks AG-UI works. This server dials your agent, so
791-
an agent on your own machine has to be reachable from here.
788+
Any agent that speaks AG-UI works. OpenBot connects to it, so it
789+
has to be reachable from OpenBot's server.
792790
</FieldDescription>
793791
)}
794792
</Field>
@@ -806,8 +804,8 @@ function EndpointStep({
806804
value={secret}
807805
/>
808806
<FieldDescription>
809-
Sent as an <code>Authorization</code> header on every run, and kept
810-
in the credential vault.
807+
Sent as an <code>Authorization</code> header with every request, and
808+
stored encrypted.
811809
</FieldDescription>
812810
</Field>
813811
</FieldGroup>

0 commit comments

Comments
 (0)