What a dashboard can't do here.

larssoni.com/security · revised 18 September 2026 · applies to every dashboard we serve

Every dashboard we host runs in a locked frame, on a domain that holds no logins. The rules are response headers, not promises, so you can check them yourself.

Content-Security-Policy:

sandbox allow-scripts

default-src 'none'

script-src 'unsafe-inline' https://cdn.jsdelivr.net https://cdnjs.cloudflare.com https://unpkg.com

style-src 'unsafe-inline' https://cdn.jsdelivr.net https://cdnjs.cloudflare.com https://unpkg.com https://fonts.googleapis.com

font-src https://fonts.gstatic.com data:

img-src data: blob:

connect-src 'none'

form-action 'none'

frame-ancestors https://larssoni.com

base-uri 'none'

X-Content-Type-Options: nosniff

Referrer-Policy: no-referrer

X-Robots-Tag: noindex, nofollow

Cache-Control: no-store

sandbox allow-scripts — Scripts may run. Nothing else: no cookies, no storage, no pop-ups, no reach into the page around it.

connect-src 'none' — It cannot call any server. Your numbers cannot be sent anywhere.

form-action 'none' — It cannot submit a form, so it cannot ask anyone for a password.

img-src data: blob: — Images come from inside the file. No tracking pixel can load.

frame-ancestors — Only our own viewer page may frame it.

Printed from the code that serves every dashboard, free or paid. To see it live: open any dashboard, open your browser's network panel, and look at the response headers of the frame.

1 · Where a dashboard runs

1.1Its own domain

Dashboards are served from larssonipages.com or larssoni.co, never from larssoni.com.

The domain that holds your login never serves a dashboard, and the domains that serve dashboards set no cookies.

1.2Free and paid, apart

Free dashboards live on larssoni.co; paid and locked ones on larssonipages.com.

If someone abuses the free plan and a filter blocks that domain, business dashboards are not on it.

1.3The frame

sandbox="allow-scripts", and nothing else.

No access to the page around it, no pop-ups. It is set twice: on the frame, and as a response header on the dashboard itself.

1.4The network

connect-src 'none'.

A dashboard cannot fetch, post or open a socket. It draws what it was given.

1.5Forms

form-action 'none'.

It cannot submit a form anywhere, which is what a phishing page needs.

1.6Scripts

Its own inline code, plus libraries from jsDelivr, cdnjs and unpkg.

So charts render. No other host can serve it a script.

1.7Images and fonts

Images only from inside the file. Fonts from Google Fonts.

There is no network source for images, so no tracking pixel can load.

1.8When we render it ourselves

Thumbnails and PDF exports run under the same policy.

Our own render service blocks every outside request the policy would block in a browser.

2 · Who can open it

2.1Three settings

Anyone with the link. Only the email addresses you list. Only addresses at your company's domain.

Locking a link is on Pro and Team. There are no shared passwords anywhere in the product.

2.2Proving an address

The viewer types their email and we send a six-digit code. It works once, for ten minutes.

No account, and no password for your people to reuse. We store a hash of the code, never the code.

2.3What the gate gives away

Nothing.

The page answers the same way whether or not the address is on the list. A code is only sent if it is.

If that email has access, a code is on its way. Enter it below.

The gate's one reply, whether or not the address is on the list.

2.4Guessing

Five tries per address in ten minutes, with a separate limit per network address.

When a limit is hit the gate refuses. It never fails open.

2.5Staying in

A pass in that browser, for seven days.

HttpOnly, Secure, SameSite=Lax. Take someone off the list and their pass ends with that save.

Set-Cookie: __viewer=…; Path=/; Max-Age=604800; HttpOnly; Secure; SameSite=Lax

Seven days, readable by no script.

2.6The address of the file

Each load uses a signed address that expires after two minutes.

Copying the frame's address out of the browser gets you nothing a moment later.

2.7What the owner learns

How many people opened it. Never who.

On the Team plan. A viewer's email is reduced to a keyed hash, separate for every dashboard, and is never shown to the owner.

3 · Your account

3.1Signing in

An emailed link, or Google. There are no passwords to steal.

The link works once, for fifteen minutes.

3.2Your session

Thirty days, in a cookie marked HttpOnly, Secure and SameSite=Lax.

We store only a hash of the session token.

Set-Cookie: __session=…; Path=/; Max-Age=2592000; HttpOnly; Secure; SameSite=Lax

Thirty days, readable by no script.

3.3Google sign-in

The request is tied to the browser that started it.

That stops someone finishing a sign-in they began elsewhere.

3.4Keys for your tools

A key for publishing from an AI tool or a script is shown once, stored as a hash, and can be revoked at any time.

Only the workspace owner can make one.

3.5Roles

On Team: an owner, who handles billing, invitations and deletion; members, who make and share dashboards.

4 · What we keep, and for how long

WhatWhere it livesHow long
Your dashboard files, every versionCloudflare R2until you delete them; then 30 days to undo
The values in a connected Google Sheetnot stored — read when an update runsa fingerprint for 30 days, to notice a changed sheet
A CSV file you uploadstored, so it can be read againuntil you delete the dashboard
Column names and the update recipeour databasewhile updates are switched on
A viewer's email on a locked linkused to send the code, then kept only as a keyed hashuntil the dashboard is deleted
View countsa hash of network address and browser that changes every day; never the address itselfwith the dashboard
The change logeach entry carries a hash of the one before, so edits to history showwith the workspace, and in your export

5 · Your spreadsheet, and what the AI sees

5.1What we read

The one tab you point us at, through Google's own link export.

Only Google's hosts are contacted. A redirect anywhere else is refused.

5.2When

At set-up, and each time a scheduled update runs. Nothing in between.

5.3What the AI sees

Column names, made-up rows, and your numbers with every digit masked: £46,200 becomes £##,###.

Anthropic's model, once, at set-up. There is no setting that sends it real values.

5.4After set-up

No AI at all.

Each update is a plain substitution, checked against the shape the dashboard expects. If the check fails, viewers keep the last good version, with its date.

5.5Private sheets

Not yet: the sheet has to be viewable by link.

We wrote the Google sign-in route and never linked it in: the permission Google offers covers every sheet in the account, and we won't ask for that.

  1. Your spreadsheet

    It stays in your Google account. Only Google’s hosts are contacted.

  2. Larssoni

    Checks the shape, swaps the numbers, publishes a new version. No AI in this step.

    Set-up only: column names and masked digits

    Anthropic

  3. The locked frame

    Draws the dashboard. Cannot call out, submit a form or open a window.

  4. Your viewers

    No account, nothing installed.

6 · Abuse: what we block

6.1At publish

We refuse files that register a service worker, redirect on load, or embed outside pages. A dashboard can be up to 6 MB.

6.2Secrets

If a pasted file contains a live key or password, publishing stops until its owner says otherwise.

The override is written to the change log.

6.3Phishing

Every file is scored for brand names, password fields, urgency and QR codes. Above the line, a person looks before it goes live.

On the free plan any password field waits for a person.

6.4Reports

Every dashboard page has a report link.

Three separate reports take a free dashboard offline at once. A paid one goes to the front of our queue and stays up until someone has looked.

6.5The off switch

Disabling a dashboard takes effect on its next request.

7 · Where it runs, and who else touches your data

7.1Cloudflare

Workers, R2 storage, the D1 database, KV and Queues.

There are no servers of ours to patch.

7.2Region

The database is provisioned in Western Europe.

7.3Others who process data for us
WhoWhat for
Cloudflarehosting, storage, database
Stripe Payments Europepayments; card details never reach us
Postmark (ActiveCampaign)email
Anthropicthe set-up step only, masked values

Google is not on the list: when you sign in with Google or link a sheet, Google gives data to us at your instruction.

7.4Email

Every email we send comes from hello@larssoni.com, through Postmark.

8 · Leaving

8.1Export

One file: every dashboard, the list of them, the change log, the view counts and where each dashboard came from.

The workspace owner can ask for it once a day.

a list of your dashboards (JSON)

audit-log.json

views.csv

provenance.json

dashboards/<each-dashboard>.html

What the export contains.

8.2Deleting a dashboard

Its link stops at once. You have 30 days to undo it; then the files are erased.

8.3Deleting your account

The workspace closes at once and any subscription is cancelled. The files are erased after 30 days.

9 · Not yet

9.1Single sign-on, SAML or SCIM

Not yet. Sign-in is an emailed link or Google.

9.2A choice of data region

Not yet. One region, Western Europe.

9.3Private Google Sheets

Not yet. See 5.5.

If one of these is what stands between you and yes, tell us. It moves up the list.

What to allowlist.

Three names for browsers, one for mail. A dashboard cannot contact anything else: the frame does not allow it.

For the people opening dashboards

  • larssoni.comthe viewer page
  • larssonipages.comdashboards on paid plans
  • larssoni.codashboards on the free plan

Only if a dashboard uses them:

  • cdn.jsdelivr.net
  • cdnjs.cloudflare.com
  • unpkg.com
  • fonts.googleapis.com
  • fonts.gstatic.com

For your mail filter

  • hello@larssoni.comsign-in links and the codes that open locked dashboards, sent through Postmark.

Paperwork, and a person.

  • Data processing agreement

    Article 28, and it takes effect with our terms, so there is nothing to sign and chase. Read it

  • Breach notice

    Within 48 hours, in the agreement.

  • New sub-processors

    30 days' notice and a right to object.

  • Reporting a vulnerability

    /security/disclosure and /.well-known/security.txt

Send the questionnaire as it is.

Spreadsheet, PDF or portal link. The person who built the product fills it in.

hello@larssoni.com

IT admin? The one-page letter