Ace Citizenship
A free iOS app I built to help my wife pass her U.S. citizenship test. She did. Now it helps others achieve the same dream.
TL;DR
When my wife began preparing for her U.S. naturalization test, I couldn't find a study app that met my standards. Most were cluttered with ads, used outdated content, or ignored proven learning techniques. So I built one.
Ace Citizenship covers all 128 official USCIS civics questions using spaced repetition—the same technique that makes Duolingo effective. My wife used it to study, passed her test, and became an American citizen.
The app is and will remain completely free. No ads, no subscriptions, no catch. Some things matter more than revenue.
The Origin Story
I built Ace Citizenship for an audience of one: my wife. She needed to pass the USCIS naturalization test, and I wanted to give her the best possible tool to succeed.
The existing apps on the market were disappointing. Intrusive ads interrupted study sessions. Subscription paywalls blocked access to essential content. The design felt like an afterthought.
I knew I could do better. So I designed, branded, and engineered the entire app from scratch—a labor of love that combined my product design experience with my passion for building useful software.
The App
Ace Citizenship delivers a premium experience without the premium price tag. The interface is clean, focused, and respectful of your time.
Visual Design
I created a cohesive 3D visual language—dreamy, optimistic, distinctly American—that makes studying feel less like a chore.
Every illustration was generated in Midjourney using custom prompts I've refined over 100,000+ image generations. The soft blue and pink palette evokes calm while maintaining patriotic undertones. This isn't your typical government-app aesthetic.
More of my AI-generated artwork at dreamofelectric.com.
Spaced Repetition
At the core of Ace Citizenship is a spaced repetition algorithm that optimizes study sessions. Questions you struggle with appear more frequently, while mastered material fades into longer review intervals.
This evidence-based approach dramatically reduces study time while improving retention. Instead of mindlessly reviewing all 128 questions, users focus their energy where it matters most.
The app tracks progress and adapts to individual learning patterns, providing a personalized experience that feels intelligent and responsive.
Personalized Learning
Some USCIS questions have answers that depend on your specific situation—your state of residence, your congressional representatives. Ace Citizenship personalizes these questions to match your actual test conditions.
This attention to detail means users aren't just memorizing generic answers; they're learning the exact information they'll need on test day.
Technical Implementation
Built entirely in SwiftUI for iOS, Ace Citizenship takes full advantage of Apple's modern frameworks. The app uses SwiftData for local persistence, ensuring progress syncs across devices via iCloud without requiring user accounts.
The architecture is maintainable and efficient. The question bank updates seamlessly when USCIS revises their official list, and the spaced repetition engine runs entirely on-device for instant feedback.
Following Apple's Human Interface Guidelines ensures the app feels native and familiar. Users don't need to learn new interaction patterns—they can focus entirely on studying.
Under the Hood
A few interesting patterns from the codebase that make the app effective.
Spaced Repetition Algorithm
The core learning engine prioritizes questions you struggle with. When you answer incorrectly, that card goes into a separate queue that gets mixed into your next study session—ensuring you see difficult material more frequently until you master it.
func completeCard(correct: Bool) {
if !currentSet.isEmpty {
let card = currentSet.removeFirst()
remainingCards -= 1
if correct {
cards.append(card) // Back to main deck
} else {
incorrectCards.append(card) // Priority requeue
}
}
}
func prepareNextSet() {
// Prioritize missed questions in next round
let incorrectCount = min(incorrectCards.count, 10)
let newCardsCount = 10 - incorrectCount
currentSet = Array(incorrectCards.prefix(incorrectCount))
incorrectCards.removeFirst(incorrectCount)
currentSet += Array(cards.prefix(newCardsCount))
}
State-Specific Personalization
The app maintains a database of all 50 states plus territories, updated for the current 119th Congress. When you select your state, questions about senators, governors, and capitals are personalized to match your actual test conditions.
struct StateInfo {
let name: String
let senators: [String]
let governor: String
let capital: String
}
// Updated for 119th Congress (January 2025)
let stateInformation: [String: StateInfo] = [
"California": StateInfo(
name: "California",
senators: ["Adam Schiff", "Alex Padilla"],
governor: "Gavin Newsom",
capital: "Sacramento"
),
// ... all 50 states + territories
]
Type-Safe Theming
The theming system uses Swift's KeyPath feature for compile-time safety. Instead of stringly-typed color lookups that can fail silently, every color access is verified by the compiler.
struct Theme {
struct ColorSet {
let background: Color
let surface: Color
let onBackground: Color
let blue: Color
let green: Color
let red: Color
}
static func color(
_ keyPath: KeyPath<ColorSet, Color>,
for colorScheme: ColorScheme
) -> Color {
let colorSet = colorScheme == .dark
? darkMode
: lightMode
return colorSet[keyPath: keyPath]
}
}
// Usage: Theme.color(\.blue, for: colorScheme)
She Passed
My wife used Ace Citizenship to prepare for her naturalization test. She passed. Today, she's an American citizen.
That moment—standing together at the USCIS office while she held her naturalization certificate—made every hour of development worth it. The app worked exactly as intended.
Helping Others
After my wife's success, I published Ace Citizenship on the App Store. It's earned a 5-star rating, and users consistently report that the app helped them pass their citizenship test.
One user wrote: "I use this app for practice 30 mins every day for a month and I passed!" Stories like this remind me why I build software—to solve real problems for real people.
The app continues to help immigrants achieve their goal of becoming U.S. citizens, one study session at a time. It's the most personally meaningful project I've ever shipped.
Thanks
Ace Citizenship represents what I love about building software: solving a real problem for someone I care about, then sharing that solution with the world.
This project allowed me to work across the entire product lifecycle—from identifying the need, to designing the experience, to writing every line of code. It's a pure expression of my craft.
The app is and will remain free. Because some things—like helping people become citizens of the country they've chosen to call home—are more important than revenue.