Unfenced - Cookie and Local-Storage Notice
Last updated: 21 October 2026
This notice explains the cookies and browser-storage the Unfenced web dashboard uses. Under the EU ePrivacy rules, storing or reading information on a user's device requires consent unless it is strictly necessary to provide a service the user asked for. We serve EU users, so this applies.
1. Strictly necessary - no consent required
The dashboard uses browser storage for sign-in and functional preferences. A first-party cookie also keeps navigation consistent between the public site and the app subdomain. These values are set after you load the dashboard.
| Key | Storage | Purpose | Strictly necessary? |
|---|---|---|---|
ac-token | localStorage | Holds your dashboard access token so you stay signed in. | Yes - without it you cannot use the dashboard. |
sb-<project>-auth-token | localStorage | Your sign-in session, written by the authentication library (Supabase) when you sign in with an account rather than a token. Its presence is also what tells the dashboard on load that this browser has signed in before. | Yes - it is the sign-in session itself. |
uf-session | Cookie | Shares only a session-expiry timestamp (or a signed-out value of zero) across unfenced.ai and its subdomains so public navigation shows Dashboard when signed in. Contains no token or identity and grants no access. Expires with the session; the signed-out value lasts up to 24 hours. | Functional sign-in navigation; classification remains subject to counsel review below. |
ac-theme | localStorage | Retains an earlier theme choice while the app uses Dark for everyone. | Yes - a functional preference you set. |
unfenced.logo-lab.v1 | localStorage | Remembers the logo direction, size, stroke, spacing and colours you experiment with on /logo. | Yes - a functional preference for the logo playground. |
ac-rail | localStorage | Remembers whether the navigation rail is open or closed. | Yes - a functional preference you set. |
ac-consent | localStorage | Remembers your analytics and advertising-measurement choice (see Section 2) so we can honour it and not ask again. | Yes - it stores a consent decision, so it needs no consent of its own. |
ac-erasure-receipt | localStorage | Holds account, user and deletion request identifiers so you can resume a pending deletion after reloading. Contains no credential and is removed after verified completion and local sign-out. | Yes - supports the deletion you requested. |
unfenced.sessions.split | localStorage | Remembers where you dragged the divider on the Sessions screen. | Yes - a functional preference you set. |
unfenced.admin.accountSort | localStorage | Admin only: remembers the chosen sort order on the Engagement (Accounts) tab. | Yes - a functional preference you set. |
unfenced_oauth_resume | sessionStorage | Held only while an authorization is in progress, so the dashboard can return you to where you were afterwards. Cleared when the tab closes. | Yes - it is part of the sign-in you started. |
ac-signin-attempt | sessionStorage | Resumes this tab's website sign-in after reload using browser scope/ID, provider, account name, save phase and public owner/workspace/approver/agent binding. No password, input, grants or access token. Valid up to 2 hours; cleared on completion, browser closure or tab close. | Yes - recovers the sign-in you started. |
unfenced_google_oidc | sessionStorage | Held only while a Continue with Google sign-in is in progress: a random check value and a one-time code that prove the answer coming back from Google belongs to the sign-in you started in this tab. Removed as soon as Google answers, and cleared when the tab closes. | Yes - it is part of the sign-in you started. |
unfenced.invite | localStorage | Holds an invite token across the sign-in round trip, so a link you opened before signing in still admits you afterwards. | Yes - it is the invitation you followed. |
unfenced_terms_version | sessionStorage | Holds the version of the Terms you ticked at sign-up until there is a session to attach the acceptance to. Cleared when the tab closes. | Yes - it is the agreement you just made. |
uf-chunk-reload | sessionStorage | Records that this tab has already reloaded itself once after a release, so a screen that fails to load is retried exactly once rather than in a loop. Holds no information about you. Cleared when the tab closes. | Yes - without it the dashboard cannot recover from a release. |
unfenced_desktop_pairing | sessionStorage | Holds the public desktop approval code across sign-in. The saved code is accepted for up to ten minutes and cleared after successful approval or when the tab closes. It contains no native proof or access token. | Yes - supports the desktop pairing you initiated; classification remains subject to counsel review below. |
These are functional and do not track you across other websites.
Our classification. The access token and the sign-in session are strictly necessary: without them the dashboard cannot keep you signed in, which is the service you asked for, so Article 5(3) ePrivacy exempts them from consent. The theme, rail, divider position, desktop pairing code and the analytics-consent value are user preference storage set as a direct result of something you did in the interface; they are not used to profile you, are not read by anyone else, and never leave your browser. We treat them as exempt on the same basis.
The analytics-consent value is worth naming separately: storing your answer is what stops us asking again, and a record of a refusal is the one piece of storage that exists purely to respect your choice.
2. Analytics and advertising measurement
On app.unfenced.ai, allowing analytics loads Microsoft Clarity for session recordings and interaction analytics, and, only where we have configured it, PostHog (EU-hosted) for session recordings, product analytics, and limited error tracking. Neither starts on links with a query string, fragment, or shared-recording token. Dashboard text reaching Clarity and PostHog is visible in session recordings across dashboard tabs, including account and site names. Dashboard input values, displayed API keys, connection snippets containing keys, and token-bearing links are masked before recording. Other dashboard text may remain visible. Clarity and PostHog may use analytics cookies after consent. Public marketing pages load Google Analytics, Reddit measurement, and Meta Pixel code through Google Tag Manager by default.
For signed-in dashboard users who allow analytics, PostHog receives the stable account user ID, display name, and email so we can connect sessions and product events to a person. It also receives limited fetch milestone fields (format, outcome, and tier), agent creation and activation milestones, and whether a dashboard view failed to render. Onboarding events include the step, client type, preview flag and test-fetch outcome. Limited dashboard request-failure events include a fixed endpoint label, HTTP method/status and failure category, without request bodies or identifiers. Render failures can create an error-tracking issue with a fixed message and scope. Fetch URLs, fetched content, and raw exception messages are not included in those custom events or issues.
The public marketing pixel is on while its consent banner is off. An unanswered visit loads GTM and sends page-view events. A previously saved ac-consent=declined choice prevents it from loading. The dashboard does not load GTM. The dashboard asks for analytics consent before Clarity or PostHog starts. Vercel Web Analytics and Speed Insights are no longer loaded. Your stored choice is described in Section 1.
- Marketing providers: Google and Reddit receive the page-view and successful beta-signup events configured in the GTM container. Meta receives marketing page-view events through its Pixel. The container also loads Meta's Conversions API parameter builder, which can collect browser and click identifiers (
_fbpand_fbc) for configured events. A Meta beta-signup conversion has not been verified. Their own privacy policies govern provider-side processing and retention.
3. Third-party sites the agent visits
When you direct the Service to fetch a page or drive a logged-in session, that third-party site may set its own cookies inside the browser session the Service runs for you. Those cookies are governed by that site's own policies, not this notice. Login cookie jars you choose to save are stored sealed with AES-256-GCM, as described in the Privacy Policy.
4. Managing your choices
- Preferences and sign-in: clearing your browser's site data for the dashboard removes every key in the table above (clearing
ac-tokenor thesb-…-auth-tokenkey signs you out). - Analytics and advertising consent: you can accept or decline in the banner, and change your mind afterwards under Settings › Analytics, which both records the new choice and reloads the page so a script already loaded stops running. Clearing the dashboard's site data (which removes
ac-consent) also returns you to the banner on your next visit. Declining, or clearing the value, stops the analytics and advertising-measurement scripts from running. - What the page view says: when analytics is on, the address is sent with the query string and the fragment removed and with a shared-recording token replaced by a placeholder, so a link that carries a credential never reaches the analytics provider.
5. Changes
We will update this notice if our use of cookies or browser storage changes.
6. Contact
Questions: privacy@unfenced.ai.
Managed agent setup
| Browser item | Purpose | Duration and category |
|---|---|---|
provider_enrollment (sessionStorage) | Carries the one-time setup invitation through sign-in. This is a secret capability bound to the invited email, not an analytics identifier. | Deleted after successful enrollment; otherwise expires with the browser tab and the invitation's seven-day validity. Strictly necessary. |
provider_portal_resume (sessionStorage) | Returns an invited customer to their agent portal after authentication. Contains only a navigation flag. | Browser tab session; removed at sign-out. Strictly necessary. |
provider_enrollment_kind (sessionStorage) distinguishes a site-approver invitation from an existing installation invitation while signing in. It contains only the invitation type, is strictly necessary, and is removed after acceptance or when the tab closes.