Feel free to donate to help keep this project live and running ❤️   Support here
Steganographic Engine

Hide Messages in Chess Games

Convert any text into a legally playable chess game. Play it anywhere — then decode the hidden message.

Secret Message
PGN Channel
Public
No key needed
Key Mode
Requires key
Generated PGN
0 moves
PGN Output
Your encoded PGN will appear here. Tip: Copy and paste into Chess.com, Lichess, or any chess platform to play the game naturally.
Cinematic Decode

Decode the Hidden Message

Paste any PGN from Chess.com, Lichess, or any platform. Watch the game replay as the message is extracted.

🔍
Decode Input
Auto-detect
Speed:
Sound
Live Board PGN Channel
Awaiting input...
Decoded Message
Message will appear here with typing animation...
♪ off
Covert Channel

Create a Dead Drop

Generate a reference card. Share only the pointer — the data lives on the chess platform.

Dead Drop Configuration

How It Works

Chess steganography — mathematically concealing information inside legally playable games.

PGN Channel

Text is converted to binary. At each position, legal moves are sorted alphabetically (deterministic). k = floor(log₂(N)) bits are encoded by choosing move index. The game looks natural: pawn moves, development, castling, captures. Works cross-platform — import into Chess.com, Lichess, or any PGN viewer.

FEN Channel

Compact data encoded into chess positions. Exactly 1 king per side, legal piece counts, no impossible structures. Capacity is dynamically determined. Used for key derivation, pointer data, or short mini-messages. Decodable from any valid FEN string.

🔑 Key System

Public: No key — direct decode for anyone.
Key Mode: XOR cipher with user password.
Hidden Key: Key derived from FEN hash at a specific move. Never transmitted. Both parties compute it from the game itself.

🎭 Decoy System

Wrong or missing key returns a plausible chess commentary message — never an error. Decoys are deterministic: hash(PGN + wrong_key) → same decoy every time. Three tiers: normal chess commentary (60%), mildly suspicious (30%), subtle troll (10%).

Encoding Math

At each chess position with N legal moves: k = ⌊log₂(N)⌋ bits can be encoded by choosing a move index in [0, 2^k). This guarantees all chosen indices are valid moves. Moves are sorted by SAN notation to ensure identical ordering at encode and decode time. A 2-byte length prefix is prepended to the payload before bit-encoding, enabling exact message reconstruction regardless of trailing bits.

Copied!