frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

Start all of your commands with a comma (2009)

https://rhodesmill.org/brandon/2009/commands-with-comma/
250•theblazehen•2d ago•84 comments

Hoot: Scheme on WebAssembly

https://www.spritely.institute/hoot/
23•AlexeyBrin•1h ago•1 comments

OpenCiv3: Open-source, cross-platform reimagining of Civilization III

https://openciv3.org/
705•klaussilveira•15h ago•206 comments

The Waymo World Model

https://waymo.com/blog/2026/02/the-waymo-world-model-a-new-frontier-for-autonomous-driving-simula...
967•xnx•21h ago•558 comments

Vocal Guide – belt sing without killing yourself

https://jesperordrup.github.io/vocal-guide/
67•jesperordrup•6h ago•28 comments

Reinforcement Learning from Human Feedback

https://arxiv.org/abs/2504.12501
7•onurkanbkrc•44m ago•0 comments

Making geo joins faster with H3 indexes

https://floedb.ai/blog/how-we-made-geo-joins-400-faster-with-h3-indexes
135•matheusalmeida•2d ago•35 comments

Where did all the starships go?

https://www.datawrapper.de/blog/science-fiction-decline
43•speckx•4d ago•34 comments

Unseen Footage of Atari Battlezone Arcade Cabinet Production

https://arcadeblogger.com/2026/02/02/unseen-footage-of-atari-battlezone-cabinet-production/
68•videotopia•4d ago•6 comments

ga68, the GNU Algol 68 Compiler – FOSDEM 2026 [video]

https://fosdem.org/2026/schedule/event/PEXRTN-ga68-intro/
13•matt_d•3d ago•2 comments

Jeffrey Snover: "Welcome to the Room"

https://www.jsnover.com/blog/2026/02/01/welcome-to-the-room/
39•kaonwarb•3d ago•30 comments

What Is Ruliology?

https://writings.stephenwolfram.com/2026/01/what-is-ruliology/
45•helloplanets•4d ago•46 comments

Show HN: Look Ma, No Linux: Shell, App Installer, Vi, Cc on ESP32-S3 / BreezyBox

https://github.com/valdanylchuk/breezydemo
237•isitcontent•16h ago•26 comments

Monty: A minimal, secure Python interpreter written in Rust for use by AI

https://github.com/pydantic/monty
237•dmpetrov•16h ago•126 comments

Show HN: I spent 4 years building a UI design tool with only the features I use

https://vecti.com
340•vecti•18h ago•147 comments

Hackers (1995) Animated Experience

https://hackers-1995.vercel.app/
506•todsacerdoti•23h ago•247 comments

Sheldon Brown's Bicycle Technical Info

https://www.sheldonbrown.com/
389•ostacke•21h ago•97 comments

Show HN: If you lose your memory, how to regain access to your computer?

https://eljojo.github.io/rememory/
303•eljojo•18h ago•188 comments

Microsoft open-sources LiteBox, a security-focused library OS

https://github.com/microsoft/litebox
361•aktau•22h ago•186 comments

An Update on Heroku

https://www.heroku.com/blog/an-update-on-heroku/
428•lstoll•22h ago•284 comments

Cross-Region MSK Replication: K2K vs. MirrorMaker2

https://medium.com/lensesio/cross-region-msk-replication-a-comprehensive-performance-comparison-o...
3•andmarios•4d ago•1 comments

PC Floppy Copy Protection: Vault Prolok

https://martypc.blogspot.com/2024/09/pc-floppy-copy-protection-vault-prolok.html
71•kmm•5d ago•10 comments

Was Benoit Mandelbrot a hedgehog or a fox?

https://arxiv.org/abs/2602.01122
23•bikenaga•3d ago•11 comments

The AI boom is causing shortages everywhere else

https://www.washingtonpost.com/technology/2026/02/07/ai-spending-economy-shortages/
25•1vuio0pswjnm7•2h ago•14 comments

Dark Alley Mathematics

https://blog.szczepan.org/blog/three-points/
96•quibono•4d ago•22 comments

How to effectively write quality code with AI

https://heidenstedt.org/posts/2026/how-to-effectively-write-quality-code-with-ai/
270•i5heu•18h ago•219 comments

Delimited Continuations vs. Lwt for Threads

https://mirageos.org/blog/delimcc-vs-lwt
34•romes•4d ago•3 comments

I now assume that all ads on Apple news are scams

https://kirkville.com/i-now-assume-that-all-ads-on-apple-news-are-scams/
1079•cdrnsf•1d ago•461 comments

Introducing the Developer Knowledge API and MCP Server

https://developers.googleblog.com/introducing-the-developer-knowledge-api-and-mcp-server/
64•gfortaine•13h ago•30 comments

Understanding Neural Network, Visually

https://visualrambling.space/neural-network/
306•surprisetalk•3d ago•44 comments
Open in hackernews

Scream cipher

https://sethmlarson.dev/scream-cipher
300•alexmolas•4mo ago

Comments

DonHopkins•4mo ago
ẰǍȦǠẠ ÄẪǠẠ
codeulike•4mo ago
Ằậaẳẳặắ
blueflow•4mo ago
... in the same sense that ROT13 or base64 would be a cipher.
andy99•4mo ago
Yes https://en.m.wikipedia.org/wiki/Substitution_cipher
blueflow•4mo ago
First sentence:

> with the help of a key

So, where is the key?

shakna•4mo ago
The key is the data table, representing which each character encodes to or from.
bradrn•4mo ago
In the code in this article, the key is the mapping stored in ‘CIPHER’.
JdeBP•4mo ago
First, second, and third statements of the provided source code.
blueflow•4mo ago
Like i said, by these measurements, base64 would also be a cipher.
omnicognate•4mo ago
And people are telling you yes, they (rot13 and base64) are indeed ciphers. What's the confusion?
blueflow•4mo ago
What people in this thread call a "key" is, not like a key, auxiliary input data, but hard-coded into the program. We are looking at encodings.

Maybe this differentiation is not popular or well accepted, but it was surely part of my cryptography curriculum and the following exam. I'd rather believe my prof than strangers on the internet.

greysonp•4mo ago
Key can mean different things in different contexts. In a substitution cipher, the key is the mapping. In modern ciphers, the key would be some set of secret bytes. Everyone agrees that this cipher would be a bad way to encrypt/encode something. But using the word cipher like this has real historical meaning, and that is the meaning that is being used in the project.
DonHopkins•4mo ago
Ha ha ha ha ha ha! You want the key?

https://www.youtube.com/watch?v=vsb9-wPYpxI

JdeBP•4mo ago
… and no, since neither the enciphering nor the deciphering do a 1:1 mapping for all possible input code points.
amenhotep•4mo ago
That's not a requirement. Pigpen is a substitution cipher.
JdeBP•4mo ago
You will find that the pigpen cipher has a 1:1 mapping between its input alphabet and its output alphabet, and that a 1:1 mapping is a necessity for full invertibility.
personalcompute•4mo ago
Ăặȧạaǎẩậā ȧẫạ13, áaǡặ64, aẩắ ạẵǎǡ ẩặả ǡăȧặaầ ăǎäẵặȧ aȧặ aậậ ǎẩǡặăȁȧặ, áȁạ ạẵặā ắẫ ầặặạ ạẵặ ạặăẵẩǎăaậ ắặằǎẩǎạǎẫẩ ẫằ a ăǎäẵặȧ.
lambdaone•4mo ago
Yog-Sothoth has heard your plea, and will be along to help you shortly.
jeroenhd•4mo ago
The original Caesar cipher supposedly also had a constant offset, yet it's still considered a cipher.

A bad substitution cipher is still a cipher. Just one you shouldn't use for anything important.

hennell•4mo ago
Rot 13 is a cipher. It's a substitution cipher, and more specifically a shift cypher or Caesar cipher. It's not a secure cipher but it is one.

Base64 is an encoding. It's an algorithm, no attempt at secrecy, thus not a cipher.

blueflow•4mo ago
And what do you think is the algorithm from the article? Looks awfully similar to base64 to me, except its lacking the bit-shifts. Both use a lookup table like that.
hennell•4mo ago
I think a lot of this depends on if you read the article as the scream cipher being specifically the exact listed substitutions or just any substitution with forms of As. Also depends on how you define encoding, cipher and the overlaps between the two. Plus questions on the relevance of intent, transformation of data, plus changing of meaning and definitions over the years. Some people say morse code is a cipher, but braille isn't - definitions can depend on way more than the black and white logical "but it does this" you're using.

You'd do better debating this with a real life friend over a pint, rather than wasting your time trying to argue with multiple people here.

cluckindan•4mo ago
And thus we arrive at SCREAM64 encoding, base64 in scream cipher.
foofoo12•4mo ago
Sweet Lord Jesus.
KPGv2•4mo ago
such a great idea that we ought to call it based64 encoding
mistercow•4mo ago
If you use base64 with the intention of hiding the encoded information, surely it’s as much a cipher as rot13 is, right?
codeulike•4mo ago
Ảặậậ ạẵaạǡ ȧặaậậā ǎẩạặȧặǡạǎẩẳ, a áǎạ ầẫȧặ ằȁẩ ạẫ ȁǡặ ạẵaẩ ȦẪẠ13
dsjoerg•4mo ago
Ǎ ăẫẩǡǎắặȧ ǎạ a ăẵaậậặẩẳặ áặằẫȧặ ạẵặ ảẵẫậặ ẵȁầaẩ ȧaăặ! Aẩắ Ǎ aǎẩ'ạ ẳẫẩẩa ậẫǡặ.....
tetris11•4mo ago
> > "Hope remains strewn asunder, I weep holy tears oh great one, Paul:16"

> "I belong to a secret group of panda bear hunters! Eat a meaty flesh chunk...."

For anyone wondering..

BubbleRings•4mo ago
I bet that last word is ROT13! We can crack it now! And maybe the second to last is “like”.
sim7c00•4mo ago
wait is it rot13 on the screamphabet or the alphabet?
ginko•4mo ago
Now pack even more info in each character with Zalgo text.
permo-w•4mo ago
am I unusual in not really seeing the "creepiness" of zalgo text?
lambdaone•4mo ago
Think of it as representing something like the letters actively 'creeping' and giving off tendrils of darkness. Does this help?
permo-w•4mo ago
I understand the idea, it just doesn't impact me
Retr0id•4mo ago
It's not inherently creepy but often symbolic of corruption or someone talking in a raspy/synthetic "evil overlord" kind of voice.
faeyanpiraat•4mo ago
Maybe you missed this piece of the internet history: https://stackoverflow.com/a/1732454
Retr0id•4mo ago
zalgo256: https://gist.github.com/DavidBuchanan314/07da147445a90f7a049...
BubbleRings•4mo ago
Hey, cool little rabbit hole there. I had totally missed all that.

https://en.m.wikipedia.org/wiki/Zalgo_text

Retr0id•4mo ago
There are a little over 256 unicode Combining Marks that have a 2-byte UTF-8 encoding. I picked a set of them, defining an encoding I call zalgo256:

https://gist.github.com/DavidBuchanan314/07da147445a90f7a049...

Since an arbitrarily tall stack of combining characters still counts as one grapheme cluster, if some application limits string length by counting grapheme clusters then you can stuff an unlimited amount of data in there, with "only" 2x overhead in the byte representation.

Unfortunately HN filters some of the codepoints so I can't demonstrate here. Since I chose "A" as the base character which the diacritics are stacked on, it has a similar aesthetic to the SCREAM cipher although a little more zalgo-y.

junon•4mo ago
A demonstration as a comment on the gist would probably work! I'd love to see that
Retr0id•4mo ago
Good point, added
junon•4mo ago
Interesting, I actually expected it to encode a single letter with infinitely long combining marks such that 'highlighting' it was just highlighting one character.
Retr0id•4mo ago
You can do that too, if you increase the STACK_HEIGHT constant (btw, the decoder still works the same, so changing this doesn't break compatibility)
junon•4mo ago
Oh neat! Thanks :)
all2•4mo ago
Most of the characters appear as boxes on my phone.
Retr0id•4mo ago
That's curious, because the only character is just the letter A. But I suppose if the font doesn't support a particular combining mark, it gives up on the whole grapheme?
RGamma•4mo ago
Are you sure this doesn't summon The One by accident?
Dylan16807•4mo ago
HN filters some combining characters? That's weird, compared to the symbol/emoji blocking.

Also I'm reminded that the unicode normalization annex suggests that legitimate grapheme clusters will be 31 code points or less. "The value of 30 is chosen to be significantly beyond what is required for any linguistic or technical usage."

Retr0id•4mo ago
If I had to guess, they probably filtered the ones that could be used to break page layouts by creating very-tall glyphs.
Dylan16807•4mo ago
I guess that's one way to do it. Pretty far from ideal though.
fainpul•4mo ago
One could use emojis instead, then the message could be hidden in plain sight in places where emoji-spam is common.
cluckindan•4mo ago
Emojis have a high overhead, a single emoji is typically 4 bytes but may be up to 35 bytes.
foofoo12•4mo ago
Yikes! Imagine if people were to start sending photos and videos to each other!
fainpul•4mo ago
Oh, my bad - I wasn't aware that we're doing serious engineering here :p
Bender•4mo ago
For fun there are other variants of base64 in a similar spirit [1][2] full unicode. [3] see other links in that repo... Not a stream cipher, just encoding but could be used in conjunction with a stream cipher to add compression. It could go turtles all the way down.

[1] - https://github.com/qntm/base2048

[2] - https://github.com/qntm/base32768

[3] - https://github.com/qntm/base65536

rawling•4mo ago
https://xkcd.com/3054/
PenguinRevolver•4mo ago
Oh god, now we're gonna have two different standards for a scream cypher https://xkcd.com/927/
codeulike•4mo ago
Ah its from XKCD (feb 2025), bit odd of the OP not to mention that
hnlmorg•4mo ago
I think this might be more coincidental than derivative.
sim7c00•4mo ago
scream ciphers. a bit like back when we invented fire :p
SethMLarson•4mo ago
OP here, I either didn't know or completely forgot this XKCD existed and it resurfaced as a good idea haha! Time to update the post lol
RealCodingOtaku•4mo ago
https://www.dcode.fr/scream-cipher-xkcd
somat•4mo ago
I got nerd sniped by this xkcd and was happily working my way through an implementation and realized that the accent combiners work with any character. It is trivial to add bad steganography to your bad encryption.

r̊e̝q̝ůěs̔t͞ p̊e̝a͞c̍e̊ t̠a̗lks

sixhobbits•4mo ago
I did something similar a while back but using all the invisible characters to encode extra data into telegram messages for metadata storage

https://github.com/sixhobbits/unisteg

franga2000•4mo ago
I was very confused why this would be useful for Telegram messages, but the Why? part of the readme makes perfect sense. Great workaround for a stupid limitation!
velcrovan•4mo ago
I had fun writing a Racket version:

    #lang racket/base

    (require net/base64
             threading)
    
    (define FIRST-INVISIBLE-CHAR 917760)
    
    (define (invis-encode str)
      (list->string
       (for/list ([c (in-list (string->list str))]
                  #:do [(define cnum (char->integer c))]
                  #:when (<= cnum 127))
         (integer->char (+ cnum FIRST-INVISIBLE-CHAR)))))

    (define (invis-decode str)
      (list->string
       (for/list ([c (in-list (string->list str))]
                  #:do [(define plaintxt-c (- (char->integer c) FIRST-INVISIBLE-CHAR))]
                  #:when (> plaintxt-c 0))
         (integer->char plaintxt-c))))

    (define (hide secret plain)
      (~> (string->bytes/utf-8 secret)
          (base64-encode #"")         ; use #"" vs #"\r\n" to prevent line-wrapping
          (bytes->string/utf-8)
          (invis-encode)
          (string-append plain _)))

    (define (unhide ciphertext)
      (~> (invis-decode ciphertext)
          (string->bytes/utf-8)
          (base64-decode)
          (bytes->string/utf-8)))

    (module+ test
      (require rackunit)
      (define secret "this is a s3cret message. ssh")
      (define plaintext "Hey you, nothing to see here.")
      (define to-share (hide secret plaintext))
    
      (check-equal? (string-length to-share) 69)         ; count of bytes
      (check-equal? (string-grapheme-count to-share) 29) ; 29 actually-visible graphemes
      (check-equal? secret (unhide to-share)))
askonomm•4mo ago
Threading is done with the wave character ~ in Racket? I can't decide if I hate it or not (am used to Clojure's ->). I think my pinky finger doesn't like ~.
velcrovan•4mo ago
In this case ~> is a macro from a widely used package (https://docs.racket-lang.org/threading/index.html) so if you defined an alias for it (or forked the package) you could use any valid identifier.
soegaard•4mo ago
The identifier `->` is already used for type annotations.
adv0r•4mo ago
it had to be done https://chatgpt.com/g/g-68ce9419c7d4819190f82744d6e2741e-url...
RealCodingOtaku•4mo ago
Ǎầầặắǎaạặậā ạẵẫȁẳẵạ ẫằ ȂẤĂẮ, ǎẩằaăạ a ǟȁǎăấ ǡặaȧăẵ ằẫȧ ạẵǎǡ ạǎạậặ ẳǎàặǡ ầặ ȂẤĂẮ, ǎạ ăẫȁậắ áặ ăẫǎẩăǎắặẩạaậ, áȁạ Ǎ ảẫȁậắ ầặẩạǎẫẩ ǎạ ǎẩ ạẵặ äaẳặ ǎằ Ǎ ảặȧặ āẫȁ.
ethmarks•4mo ago
Here's another implementation I made a few months ago:

https://ethmarks.github.io/posts/screamcipher

efitz•4mo ago
I have been using ROT13, but I’ve been looking for a post-quantum replacement so definitely I’m going to convert to SCREAM. It’s generally understood that qubits are unable to represent or even discern the little squiggly bits above normal Latin letters.

Thank you for this important contribution to cryptography!

eastbound•4mo ago
I wonder if Chatgpt can decrypt all of them just by analyzing vowel frequency, and then trying to find the algo on the internet.
ameliaquining•4mo ago
In my tests, ChatGPT 5 Thinking can handle a monoalphabetic substitution cipher if you prompt it a couple times to keep going.
stordoff•4mo ago
Not perfectly. I grabbed a random encoded line from these comments, and asked ChatGPT to decode it[1]. It determined the plaintext was:

> Immediately thought of Moby, infact a quick search for this title... coincidental, but I would mention it in the page if I were you.

and noted that it had "preserved punctuation and capitalization from the ciphertext". The actual plaintext should be:

> Immediately thought of XKCD, infact a quick search for this title gives me XKCD, it could be coincidental, but I would mention it in the page if I were you.

I've hit my free usage limit so can't currently prompt it further about its mistake.

[1] https://chatgpt.com/share/68cf17a6-8478-8011-a44e-64d43ad8a4...

thenewwazoo•4mo ago
I pushed it a bit and it didn’t do so hot.

https://chatgpt.com/share/68cf3b9f-decc-8007-8a5d-cc7b583d0e...

jagged-chisel•4mo ago
The important part about applying ROT13 is the number of iterative applications. The security of even-numbered applications is undeniable. Odd-numbered is even better than that.

I’m currently building an implementation with fractional rotation. Of course I will post a Show HN when it’s ready.

fragmede•4mo ago
oh so that's where æ comes from!
vpShane•4mo ago
Looking forward to seeing that, sounds fun and interesting!
s20n•4mo ago
It's hilarious that Stream Ciphers are the closest thing to the One-Time-Pad (which provides "Perfect Secrecy") and this thing is a Monoalphabetic Substitution Cipher which provides no security whatsoever.
tptacek•4mo ago
It feels like you're trying to express that stream ciphers are especially secure compared to block ciphers (which is what most of them are built out of), which isn't the case.
fuzzy_biscuit•4mo ago
Now I need a TTS to read a scream.
sigseg1v•4mo ago
Artosis' channel on Twitch has got that one covered.
timonoko•4mo ago
Most of these are short/long vowel markings, except last one which is (probably) implosion. And rest are frontal/back and wide/narrow A.

But Swedish "Å" is just stupidity "O", because they started pronouncing "O" as "U" and "U" as "Y".

-- Can you pronounce these screams?

pezezin•4mo ago
The last one is the ogonek, it usually indicates nasalization: https://en.m.wikipedia.org/wiki/Ogonek
slig•4mo ago
Ạẵặǡặ Äȧặạąặậǡ Aȧặ Ầaấǎẩẳ Ầặ Ạẵǎȧǡạā!
zahlman•4mo ago
It's not necessary to write the ciphering logic.

  CIPHER, UNCIPHER = str.maketrans(CIPHER), str.maketrans(UNCIPHER)

  print(s := 'STREAM CIPHER'.translate(CIPHER))
  print(s.translate(UNCIPHER))
SethMLarson•4mo ago
NICE!!
zahlman•4mo ago
It's truly an honour to have been able to teach the PSF's Security Developer-in-Residence something about the implementation of a simple substitution cipher in Python. ;) (In all seriousness, thanks for all your excellent work. The many projects you help out with — and advocate for — in the Python ecosystem, including CPython itself, are all far better off for it.)
SethMLarson•4mo ago
<3 Thanks for the kind words!! :)
vehementi•4mo ago
Finally we can talk to the bomb dudes in Serious Sam
cluckindan•4mo ago
Or teach it as the only righteous alphabet to our children.
cluckindan•4mo ago
Do this with variants of O and the ghosts will be happy.
vman512•4mo ago
How sand people talk
kirjavascript•4mo ago
here's a JS one liner that handles scream and unscream in one function

  transform=s=>[...s.toUpperCase()].map(s=>(l="BÁGẲLẬQǞVÀCĂHẴMẦRȦWẢDẮIǍNẨSǠXȂEẶJÂOẪTẠYĀFẰKẤPÄUȀZĄ")[l.indexOf(s)^1]||s).join``
jdranczewski•4mo ago
I was rather confused by the dictionary comprehension syntax used there, because I wasn't aware that you could write one without the ":" to delineate the key: value pair. Turns out you can, but it just creates a dict with no values stored, just the keys! This works here because the returned dict is an iterable that returns the keys on iteration, and "update" accepts an iterable of (key, value) tuples - and the keys are just that in this case. So the effect is the same as if it was a list comprehension! Just slightly more confusing
duskwuff•4mo ago
Not precisely. {x} is a set literal; {x for y in z} is a set comprehension.
jdranczewski•4mo ago
Ah, my bad! I did not know these were a thing, but that makes more sense! Teaches me a thing about only quickly trying things in an online REPL on mobile and jumping to conclusions - I forgot curly braces were also a way to denote a set
pbsd•4mo ago
I thought this was gonna be about the actual Scream stream cipher: https://eprint.iacr.org/2002/019
yencabulator•4mo ago
Previous attempt at cracking this cipher:

https://www.youtube.com/watch?v=ZlIz0q8aWpA