Writing
How to write interface text in Zenox products, from button labels to error messages.
Interface text is part of the design. A label that names the wrong thing or an error that does not say how to fix it costs the user as much as a broken control. These rules apply to every string a Zenox product shows, in English, Portuguese and Spanish alike, and to the defaults the library’s patterns ship with.
Voice and tone
Zenox users investigate threats and fix exposures, often under time pressure. Write like a competent colleague: direct, calm and specific.
- Direct. Lead with what matters. Cut words that do not change the meaning.
- Calm. State severity as a fact; never add alarm the data does not carry. No exclamation points.
- Specific. Name the object and the number: “3 domains expire this week”, not “Some items need attention”.
- Respectful. Never blame the user, never joke about a failure, never call a task “simple”.
| Too formal | Too casual | Right |
|---|---|---|
| The requested operation could not be completed due to insufficient permissions. | Oops, you can’t do that! | You don’t have permission to delete assets. Ask a tenant admin. |
| Please be advised that the scan has been successfully scheduled. | Scan’s all set, you’re good to go. | Scan scheduled for 02:00 |
Plain language
- Prefer short sentences and common words. If a sentence needs a second read, split it.
- Use one term for one concept, everywhere. If the product calls it an alert, it is never also a notification, an event or a finding on the next screen.
- Spell out acronyms at first use unless the audience uses them daily (IP, URL, CVE, DNS do not need it; “EASM” in onboarding text does).
- No idioms, metaphors or slang. They do not translate and do not help the reader.
- No judgments about effort or speed: drop “simply”, “just”, “easily”, “quickly”. What is easy for one person is not for another.
- Software does not want, think or see. “The scan found 4 open ports”, not “The scanner thinks there are 4 open ports”. Established terms such as “ingest” are fine.
- Name the thing. “Select the Domain field”, not “Select it”.
Voice, tense and mood
- Use the active voice and the present tense: “Zenox checks the certificate every hour.”
- Use the imperative for instructions: “Enter a domain.” Not “You should enter a domain.”
- Use the passive voice when naming the actor would blame the user: “The file couldn’t be uploaded”, not “You uploaded an invalid file”.
- Use the future tense only for something that will happen at a known time: “The report will be sent at 08:00.”
Capitalization
Sentence case for everything: page and dialog titles, buttons, tabs, menu items, labels, column headers, toasts. Capitalize only the first word and proper nouns.
| Right | Wrong |
|---|---|
| Create alert rule | Create Alert Rule |
| Last seen | Last Seen |
| Connect Microsoft Entra ID | Connect microsoft entra id |
- Product, company and standard names keep their own capitalization: Zenox, Vydar, Tellyu, Microsoft Entra ID, CVE-2024-3400.
- Never type text in capitals. The only uppercase in the interface is the caption style
(
text-xs font-semibold uppercase tracking-widest), applied with CSS, for short group labels such as sidebar sections.
Punctuation and symbols
| Mark | Rule |
|---|---|
| Period | End full sentences with one: descriptions, helper text, message bodies. No period on titles, labels, buttons, menu items, tabs, column headers, placeholders, toast titles or empty-state titles. |
| Colon | No colon after a form label: the label sits above the field. Use one only to join a label and a value on one line (“Owner: Security team”) and to introduce a list. |
| Comma | Use the serial comma in English lists: “domains, hosts, and certificates”. |
| Hyphen | Join compound adjectives before a noun: “case-sensitive value”, “high-severity alerts”. No spaces around it. |
| Dashes | No em or en dashes in interface text. Split the sentence or use a comma. Write ranges with words: “10 to 20”. |
| Ellipsis | Not in buttons, menu items, labels or placeholders, and not to show progress: loading is a Spinner or a Skeleton. |
| Exclamation point | Never. |
| Question mark | Only in a confirmation title that asks for a decision: “Delete asset vpn-01?” |
| Quotation marks | Straight double quotes (") around names the user typed or chose, inside a sentence: Rule "Leaked credentials" was deleted. Not around IDs, dates, numbers or UI labels, and never for emphasis. |
| Parentheses | Avoid them in labels and buttons. Never write plurals as “(s)”. |
| Slash | In sentences, write the word you mean: “Linux or Windows”. A spaced slash may join two distinct values in a narrow column header: “City / Country”. |
| Ampersand | Write “and”. Keep & only inside a proper name. |
| Apostrophe | Contractions are fine in English (“can’t”, “don’t”). Do not make product names possessive: “the Vydar dashboard”, not “Vydar’s dashboard”. |
Numbers, dates and values
Numbers, dates, times, identifiers and empty values follow Data display: absolute times in the user’s time zone, numbers through the locale’s formatters, and a muted dash for an empty value.
Word choice
Use the same verb for the same action across every product and language. The Portuguese and Spanish columns are the reference for the products’ translation files.
| English | Portuguese | Spanish | Use for | Not |
|---|---|---|---|---|
| Create | Criar | Crear | Making a new object and saving it | Add (for new objects), New (as a button) |
| Add | Adicionar | Agregar | Putting an existing thing into a list or group: add a member, add a domain to a scope | Create |
| Edit | Editar | Editar | Changing an existing object | Modify, Update (as a button) |
| Save | Salvar | Guardar | Keeping changes to an existing object | Apply (in forms) |
| Apply | Aplicar | Aplicar | Applying filters or settings that affect a view | Save |
| Submit | Enviar | Enviar | Sending something into a review or workflow | Send (unless it is a message) |
| Cancel | Cancelar | Cancelar | Leaving a task without keeping changes | Abort, Dismiss |
| Close | Fechar | Cerrar | Closing something that changed nothing (a details panel, an error dialog) | OK |
| Delete | Excluir | Eliminar | Destroying something that was saved | Remove, Erase; “Deletar”, “Apagar” |
| Remove | Remover | Quitar | Taking something out of a list without destroying it | Delete |
| Discard | Descartar | Descartar | Throwing away unsaved changes or a draft | Delete |
| Duplicate | Duplicar | Duplicar | Creating a new object from an existing one | Copy, Clone |
| Copy | Copiar | Copiar | Copying a value to the clipboard | Duplicate |
| Export | Exportar | Exportar | Producing a file: “Export to CSV”, “Export to PDF” | Download (as a button), product names |
| Try again | Tentar novamente | Reintentar | Retrying a failed request | Retry, Reload |
| Clear | Limpar | Limpiar | Removing applied filters or a typed value | Reset (unless restoring defaults) |
| Show more / Show less | Mostrar mais / menos | Mostrar más / menos | Expanding and collapsing a list | See more, Expand |
| Sign in / Sign out | Entrar / Sair | Iniciar sesión / Cerrar sesión | Starting and ending a session | Log in, Login, Log out |
- “OK” only acknowledges information. Never pair a question with OK and Cancel, or with Yes and No: name the action instead.
- Say “please” only when you are making the user wait or redo work, and not in every message.
- Do not say “successfully” (“com sucesso”, “con éxito”) in a success message: the message itself says it worked.
Text in components
| Element | Rule | Example |
|---|---|---|
| Button | A verb, plus the object when it is not obvious. One to three words. | Create rule, Export to CSV |
| Link | Describe the destination. A link that reads “Learn more” alone says nothing to a screen reader. | Learn about detection rules |
| Page title | The object or the task, as a noun phrase. | Alerts, Detection rules |
| Dialog title | What happens, or the question to answer. | Invite member, Delete asset vpn-01? |
| Field label | A noun phrase naming the value. Never a sentence, never a colon. | Domain, Notification email |
| Placeholder | An example of the expected format, only when it helps. Never a replacement for the label; it disappears as the user types. No period. | acme.com |
| Helper text | One sentence about format, limits or consequences, with a period. | Separate several domains with commas. |
| Tooltip | The name of an icon-only control, or one short sentence of help. | Copy, Refresh |
| Tab, menu item | A noun or a short verb phrase, sentence case. | Overview, Export to PDF |
| Column header | Singular when each row has one value, plural when a cell lists several. | Owner, Tags |
| Badge, status | One or two words, a state not a sentence. | Resolved, In progress |
Messages
Every message answers up to three questions, in this order: what happened, why, and what the user can do. Skip the “why” when it does not help them act.
| Type | Write | Example |
|---|---|---|
| Success | A short past-tense statement, the object first. No period, no “successfully”. | Asset deleted, 12 alerts resolved |
| Error | What went wrong and what to do, in full sentences. No error codes or stack traces in the text: put them in a “Details” section or in the logs. | The report couldn’t be generated. Try again in a few minutes. |
| Field error | How to fix the value, not that it is wrong. | Enter a domain, such as acme.com. |
| Required field | Name the field. | Domain is required. |
| Warning | The consequence, then the choice. | 3 of 12 alerts are already closed and won’t change. Resolve the other 9? |
| Confirmation | Title: the question, naming the object. Body: what changes and whether it can be undone. Button: the same verb as the title. | Delete asset vpn-01? / Its findings and history are deleted too. This can’t be undone. / Delete asset |
| Information | Context the user should know before acting, one or two sentences. | Results include assets discovered in the last 30 days. |
Never show a raw backend message to the user: it can carry internal details or personal data. Map known errors to written messages and fall back to a generic one. When an unexpected error may reach support, show the request ID as a copyable value under the message (“Reference: 7f3a9c”), so support can find the request in the logs.
Writing for translation
Every Zenox interface ships in English, Portuguese and Spanish.
- Keep a message in one string, with named variables:
"{count} alerts resolved". Never build a sentence by joining fragments; word order changes between languages. - Write singular and plural as separate strings, chosen by count. Never “(s)”.
- Leave room: Portuguese and Spanish run about 30% longer than English. Do not size a button or a column to the English text.
- Do not put a variable where its grammar depends on the word (gender, articles). Write a separate message for each case instead.
- Quote names the user typed so the sentence stays readable in every language.