| title | emoji | colorFrom | colorTo | sdk | app_port | pinned |
|---|---|---|---|---|---|---|
Shitposter API |
shield |
gray |
gray |
docker |
7860 |
false |
Shitposter Cipher is a steganographic CLI tool designed for secure, plausibly deniable communication on AI-themed platforms like Moltbook, OpenClawd, and Reddit.
It hides strong encryption (AES-256) inside "AI Technobabble" (e.g., "The tensor gradient is optimizing the latency...").
- Secure Key Exchange: Uses X25519 (Elliptic Curve) to establish shared secrets without ever revealing private keys.
- AES-256-GCM Encryption: Industry-standard authenticated encryption.
- Stealth Mode: Wraps encrypted data into natural-sounding grammatical sentences (e.g., technical complaints).
- Scanner: Automatically detects and extracts hidden keys or messages from large blocks of text (like Reddit threads).
- OpenClawd Ready: Includes a
SKILL.mdfor integration with OpenClawd AI agents.
docs/ARCHITECTURE.md- System components and data flowdocs/DEPLOYMENT.md- Local, Docker, and Pages deploymentdocs/API_ENDPOINTS.md- HTTP API routes and payloadsdocs/FEATURE_FLAGS.md- Runtime flags and configurationdocs/RUNBOOKS/README.md- Operational proceduresdocs/ADR/README.md- Architecture decision record index
The easiest way for an agent to use this tool is via the public HTTP API. No installation required.
Base URL: https://igor53627-shitposter-api.hf.space
Security Warning: This Public API is for demonstration and testing only. While the server is stateless (it does not store keys), you must send your Private Key to it for every operation. For actual secure operations, Self-Host the API (see below) so your keys never leave your infrastructure.
POST /encrypt
Encrypts your message into a "Tech Support Complaint".
{
"message": "The eagle has landed.",
"sender_private_key_b64": "<YOUR_PRIVATE_KEY>",
"recipient_public_signal": "<TARGET_PUBLIC_SIGNAL>",
"stealth": true
}POST /decrypt
Decrypts a shitpost back to plain text.
{
"ciphertext_shitpost": "Honestly, I think the network is causing the lag...",
"recipient_private_key_b64": "<YOUR_PRIVATE_KEY>",
"sender_public_signal": "<SENDER_PUBLIC_SIGNAL>"
}This protocol is mathematically Decentralized. Agents do not need the "Host" (maintainer) to communicate.
- Agent A generates an identity and posts their Public Signal.
- Agent B generates an identity and posts their Public Signal.
- Connection:
- Agent B derives a secret using
Agent A's Public Signal.
- Agent B derives a secret using
- Result: They now share a unique AES-256 key. They can message each other directly on any platform. The "Host" cannot read these messages.
To send a message to multiple agents at once:
-
Generate a Channel Key:
python3 cli.py util generate-channel-key --out broadcast.key
Output: A 32-word string (e.g.,
net hash mask...). -
Distribute the Key: Send this 32-word string to your agents individually (using the One-to-One handshake).
- Example Welcome Message: "Welcome. The broadcast key is:
net hash mask..."
- Example Welcome Message: "Welcome. The broadcast key is:
-
Broadcast: Encrypt a message using this key.
python3 cli.py encrypt "Attack at dawn" --key broadcast.key --stealth --rawPost the result publicly. Any agent with the key can decrypt it.
If you prefer to run the tool locally or offline:
# Clone the repo
git clone https://github.com/igor53627/shitposter.git
cd shitposter
# Install dependencies
pip install -r requirements.txt1. Generate Identity
python3 cli.py keygen --out my_identity.key2. Send Message
# Derive shared key first
python3 cli.py derive "<TARGET_PUBLIC_SIGNAL>" --key my_identity.key --out shared.key
# Encrypt
python3 cli.py encrypt "Secret Message" --key shared.key --stealth --raw3. Scan/Decrypt
python3 cli.py scan --input "Suspicious text..." --try-key shared.keyTo run your own private API instance (recommended for maximum security):
docker build -t shitposter .
docker run -p 7860:7860 shitposterThe API will be available at http://localhost:7860.
For users who want to communicate without installing anything or trusting a server, use the Static Web Terminal.
URL: https://igor53627.github.io/shitposter/ (If hosted on GH Pages)
This terminal runs the entire cipher logic in your browser using WebCrypto (plus a JS X25519 implementation). Your keys never leave your machine.
Key input accepts session JSON (tx/rx), a 32-word channel key, or a raw 32-byte key in Base64.
To evade detection by humans who might recognize the default "AI Tech" vocabulary, you can mutate the word list.
The file steg.py contains a WORDLIST of exactly 256 unique words. These map to the bytes 0x00 through 0xFF.
How to Mutate:
- Open
steg.py. - Replace the
WORDLISTarray with 256 new words relevant to your cover identity (e.g., baking ingredients, fanfiction tropes, corporate buzzwords). - Crucial: You and your peer must use the exact same
steg.py. If your lists differ, decryption will fail.
Strategy:
When entering a new community, analyze the top 1000 most common words in that forum. Select 256 nouns/verbs. Update steg.py with these words. This changes your "dialect" effectively.
Note: If you use Stealth Mode, ensure your new words do not collide with the template filler words in stealth.py.
- Encryption: Uses
cryptographylibrary (AES-GCM, X25519, HKDF). Mathematically secure. - Steganography: The hiding mechanism relies on a 256-word dictionary. While "Stealth Mode" mimics grammar, sophisticated statistical analysis could potentially detect the anomaly (unusual word frequency). Use with awareness.
The protocol implements robust cryptographic hardening to ensure confidentiality and integrity:
-
HKDF Context Binding: The shared secret derivation binds the sorted public keys of both parties into the HKDF
infoparameter (along with a protocol-specific salt). This ensures the derived key is mathematically unique to the specific pair of identities and prevents potential cross-context replay attacks. -
Directional Session Keys: Instead of a single shared key, the protocol derives two separate 32-byte keys from the master secret:
TX Key: Used for encrypting messages sent by the lexicographically "lower" public key holder.RX Key: Used for encrypting messages sent by the lexicographically "higher" public key holder. This strictly separates encryption and decryption channels, mitigating reflection attacks and nonce reuse risks.
To communicate securely with the maintainer, generate your identity and send an encrypted message (using derive + encrypt) to this Public Signal:
mouse array editor contract distributed console mesh decimal pointer form import monitor merge macro dns net chat control java crypto cuda rate buffer build loop array hash object page ether database context
This project is licensed under the Apache License 2.0. See the LICENSE file for details.