The four brand colors I wrote in my first prompt in January are still in my app today, to the exact hex code. Almost nothing else from that first sketch survived: not the logo, not the font setup, and certainly not the way I handled five languages.
This episode is about the visual identity and the language of the app, and about the AI's role in both. It's the part of the project where I disagreed with the AI the most. In the previous episode I told how one rule in the data model fixed the direction of the whole spec.
Colors decided on day one
My first prompt didn't just describe the app. It listed fourteen colors, each with a name and a job:
- Primary
#E040FB, a bright purple, for the main buttons; - Secondary
#7C4DFF, an electric violet, for links and active states; - Accent
#FF4081, neon pink, for notifications and social elements; - Accent
#40C4FF, bright cyan, for status indicators; - then backgrounds, text colors, success, warning and error.
Today the theme file of the app has the same four codes. It even keeps custom colors named after my January descriptions, translated into English: primaryVibrantPurple, secondaryElectricViolet, accentNeonPink, accentBrightCyan. Some things changed: a different red for errors, the dark backgrounds, and a lime green added later for public events.
In August, during a redesign, the AI proposed a calmer look: one single accent color and warm neutrals. It applied it. I looked at it for a day and reverted it. Neon colors read better in both light and dark mode, and the neutral version looked flat. I wrote it down as a product decision not to reopen, because I knew the next session would propose it again.
The AI was right about one thing, though. My brand purple on a white background has a contrast ratio of 3.2, below the 4.5 recommended for text. Links moved to a darker violet. The purple stayed for buttons and highlights, where it works.
A font chosen for legibility
The same January prompt chose the font: Atkinson Hyperlegible, a typeface designed to be easy to read for people with low vision. I wanted an app that anyone could read at a glance, outside, on a small screen.
It's still there, but only for titles. In the August redesign the body text moved to Inter, which is denser and works better in lists and small labels.
And here is the honest part. The app uses Atkinson and Inter. The website uses three other fonts. A printed flyer I made in August uses yet another family. Three type systems for one small product. The only thing they really share is the logo. If I started again, I would decide one type system for everything on day one, the same way I decided the colors.
The logo I threw away
The first logo, from January 22, was three intertwined circles with a small lime star in the middle. Circles of friends overlapping. I liked it, and I used it in the first test builds.
I dropped it after the very first builds for testers, before the public release, and redid it. The new one is a map pin with an orbit around it: a place, not a group of people.
Looking back, the logo changed direction before I could say it in words. The app moved from "who" to "where" in the drawing first.
Five languages, the hardest part
I wanted Italian, English, Spanish, French and Romanian from the first prompt, because I knew who I wanted to reach. It still turned out to be the hardest part of the identity, for reasons that had nothing to do with translation.
The AI dropped a language. On February 18 the master prompt listed the supported languages as "Italian, Spanish, French, German". Romanian had disappeared and German had appeared. The work plan of the next day set English as the main language and enabled Italian, Spanish and French. Nobody had asked for German. I only noticed because I reread the list.
The first screens weren't translated at all. In February the texts were written directly inside the widgets, in Italian: "Sono qui", "Mi piacerebbe". The spec then said every fixed string must go into FlutterFlow's language panel. That worked for labels, but not for everything: messages in snackbars, dialogs and custom code don't live in that panel.
So for a while I made a rule: whatever isn't in the panel stays in English, as a common language. In July some screens showed Italian buttons next to English labels. I reversed the rule and translated everything. Today the app has 264 texts in five languages in the language panel, about 145 more translated field by field inside pages and components, and twelve custom code files that carry their own translation tables. The text of the permission requests lives in yet another place. "Five languages" turned out to mean four different places to keep in sync.
A language audit found the leaks. An audit in August found sentences where one language had leaked into another: "Bienvenido par" (Spanish with French inside), "Pas besoin di rester" (French with Italian inside), and French that switched between formal and informal "you" across nineteen strings.
Words that changed
Some of the best decisions were about words, not code:
| Concept | Italian | English | Spanish | French | Romanian |
|---|---|---|---|---|---|
| Wish | Vorrei | Wish | Me gustaría | Je voudrais | Aș vrea |
| Ghost mode | Evento invisibile | Invisible event | Evento invisible | Événement invisible | Eveniment invizibil |
| History | I miei eventi | My events | Mis eventos | Mes événements | Evenimentele mele |
| Tags | Gruppi | Groups | Grupos | Groupes | Grupuri |
- The Wish is a noun only in English. In the other four languages it became a verb in the conditional: "I would like". It sounds like something you say to a friend, not like a feature.
- Ghost mode and Vault were good internal names. Users read "invisible event" and "my events".
- Tags became groups. Nobody tags their friends.
- The animated intro had a play on words, "orbit to me". I removed it: it doesn't survive translation.
What I took from it
- Decide colors early and write down why. They are the part of a brand that lasts.
- Decide one type system for everything you'll ever publish, not only for the app.
- An AI will happily "improve" your identity every session. Write your decisions down as decisions, or you'll defend them again every week.
- Five languages is not a translation task. It's an architecture task: know where every string lives before you write the first one.
- Reread the AI's lists. It replaced a language and nobody would have noticed.
Next episode: evolutions and fixes. Most of my bugs started with a word, not with code.
I'm building orbiTome solo, with FlutterFlow and Firebase. More at orbitome.com.


Top comments (0)