"Hide data in plain sight"
Emoji steganography tool that hides secret text inside emojis using Unicode Tag Characters (U+E0001–U+E007F). The hidden data is completely invisible, the emoji looks identical to the original.
👻 + secret message = 👻 (with hidden data inside)
Unicode defines a range of invisible characters called Tag Characters (U+E0001 to U+E007F). They take up zero visual space and are already used natively to create subdivision flags like Scotland and Wales.
GhostInk maps each character of your secret message to its corresponding tag character and appends them after any visible emoji. The result looks identical to the original emoji but carries hidden data.
- Encode : Pick an emoji, type a secret message, get an identical-looking emoji with hidden data
- Decode : Paste any suspicious emoji to extract hidden text
- Stash : Save encoded emojis with labels for later retrieval from the Decode panel
- Codepoint analysis : Color-coded breakdown of visible, hidden, and cancel tag characters
- Accent normalization : Automatically converts accented characters to ASCII equivalents
- Pre-built examples : Try decoding sample emojis to see it in action
- Educational section : Learn how tag characters work and which platforms preserve them
- Authentication : Single-user login system with onboarding, account management, and rate-limited login
- Security : bcrypt password hashing, secure session cookies, security headers, restrictive file permissions
| Platform | Status |
|---|---|
| Twitter/X | Preserves tag characters |
| Signal | Preserves tag characters |
| Preserves tag characters | |
| May strip tag characters | |
| Telegram | Strips tag characters |
| Discord | Strips tag characters |
- Backend: Flask + Hypercorn + Flask-Login + vite-fusion
- Frontend: React 18 + TailwindCSS 3 + Vite
git clone https://github.com/SurceBeats/GhostInk.git
cd GhostInk
docker compose up -dOpen http://localhost:12500 and create your account.
Your data (ghostink.ini, stash.json) persists in ./ghostink_docker_volume.
Open Packager on HomeDock OS and drop the ghostink.hds file on Package Manager to make it instantly available on the App Store.
Configure RUN and PORT at the top of app.py:
RUN = "DEV" # "DEV" or "PROD"
PORT = 12500pip install -r requirements.txt
npm install
# Build once first (generates manifest.json required by vite-fusion)
npm run build
# Terminal 1: Vite dev server
npm run dev
# Terminal 2: Flask server
python3 app.py