Use CLI tools jdvin & jdvout with a JPG image, to hide/extract any file type, up to *2GB.
*Compatible hosting sites, listed below, have their own much smaller embedded data size limits:
- Flickr (200MB), ImgPile (100MB), ImgBB (32MB), PostImage (32MB), Reddit (20MB / -r option),
- Mastodon (~6MB), Bluesky (~64KB / -b option), Tumblr (~64KB), Twitter (~10KB).
jdvrif partly derives from the technique implemented by security researcher David Buchanan.
Image credit: @unpaidactor1 / PIN: 7505403832509957594
For increased storage capacity and better security, your embedded data file is compressed with zlib/deflate (if not already a compressed file type) and encrypted using the libsodium crypto library.
You can try the jdvrif Web App, here, if you don't want to download and compile the CLI source code.
user1@linuxbox:~/Downloads/jdvrif-main/src/jdvin$ sudo apt-get install libsodium-dev
user1@linuxbox:~/Downloads/jdvrif-main/src/jdvin$ g++ main.cpp -O2 -lz -lsodium -s -o jdvin
user1@linuxbox:~/Downloads/jdvrif-main/src/jdvin$ sudo cp jdvin /usr/bin
user1@linuxbox:~/Desktop$ jdvin
Usage: jdvin [-b|-r] <cover_image> <secret_file>
jdvin --info
user1@linuxbox:~/Desktop$ jdvin Cover_Image.jpg Hidden_File.zip
Saved "file-embedded" JPG image: jrif_12462.jpg (143029 bytes).
Recovery PIN: [***2166776980318349924***]
Important: Keep your PIN safe, so that you can extract the hidden file.
Complete!
user1@linuxbox:~/Downloads/jdvrif-main/src/jdvout$ g++ main.cpp -O2 -lz -lsodium -s -o jdvout
user1@linuxbox:~/Downloads/jdvrif-main/src/jdvout$ sudo cp jdvout /usr/bin
user1@linuxbox:~/Desktop$ jdvout
Usage: jdvout <file_embedded_image>
jdvout --info
user1@linuxbox:~/Desktop$ jdvout jrif_12462.jpg
PIN: *******************
Extracted hidden file: Hidden_File.zip (6165 bytes).
Complete! Please check your file.
To correctly download images from X/Twitter or Reddit, click the image in the post to fully expand it, before saving.
Twitter_CLI_jpg_txt.mp4
To create "file-embedded" JPG images compatible for posting on Reddit, use the -r option with jdvin.
From the Reddit site, click "Create Post" then select "Images & Video" tab, to post your JPG image.
To create "file-embedded" JPG images compatible for posting on Bluesky, use the -b option with jdvin.
For Bluesky, you are required to use the Python script "bsky_post.py" (found in the repo src folder), to post the image. It will not work if you post images via the Bluesky browser site or mobile app.
Bluesky script example:
$ python3 bsky_post.py --handle exampleuser.bsky.social --password pxae-f17r-alp4-xqka --image jrif_11050.jpg --alt-text "text to describe image, here..." "standard text to appear in main post, here..."
You will need to create an app password from your Bluesky account. (https://bsky.app/settings/app-passwords)
Bluesky_CLI_jpg_txt.mp4
Bluesky_web_app.mp4
With X/Twitter, Bluesky, & Tumblr, the small size limits are measured by the data file size and not the combined image + data file size. As the embedded data file is compressed with jdvin using zlib/deflate (if not already a compressed file type), you should be able to get significantly more than the default size limit, especially for text documents and other file types that compress well. You may wish to compress the data file yourself (zip, rar, 7z, etc) before embedding it with jdvin, so as to know exactly what the compressed file size will be.
Also with Mastodon, the size limit is measured by the data file size and not the combined image + data file size.
For example, if your cover image is 1MB you can still embed a data file up to the ~6MB Mastodon size limit.
jdvrif_web_app.mp4
tumblr_CLI_jpg.mp4
To correctly download an image from Flickr, click the download arrow near the bottom right-hand corner of the page and select Original for the size of image to download.
Flickr_CLI_200MB_ZIP.mp4
This project makes use of the following third-party libraries:
- libsodium for cryptographic functions.
- LICENSE
- Copyright (c) 2013-2025 Frank Denis (github@pureftpd.org)
- zlib: General-purpose compression library
- License: zlib/libpng license (see LICENSE file)
- Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler