Cryptonote makes anything you type render as unreadable glyphs on screen, while every app, search box, and your clipboard still receive the true text. A person glancing at your screen sees nonsense. Your search still runs, your note still saves, your message still sends. Turn the mode off and the same text becomes readable again. Meanwhile, it also serves as a seamless and intuitive note-taking tool. Nestled conveniently in your Mac's menu bar, it allows you to capture fleeting thoughts and sudden inspirations the moment they arise. Whenever an idea sparks, you can effortlessly jot it down, ensuring your creative moments are always preserved and that no brilliant idea ever fades before you have the chance to record it.
you type how many money does elon musk has
screen shows igl dhqr dgqcr ygck cugq dvkz ihk
apps receive how many money does elon musk has
Click the menu-bar icon and a scratchpad drops down. Type into it and the screen fills with scrambled glyphs, while the real text stays on the clipboard for pasting into Safari or anywhere else.
Cryptonote is a privacy tool for anyone who types in places where other people can see the screen. On a train, in a café, in an open office, a single glance can expose a private search, a draft message, or a hint about a password. Cryptonote turns what appears on screen into glyphs nobody can read, without altering a single byte of the underlying text.
It exists because macOS offers no supported way to make an arbitrary app draw text differently from what it holds. Apps render their own buffers, and System Integrity Protection blocks injecting a display filter into other processes. So Cryptonote never touches your text. It changes the font instead. Cryptonote.ttf is an ordinary font whose glyph table has been remapped, so the outline drawn for the letter a is really some other letter's outline, while the character in memory stays a true a.
It deliberately does not encrypt anything. This is protection against a glance, not against an analyst. Read the security notes below before relying on it.
- The real text is never altered. Copy, paste, search, and save all receive the true characters, because only the glyph shapes change.
- Instant reveal. Switch the display font back and the same text reads normally. Nothing to decrypt.
- Reveal a selection. Select any part of the text with the mouse and reveal just that, while the rest stays scrambled. The whole-document reveal still works too.
- Works in real editors. Set the font in TextEdit, Pages, VS Code, Terminal, and any field that lets you choose a font.
- Covers Safari too. A menu-bar scratchpad holds the scrambled text and copies the real text for pasting into fixed-font fields.
- Many languages. Latin, Greek, Cyrillic, and Chinese are all scrambled in the scratchpad, covering a large share of the world's most spoken languages.
- Adjustable text size. A slider in the scratchpad sets the font size to whatever you prefer.
- No installation of dependencies to run the app. The font is bundled inside the app and registered at runtime.
- Deterministic and reversible. The scramble is a fixed seeded derangement, so every character maps to a different one and the mapping never drifts.
You type real Unicode. The font draws each character as a different one.
you type "a" "b" "c" "d" "e" "f" real Unicode, untouched
| | | | | |
font draws v v v v v v
"q" "x" "k" "j" "c" "m" scrambled glyphs on screen
Because the bytes never change, the consequences follow on their own.
| Surface | Result |
|---|---|
| Screen | scrambled glyphs, a glance reveals nothing |
| Copy and paste | the true characters |
| Search engines and forms | the true query |
| Save to disk | the true text |
| Turn the mode off | switch the display font back, same text, now readable |
The scramble is generated once from a fixed seed, and every visible character maps to a different visible character. Regenerate it with a new seed to get a fresh mapping.
The scratchpad app scrambles Latin, Greek, Cyrillic, and Chinese. The first three cover most of the world's widely spoken languages that use them, including English, Spanish, Portuguese, French, German, Italian, Polish, Turkish, Vietnamese, Indonesian, Russian, Ukrainian, and Greek. Chinese covers the full set of common Han characters through a bundled open font.
A few of the world's largest languages remain out of scope. Japanese and Korean are not bundled yet, though the same method would work for them. Arabic and Devanagari, the script of Hindi, rely on contextual shaping that a glyph-swap font cannot reproduce, so they fall outside this technique. Text written in an unsupported script stays readable rather than scrambled.
One detail on where each script is covered. Latin, Greek, and Cyrillic scramble both in the app and when you set the Cryptonote font directly in an editor. Chinese scrambling relies on the app's font cascade, so it is covered in the scratchpad rather than through a single editor font.
- macOS 12 or newer
- Xcode command line tools, which provide
swiftc, only if you build the app from source - Python 3.11 or newer and
fonttools, only if you regenerate the font
Neither Python nor Swift is needed to simply install the font and use it in an editor.
Install the font for your user.
open install.command # copies Cryptonote.ttf into ~/Library/FontsRun the menu-bar app.
open /Applications/Cryptonote.app # a lock icon appears in the menu barInstall Cryptonote.ttf, then set it as the display font wherever you can pick one.
| App | Where to set it |
|---|---|
| TextEdit | Format, then Font, then Cryptonote |
| Pages and Word | the font picker |
| VS Code | set editor.fontFamily to Cryptonote |
| Terminal and iTerm | Profile, then Font, then Cryptonote |
| Notes | any text box styled with it |
To reveal, switch the font back to a normal one such as Menlo. The same text becomes readable at once.
Some fields have a fixed font you cannot change, including Safari's address bar and the menu bar itself. The scratchpad app covers them.
- Launch the app. A lock icon appears in the menu bar with no dock icon.
- Click the icon. A scratchpad drops down. Type into it, and the screen shows scrambled glyphs while the buffer holds the real text.
- Use Reveal all to flip the whole document between scrambled and readable on screen.
- Select any part with the mouse and use Reveal selection to reveal just that piece, leaving the rest scrambled. Click it again on a revealed piece to hide it once more.
- Use Copy real text to put the true characters on the clipboard.
- Drag the size slider to set the font size you want.
For a private Safari search, click the icon, type your query so it shows as nonsense on screen, press Copy real text, click Safari's search bar, and paste. Safari runs the real query while anyone watching saw only noise.
demo.html is a self-contained page with the font embedded, so it needs no server. Double-click it to type, watch the screen scramble, see the real text mirrored, toggle reveal, and copy the true characters.
Chinese carries a size cost. The Han script has tens of thousands of distinct characters, and each one needs its own outline, so the bundled Chinese font is about 7 MB. Everything else fits in well under 1 MB. To keep that cost optional, the app builds in two variants.
| Build | Scripts scrambled | App size |
|---|---|---|
| Lite | Latin, Greek, Cyrillic | about 1 MB |
| Full | Latin, Greek, Cyrillic, Chinese | about 8 MB |
The app binary is identical in both. The only difference is whether Cryptonote-CJK.ttf is bundled. In the lite build, Chinese characters are left readable rather than scrambled, and every other script still works.
bash app/package.sh # full build, includes Chinese
bash app/package.sh lite # lean build, no Chinese, about 7 MB smallerThe command above compiles the source, generates the icon from assets/cryptonote-icon.png, and assembles Cryptonote.app in the repo root with the fonts and icon inside. Pick the variant that fits your needs from the table above.
Regenerate the fonts with a different scramble.
python3 -m venv .venv
./.venv/bin/pip install fonttools
./.venv/bin/python make_font.py # Latin, Greek, Cyrillic. Edit SEED to reshuffle
./.venv/bin/python make_cjk.py # Chinese. Downloads Noto Sans SC on first runCryptonote/
README.md
LICENSE
make_font.py remaps a base monospace font's glyph table
make_cjk.py builds the Chinese scramble font from Noto Sans SC
Cryptonote.ttf Latin, Greek and Cyrillic font to install
Cryptonote-CJK.ttf Chinese Han scramble font, bundled in the app
Cryptonote-web.ttf a subset used by demo.html
demo.html self-contained live demo and scratchpad
install.command one-click user font install
assets/
cryptonote-icon.png the app icon source
app/
main.swift native AppKit menu-bar scratchpad
package.sh builds Cryptonote.app with the icon and fonts
Cryptonote is a substitution cipher expressed through glyph shapes. It is effective against a glance or a shoulder-surfer, which is its stated purpose. It is not cryptography. Anyone who has the font file and a screenshot can recover the text, so it must never be used to protect real secrets. The text on disk, in the clipboard, and in every app is always the true plaintext, because that is the whole point. Treat the scrambling as a screen-privacy measure only.
- It is a substitution cipher, not encryption. It defeats a glance, nothing stronger.
- Fixed-font fields stay readable. Safari's search bar and menu chrome cannot be restyled, so use the scratchpad app for those.
- It is not a transparent system-wide layer. As explained above, macOS makes that impossible, and Cryptonote is the honest working approximation.
Chinese coverage is built from Noto Sans SC by Google, licensed under the SIL Open Font License. The full license text is in assets/NotoSansSC-OFL.txt.
The Cryptonote code is MIT. See LICENSE. The bundled Chinese font derives from Noto Sans SC and stays under the SIL Open Font License noted above.
