All work

4Word

A daily word puzzle for iPhone and iPad: solve four clue words, and their first letters help you find the day's mystery word.

4Word puzzle with four solved clue words spelling the start of Today's Word, REINDEER

Overview

Everyone who plays 4Word gets the same puzzle each day. You solve four clue words, and their first letters spell the start of the day's mystery word, "Today's Word", which has its own hint.

4Word is a client project for GDI MFG. The client's own developer started it in 2023 and 2024, then I took over development in 2024 and have been the main developer since, with 136 of its 193 commits.

It's released on the App Store, and I still maintain it. The latest work was in April 2026, on version 2.0.8.

What it does

The daily puzzle

  • Custom on-screen keyboard, with a shake on wrong guesses
  • How To Play guide

Reveals and Hard Mode

  • Reveals fill in one letter at a time
  • Reveals for the mystery word unlock after all four clues are solved
  • Hard Mode hides the mystery word's hint

Stats

  • Streaks split by normal and hard mode
  • Yesterday's solution

Settings and sharing

  • Five color schemes and a sound toggle
  • Share your win and invite friends
  • Prompt to install required updates

Ads and purchases

  • Free, with AdMob app-open and interstitial ads
  • One-time purchases: remove ads ($0.99), unlimited reveals ($0.99), or a bundle of both ($1.49)

How it's built

Simpler monetization

In March 2026 I reworked how the game makes money. Reveal packs and rewarded ads were replaced with three one-time StoreKit 2 purchases.

Purchases that survive a reinstall

Purchases and reveal credits are stored in the iOS Keychain, so they're still there after the app is deleted and reinstalled. Values stored the older way are migrated over.

Puzzles from Firebase, cached on the device

Puzzles are delivered as CSV from Firebase Storage behind anonymous Firebase auth and cached locally. Stats, settings, and completed puzzles live in a local SQLite database through SQLite.swift, and reveal state is saved and restored across restarts.

Keeping ads from getting stuck

An ad watchdog shows a close button after 5 seconds and force-closes an ad that's still stuck after 30, so a bad ad can't block the game.

Tests

About 6,500 lines of Swift, covered by unit and UI test suites.

Have an app idea like this?

Tell me about it on a free 30-minute call. You'll leave knowing what to build first and what it would cost.