Skip to main content
Flowra
PricingCommunityFAQ
JoinStart with Flowra
  • PricingPlans, seats and payment
  • Frequently asked questionsEverything you have asked, in one place
  • Contact usWrite to the right team
  • CommunityKaro Studio, who make Flowra

For your team

  • Marketing teamsCampaigns from brief to launch
  • Product and dev teamsFeatures and bugs with full context
  • Design and content teamsBrief, files and delivery side by side
  • Operations teamsWork, documents and costs you can track
  • Sales and services teamsFrom meeting to contract and payment
  • Remote teamsOnline meeting to delivery, on your time

For your role

  • Project managersAction stories instead of chasing the team
  • Freelancers and consultantsFrom brief to contract and settlement

For your workflow

  • Meeting to actionMeeting decisions as trackable work
  • Actions with financial contextCosts next to the work that caused them
  • Actions with contract contextEvery commitment as trackable work
  • Brief to project deliveryEvery project step, one complete action
See all solutionsStart with FlowraJoin
++
Flowra design system

Fundamentals

PrinciplesVoice and writingCopy rules for each surfaceGlossaryRTL and languagesNumbers and datesAccessibility

Foundations

ColorDark modePrintingTypographySpacing and layoutRadius and shadowLayersMotionNotification soundKeyboard shortcutsIconsService logos

Components

ButtonsText fieldPickerDate and timeCheckboxRadioKeySegmented controlSliderMenu and sheetDialogCard and listTables and data listsBadge, pill, and switchTabs and filtersAvatarEmpty and loading statesProgress and stepsToastFloating helpNavigationPage headerAssistants

Patterns

Connector pageList, filter, and searchForm layoutCreation flowUpgrade promptConfirmation and irreversible actionsPhone layoutFixed bars and scrolling

Brand

Flowra brandMark and logoBrand colorBrand typographyMisuse

Design system/Fundamentals

Voice and writing

Text is part of the interface, not something poured on at the end. Flowra speaks in a friendly, short, precise way, and every string people see goes through one path: tr().

In codelib/tr.tslib/locales/

On this page

  1. Voice
  2. Buttons are verbs
  3. No internal words
  4. Punctuation
  5. Strings in code
  6. Error messages in three parts
  7. Length and shape

Voice

We use the informal you, like a colleague sitting next to you. Sentences are short, verbs are clear, and we don't promise anything that isn't built.

Do

"We'll let you know when it's ready."

Don't

"This feature will be made available in future releases."

Do

"No one with this username was found."

Don't

"Error 404: User not found."

Buttons are verbs

A button's label says what happens when you press it: "Create action", "Save", "Yes, delete". "OK" and "Confirm" on their own say nothing. In a delete dialog, the primary button names the action itself, so someone who only reads the button still knows what it does.

No internal words

People don't care about IDs, feature flags, APIs, or database table names. A server error is translated into a sentence that says what happened and what to do now. The technical reason belongs in the audit log, for whoever asks for it.

Do

"The payment didn't go through. Please try again later."

Don't

"Gateway has not been implemented yet."

Punctuation

  • The em dash never appears anywhere in user-facing text, in any language. Use a period, comma, semicolon, or colon instead.
  • Quotations and section names go inside Persian quotation marks «».
  • The product name is «فلورا» in Persian text and Flowra in the Brand kit and Latin-script text: one word with a capital F.
  • Numbers are written with numLocale() so each language gets its own digits and separators.

Strings in code

Every Persian string people see is written inside tr() and has an entry in each language's catalog. Parameterized sentences use the asterisk pattern so word order stays free in every language. The result of tr() is never stored in a module-level constant, because it's built only once, in whatever language is active at that moment; use trMap for tables and trList for lists.

Values stored in the database stay in Persian and are translated at display time, not at write time.

tr("دعوت «*» رد شد.").replace("*", name)

// a module-level list: rebuilt when the language changes
const STATUSES = trList(() => [tr("باز"), tr("انجام شد")]);

Error messages in three parts

An error message says what happened, why if it helps the person, and what to do now. It sits under the relevant field, not at the top of the form.

Do

“Your password needs at least 8 characters.”

Don't

“Invalid input.”

Do

“That username is taken. Try another one.”

Don't

“Error: duplicate.”

Do

"The payment didn't go through. Please try again later."

Don't

“Error 503 from gateway.”

Length and shape

  • Button labels are one to three words, verb first: “Create action”, “Upgrade to Prime”.
  • A field label is a noun: “Email”, “Amount”. When it floats up it's 11px, and a full sentence gets cut off.
  • A toast is one sentence with no button, and stays no longer than 3.6 seconds.
  • An empty state sentence has two parts: what isn't there, and how to create the first one.
  • A confirmation dialog states the consequence, and its button names the action itself: “Yes, delete”.

Do

“You don't have any projects yet.”

Don't

“There are no items to display.”

Do

“Saved.”

Don't

“The operation was completed successfully.”

Why

Short text stays short in nine languages. A sentence that's long in Persian spills out of the button in German.

Related pages

RTL and languagesEvery string goes through tr() and reaches nine languages.PrinciplesThe principle of honesty, in words.Confirmation and irreversible actionsA confirm button's label names the action that will happen.Empty and loading statesThe empty state sentence: what's missing and how to fix it.Flowra brandBrand voice and our own vocabulary.ButtonsButtons are verbs.ToastToast sentences are short and straight.
PreviousPrinciplesNextCopy rules for each surface

Related pages

  • PageBrand kitThe Flowra mark and logo, colors, typography, clear space and minimum size, and the brand kit files to download.
  • PageDocumentationThe complete Flowra guide: actions, calendar, meetings, knowledge, files, Folio, chat, network, finance, connectors, settings and AI, each with its connections.
  • PageChangelogWhat each release added to Flowra, what got better, and what’s coming next.
  • PageContact usReach the right team: support, sales and plans, partnerships, careers, or security and privacy.
Flowra

Flowra is an all-in-one workspace for managing tasks, projects, finances, meetings, and teamwork, powered by AI to keep everything organized in one place.

Solutions for teams

  • Marketing teams
  • Product and dev teams
  • Design and content teams
  • Operations teams
  • Sales and services teams
  • Remote teams

Roles and flows

  • Project managers
  • Freelancers and consultants
  • Meeting to action
  • Actions with financial context
  • Actions with contract context
  • Brief to project delivery

With Flowra

  • All solutions
  • Pricing
  • Frequently asked questions
  • Documentation
  • Contact us
  • Brand kit
  • Design system
Crafted by Karo Studio
SecurityPrivacyTermsCookies
Version 0.16.0