Back to projects

Schedule Blocker

Your apps close on time — extra minutes are earned with a breath

Schedule Blocker screenshot

Overview

Schedule Blocker is a native iOS app built on Apple's Screen Time API that closes groups of apps on weekly time slots and daily quotas, enforced by the system itself even when the app isn't running. Each group draws its day as a 24-hour band — today's closed slots in amber, a cursor on the current time. When a quota runs out, the group shuts until tomorrow; a 15-minute extension can still be earned, but only through a guided breathing ritual that ends on a real choice: back to your day, or open anyway.

Why I Built This

I wanted to curb my own doomscrolling without renting a blocker by subscription, and the ones I tried either guilt-tripped me in red or folded at a single tap. So I built the one I actually wanted: calm, strict, never red — where unlocking costs sixteen seconds of breathing, which is usually enough to change your mind.

Features

  • Groups, Schedules & Quotas — Each group of apps carries its own weekly time slots and daily time budget, enforced through Family Controls by iOS itself: the blocking survives reboots and force-quits because the system holds the shield, not the app
  • The 24-Hour Band — Signature UI: every group draws its day as a band, today's closed slots in amber and a cursor on the current hour — and never a progress gauge, because the Screen Time API only reports when a threshold is crossed, so a "time used" bar would be invented
  • Breathing Ritual Unlock — Once a quota is spent, 15 more minutes can be earned through a 16-second guided breath that lands on a deliberate choice — "back to my day" or "open anyway" — friction designed to change your mind, not to punish you
  • Per-Group Extensions — Every group owns its own ManagedSettingsStore; restrictions from multiple stores stack, so granting one group its extension never unlocks the others
  • Shield → Notification Relay — Apple gives shield extensions no way to open the host app, so the shield button posts a local notification that carries you into the ritual, and a one-shot DeviceActivity re-arms the block when the extension ends — no app process required on either side

Tech Stack

iOS App

Swift SwiftUI XcodeGen

Screen Time API

FamilyControls DeviceActivity ManagedSettings Shield extensions

Architecture

4 targets App Group storage Local notifications