April 25, 2026 · Gökhan Oğuz

Custom Art and the Deduplication Marathon

An AAC app lives and dies by its symbols. Kids don't read labels — they recognise pictures. Today the app got its own visual identity: 387 hand-crafted SVG icons across all 16 categories, a brutal deduplication pass, and fixes to the sentence helper row. The grid finally looks like our app, not a Mulberry reskin.

387

Custom SVGs

457

Visible Symbols

514

Duplicates Hidden

691

Tests

The Sesla Art Style

Every symbol follows a consistent formula: 100×100 SVG viewBox, rounded 12px background, bold outlines, flat fills, no gradients. A banana looks like a banana at 64 pixels wide. A house reads instantly as a house. The palette is bright but not garish — about 30 named colours that map to natural categories (green for nature, blue for places, yellow for food).

The generator script covers all 16 categories: social expressions, feelings, people, colours, drinks, numbers, time, nature, places, animals, play, school, home, food, actions, and body. Plus a "board extras" section for symbols that only appear in pre-built boards. Each symbol is a few hundred bytes of SVG — the entire set adds barely anything to the app bundle.

The Duplication Problem

Here's what happens when you have 4,371 symbol entries and multiple data sources: duplicates. Lots of them. The original Mulberry set had multiple entries for common words. Our generator created new entries for the same words. Board-specific symbols overlapped with category symbols. It was a mess.

A child tapping into the "Body" category shouldn't see two copies of "El" (hand) with slightly different art. That's confusing, not helpful.

The fix was two automated dedup passes. The first one caught 409 obvious duplicates — same Turkish text, keep the lower-numbered entry, hide the rest. The second pass, after art generation created new entries, caught another 105. The scoring logic prefers entries with custom Sesla art, then checks if the symbol is referenced by a pre-built board (can't hide those), then falls back to ID number.

End result: 457 visible symbols, zero duplicate text within any category. Clean grids.

Fixing the Helper Row

Remember the sentence helper row from last time? The pinned pronouns and verbs at the top of every category? Two of the core symbols — "O" (he/she/it) and "Benim" (my/mine) — were showing broken placeholders. They'd been hidden during dedup because they were Mulberry entries, and nobody had created Sesla replacements.

Created proper SVGs for both, plus the question mark symbol. The helper row now renders cleanly: Ben, Sen, O, Benim, Hayır, Dün, Yarın, and the question mark — all in the Sesla art style, always visible, every category.

Pre-Built Boards

The three Turkish boards (Temel İletişim, Yemek Zamanı, Okul) reference 69 specific symbol IDs. All of them now have Sesla art and none are accidentally hidden. A small thing, but pre-built boards are the first thing a new user sees after onboarding. Every symbol needs to render — no question marks, no missing images.

Visual QA, Category by Category

Went through every category on the simulator, taking screenshots. Most categories looked great. A few things to revisit later — some food items could be more recognisable, and there are still a handful of Mulberry-style symbols mixed in where the generator didn't have a custom version. But the overall feel has shifted from "borrowed open-source art" to "cohesive visual language."

Symbols are the words of an AAC app. Today the app learned to speak in its own visual dialect instead of borrowing someone else's.

What's Next

Some individual symbols need art touch-ups. The tablet layout got responsive treatment last session but hasn't been tested with the new symbol set. And the English locale needs the same dedup and art treatment that Turkish just got. But the core visual identity is here — 387 symbols, one consistent style, zero duplicates.