BootUp

Boot Up

Boot Up was created to solve my problem of opening instagram reels whenever I had a second to spare. It uses Apple’s Screen Time APIs to lock down user selected apps and enforces/integrates a fake loading screen as the only way to unlock them.

IMG_4662

Join the Beta testers!

Download on the app store

What it does

The Psychology

I like playing video games but I found myself scrolling on instagram even when I had the time to make some progress in the video game I am playing at the time. Why? Because instagram reels loads instantly and my PC or Steam deck takes a minute or two to boot up a game. So I thought, why dont I force a loading screen on instagram as well so I will play my game instead of brain rotting. (lesser of two evils?)

Features

How it works (the pipeline in my head and my notes)

[1] First Launch
└── open Boot Up
    └──  Onboarding slideshow video tutorial shows
        ├── Get Screen Time authorization
        └── Get Notification authorization
            └── Tap + in top right to choose apps to lock (FamilyActivityPicker)
                ├── saves selection (UserDefaults?? better way to do this?)
                └── locks chosen apps via ManagedSettingsStore
                    ├── user clicks new app shown in the LockedAppsView to add a name to them
                        ├── [Note 1] This is necessary because I need to link the app to a bundleID 
                             and a urlScheme like this, bundleID: com.instagram instagram urlScheme: instagram://
                        ├── [Note 2] This allows me to send the custom boot timer information with the notification or 
                             automation and it also allows me to deeplink back to the app after the loading screen finishes.
                        └── [Note 3] These bundleIDs and urlSchemes are saved in the AppDatabase.swift file for
                              popular apps. If the user to use an app that isnt in the database they can set
                              up a open app shortcut that they can then input into the "Deep Link Fallback"
                              in TokenTimerEditView.
[2] Static Shielded App Screen (Apple's Shield Configuration Extension)
└── user taps locked app
    ├── iOS displays Static Shield UI
    └── Shortcut automation fires bringing the user to Boot Up
        └── Boot Up starts the loading screen for the app the user opened
[3] Buttons on static shield screen (Apple's Shield Action Extension)
[Note] This is only if the user didnt set up the shortcut automation
└── user taps primary button (BOOT UP) on the static shield screen
    └── fire notification that includes bundleID to figure out custom boot time set and app name
        └── user taps notification
[4] Actual Loading Screen
└── Boot Up shows ShieldLoadingView (my cool loading screen)
    └── hits 100%
        ├── Calls ManagedSettingsStore
        │   └── Locked app is temporarily unlocked
        └── Start DeviceActivityMonitorExtension
            └── Schedule user's set grace period
[5] relock (Apple's Device Activity Monitor Extension)
[Note] I dont really do any of this, the timing and unlocking is all handled by Apple extensions
└── locked app temporarily unclocked
    └── grace time successfully reached
        └── iOS wakes DeviceActivityMonitorExtension in background
            └── Extension reads app token saved in UserDefaults
                └── Extension calls ManagedSettingsStore
                    └── app is relocked

Things to do/figure out

If you have a solution or want to help with any of this please make a pull request. thanks