HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
rw
plainsight
Python2011–2020
rw / plainsight

plainsight

Plainsight: a textual steganography tool to defeat censorship.

2Distinct people
5Mentions
0Explicit recommenders
122GitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Plainsight: a textual steganography tool to defeat censorship.

GitHub

Where it is used

No documented product use has been verified yet.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year5 dated mentions

Observed mentions: 2011-08-14 17:40:58 UTC to 2020-05-04 23:59:00 UTC.

012011-01-01 00:00:00 UTC to 2012-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments20112012-01-01 00:00:00 UTC to 2013-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments20152016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2020

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20112011-01-01 00:00:00 UTC2012-01-01 00:00:00 UTC101
20122012-01-01 00:00:00 UTC2013-01-01 00:00:00 UTC000
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC101
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC101
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC000
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC000
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC000
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC000
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC101
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC101

What Hacker News says

5 sources
Stegasuras is convincing work and the quality looks excellent. I wrote a steganographic tool in this same spirit back in 2011, called Plainsight. Back then, we didn't have deep learning, and the "Imagenet moment for NLP" had yet to arrive. My Python code, with examples, is here: https://github.com/rw/plainsight Unlike the OP, my Plainsight algorithm is 100% invertible by construction, and accepts binary input. (I verified the inversion process with "roundtrip fuzzing", a technique I still use today.) Plainsight uses each bit of the input message to generate tokens. Bits are used to decide how to traverse a Huffman-style n-gram tree, weighted by frequency. This tree of n-grams is the model used in both the encoding and decoding steps. The drawbacks to my method are that the output 1) can be verbose and 2) does not convince a human that it'
Read the rest
s plausible, except for short messages. Stegasuras has orders-of-magnitude better output, and seems to solve the problems I couldn't solve eight years ago. I would venture that their new result has as much to do with advances in language modeling, as it does with the particulars of their encoding and decoding algorithms. I'll also note that I'm glad these researchers were able to use grant money to do this work. As a non-academic, I applied for an AI Grant to support me in upgrading Plainsight to use deep learning, but I was turned away at the time. Finally, one of the ideas I picked up back then is that spam can be used to contain secret messages. Send enough gibberish to enough people, with your intended recipient included, and you'll look like a spammer--not a spy: $ wget https://spamassassin.apache.org/publiccorpus/20030228_spam.tar.bz2 $ tar -jxvf 20030228_spam.tar.bz2 $ cat spam/0* > spam-corpus.txt $ echo "The Magic Words are Squeamish Ossifrage" | plainsight -m encipher -f spam-corpus.txt > spam_ciphertext $ cat spam_ciphertext (8.11.6/8.11.6) 3 (Normal) Internet can send e-mails until to transfer 26 10 [127.0.0.1] also include address from the most logical, mail business for your Car have a many our portals ESMTP Thu, 29 1.0 this letter on internet, <a style=3D"color: 0px; text/plain; cellspacing=3D"0" how quoted-printable about receiving you would like width=3D"15%" width=3D"15%" border="0" width="511" Date: Tue, 27 Thu, 19 26 because zzzz@localhost.spamassassin.taint.org for $ cat spam_ciphertext | plainsight -m decipher -f spam-corpus.txt Adding models: Model: spam-corpus.txt added in 2.57s (context == 2) input is "<stdin>", output is "<stdout>" deciphering: 100% | 543.84 B/s | Time: 0:00:00 The Magic Words are Squeamish Ossifrage
In Stegasuras: Neural Linguistic Steganography
Previously: https://news.ycombinator.com/item?id=6427525 Pardon the essay, but I've written a tool in this space before. Back in 2011, I wrote a textual steganography library and command-line application, called Plainsight: https://github.com/rw/plainsight Additionally, @workmajj and I wrote TweetFS using Plainsight. It lets you recursively pack up directories and post them as an encoded linked list of Tweets to Twitter: https://github.com/rw/tweetfs Plainsight uses each byte of the input message to generate tokens. Bits are used to decide how to traverse the token tree, weighted by frequency. The drawbacks are 1) verbosity and 2) incorrect grammar. One of the lessons of writing Plainsight is that spam can be used to contain secret messages. Send enough gibberish to enough people, with your intended recipient included, and you'll look lik
Read the rest
e a spammer--not a spy. -- Example 1 (regular text) Type your message to encode: echo 'Meet at Union Square at noon. The password is FuriousGreen.' > cleartext Then, pipe it through Plainsight: cat cleartext | plainsight -m encipher -f sherlock.txt > ciphertext The output will be Doyle-esque gibberish: cat ciphertext | fold -s which was the case, of a light. And, his hand. "BALLARAT." only applicant?" decline be walking we do, the point of the little man in a strange, her husband's hand, going said road, path but you do know what I have heard of you, I found myself to get away from home and for the ventilator little cold night, and I he had left my friend Sherlock of our visitor and he had an idea was not to abuse step I of you, I knew what I was then the first signs it is the daughter, at least a fellow-countryman. had come. as I have already explained, the garden. what you can see a of importance. your hair. a picture upon of the money which had brought a you have a little good deal in way: out to my wife and hurry." made your hair. a charge me a series events, and excuse no sign his note-book has come away and in my old Sherlock was already down to do with the twisted Now, decipher that ciphertext: cat ciphertext | plainsight -m decipher -f sherlock.txt > deciphered cat deciphered Meet at Union Square at noon. The password is FuriousGreen. -- Example 2 (binary data) $ dd if=/dev/urandom of=/dev/stdout bs=1 count=10 | plainsight -m encipher -f 1984.txt 10+0 records in 10+0 records out 10 bytes (10 B) copied, 9e-05 s, 111 kB/s Adding models: Model: 1984.txt added in 0.89s (context == 2) input is "<stdin>", output is "<stdout>" enciphering: 100%|#####################################################################################################################################################################|474.67 B/s | Time: 0:00:00 which is a war is real, the proles used mind on the telescreen. He could see through all right to. You have read what said. 'Yes,' only in the Ministry ---- One serious use case is to seed the generator with a spam email corpus. This lets you generate messages that look like spam. Example: wget https://spamassassin.apache.org/publiccorpus/20030228_spam.tar.bz2 tar -jxvf 20030228_spam.tar.bz2 cat spam/0* > spam-corpus.txt echo "The Magic Words are Squeamish Ossifrage" | plainsight -m encipher -f spam-corpus.txt > spam_ciphertext $ cat spam_ciphertext (8.11.6/8.11.6) 3 (Normal) Internet can send e-mails until to transfer 26 10 [127.0.0.1] also include address from the most logical, mail business for your Car have a many our portals ESMTP Thu, 29 1.0 this letter on internet, <a style=3D"color: 0px; text/plain; cellspacing=3D"0" how quoted-printable about receiving you would like width=3D"15%" width=3D"15%" border="0" width="511" Date: Tue, 27 Thu, 19 26 because zzzz@localhost.spamassassin.taint.org for $ cat spam_ciphertext | plainsight -m decipher -f spam-corpus.txt Adding models: Model: spam-corpus.txt added in 2.57s (context == 2) input is "<stdin>", output is "<stdout>" deciphering: 100%|#####################################################################################################################################################################|543.84 B/s | Time: 0:00:00 The Magic Words are Squeamish Ossifrage
In SpamMimic: encode your message into something innocent-looking
I wrote a textual steganography library and CLI in 2011, called Plainsight: https://github.com/rw/plainsight Additionally, @workmajj and I wrote TweetFS using Plainsight. It lets you recursively pack up directories and post them as an encoded linked list of Tweets to Twitter: https://github.com/rw/tweetfs I presented Plainsight at Hack'n'Tell NYC in 2011 and a video was recorded: http://bit.ly/pecGgW Plainsight uses each byte of the input message to generate tokens. Bits are used to decide how to traverse the token tree, weighted by frequency. The drawbacks are 1) verbosity and 2) incorrect grammar. One of the lessons of writing Plainsight is that spam can be used to contain secret messages. Send enough gibberish to enough people, with your intended recipient included, and you'll look like a spammer--not a spy. I also wrote a fuzzing tool
Read the rest
, called Shag, to find edge cases, e.g. for single-byte inputs: https://github.com/rw/shag/blob/master/shag.rb -- Example 1 (regular text) Type your message to encode: echo 'Meet at Union Square at noon. The password is FuriousGreen.' > cleartext Then, pipe it through Plainsight: cat cleartext | plainsight -m encipher -f sherlock.txt > ciphertext The output will be Doyle-esque gibberish: cat ciphertext | fold -s which was the case, of a light. And, his hand. "BALLARAT." only applicant?" decline be walking we do, the point of the little man in a strange, her husband's hand, going said road, path but you do know what I have heard of you, I found myself to get away from home and for the ventilator little cold night, and I he had left my friend Sherlock of our visitor and he had an idea was not to abuse step I of you, I knew what I was then the first signs it is the daughter, at least a fellow-countryman. had come. as I have already explained, the garden. what you can see a of importance. your hair. a picture upon of the money which had brought a you have a little good deal in way: out to my wife and hurry." made your hair. a charge me a series events, and excuse no sign his note-book has come away and in my old Sherlock was already down to do with the twisted Now, decipher that ciphertext: cat ciphertext | plainsight -m decipher -f sherlock.txt > deciphered cat deciphered Meet at Union Square at noon. The password is FuriousGreen. -- Example 2 (binary data) $ dd if=/dev/urandom of=/dev/stdout bs=1 count=10 | plainsight -m encipher -f 1984.txt 10+0 records in 10+0 records out 10 bytes (10 B) copied, 9e-05 s, 111 kB/s Adding models: Model: 1984.txt added in 0.89s (context == 2) input is "<stdin>", output is "<stdout>" enciphering: 100%|#####################################################################################################################################################################|474.67 B/s | Time: 0:00:00 which is a war is real, the proles used mind on the telescreen. He could see through all right to. You have read what said. 'Yes,' only in the Ministry
In Show HN: Send Secret Messages over Twitter as Public Tweets

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.