
Research
/Security News
737 Chrome VPN Extensions Linked to Brand Impersonation and Browser Traffic Redirection
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.
@arelay/client
Advanced tools
Browser-side reader for Agent Relay: unlock your E2EE key (passkey or recovery key) and fetch + decrypt inbox deliveries for a custom frontend.
Browser-side reader for Agent Relay. The consumer-side mirror of
@arelay/cli: where the CLI encrypts and delivers, the client unlocks your E2EE
private key in the browser and fetches + decrypts what arrived — so you can build your own
inbox frontend instead of using the stock portal.
All decryption happens in memory in the browser. The server only ever returns ciphertext and the encrypted private key, so a custom frontend is exactly as trustworthy as the official one.
npm install @arelay/client
ArelayReaderimport { ArelayReader } from '@arelay/client';
const reader = new ArelayReader({ baseUrl: window.location.origin });
// 1. Unlock the private key (one of)
await reader.unlockWithPasskey(); // WebAuthn PRF — one tap
await reader.unlockWithRecoveryKey('ABCD-EFGH-…'); // PBKDF2
reader.unlocked; // boolean
// 2. Read + decrypt (everything comes back already decrypted)
const sessions = await reader.listSessions();
// → [{ id, title, summary, isRead, createdAt, … }]
const { session, artifacts } = await reader.getSession(sessions[0].id);
const bytes = await reader.getArtifactBytes(artifacts[0]); // Uint8Array
A runnable version of exactly this lives in the repo at
src/routes/examples/reader — a dev-only page in the
portal. Run npm run dev, sign in, and open /examples/reader.
The read endpoints (/api/e2ee/config, /api/sessions, /api/artifacts/[id]/ciphertext)
are authenticated by the portal session cookie, so baseUrl must be the origin the user
is logged into — the portal itself, or a self-hoster's own deployment. A different-origin
frontend can decrypt but can't fetch until a human-session auth path is added to those
endpoints. Pass your own fetch via options.fetch if you need to customize the transport.
For consumers managing their own key lifecycle and transport, the primitives are exported
directly — envelope crypto (re-exported from @arelay/core) plus keyring/unlock:
import {
unlockPrivateKeyWithPasskey, unlockPrivateKey,
decryptString, decryptBytes, decryptPayloadBytes,
generateRecoveryKey, createE2eeKeyring, canAttemptPasskeyPrf,
} from '@arelay/client';
const privateKey = await unlockPrivateKey(encryptedPrivateKey, recoveryKey);
const title = await decryptString(titleEnvelope, privateKey);
ArelayReader is a thin wrapper over these plus the fetch calls.
MIT
FAQs
Browser-side reader for Agent Relay: unlock your E2EE key (passkey or recovery key) and fetch + decrypt inbox deliveries for a custom frontend.
We found that @arelay/client demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.