Architecture

Components and data flows

Every moving part, where it runs, and every connection between them, with the protocol and the credential each side uses.

Describes LayerT as built on 3 October 2026. Anything not built is labelled.

In the browser

LayerT’s browser side is a Manifest V3 extension. Your MDM installs it and pins its icon to the toolbar using Chrome enterprise policy files for macOS and Windows (Linux files exist too). The same policy switches off Incognito, Guest mode and Chrome’s own password manager, and on Windows it adds LayerT to your other force-installed extensions instead of replacing them. A person can also set LayerT up in a browser themselves, with their work account.

Every new browser then waits for an Owner or IT Admin to approve it, however LayerT was installed. Until it’s approved it gets no rules and can’t use shared accounts.

PartWhat it isNotes
Service workerThe extension’s background processHolds the browser’s own signing key and its short-lived token, fetches and verifies signed policy, batches audit events, brokers shared-account grants, runs timers for session expiry
Content scriptsScripts Chrome runs in each page’s isolated worldSeparate from the page’s own JavaScript. They read values only from the fields your rules name, check files given to the places a file rule names, and fill shared-account sign-ins
In-page promptsThe block card, notices, account menu and session chipDrawn in closed shadow roots, so page scripts can’t read or restyle them. Buttons act only on real clicks and key presses. They use system fonts, so LayerT never loads web fonts into other companies’ pages
Account menu frameAn extension page shown in a frame inside the promptThe shared-account list lives in the extension’s own origin, not in the page
Toolbar popupThe launcher, approvals and quick addAn extension page; never part of a website
The trust cue a page can’t fake. While any LayerT prompt is on a tab, LayerT lights an amber dot on its own toolbar icon. A website can copy the look of a prompt, but it can’t draw in the browser’s toolbar. LayerT prompts also never ask for a password, and a test enforces that no prompt contains a password field.

In LayerT’s cloud

PartWhat it isNotes
Console and APIA web applicationThe admin console, the extension’s API, the SCIM 2.0 server and the OpenID Connect client
WorkerA separate service with no public addressRuns the scheduled jobs and sends notifications
Operator consoleA separate site for LayerT staffCreates and manages organisations. Staff can see inside an organisation only with that organisation’s approval (see Identity, tenancy and roles)
PostgresThe system of recordSigned policy versions, audit events, directory data, requests and sessions. Shared-account secrets are stored as ciphertext in their own table
Object storageGoogle Cloud StorageSession recordings only, encrypted on the device before upload. The bucket never holds plaintext
Key serviceA cloud key serviceSigns each policy version with Ed25519 and wraps the key that seals each shared-account secret and recording. Keys can be used through the service but never copied out of it. The policy signing key is software-protected: the service offers that type of key in software only, not in a hardware security module. Built, and in use in LayerT’s test environment. Production, which will use Google Cloud KMS, is not deployed
Scheduled jobsRecurring jobs on the workerClose expired requests and sessions, apply retention, re-sign policy before it expires, rebuild policy after directory changes, send notifications and reminders, check gateway health
Hosting. LayerT isn’t in production yet. Today it runs in a test environment that holds dummy data only. In production it will run on Google Cloud in the EU, in the Milan region (europe-west8), with its keys and database backups kept in Google’s EU multi-region. Cloudflare will handle DNS and send notification email. The providers are listed in Data handling. Other data residency options aren’t available yet.

Outside LayerT

PartOwned byHow LayerT uses it
Your identity providerYouSends people and groups to LayerT over SCIM 2.0, and signs admins and people in over OpenID Connect. Built for JumpCloud
Your MDMYouPushes the Chrome policy that installs LayerT, pins its icon and tells it which organisation it belongs to
Your gateways Early accessYouSmall servers you rent. A shared account with routing switched on sends its own sites through one, so the vendor sees one address. LayerT checks each gateway from outside and tells it which connections to admit. LayerT doesn’t run gateways
The sites your people useVendorsLayerT reads and fills forms on them. It never changes a vendor’s servers or traffic

Data flows

Every flow below runs over HTTPS.

FlowDirectionWhat movesAuthenticated by
Directory syncIdentity provider → APIPeople, groups, active status (SCIM 2.0)A LayerT-issued SCIM token, stored only as a hash
Console sign-inBrowser ↔ API ↔ identity providerOpenID Connect authorization code flowSigned ID token, checked against the provider’s published keys
Console useBrowser → APIDecisions, rules, settingsA server-side session, re-checked on every request
EnrolmentExtension → API → identity providerThe person signs in once. The browser sends the public half of a key it made, proves it holds the private half, and gets a short-lived device token. It then waits for an administrator’s approvalThe identity provider’s sign-in, and a signature from the browser’s key
Token renewalExtension → APIA fresh short-lived device tokenA proof signed by the browser’s key, checked against the public key LayerT stored at enrolment
Policy syncAPI → extensionThe signed policy for your organisationDevice token; the policy itself is verified with Ed25519 in the browser
The person’s groupsAPI → extensionThe directory groups of this browser’s own person, and nobody else’s, as a signed answer valid for 24 hoursDevice token; the answer is verified with Ed25519 in the browser
AuditExtension → APIEvents about blocks, matches, approvals and sessions, with the value a rule matchedDevice token, which must match the event’s device
Continuing with a reasonExtension → APIThe person’s reason for continuing past a block, with the rule, the page and the value. The action goes ahead only once the server has stored itDevice token; the person is taken from the token, never from the page
Requests and grantsExtension ↔ APIAccess requests, decisions, shared-account grantsDevice token, bound to the person and the enrolled browser
RecordingExtension → API → object storageEncrypted recording chunksDevice token; chunks are already encrypted
Gateway session Early accessAPI → extensionFor a routed account: which gateway to use, a credential for this session only, and the address the vendor will see. No password travels in itDevice token, bound to the person’s active session
Gateway admission Early accessGateway → APIThe gateway asks whether to admit each new connectionThe gateway’s own key. LayerT answers it only about its own organisation’s sessions
Scheduled jobsCloud Scheduler → workerTrigger onlyA Google-signed identity token for the scheduler’s own service account
Sign-in outcomesExtension → APIWhether a shared-account sign-in worked, at which step it stopped, and the page’s address without its query. Never values, labels or page textDevice token
Device factsExtension → APIExtension version, how the browser says it was installed, browser, operating system and policy versionDevice token
Version checkExtension → APIWhich LayerT version is newest. The answer is the same for every organisationNone. The request carries no credentials and nothing about the person
NotificationsWorker → approversRequests waiting on someone, answers and alerts, by email, Slack and the extension. No secrets and no full valuesEmail over SMTPS; Slack’s API with your organisation’s Slack connection; the extension’s device token
Slack decisionsSlack → APIAn approver’s Approve or Deny on a requestSlack’s request signature, then the approver’s rights are checked again at the moment of the click

What the extension sends, and what it doesn’t

LayerT reads only the fields your rules name. When a rule matches, LayerT records what matched, and for a typing rule the text of the field, so an auditor can check the decision. A rule can mask or hide its values.

  • It sends audit events when a rule matches: the rule, the page’s address, the field and the value that matched. For a form rule the value is the text of the field, and for a paste rule the pasted text. That’s how an auditor can see that a personal address was stopped.
  • For a typing rule, the value is the whole text of the field as it was when the rule matched, not only the part that matched, up to 10,000 characters.
  • For a file rule, it sends the file’s name, type and size, how the file was given to the page, and whether LayerT could read it. A file’s text is read in the browser to decide and is never sent.
  • The browser always sends the value whole. A rule’s setting to mask or hide its values is applied on LayerT’s servers, before anything is stored. Values aren’t redacted in the browser.
  • A password or code LayerT filled is never read by any rule, so there is nothing to send. A typing rule never reads a password box or a one-time-code box at all. A form or paste rule reads the fields it names, and that can include a password box a person typed into themselves.
  • It sends access requests with the person’s reason, and encrypted recording chunks when recording is on for a shared account.
  • It sends the reason a person gives to continue past a block, where a rule allows that.
  • It reports whether each shared-account sign-in worked, and basic facts about the browser, so IT can see which laptops are protected. These reports carry no typed values and no page text.
  • Events waiting to be sent are held in the extension’s storage until they’re delivered, and can include matched values.
  • It doesn’t send pages. Outside a recorded shared-account session, the only page content it sends is the text of a field a rule matched, and it sends nothing typed into fields your rules don’t name. It never sends browsing history, a list of visited pages or cookie values. In a recorded session, what people type is masked where they type it, in form fields and rich-text editors, and the recording still shows what the page shows back: Sessions and recording has the detail.