# Attractor

Attractor is a web browser for iOS and macOS prioritizing security and aggresive content filtering, and some nifty useful features. 

![](Screenshots/main.png)

## Security Modes

Attractor aggresively filters unwanted web content and prevents arbitrary code execution (JavaScript) by default. I created a special browser for this purpose. Philosophically speaking, I believe the web should primarily be used as a document viewer (as originally intended by [Tim Berners-Lee](https://en.wikipedia.org/wiki/World_wide_web)). Interactive web applications are fine, but the *default* mode should be document viewing, which is why this security model exists. 

Attractor operates in five "security modes":
1. **Alpha** (Default) All JavaScript is blocked, as well as web fonts and iframes. 
2. **Bravo** Only embedded scripts are allowed. This means any JavaScript enclosed in `<script>` tags. Often this is enough to allow form validation to occur without issue. 
3. **Charlie** Allows external JavaScript, but only from the same security origin. Meaning, if browsing `buzzert.net`, only external scripts from the domain `buzzert.net` (or subdomains) are allowed to execute. 
4. **Delta** Allows external JavaScript, but only from a curated list of common CDNs. 
5. **Echo** All scripts are allowed. 
   
## Other features

- Dark mode (a very good one that uses low-level stylesheet injection to prevent flicker) 
- Tab syncing
- Share via Email
- Reader Mode
- Arbitrary zoom scale
- User-defined scripts and stylesheets via UI
- Custom redirect rules
- Catalyst and iPadOS support

## Deployment

TestFlight deployment is handled by Fastlane and the Gitea workflow at `.gitea/workflows/testflight.yml`.

Required Gitea secrets match the local `.env.example`: `APP_STORE_CONNECT_KEY_ID`, `APP_STORE_CONNECT_ISSUER_ID`, `APP_STORE_CONNECT_KEY_CONTENT`, `MATCH_GIT_URL`, `MATCH_PASSWORD`, and `MATCH_GIT_BASIC_AUTHORIZATION`.

Push a tag like `release/ios/v4.2` or `Attractor-4.2` to build and upload to TestFlight. To prepare signing assets locally, run `bundle exec fastlane ios setup_signing`; to upload manually, run `bundle exec fastlane ios beta`.
