Skip to content
RH★RYAN
HANGRALIMDEVELOPER / BALI, ID

IOS / SCREEN TIME

Luna

An iOS app that makes screen time intentional: shield distracting apps, choose a timed break, and keep the session visible on the Lock Screen.

Shipped on the App Store

A little less scroll. A little more life.
THE ROLE
iOS Developer · Apple Developer Academy
THE WHEN
Oct — Nov 2025
BUILT WITH
SwiftUIScreen Time APIActivityKitApp Extensions

The idea

Opening a distracting app is often automatic. Luna puts a decision in that moment: choose the apps to restrict, then deliberately start a timed allowance when you want to use them. The app combines system-level blocking with a visible timer and a history of sessions.

Built with a cross-disciplinary team at the Apple Developer Academy, Luna shipped to the App Store. My role was iOS development, including the Screen Time integration that connects app selection, temporary access, and reapplying restrictions.

How it works

  • Choose what to block. FamilyControls handles authorization and app selection. ManagedSettings applies shields to the selected apps, categories, and websites.
  • Take a timed break. Starting an allowance temporarily removes the shields. A DeviceActivity monitor reapplies them when the allowance ends, including a fallback at the end of its monitoring interval.
  • Keep time visible. ActivityKit and WidgetKit present the session on the Lock Screen and Dynamic Island, with an action to stop it early.
  • Share state across extensions. The app, activity monitor, and shield extensions use shared storage for selections and session state.

The engineering challenge

The core flow spans several processes with different lifecycles. A timer on the main screen alone cannot coordinate the app shields, background monitor, and Live Activity. The implementation gives the monitor responsibility for restoring restrictions and shares the selected apps and allowance state across the extensions.

This project deepened my experience with Apple’s Screen Time frameworks and the coordination required to make an app and its extensions behave as one product.

CASE FILE / 03THAT'S THE STORY.

LET'S BUILD THE NEXT ONE ↗
UP NEXT / CASE FILE 04

Keepsake

Tap. Snap. Already organized.

← THE COMPLETE LINEUPBACK TO BASE ↑
YOU'VE GOT A DIRECT LINE.

RYAN'S GUIDE

The inside story on the work.

AI PORTFOLIO GUIDEASK AWAY
THIS IS WHERE THE CONVERSATION STARTS.
Ryan's guide

Hey! I'm Ryan's AI portfolio guide. Want the story behind a project, his background, or what he builds? You're in the right place.

PICK A CONVERSATION STARTER

ENTER: SEND SHIFT + ENTER: NEW LINE

AI guide, not Ryan. Messages go to OpenRouter.
Have something personal to discuss? Email Ryan ↗