···11+FROM fedora:40
22+33+# Install system packages required for Rust builds and Node-based Codex CLI
44+RUN dnf install -y \
55+ curl \
66+ ca-certificates \
77+ make \
88+ gcc \
99+ pkg-config \
1010+ openssl-devel \
1111+ git \
1212+ nodejs \
1313+ npm \
1414+ && dnf clean all
1515+1616+# Install OpenAI Codex CLI from npm registry
1717+RUN npm install -g @openai/codex
1818+1919+# Create a non-root user to run the CLI by default
2020+RUN useradd --create-home --shell /bin/bash app
2121+USER app
2222+WORKDIR /home/app
2323+2424+CMD ["codex", "--help"]
+63
README.md
···11+## frontpage.fyi Firefox extension
22+33+This repository provides a Firefox WebExtension that lets you share the current tab to [frontpage.fyi](https://frontpage.fyi) with minimal effort.
44+Links are submitted by creating `fyi.unravel.frontpage.post` records on your ATProto account, the same mechanism the official Frontpage site uses.
55+66+> ℹ️ The Frontpage source code lives at <https://tangled.org/did:plc:klmr76mpewpv7rtm3xgpzd7x/frontpage>.
77+88+### Features
99+1010+- Pop-up form that auto-fills the active tab’s title and URL.
1111+- Title length indicator (120 characters, matching the Frontpage UI).
1212+- Background service worker handles ATProto login, token refresh, and record creation.
1313+- Options page for storing your handle, app password, and optional PDS override.
1414+- Convenience links to open frontpage.fyi or the options page from the pop-up.
1515+1616+### Repository layout
1717+1818+```
1919+extension/
2020+├── background.js # Service worker for auth + ATProto requests
2121+├── manifest.json # Manifest V3 definition
2222+├── options.html/js # Credential management UI
2323+├── popup.html/js # Submission UI
2424+└── styles.css # Shared styling for popup and options
2525+```
2626+2727+### Prerequisites
2828+2929+- An ATProto account that Frontpage can read.
3030+- An app password for that account (create one at <https://bsky.app/settings/app-passwords> or via your own PDS).
3131+3232+### Load the add-on in Firefox
3333+3434+1. Open `about:debugging#/runtime/this-firefox`.
3535+2. Click **Load Temporary Add-on…** and choose `manifest.json` inside the `extension/` directory.
3636+3. Pin the “Frontpage” toolbar button if you want quick access.
3737+3838+### Configure credentials
3939+4040+1. Open the add-on pop-up and press the gear icon (or use `about:addons` → **Preferences**).
4141+2. Enter your handle and app password. Supply a PDS URL only if you run a custom server.
4242+3. Click **Save credentials**. A success message confirms that the session tokens are stored locally.
4343+4. Use **Log out** at any time to remove stored tokens (you can also revoke the app password server-side).
4444+4545+### Submit a link
4646+4747+1. Browse to the page you want to share.
4848+2. Open the Frontpage pop-up; the title and URL are pre-filled.
4949+3. Adjust the text if necessary and click **Post to Frontpage**.
5050+4. On success, the pop-up reports the record URI returned by `com.atproto.repo.createRecord`.
5151+5252+### Implementation notes
5353+5454+- The background worker discovers the user’s PDS by resolving the handle (`com.atproto.identity.resolveHandle` + PLC lookup).
5555+- Sessions are refreshed automatically via `com.atproto.server.refreshSession` when the access JWT expires.
5656+- All data stays in `browser.storage.local`; nothing is transmitted to third-party services beyond the ATProto endpoints.
5757+- Maximum lengths follow the current Frontpage limits (120 characters for the title, 2048 for URLs).
5858+5959+### Development tips
6060+6161+- Inspect background/service-worker logs from `about:debugging` → **Inspect**.
6262+- The UI scripts (`popup.js` and `options.js`) log to the DevTools console attached to their respective documents.
6363+- When packaging for distribution, zip the contents of the `extension/` directory.