sideroom

Sideroom documentation

A little more room.
A closer look inside.

Uncensored models, an encrypted connection you can check, and credits you use as you go. Here’s how it all fits together.

The mainnet app lives at app.sideroom.sh and is being prepared for launch. The separate testnet uses test tokens and its own accounts.

Encrypted in your browser

Your prompt is sealed before it leaves your device for the gateway.

Hardware you can verify

Each exchange starts with a fresh check of the running gateway.

Pay for what you use

One credit balance for the chat app and API. No per-message flat fee.

02 / Privacy layer

Encrypted before it leaves.

Sideroom encrypts messages in your browser and opens them inside its verified AWS Nitro gateway. The gateway connects to your selected model over HTTPS. Replies return through the encrypted channel, with each streamed chunk authenticated before display.

THE PATH OF A MESSAGE
Your browserVerifies the gateway.
Encrypts your prompt.
Sideroom relayPasses encrypted
bytes along.
Nitro gatewayOpens the request
inside the enclave.
Model providerReceives the prompt
over HTTPS.

Browser ↔ gateway: OHTTP encryption. Gateway ↔ model: a separate HTTPS connection. Answers follow the same route back.

The gateway proof covers the encrypted browser connection and the approved gateway release measurements. The external model provider processes the prompt to generate the answer.

A key bound to the hardware

The gateway creates its encryption key at startup. A hardware-signed attestation binds that key to the exact running gateway. Your browser checks it against the approved release before sending your prompt.

A fresh check, every exchange

Your browser sends a new random challenge and checks the signed answer. It also verifies the release measurements and timestamp. A failed check stops the request before your message is sent.

History stays encrypted, too.

Saved conversations are encrypted in your browser with AES-256-GCM before upload. The history service stores encrypted records; the key used to open them stays in your browser. Each save uses a fresh IV and authenticates the account, conversation and revision alongside the content.

You can delete saved chats or export a recovery file in Settings. Keep that file private: it includes the credentials and key needed to restore your history.

Technical details & trust boundary
  • Transport: OHTTP / HPKE using X25519, HKDF-SHA256 and AES-128-GCM. Streaming replies use authenticated Chunked OHTTP records.
  • Attestation: AWS Nitro certificate-chain validation and COSE ES384 signatures, anchored to the pinned AWS Nitro Enclaves Root G1.
  • Release identity: exact nonzero SHA-384 PCR0, PCR1 and PCR2 measurements pinned in the client’s approved release policy.
  • Freshness: a new 32-byte challenge per exchange, an attestation no more than five minutes old, and a thirty-second clock allowance.
  • Request integrity: a random request ID, expiry and replay rejection. A stream completes only after its authenticated final record and end of response.
  • Operational data: the relay handles the selected model, input size, account, billing and timing. The history service holds record IDs, revisions, sizes and timestamps.

Your browser and the code running in it are part of the trusted environment. The model provider processes plaintext inside its own service; the gateway’s attestation describes the Sideroom gateway.

Further reading: OHTTP specification and AWS Nitro attestation verification.

03 / Verification

Don’t just take a badge for it.

The connection proof is a check of real hardware-signed evidence. Open it in the app to inspect the encrypted connection, or use the client tools to check a record yourself.

  1. The browser asks a fresh question.

    A random challenge makes the gateway return evidence for this exchange, rather than reuse an old signed document.

  2. The hardware signs the answer.

    The attestation includes the gateway’s image measurements and encryption key. The client checks the AWS signature, certificate chain, timestamp and challenge.

  3. The release must match.

    The client compares PCR0, PCR1 and PCR2 with the approved release policy. Only then does it encrypt your message for that gateway.

Download the client tools, the gateway policy and the client-kit manifest. A policy expresses which release you trust: review its measurements separately from the live server you are checking. Each new gateway build needs an updated policy.

VERIFY AN EXPORTED CONNECTION PROOF
node scripts/verify-gateway.mjs connection-proof.json \
  --policy gateway-policy-2026-09-20.json

Run this from the extracted client directory after npm ci --ignore-scripts. Export the JSON from connection proof in the app and check it within five minutes. The verifier recomputes the checks; a saved record describes the recorded connection.

04 / API

The same connection, from code.

Use Sideroom from your terminal or your own application. API calls go through the same gateway verification and encryption as chat, and spend the same credit balance.

These instructions cover the testnet client. Mainnet API access opens with the mainnet app; API keys and credits are separate for each environment.

1. Create your key.

Open Settings → API keys in the app. Give the key a name and copy it when it appears. The full key is shown once. Keys can send inference requests; they cannot read saved conversations, change your account or manage other keys. Revoke a key from Settings at any time.

2. Set up the client.

Use Node.js 24. Download and extract the Sideroom client kit, then run the following inside its sideroom-client folder.

TERMINAL
npm ci --ignore-scripts
umask 077
touch .env.api
chmod 600 .env.api

Open .env.api in your editor and add your key. The testnet preview password, if required, is separate from your API key.

.ENV.API
SIDEROOM_API_KEY=your_sideroom_api_key
# For password-protected testnet access:
# SIDEROOM_PREVIEW_PASSWORD=your_preview_password

3. Send a prompt.

Use the approved gateway policy included with the release. The prompt is read from standard input; the reply goes to standard output.

ENCRYPTED CHAT
node --env-file=.env.api scripts/account-chat.mjs \
  --policy gateway-policy-2026-09-20.json \
  --url https://testnet.sideroom.sh \
  --model phala/gemma-4-26b-a4b-uncensored <<'PROMPT'
Explain public-key encryption in three short sentences.
PROMPT

The CLI prints the completed answer; verification and usage details go to standard error. For Qwen, use phala/qwen3.8-27b-uncensored. The chat app streams responses as they arrive.

Protocol reference

GET /api/lab/connection?nonce=<64 hex characters> returns fresh attestation bound to the client’s challenge and gateway encryption key.

POST /api/lab/secure carries the OHTTP-encrypted binary request and encrypted response. Use the client to construct and verify these messages; this is not an OpenAI-compatible JSON endpoint.

The client supplies the API key in X-Sideroom-Account. The selected model and input byte count are sent separately for billing. Prompt and response content travel in the encrypted body.

05 / Models & credits

A balance, not a subscription.

Buy credits, choose a model, and pay for the text it processes. A model token is a unit of text. Usage credits are your service balance. Both are separate from the planned $ROOM token.

Current model prices in US dollars per one million tokens
ModelInput / 1M tokensOutput / 1M tokens
Gemma 4 26B A4B Uncensored$0.1875$0.875
Qwen 3.8 27B Uncensored$0.375$1.875

USD per 1 million model tokens. The same rates apply to chat and API calls.

How a message is charged

Input includes the conversation context sent with your message. Before a request starts, Sideroom reserves a usage allowance. When the request completes with measured usage, it settles the actual charge and releases the unused allowance back to your balance.

USDG credits on mainnet.

Mainnet checkout is being prepared. At launch, open Wallet to buy credits with USDG on Robinhood Chain. Approve USDG if needed, then confirm the payment. Funds go directly to the configured treasury; credits appear after 40 L2 block confirmations. You need a little ETH for gas.

STARTER

5 USDG

Receive $5 credits

PLUS

20 USDG

Receive $21 credits

+5% bonus credits

MAX

50 USDG

Receive $55 credits

+10% bonus credits

Mainnet chain ID: 4663. Usage credits are recorded in your account; they are not transferable tokens. Try the separate testnet app with freely minted tUSDG, which has no cash value. Testnet credits and accounts stay separate from the main app.

06 / The Sideroom token

Make room for $ROOM.

Launch planned

$ROOM is the planned Sideroom token, with a launch on Pons on Robinhood Chain. Its role is to connect the people using Sideroom with the protocol’s growth.

The token launch comes first. Staking, protocol revenue sharing and holder discounts are planned to follow as separate releases.

Stake $ROOM.

The planned staking contract will let holders deposit $ROOM to participate in the protocol’s staking programme. Deposit, withdrawal and eligibility rules will be published with the release.

Coming soon

Share in protocol revenue.

We plan to allocate a portion of protocol revenue to eligible stakers. Any distributions will depend on actual revenue and the published programme rules, rather than a promised fixed return.

Coming soon

More credits for holders.

Planned holder benefits include discounts on usage credits. Holding requirements, discount tiers and how benefits are applied will be announced when the feature is ready.

Coming soon

You can use Sideroom without holding $ROOM. The token is separate from your usage-credit balance and the tUSDG used to test payments. The official contract address and launch details will be published here when confirmed.