Focus, the physical way
Foqos helps you put your most distracting apps behind a quick tap — using NFC tags or QR codes — so you can stay in the zone and build better digital habits. It’s free, open source, and an alternative to Brick, Bloom, Unpluq, Blok, and more.
- 🏷️ NFC & QR Blocking: Start or stop sessions with a quick tag tap or QR scan
 - 🧩 Mix & Match Strategies: Manual, NFC, QR, NFC + Manual, QR + Manual
 - 🔐 Physical Unblock: Optionally require a specific tag or code to stop
 - 📱 Profiles for Life: Create profiles for work, study, sleep — whatever you need
 - 📊 Habit Tracking: See your focus streaks and session history at a glance
 - ⏸️ Smart Breaks: Take a breather without stopping your session
 - 🔄 Live Activities: Real-time status on your Lock Screen
 
- iOS 16.0+
 - iPhone with NFC capability (for NFC features)
 - Screen Time permissions (for app blocking)
 
- Download Foqos from the App Store
 - Grant Screen Time permissions when prompted
 - Create your first blocking profile
 - Optionally set up NFC tags or a QR code and start focusing
 
- Grab a few NFC tags (NTAG213 or similar works great)
 - Create a profile in Foqos
 - Write the tag from within the app
 - Stick tags where they make sense (desk, study spot, bedside)
 - Tap to start or stop a session
 
- Xcode 15.0+
 - iOS 17.0+ SDK
 - Swift 5.9+
 - Apple Developer Account (for Screen Time and NFC entitlements)
 
git clone https://github.com/awaseem/foqos.git
cd foqos
open foqos.xcodeprojfoqos/
├── Foqos/                     # Main app target
│   ├── Views/                 # SwiftUI views
│   ├── Models/                # Data models
│   │   └── Strategies/        # Blocking strategies
│   ├── Components/            # Reusable UI components
│   ├── Utils/                 # Utility functions
│   └── Intents/               # App Intents & Shortcuts
├── FoqosWidget/               # Widget extension
└── FoqosDeviceMonitor/        # Device monitoring extension
- SwiftUI — Modern, declarative UI
 - SwiftData — Local persistence
 - Family Controls — App blocking
 - Core NFC — Tag reading/writing
 - CodeScanner — QR scanning
 - BackgroundTasks — Background processing
 - Live Activities — Dynamic Island + Lock Screen updates
 - WidgetKit — Home Screen widgets
 - App Intents — Shortcuts and automation
 
All strategies live in Foqos/Models/Strategies/ and are orchestrated by Foqos/Utils/StrategyManager.swift.
- 
NFC Tags (
NFCBlockingStrategy)- Start: scan any NFC tag to start the selected profile
 - Stop: scan the same tag to stop the session
 - Physical Unblock (optional): set 
physicalUnblockNFCTagIdon a profile to require that exact tag to stop (ignores the session’s start tag) 
 - 
QR Codes (
QRCodeBlockingStrategy)- Start: scan any QR code to start the selected profile
 - Stop: scan the same QR code to stop the session
 - Physical Unblock (optional): set 
physicalUnblockQRCodeIdon a profile to require that exact code to stop (ignores the session’s start code) - The app can display/share a QR representing the profile’s deep link using 
QRCodeView 
 - 
Manual (
ManualBlockingStrategy)- Start/Stop entirely from within the app (no external tag/code required)
 
 - 
NFC + Manual (
NFCManualBlockingStrategy)- Start: manually from within the app
 - Stop: scan any NFC tag (restricted to 
physicalUnblockNFCTagIdif set) 
 - 
QR + Manual (
QRManualBlockingStrategy)- Start: manually from within the app
 - Stop: scan any QR code (restricted to 
physicalUnblockQRCodeIdif set) 
 
- Each profile exposes a deep link via 
BlockedProfiles.getProfileDeepLink(profile)in the form:https://foqos.app/profile/<PROFILE_UUID>
 - Scanning a QR that encodes this deep link will toggle the profile: if inactive it starts, if active it stops. This works even if the app isn’t already open (it will be launched via the link).
 
We love contributions! Here’s how to jump in:
- Fork the repository
 - Make your changes and test them out
 - Commit your changes (
git commit -m 'Add amazing feature') - Open a Pull Request
 
- Follow Swift coding conventions
 - Update documentation as needed
 - Test on multiple iOS versions when possible
 
Something not working as expected? We're here to help.
- Bug Reports: Open an issue with detailed steps to reproduce
 - Feature Requests: Share your ideas via GitHub Issues
 - Questions: Use GitHub Discussions for general questions
 
When reporting issues, please include:
- iOS version
 - Device model
 - Steps to reproduce
 - Expected vs actual behavior
 - Screenshots if applicable
 - Debug output (needed for diagnosing issues):
- Start an active profile
 - Scroll to the bottom and tap "Debug Mode"
 - Tap the copy button on the right-hand side
 - Paste the output in your issue report
 
 
This project is licensed under the MIT License - see the LICENSE file for details.
- App Store
 - GitHub Issues
 - Support the Project (via in-app purchases or here)
 
Made with ❤️ by Ali Waseem
