Qvnt
The project, in plain words.
Qvnt is a daily word puzzle for iOS, built around the Romanian language. The name is “cuvânt” (Romanian for “word”) with the vowels removed — six guesses, one shared word each day. It's my first native iOS app, designed and shipped solo to the App Store as a free portfolio project.
The whole game runs offline. The daily word is chosen deterministically from a curated list using the calendar date as a seed, so every player sees the same puzzle without any backend. A separate validated dictionary of roughly 10,000 five-letter Romanian words backs the guess checker, and stats and streaks persist locally with SwiftData.
Romanian brings its own quirks — diacritics (ă, â, î, ș, ț) and a letter frequency that differs from English Wordle. The brand idea of 'missing letters' runs through the UI: a dashed terracotta slot marks the active row, and the win moment reveals QVNT → CUVÂNT. It's all SwiftUI with the @Observable model — no UIKit, no third-party state libraries.
What I actually shipped.
- Designed and built the entire app solo — gameplay, state model, persistence, theming, and the App Store submission.
- Implemented a deterministic daily-word system seeded by the calendar date, so every player shares one puzzle with zero backend.
- Built a Romanian word validator over a curated ~10K-word dictionary, handling diacritics and language-specific letter matching.
- Architected game state with SwiftUI's @Observable and persisted stats, streaks and history locally using SwiftData.
- Created the full visual identity — color system, IBM Plex typography, app icon set — plus a daltonist-friendly palette gated behind an accessibility toggle.
Three problems worth talking about.
One word, no server
The daily word is derived from the calendar date: a days-since-epoch index into a curated word list. Every player gets the same puzzle, the app works fully offline, and there's no backend to run or pay for.
Romanian, done right
Diacritics make Romanian matching non-trivial — â and î, ș and ț all carry meaning. The validator and the on-screen keyboard respect Romanian orthography instead of forcing an English alphabet onto a Romanian game.
Pure SwiftUI state
Game logic lives in a single @Observable model — no UIKit, no Combine. SwiftData handles stats, streaks and history. The result is a small, fast, dependency-light codebase that's easy to reason about.