Back to Blog
Retro Joy: Retro Achievements App

Retro Joy: Retro Achievements App

Published: 5/7/2022

After spending countless hours exploring retro games and earning achievements on RetroAchievements.org, I realized the community deserved a truly native iOS experience. What started as a passion project became a two-year journey of learning, designing, and building **Retro Joy** – an iOS application that brings the beloved RetroAchievements community to your pocket with style.

## The RetroAchievements Community

[RetroAchievements.org](https://retroachievements.org) is a vibrant community dedicated to adding modern achievement systems to classic retro games. It's where passionate gamers come together to experience nostalgic titles with fresh challenges and social features. The platform covers thousands of games across dozens of retro consoles, creating achievements that weren't possible in the original releases.

## The Vision: More Than Just Another API Client

While working full-time as an iOS engineer, I spent my evenings and weekends crafting what would become Retro Joy. My goal wasn't just to create another web wrapper – I wanted to build a truly native iOS experience that felt at home on Apple devices while honoring the retro aesthetic that makes the community special.

## The Interactive Experience

<div className="my-8 flex flex-col md:flex-row gap-6 p-6 bg-muted rounded-lg">
<div className="flex-shrink-0">
<picture className="block">
<source
srcSet="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/bd/ac/5e/bdac5eed-0fe6-cabe-8af9-0fdd052d1b63/AppIcon-0-1x_U007emarketing-0-10-0-sRGB-85-220-0.png/246x0w.webp 246w, https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/bd/ac/5e/bdac5eed-0fe6-cabe-8af9-0fdd052d1b63/AppIcon-0-1x_U007emarketing-0-10-0-sRGB-85-220-0.png/492x0w.webp 492w"
sizes="246px"
type="image/webp"
/>
<source
srcSet="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/bd/ac/5e/bdac5eed-0fe6-cabe-8af9-0fdd052d1b63/AppIcon-0-1x_U007emarketing-0-10-0-sRGB-85-220-0.png/246x0w.png 246w, https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/bd/ac/5e/bdac5eed-0fe6-cabe-8af9-0fdd052d1b63/AppIcon-0-1x_U007emarketing-0-10-0-sRGB-85-220-0.png/492x0w.png 492w"
sizes="246px"
type="image/png"
/>
<img
src="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/bd/ac/5e/bdac5eed-0fe6-cabe-8af9-0fdd052d1b63/AppIcon-0-1x_U007emarketing-0-10-0-sRGB-85-220-0.png/246x0w.png"
alt="Retro Joy App Icon"
className="w-32 h-32 md:w-40 md:h-40 rounded-2xl shadow-lg"
width="246"
height="246"
/>
</picture>
</div>

<div className="flex-1 space-y-2">
<p className="text-2xl font-bold text-foreground">
Retro Joy
</p>

<p className="text-muted-foreground">
retro achievements tracker
</p>

<p className="text-blue-600 dark:text-blue-400 text-sm">
<a
href="https://apps.apple.com/us/developer/clayton-sulby/id1549703638"
className="hover:underline"
>
Clayton Sulby
</a>
</p>

<div className="pt-2">
<a
href="https://apps.apple.com/us/app/retro-joy/id1623005852"
className="inline-flex items-center px-3 py-2 border border-blue-600 text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950 rounded-md text-sm font-medium transition-colors"
target="_blank"
rel="noopener noreferrer"
>
View in App Store
<svg className="w-4 h-4 ml-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>
</a>
</div>

</div>
</div>

## Technical Architecture: Three Approaches to API Integration

One of the most interesting aspects of building Retro Joy was creating a comprehensive API wrapper around the RetroAchievements PHP community API. I implemented three different networking mechanisms to handle various use cases:

### 1. Closure-Based Retrieval

```swift
// Traditional callback-based approach for simple requests
APIManager.shared.fetchUserProfile(username: "player") { result in
switch result {
case .success(let profile):
// Handle success
case .failure(let error):
// Handle error
}
}
```

### 2. Combine Framework

```swift
// Reactive programming for complex data flows
APIManager.shared.fetchGameList()
.map { games in games.filter { $0.hasAchievements } }
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { _ in }, receiveValue: { filteredGames in
// Update UI
})
.store(in: &cancellables)
```

### 3. Async/Await

```swift
// Modern Swift concurrency for clean, readable code
Task {
do {
let achievements = try await APIManager.shared.fetchUserAchievements(userID: userID)
await MainActor.run {
self.achievements = achievements
}
} catch {
// Handle error
}
}
```

This tri-modal approach allowed me to choose the best networking pattern for each specific use case while maintaining consistency across the app.

## Design Philosophy: CRT Television Inspiration

The visual design of Retro Joy draws heavy inspiration from CRT televisions – those chunky, warm displays that defined the retro gaming era. Every element in the app incorporates:

### Scanlines and Glow Effects

- **Subtle scanlines** across game artwork and backgrounds
- **Gentle phosphor glow** around interactive elements
- **Warm color temperatures** that evoke classic CRT displays
- **Rounded corners** reminiscent of old television bezels

### Visual Hierarchy

The app uses the characteristic green glow of classic terminals and arcade machines for primary actions, while maintaining Apple's design principles for usability and accessibility.

## Native iOS Features: Beyond Web Capabilities

What sets Retro Joy apart from web-based alternatives are the native iOS features that simply aren't possible in browser-based experiences:

### Personal Library Management

- **Custom game collections** organized by console, genre, or personal preference
- **Offline browsing** of your game library
- **Smart sorting** and filtering options
- **Personal notes** and ratings for games

### Favorites System

- **Heart your favorite games** for quick access
- **Favorite achievements** to track your most prized accomplishments
- **Sync across devices** through iCloud integration

### Achievement Playlists

- **Create custom playlists** of achievements you want to pursue
- **Progress tracking** for multi-game challenge runs
- **Social sharing** of your curated achievement lists
- **Reminder notifications** for achievements you're working toward

### Native iOS Integration

- **Haptic feedback** for interactions and achievement unlocks
- **Dynamic Type** support for accessibility
- **Dark Mode** integration with system preferences
- **Spotlight search** integration for finding games quickly
- **Share Sheet** integration for sharing achievements

## The Development Journey: Two Years of Evenings and Weekends

Working on Retro Joy while maintaining a full-time iOS engineering position meant every line of code was written during evenings, weekends, and lunch breaks. The project became a labor of love that taught me:

### Technical Growth

- **Advanced SwiftUI** patterns and performance optimization
- **Core Data** for complex local data management
- **Network layer architecture** for robust API communication
- **Custom UI components** that maintain Apple's design standards

### Project Management

- **Feature prioritization** when time is limited
- **User feedback integration** from the RetroAchievements community
- **Version planning** and release management
- **Beta testing coordination** with community members

### Community Engagement

Building for the RetroAchievements community meant constant interaction with users, gathering feedback, and ensuring the app served real needs rather than just technical achievements.

## Key Features That Define the Experience

### Game Discovery

- **Browse thousands of retro games** across multiple console generations
- **Achievement previews** before you start playing
- **Difficulty ratings** and completion estimates
- **Community reviews** and recommendations

### Achievement Tracking

- **Real-time progress updates** as you play
- **Achievement rarity statistics** showing how exclusive your accomplishments are
- **Leaderboards** for competitive achievement hunting
- **Achievement art gallery** showcasing the beautiful custom badges

### Social Features

- **Follow other players** and see their recent achievements
- **Comment system** for sharing strategies and celebrating accomplishments
- **Achievement comparison** between friends
- **Community challenges** and events

## Lessons Learned

Building Retro Joy taught me that passion projects require different skills than professional development:

1. **Sustained motivation** over years, not sprints
2. **Community-driven development** where users become collaborators
3. **Balancing nostalgia with modern UX** expectations
4. **API design** that serves multiple programming paradigms
5. **Visual design** that honors source material while remaining functional

## The Impact

Seeing RetroAchievements community members use Retro Joy to discover new games, track their progress, and share achievements has been incredibly rewarding. The app has become more than just a client – it's a portal that brings the warmth of retro gaming into the modern iOS ecosystem.

## Looking Forward

The RetroAchievements community continues to grow, and Retro Joy evolves with it. Future updates will include more social features, enhanced achievement tracking, and even deeper integration with the community's expanding game library.

Building Retro Joy proved that with enough passion and persistence, you can create something meaningful for a community you love. It's been an incredible journey from that first evening of writing API calls to seeing thousands of retro gaming enthusiasts using the app daily.

---

_Interested in retro gaming or iOS development? I'd love to discuss the technical details of building Retro Joy or share more about the incredible RetroAchievements community!_