- Universal file support: Seamlessly share local files, directories, or URLs.
- Auto-generated unique URLs: instantly provides web-accessible links for shared content.
- Efficient file management: uses copying, hard linking, or symbolic linking to optimise server storage.
- Configurable via
nanirc: allows easy customization without script modifications.
- A working web server (e.g., Apache, Nginx)
bash
- Place
nanisomewhere in your PATH, like~/bin - Make it executable:
chmod +x nani
curl -Lo ~/bin/nani https://github.com/welpo/nani/raw/main/nani
chmod +x ~/bin/naniTo configure nani, you can modify the script directly or use a nanirc file for easier customization and updates.
- Create a file named
nanircin your home directory under.config/nani/for user-specific settings or in/etc/for system-wide settings. - Set the following variables according to your environment:
local_directory: The path to the directory on your web server where files will be stored.url_format: The corresponding URL to accesslocal_directoryover the web.
Example nanirc content (see default nanirc):
local_directory="/var/www/site/nani"
url_format="https://example.com/nani"Save the file and nani will automatically use these settings.
nani users must have write permissions to local_directory and be part of the web server's user group to serve the files.
sudo chown [username]:[group] /var/www/site/nani
sudo chmod 755 /var/www/site/naniReplace [username] with your user and [group] with an appropriate group (e.g., your user's primary group or a web server group like www-data).
Replace /var/www/site/nani with the path to your local_directory.
To share a picture (or any other file) in your server, run:
nani Path/To/picture.png
nani will return a URL to the file:
https://example.com/nani/oThot0b.png
To share a directory with files you would run this:
nani Path/To/Directory
and nani would return a URL to the zipped contents of that directory, like:
https://example.com/nani/iE4RWE.zip
If you want to keep the name of the input, you can use the -o, --original flag, so: nani -o Path/To/Directory. Read more about the available flags at the bottom of this page.
Different files will be processed differently (for example it can transcode .flac to .mp3 before sharing), read more about the process below, under the section Input handling.
nani will process input based on its nature:
- Directory: A zip file will be created in the output directory (default). It's also possible to create a symbolic link to browse the files inside. (e.g. input:
nani Directory/output:https://example.com/nani/62WlrM.zip) - FLAC: Can be transcoded to MP3 (e.g. input:
nani "01 - Title.flac"output:https://example.com/nani/nO0A5v.mp3) - Text (
html,php...): Extension can be set to.txt(e.g. input:nani index.phpoutput:https://example.com/nani/4PwTwgL.txt) - Other files: New copy/hard link/symbolic link at output directory (e.g. input:
nani movie.mkvoutput:https://example.com/nani/ki3msYn.mkv) - URL to video (e.g: youtube): Downloaded using youtube-dl (e.g. input:
nani https://www.youtube.com/watch?v=p4cJv6s_Yjwoutput:https://example.com/nani/uhpPcm.mp4) - Other URLs: Downloaded using wget (e.g. input:
nani https://www.gnu.org/distros/free-distros.htmloutput:https://example.com/nani/o80togB.html)
Set up nani to your liking by modifying the script or using a nanirc file.
The following settings are available:
add_txt: Add.txtto files with no extension. Default is 1 (Yes).hardlink: Create hard links instead of new copies. Default is 1 (Yes).local_directory: Local directory where files will be stored (e.g. your public_html folder)minimum_length: Minimum number of characters for the output name. Default is 5.notify: Send a notification usingnotify-sendwhen nani is done. Makes sense if using on a desktop (using SSHFS as the output directory, for example). Default is 1 (On), but it will be set to 0 ifnotify-sendis not installed in the system.modify_text: If set to 1 (default) it will modify the extension of files storing text (.php,.html,.tex...) to.txt.post_process: Call exiftool & optipng to remove metadata and compress files, only on new copies. Default is 1 (Post-process).push: Send push notification (through Pushbullet and/or Pushover) with the URLs. Default is 0 (Don't send them).pushbullet_token: Your Pushbullet access token. Leave empty if you don't want to use Pushbullet.pushover_key: Your Pushover key. Leave empty if you don't want to use Pushover.quiet: If set to 1 it will only output the URL. Default is 1 (be quiet).random_length: Maximum number of extra characters the length will have (the final length will be a number between minimum_length and minimum_length+random_length). Default is 2, can be left empty to always have the same string length.sshfs: Same assymbolicexcept it won't use symbolic links for directories (useful for SSHFS mounted output directories)symbolic: Create symbolic links instead of new copies/hard links. Default is 0 (Disabled).transcode: Transcode FLAC files to MP3 V0? Default is 1 (Yes). Requiresmetaflac,flacandlame.url_format: URL that directs to the directory set inlocal_directoryxclip: Send the URLs toxclipto get them in your local clipboard. Requiresxclipand the -X flag set on the SSH session. Default is 1 (Enabled).
Some of the settings described above can be modified without editing the script, just use the available flags:
-a, --alias Revert the hard link setting
-c, --cleanup Remove all files on /nani/ (except index.html)
-h, --help Display help and exit
-i, --insert Open nano to enter text. Saved in output directory as .txt
-k, --keep Output dir becomes /nani/k/, to set different cleanup rules
-l, --list List files in output directory /nani/
-n, --name Use custom name (e.g. nani --name=DesiredName <file> or nani -n DesiredName <file>)
-N, --notify Revert the notify option
-o, --original Preserve original file name
-p, --push Send push notification
-q, --quiet Reverse the quiet setting
-s, --string Force a certain string length (e.g. nani --string=32 <file> or nani -n 32 <file>)
-t, --transcode Revert the transcode setting
-x, --xclip Revert the xclip setting
-y, --symbolic Create a symbolic link for files and directories
You can automate the cleanup of old files by using a cron job.
Run crontab -e and add this line, which performs the check every hour:
0 * * * * find "/var/www/site/nani/ -mindepth 1 ! -path '*/k/*' -ctime +0 ! -name "index.html" ! -name "k" -delete`This will remove all files in /var/www/site/nani/ that are older than 24 hours, except for those in the /var/www/site/nani/k/ directory.