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 - A shared host-app cockpit strip that routes proof states to Activity, Setup, or Overview
- Guided onboarding that helps users enable the extension and verify protection
- A compact Safari popup with primary protection control, quick stats, durable control state, current-site exception support, and exception management
- A background service worker that owns extension state, redirect rules, recent activity, and native sync
- Small and medium widgets that read the same local app-group dashboard snapshot
- 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:
enabledvideoCountdailyCountslastProtectedAtrecentActivityexceptionslastSyncStatelastSyncTimestamplastSyncRevision
FreeYT/SharedState.swiftstores the shared dashboard snapshot in thegroup.com.freeyt.appapp groupFreeYT/Models/DashboardStore.swiftcoordinates app-side state, navigation, and actionsFreeYT/Models/SetupVerification.swiftderives the local setup-verification checklistFreeYT/Models/HostCockpitSummary.swiftderives the shared host cockpit status and primary routeFreeYT/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.
FreeYT's security model is local-first: URL handling, Exceptions, native
messaging, app-group state, widget projection, and privacy copy must stay backed
by local proof. docs/security-threat-model.md
tracks the current trust boundaries, controls, residual risks, and regression
coverage.
The app, Safari extension, and widget each include a privacy manifest declaring
no tracking and no collected data types. Release gating and store-readiness
boundaries are tracked in
docs/engineering/release-readiness-audit.md.
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' buildFull local verification:
scripts/verify-local.sh fullFaster local loops:
scripts/verify-local.sh quick
scripts/verify-local.sh extensionxcodebuild 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
Host dashboard compact-layout expectations are tracked in
docs/engineering/visual-interaction-polish.md.
Localized extension and trust-copy rules are tracked in
docs/engineering/localization-trust-copy.md.
Release-readiness checks are tracked in
docs/engineering/release-readiness-audit.md.
FreeYT/
├── FreeYT.xcodeproj/
├── FreeYT/
├── FreeYT Extension/
├── FreeYTWidget/
├── FreeYTTests/
├── FreeYTUITests/
├── docs/
├── PRIVACY.md
└── README.md