A Chrome extension that acts as a browser privacy firewall. It disguises protected websites as DNS errors and unlocks them via biometric authentication through the Fortis Agent.
fortis-lock intercepts navigation to protected domains and replaces the page with a convincing Chrome DNS error screen (DNS_PROBE_POSSIBLE). To unlock:
- Click the error code text 3 times — this reveals the authentication prompt
- Click "Authenticate" — this sends a biometric challenge to
fortis-agent - The agent relays the challenge to your phone via gRPC
- Scan your fingerprint on
fortis-mobile— the website unlocks instantly
No master passwords to remember. Pure push-to-unlock biometrics.
| Requirement | Version |
|---|---|
| Node.js | 20+ |
| Chrome | 120+ (Manifest V3) |
fortis-agent |
Running locally on port 8023 |
fortis-mobile |
Paired and connected |
cd fortis-lock
# Install dependencies
npm install
# Build the extension
npm run build- Open Chrome and navigate to
chrome://extensions - Enable Developer Mode (toggle in top-right)
- Click "Load Unpacked"
- Select the
fortis-lock/distfolder - The FortisLock extension icon will appear in your toolbar
- Click the FortisLock icon in the Chrome toolbar → opens the Popup
- Or right-click the icon → Options → opens the Dashboard
- In the Dashboard, add domains you want to protect (e.g.,
reddit.com,twitter.com) - Set the protection mode:
- ASK — Prompt for authentication each time
- PERMANENT_ALLOW — Always allow (whitelist)
- Navigate to a protected domain — you'll see a fake DNS error page
- Click
DNS_PROBE_POSSIBLE3 times - Click "Authenticate" to send a biometric push to your phone
- Approve on your phone — the site unlocks with a 5-minute session
Press Ctrl+Shift+L to instantly revoke all active sessions and lock every protected tab.
┌─────────────────┐ ┌──────────────────┐ ┌──────────────┐
│ Lock Screen │────▶│ fortis-agent │────▶│ fortis-mobile │
│ (lock.html) │HTTP │ POST /auth/ │gRPC │ (fingerprint) │
│ │◀────│ unlock │◀────│ │
│ ✅ Unlocked! │ └──────────────────┘ └──────────────┘
└─────────────────┘
fortis-lock/
├── package.json
├── vite.config.ts
├── public/
│ └── manifest.json # Chrome Manifest V3
├── popup.html # Extension popup UI
├── dashboard.html # Options/settings page
├── lock.html # Fake DNS error + auth screen
├── src/
│ ├── background/
│ │ ├── index.ts # Service worker (navigation interception)
│ │ ├── rules/ # Domain rules engine
│ │ ├── sessions/ # Session management
│ │ └── storage/ # Chrome storage abstraction
│ ├── ui/
│ │ └── lock/
│ │ ├── main.tsx # Lock screen entry point
│ │ ├── LockScreen.tsx # Fake error + biometric auth UI
│ │ └── LockScreen.css
│ └── lib/
│ └── crypto/ # PBKDF2 utilities (legacy, now unused)
└── dist/ # Built extension (load this in Chrome)
The extension requests the following Chrome permissions:
| Permission | Reason |
|---|---|
storage |
Persist rules and session data |
webNavigation |
Intercept page navigations to protected domains |
tabs |
Redirect protected tabs to the lock screen |
declarativeNetRequest |
Block requests to protected domains |
http://127.0.0.1:8023/* |
Communicate with the local fortis-agent daemon |