{{ mode === 'encode' ? 'Hide a message inside a picture' : 'Reveal a hidden message' }}

{{ mode === 'encode' ? 'Type a secret, drop in any picture, and get back one that looks identical — with your words tucked invisibly inside.' : 'Upload a picture made here and read the message hidden in it. Everything happens on your device.' }}

{{ announcement }}
1 — Pick a picture
{{ encName || 'Your picture' }}
{{ encW }} × {{ encH }} px · fits about {{ capacity.toLocaleString() }} characters
{{ secretMessage.length.toLocaleString() }} characters {{ overCapacity ? (secretMessage.length - capacity).toLocaleString() + ' too many for this picture' : (capacity - secretMessage.length).toLocaleString() + ' left' }}
Your picture with the message hidden inside — it looks identical to the original
Done. Save it as a PNG and share it. The message survives only if the file stays a PNG — sending it through apps that re-compress images (like some chats) can wipe it.
1 — Upload the picture
{{ decName || 'PNG uploaded' }}
Ready to reveal

Hidden on {{ decodedTimestamp }}

{{ decodedMessage }}

Your pictures never leave your browser. Everything is processed on your own device — nothing is uploaded. Curious how the trick works? Read the plain-English explainer.