Skip to content

Encryption

Simplepush supports end-to-end encryption. Content is sealed on the sending device and opened on the receiving device, so the server only ever stores and relays encrypted data. It covers notifications, tasks, answers, replies, submissions, and files.

Encrypted and plain traffic can mix freely on one account. Anything you receive that was encrypted with a password you don't have simply passes through unreadable, without breaking the stream.

Two ways to encrypt

  • Personal accounts: you pick the passwords. A topic password is meant to be shared with the people who should be able to read that topic; your personal password is yours alone and stays on your own devices.
  • Organizations: the admin turns on encryption once and the key is distributed to member devices automatically. Nobody handles passwords. See organizations.

Your passwords

Every password is tied to what it protects:

  • A topic password (Settings -> Topics -> Your Topic -> Set Password) protects sends to one topic. Everyone who holds the topic and knows the password can read them, so this is the one you share with the people on the other end.
  • Your personal password (Settings -> Encryption -> Personal Password) protects your submissions and tasks/notification that you send to yourself. It only ever travels between your own devices, so keep it to yourself.
bash
# secret@family = the password for the topic "family"
sp task -t family --title "Groceries?" --text-input "What do we need?" -p "secret@family"

# a bare password = your personal password
sp collect --submissions -p "personal-secret"
python
from simplepush import Client

client = Client(
    api_token="YOUR_API_TOKEN",
    passwords=[
        ("secret", "family"),   # topic password
        "personal-secret",      # personal password
    ],
)

# encrypted automatically: the topic has a password
client.send_task(topic="family", title="Groceries?")
typescript
import { Client } from "@simplepush/sdk";

const client = new Client({
  apiToken: "YOUR_API_TOKEN",
  passwords: [
    ["secret", "family"],  // topic password
    "personal-secret",     // personal password
  ],
});

await client.sendTask({ topic: "family", title: "Groceries?" });

What stays visible

Everything a person reads or answers is encrypted: titles, content, questions, choice options, action buttons (both the label and the key your code matches on), slider scales, links, and file contents.

What the server still needs in the clear is the plumbing: who a message is addressed to, when it was sent, and the ids used to route answers back to you. So encryption hides the content of your work, not the fact that work happened.

Choosing passwords

There is no recovery. A password nobody remembers means content nobody can read, including you. Losing one never locks you out of your account, only out of the content it protected.