Foqos allows you to lock apps behind the tap of a NFC tag or scan of a QR code. Free and open source alternative to Brick, Opal, ScreenZen, Unpluq, Scrolly, Blok and more!
800
stars
837
commits
Swift
primary language
Sep 3, 2026
updated
Free, open-source iPhone app blocker with NFC and QR code unlocking.
Foqos is a privacy-first iOS app blocker that uses Apple's Screen Time API to block distracting apps and websites. Start a focus session manually, with an NFC tag, with a QR code or barcode, with a timer, or with temporary access rules. It is built as a free and open-source alternative to Brick, Unpluq, Blok, Opal, and other paid app blockers for iPhone.
Website | App Store | Releases | Support the project
Foqos helps you put friction between yourself and the apps or websites you want to avoid. You create blocking profiles for work, study, bedtime, or any other routine, choose the apps and domains to block, then decide how that profile starts and stops.
Unlike hardware-first blockers, Foqos works with cheap NFC tags, printable QR codes, barcodes, iOS Shortcuts, and in-app controls. Your data stays on your device. There is no account requirement, no tracking, no ads, and no subscription.
Foqos is built for people who want physical app blocking on iPhone without buying a dedicated device or paying for a subscription. It covers the core workflows people often look for in a Brick alternative, Unpluq alternative, Blok alternative, or Opal alternative: app blocking, website blocking, NFC unlocks, QR code unlocks, timed focus sessions, and local privacy.
Foqos is not affiliated with Brick, Unpluq, Blok, or Opal.
Foqos includes several ways to start and stop a blocking session. All strategies are implemented in Foqos/Models/Strategies/ and registered in Foqos/Utils/StrategyManager.swift.
| Strategy | Best for | How it works |
|---|---|---|
ManualBlockingStrategy | Simple in-app blocking | Start and stop directly in Foqos. |
NFCBlockingStrategy | Physical NFC app blocking | Scan an NFC tag to start. Scan the same tag again to stop, unless strict unlock rules are configured. |
QRCodeBlockingStrategy | QR code or barcode blocking | Scan a QR code or barcode to start. Scan the same code again to stop, unless strict unlock rules are configured. |
NFCManualBlockingStrategy | Easy start, physical stop | Start in the app. Stop by scanning an NFC tag. |
QRManualBlockingStrategy | Easy start, QR or barcode stop | Start in the app. Stop by scanning a QR code or barcode. |
NFCTimerBlockingStrategy | Timed focus with NFC escape hatch | Choose a duration. Blocking ends when the timer expires, or early when an allowed NFC tag is scanned. |
QRTimerBlockingStrategy | Timed focus with QR or barcode escape hatch | Choose a duration. Blocking ends when the timer expires, or early when an allowed QR code or barcode is scanned. |
ShortcutTimerBlockingStrategy | Manual timer sessions | Choose a duration. Stop early with the in-app Stop button. |
NFCPauseTimerBlockingStrategy | Long sessions with NFC pause control | Choose a pause duration. Scan an NFC tag once to pause, then again during the pause to fully stop. |
QRPauseTimerBlockingStrategy | Long sessions with QR or barcode pause control | Choose a pause duration. Scan a QR code or barcode once to pause, then again during the pause to fully stop. |
NFCSoftUnblockBlockingStrategy | Limited temporary access with NFC stop | Keep blocking active but allow a configured number of short opens. Stop the session with an NFC tag. |
QRSoftUnblockBlockingStrategy | Limited temporary access with QR or barcode stop | Keep blocking active but allow a configured number of short opens. Stop the session with a QR code or barcode. |
Strict unlocks can require specific physical unlock items. When a profile has an approved NFC tag, QR code, or barcode configured, other tags and codes cannot stop that profile.
Foqos works with common NFC tags such as NTAG213. You can write profile links to NFC tags from inside the app, then place tags where they match the routine: desk, bedside table, gym bag, office door, or another physical location.
QR codes are free to print or display on another device. Each profile can expose a deep link in this format:
https://foqos.app/profile/<PROFILE_UUID>
Scanning a QR code with that link can toggle the profile. If the profile is inactive, Foqos starts it. If it is active, Foqos stops it when the profile's strategy and unlock rules allow that stop.
You can trigger Foqos profiles through iOS Shortcuts. For NFC automations, create one automation per NFC tag.
Foqos also has a printable NFC brick and keychain design for 25 mm NFC tags:
Foqos is iOS-only. Android users looking for a similar physical app blocker can try Switchly or Lock (source), a free and open-source NFC app blocker for Android.
This project includes a Makefile with common development tasks:
make build # Build the project
make lint # Check Swift formatting
make lint-fix # Fix Swift formatting
make check # Run lint and build
make clean # Clean build artifacts
make help # Show all commands
Or open the project in Xcode:
git clone https://github.com/awaseem/foqos.git
cd foqos
open foqos.xcodeproj
Run iOS releases from a clean, up-to-date main branch with GitHub CLI authenticated:
make app-release VERSION=2.2.1
The command shows a release plan before making changes. After confirmation, it updates the main
iOS app and every embedded extension to the requested marketing version, resets their build
numbers to 1, commits and pushes main, creates and pushes the matching vVERSION tag, then
publishes a Foqos for iOS VERSION GitHub release with generated notes.
The iOS release is marked as GitHub's repository-wide “Latest” release. Generated notes use the
previous iOS vVERSION tag as their baseline rather than the latest mac-vVERSION tag. The main
push triggers the repository's configured Xcode Cloud workflow. The entire release is performed
locally, so no GitHub Actions workflow needs permission to bypass main branch protection.
Foqos for Mac is distributed as a notarized DMG attached to a GitHub release. Sparkle reads
appcast-macos.xml from the repository's main branch and downloads signed updates from GitHub
Releases.
The release Mac needs:
Developer ID Application: Ali Waseem (YR54789JNV) certificate and private keyFoqos Mac Developer ID and Foqos Filter Developer ID provisioning profilesawaseem/foqoscreate-dmg for the Finder installation layoutambitionsoftwarefoqos-notaryInstall the DMG layout tool with Homebrew if necessary:
brew install create-dmg
Authenticate GitHub CLI if necessary:
gh auth login
Create the notarization profile using the Apple ID, team ID YR54789JNV, and an app-specific
password:
xcrun notarytool store-credentials foqos-notary
The Sparkle private key must be backed up outside the repository. Never add the exported key to Git, a release asset, or the app bundle.
Run releases from a clean, up-to-date main branch:
make mac-release VERSION=0.1.0
The build number defaults to the repository commit count. Override it when needed:
make mac-release VERSION=0.1.0 BUILD_NUMBER=812
Provide Markdown release notes with:
make mac-release VERSION=0.1.0 RELEASE_NOTES_FILE=release-notes.md
The command validates the release environment, updates both Mac targets from
Config/MacRelease.xcconfig, builds a universal Developer ID app, notarizes the app and DMG,
adds the drag-to-Applications Finder layout, updates the signed Sparkle appcast, and publishes a
mac-vx.y.z GitHub release. Mac releases are not marked as GitHub's repository-wide “Latest”
release, so they do not replace the current iOS release badge.
Release artifacts are retained under .build/mac-release/, which is ignored by Git. If the
command fails before committing the Mac version, it restores the version and appcast source files
automatically. If it fails after pushing the version, inspect the draft GitHub release before
retrying. Do not publish a release unless its appcast entry and DMG are both present.
foqos/
|-- Foqos/ # Main app target
| |-- Views/ # SwiftUI views
| |-- Models/ # SwiftData models and blocking strategies
| |-- Components/ # Reusable UI components
| |-- Utils/ # Utility functions and managers
| `-- Intents/ # App Intents and Shortcuts
|-- FoqosWidget/ # Widget and Live Activity extension
|-- FoqosDeviceMonitor/ # Device Activity monitor extension
|-- FoqosShieldAction/ # Managed Settings shield action extension
`-- FoqosShieldConfig/ # Managed Settings shield configuration extension
Contributions are welcome. Before opening a pull request:
make lint or make lint-fix.make build or make check when your local signing setup allows it.Use GitHub Issues for bugs and feature requests.
When reporting a bug, include:
Foqos is released under the MIT License. See LICENSE for details.
Made in Calgary, AB by Ali Waseem.
Swift
96.7%
Shell
2.1%
Foqos allows you to lock apps behind the tap of a NFC tag or scan of a QR code. Free and open source alternative to Brick, Opal, ScreenZen, Unpluq, Scrolly, Blok and more!
800
stars
837
commits
Swift
primary language
Sep 3, 2026
updated
Free, open-source iPhone app blocker with NFC and QR code unlocking.
Foqos is a privacy-first iOS app blocker that uses Apple's Screen Time API to block distracting apps and websites. Start a focus session manually, with an NFC tag, with a QR code or barcode, with a timer, or with temporary access rules. It is built as a free and open-source alternative to Brick, Unpluq, Blok, Opal, and other paid app blockers for iPhone.
Website | App Store | Releases | Support the project
Foqos helps you put friction between yourself and the apps or websites you want to avoid. You create blocking profiles for work, study, bedtime, or any other routine, choose the apps and domains to block, then decide how that profile starts and stops.
Unlike hardware-first blockers, Foqos works with cheap NFC tags, printable QR codes, barcodes, iOS Shortcuts, and in-app controls. Your data stays on your device. There is no account requirement, no tracking, no ads, and no subscription.
Foqos is built for people who want physical app blocking on iPhone without buying a dedicated device or paying for a subscription. It covers the core workflows people often look for in a Brick alternative, Unpluq alternative, Blok alternative, or Opal alternative: app blocking, website blocking, NFC unlocks, QR code unlocks, timed focus sessions, and local privacy.
Foqos is not affiliated with Brick, Unpluq, Blok, or Opal.
Foqos includes several ways to start and stop a blocking session. All strategies are implemented in Foqos/Models/Strategies/ and registered in Foqos/Utils/StrategyManager.swift.
| Strategy | Best for | How it works |
|---|---|---|
ManualBlockingStrategy | Simple in-app blocking | Start and stop directly in Foqos. |
NFCBlockingStrategy | Physical NFC app blocking | Scan an NFC tag to start. Scan the same tag again to stop, unless strict unlock rules are configured. |
QRCodeBlockingStrategy | QR code or barcode blocking | Scan a QR code or barcode to start. Scan the same code again to stop, unless strict unlock rules are configured. |
NFCManualBlockingStrategy | Easy start, physical stop | Start in the app. Stop by scanning an NFC tag. |
QRManualBlockingStrategy | Easy start, QR or barcode stop | Start in the app. Stop by scanning a QR code or barcode. |
NFCTimerBlockingStrategy | Timed focus with NFC escape hatch | Choose a duration. Blocking ends when the timer expires, or early when an allowed NFC tag is scanned. |
QRTimerBlockingStrategy | Timed focus with QR or barcode escape hatch | Choose a duration. Blocking ends when the timer expires, or early when an allowed QR code or barcode is scanned. |
ShortcutTimerBlockingStrategy | Manual timer sessions | Choose a duration. Stop early with the in-app Stop button. |
NFCPauseTimerBlockingStrategy | Long sessions with NFC pause control | Choose a pause duration. Scan an NFC tag once to pause, then again during the pause to fully stop. |
QRPauseTimerBlockingStrategy | Long sessions with QR or barcode pause control | Choose a pause duration. Scan a QR code or barcode once to pause, then again during the pause to fully stop. |
NFCSoftUnblockBlockingStrategy | Limited temporary access with NFC stop | Keep blocking active but allow a configured number of short opens. Stop the session with an NFC tag. |
QRSoftUnblockBlockingStrategy | Limited temporary access with QR or barcode stop | Keep blocking active but allow a configured number of short opens. Stop the session with a QR code or barcode. |
Strict unlocks can require specific physical unlock items. When a profile has an approved NFC tag, QR code, or barcode configured, other tags and codes cannot stop that profile.
Foqos works with common NFC tags such as NTAG213. You can write profile links to NFC tags from inside the app, then place tags where they match the routine: desk, bedside table, gym bag, office door, or another physical location.
QR codes are free to print or display on another device. Each profile can expose a deep link in this format:
https://foqos.app/profile/<PROFILE_UUID>
Scanning a QR code with that link can toggle the profile. If the profile is inactive, Foqos starts it. If it is active, Foqos stops it when the profile's strategy and unlock rules allow that stop.
You can trigger Foqos profiles through iOS Shortcuts. For NFC automations, create one automation per NFC tag.
Foqos also has a printable NFC brick and keychain design for 25 mm NFC tags:
Foqos is iOS-only. Android users looking for a similar physical app blocker can try Switchly or Lock (source), a free and open-source NFC app blocker for Android.
This project includes a Makefile with common development tasks:
make build # Build the project
make lint # Check Swift formatting
make lint-fix # Fix Swift formatting
make check # Run lint and build
make clean # Clean build artifacts
make help # Show all commands
Or open the project in Xcode:
git clone https://github.com/awaseem/foqos.git
cd foqos
open foqos.xcodeproj
Run iOS releases from a clean, up-to-date main branch with GitHub CLI authenticated:
make app-release VERSION=2.2.1
The command shows a release plan before making changes. After confirmation, it updates the main
iOS app and every embedded extension to the requested marketing version, resets their build
numbers to 1, commits and pushes main, creates and pushes the matching vVERSION tag, then
publishes a Foqos for iOS VERSION GitHub release with generated notes.
The iOS release is marked as GitHub's repository-wide “Latest” release. Generated notes use the
previous iOS vVERSION tag as their baseline rather than the latest mac-vVERSION tag. The main
push triggers the repository's configured Xcode Cloud workflow. The entire release is performed
locally, so no GitHub Actions workflow needs permission to bypass main branch protection.
Foqos for Mac is distributed as a notarized DMG attached to a GitHub release. Sparkle reads
appcast-macos.xml from the repository's main branch and downloads signed updates from GitHub
Releases.
The release Mac needs:
Developer ID Application: Ali Waseem (YR54789JNV) certificate and private keyFoqos Mac Developer ID and Foqos Filter Developer ID provisioning profilesawaseem/foqoscreate-dmg for the Finder installation layoutambitionsoftwarefoqos-notaryInstall the DMG layout tool with Homebrew if necessary:
brew install create-dmg
Authenticate GitHub CLI if necessary:
gh auth login
Create the notarization profile using the Apple ID, team ID YR54789JNV, and an app-specific
password:
xcrun notarytool store-credentials foqos-notary
The Sparkle private key must be backed up outside the repository. Never add the exported key to Git, a release asset, or the app bundle.
Run releases from a clean, up-to-date main branch:
make mac-release VERSION=0.1.0
The build number defaults to the repository commit count. Override it when needed:
make mac-release VERSION=0.1.0 BUILD_NUMBER=812
Provide Markdown release notes with:
make mac-release VERSION=0.1.0 RELEASE_NOTES_FILE=release-notes.md
The command validates the release environment, updates both Mac targets from
Config/MacRelease.xcconfig, builds a universal Developer ID app, notarizes the app and DMG,
adds the drag-to-Applications Finder layout, updates the signed Sparkle appcast, and publishes a
mac-vx.y.z GitHub release. Mac releases are not marked as GitHub's repository-wide “Latest”
release, so they do not replace the current iOS release badge.
Release artifacts are retained under .build/mac-release/, which is ignored by Git. If the
command fails before committing the Mac version, it restores the version and appcast source files
automatically. If it fails after pushing the version, inspect the draft GitHub release before
retrying. Do not publish a release unless its appcast entry and DMG are both present.
foqos/
|-- Foqos/ # Main app target
| |-- Views/ # SwiftUI views
| |-- Models/ # SwiftData models and blocking strategies
| |-- Components/ # Reusable UI components
| |-- Utils/ # Utility functions and managers
| `-- Intents/ # App Intents and Shortcuts
|-- FoqosWidget/ # Widget and Live Activity extension
|-- FoqosDeviceMonitor/ # Device Activity monitor extension
|-- FoqosShieldAction/ # Managed Settings shield action extension
`-- FoqosShieldConfig/ # Managed Settings shield configuration extension
Contributions are welcome. Before opening a pull request:
make lint or make lint-fix.make build or make check when your local signing setup allows it.Use GitHub Issues for bugs and feature requests.
When reporting a bug, include:
Foqos is released under the MIT License. See LICENSE for details.
Made in Calgary, AB by Ali Waseem.
Swift
96.7%
Shell
2.1%