FreeYT is a Safari Web Extension for iPhone, iPad, and Mac that routes supported YouTube links through youtube-nocookie.com and keeps a local-first privacy dashboard in the companion app.
- A native SwiftUI dashboard with
Overview,Activity,Exceptions,Trust, andSetup - Guided onboarding that helps users enable the extension and verify protection
- A compact Safari popup with primary protection control, quick stats, current-site exception support, and exception management
- A background service worker that owns extension state, redirect rules, recent activity, and native sync
- A small content script banner on
youtube-nocookie.compages that explains the privacy-enhanced route - Seven declarative redirect rules covering watch, shorts, embed, live, mobile watch, short links, and legacy
/v/URLs
FreeYT stays local-first:
- No accounts
- No analytics
- No remote dashboard backend
- No cross-site tracking
- State stays on-device in the shared app-group container and Safari extension storage
The shared dashboard snapshot includes:
enabledvideoCountdailyCountslastProtectedAtrecentActivityexceptionslastSyncStatelastSyncTimestamp
FreeYT/SharedState.swiftstores the shared dashboard snapshot in thegroup.com.freeyt.appapp groupFreeYT/Models/DashboardStore.swiftcoordinates app-side state, navigation, and actionsFreeYT/LiquidGlassView.swiftrenders the dashboard shellFreeYT/Views/Onboarding/OnboardingView.swiftdrives setup
FreeYT Extension/Resources/manifest.jsondefines the MV3 extension, popup, background worker, content script, and permissionsFreeYT Extension/Resources/background.jsmanages redirect state, exceptions, recent activity, and native syncFreeYT Extension/Resources/popup.html,popup.css, andpopup.jsimplement the popupFreeYT Extension/Resources/banner.jsshows the explanatory banner onyoutube-nocookie.comFreeYT Extension/SafariWebExtensionHandler.swifthandles native messaging and app deep links
FreeYT Extension/Resources/rules.json currently ships 7 main_frame redirect rules:
youtube.com/watch?v=...youtube.com/shorts/...youtube.com/embed/...youtube.com/live/...m.youtube.com/watch?v=...youtu.be/...youtube.com/v/...
All supported routes redirect to https://www.youtube-nocookie.com/embed/<video-id>?autoplay=1.
The project is aligned around:
- App:
com.freeyt.app - Extension:
com.freeyt.app.extension - Widget:
com.freeyt.app.widget - App group:
group.com.freeyt.app
Those values are used by the Xcode project, entitlements, shared state, and native messaging bridge.
xcodebuild -project FreeYT.xcodeproj -scheme FreeYT \
-destination 'platform=iOS Simulator,name=iPhone 17' build
xcodebuild -project FreeYT.xcodeproj -scheme FreeYT \
-destination 'platform=macOS,variant=Mac Catalyst' buildxcodebuild test -project FreeYT.xcodeproj -scheme FreeYT \
-destination 'platform=iOS Simulator,name=iPhone 17'Extension tests:
cd "FreeYT Extension/Tests"
npm test- Build and run the app.
- Enable the FreeYT extension in Safari.
- Complete the onboarding flow in the host app.
- Open a supported YouTube URL and confirm it lands on
youtube-nocookie.com. - Open the Safari popup and verify:
- protection can be paused and resumed
Today,This Week, andAll Timecounts updateBypass this siteadds and removes a trusted exception
- Open the host app and verify recent activity, exceptions, trust copy, and setup checklist.
The dashboard and popup are designed to respect:
- Dynamic Type
- Light and dark appearance
- Reduce Motion
- Reduce Transparency where system materials fall back
- VoiceOver and semantic labels for popup controls and status regions
FreeYT/
├── FreeYT.xcodeproj/
├── FreeYT/
├── FreeYT Extension/
├── FreeYTWidget/
├── FreeYTTests/
├── FreeYTUITests/
├── PRIVACY.md
└── README.md