Skip to main content

SPECTER

SPECTER cover

Private receiving without a public recipient trail

SPECTER lets you publish one public meta-address and receive each payment at a different one-time stealth address.

The discovery path uses ML-KEM-768, so the announcement data that helps you recover payments is designed to remain private even under future quantum attacks.

Understand the model

Learn the core ideas: meta-addresses, announcements, view tags, and stealth addresses.

Build with the SDK

Run the full protocol in TypeScript, with the cryptography on the device.

Run the API quickstart

Execute the flow end to end against the hosted backend in four calls.

Contribute

Review the open GitHub issues and find the highest-value work.


Use the docs by goal

These docs are organized around reader intent. Start with the path that matches your job.

Read The Problem for the privacy and quantum context, then How SPECTER Works for the plain-language model.

Use SPECTER vs Others and Security Boundaries to evaluate tradeoffs honestly.


Protocol in 30 seconds

One public address in. A different stealth address for every payment out. Step through the three phases:

Recipient generates a spending keypair and a viewing keypair, then bundles both public keys into a single meta-address that they publish.

You generate two ML-KEM-768 keypairs and publish one meta-address. That is the only address you ever share.

  • Spending key controls funds
  • Viewing key detects payments
  • Meta-address is public and reusable

The same flow as a single diagram:

  1. The recipient creates a meta-address from public spending and viewing keys.
  2. The sender derives a one-time stealth address from that meta-address.
  3. The sender transfers funds and publishes an announcement using the server-bound payment_id.
  4. The recipient scans announcements, recovers the matching stealth key, and spends normally.

Observers can see the transfer and the announcement. They should not be able to link the stealth address back to the recipient without the private keys.


Current implementation status

Warning

The docs describe the current shipped behavior, not the end-state vision.

AreaCurrent status
Key generationThe @specterpq/sdk generates ML-KEM-768 keys locally in WebAssembly, so secrets stay on the device. The hosted API also exposes POST /api/v1/keys/generate, where the backend generates the keys.
ScanningThe SDK scans announcements locally with the viewing key. The hosted API offers server-side scanning for backends that own the full flow.
Announcement recoveryDiscovery currently depends on the backend-managed registry. Backend-independent recovery from on-chain announcements is tracked in issue #16.

What makes SPECTER different today

SPECTERClassical stealth (Umbra/Fluidkey)
Discovery cryptoML-KEM-768 (post-quantum)ECDH (broken by quantum)
Harvest-now-decrypt-later safeYesNo
View tag scanning~1-2s for 100k announcements10-15s
Multi-chainEthereum + SuiEthereum only
Name service integrationENS + SuiNSENS
NIST standardFIPS 203N/A
Tip

If you only read three pages, start with How SPECTER Works, Protocol Flow, and Security Boundaries.


Keep going

TypeScript SDK

Run the protocol locally in TypeScript, with the cryptography on the device.

API reference

Browse the full REST surface and endpoint groups.

Verification matrix

Validate docs claims against the current source and issue backlog.

Contribution opportunities

Review the current GitHub issues and contributor paths.