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 demonstrated by security researcher David Buchanan.
Image credit: @unpaidactor1 / PIN: 7505403832509957594
For extra security, your data file is also compressed (zlib) 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
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.
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 data file is compressed, you should be able to get significantly more than the default limit, especially for text documents and other file types that compress well.
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
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 ([email protected])
- zlib: General-purpose compression library
- License: zlib/libpng license (see LICENSE file)
- Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler