Store and retrieve files on the ATmosphere (like Bluesky or Tangled)
Written entirely in Bash Shell. No NodeJS here!
curl -sSL https://zio.sh/atfile.sh | bash
echo 'ATFILE_USERNAME="<your-atproto-username>"' > ~/.config/atfile.env # e.g. alice.bsky.social, did:plc:wshs7t2adsemcrrd4snkeqli, did:web:zio.sh
echo 'ATFILE_PASSWORD="<your-atproto-password>"' >> ~/.config/atfile.env
atfile help- OSΒΉ
- π‘ Linux: GNU, MinGW and Termux only; muslΒ² not supported
- π’ macOS: Compatible with built-in version of Bash (3.2)
- π΄ Windows: No native version available
- Run with MinGW (Cygwin, Git Bash, MSYS2, etc.) or WSL (see Linux caveats above)
- π’ *BSD: FreeBSD, NetBSD, OpenBSD, and other *BSD's
- π’ Haiku: Yes, really
- π΄ Solaris: Has issues; low priority
- π΄ SerenityOS: Untested
- BashΒ³: 3.x or later
- Packages
curl- ExifTool (
exiftool) (optional: setATFILE_DISABLE_NI_EXIFTOOL=1to ignore) file(only on *BSD, macOS, or Linux)- GnuPG (
gpg) (optional: needed forupload-crypt,fetch-crypt) jq- MediaInfo (
mediainfo) (optional: setATFILE_DISABLE_NI_MEDIAINFO=1to ignore) md5sum(optional: setATFILE_DISABLE_NI_MD5SUM=1to ignore)- Both GNU and BusyBox versions supported
websocat(optional: needed forstream)
- ATProto account
- Limit the amount of files you upload, and avoid copyrighted files, if using a managed PDS
(e.g. Blacksky, Bluesky, Spark, Tangled, or any other independent PDS you don't own) - Supports accounts with
did:plcanddid:webidentities - Supports PDSs running Bluesky PDS and millipds
- Other PDSs remain untested, but if they implement standard
com.atproto.*endpoints, there should be no reason these won't work - Filesize limits cannot be automatically detected. By default, this is 100MB
- To change this on Bluesky PDS, set
PDS_BLOB_UPLOAD_LIMIT=<bytes> - If the PDS is running behind Cloudflare, the Free plan imposes a 100MB upload limit
- This tool, nor setting a higher filesize limit, does not workaround video upload limits on Bluesky. Videos are served via a CDN, and adding larger videos to post records yields errors
- To change this on Bluesky PDS, set
- Other PDSs remain untested, but if they implement standard
- Limit the amount of files you upload, and avoid copyrighted files, if using a managed PDS
There are three ways of installing ATFile. Either:
curl -sSL https://zio.sh/atfile.sh | bash
This will automatically fetch the latest version of ATFile and install it in an appropriate location, as well as creating a blank configuration file. Once downloaded and installed, the locations used will be output. They are as follows:
- Linux/*BSD/Solaris/SerenityOS
- Install:
$HOME/.local/bin/atfile- As
sudo/root:/usr/local/bin/atfile
- As
- Config:
$HOME/.config/atfile.env, or$XDG_CONFIG_HOME/atfile.env(if set)
- Install:
- macOS
- Install:
$HOME/.local/bin/atfile- As
sudo/root:/usr/local/bin/atfile
- As
- Config:
$HOME/Library/Application Support/atfile.env
- Install:
- Haiku
- Install:
/boot/system/non-packaged/bin/atfile - Config:
$HOME/config/settings/atfile.env
- Install:
See tags on @zio.sh/atfile, and download the required version under Artifacts β this can be stored and run from anywhere (and is identical to the version curl|bash fetched. Consider renaming to atfile.sh (as ATFile can update itself, making a fixed version in the filename nonsensical), and mark as executable (with chmod +x atfile.sh).
Config locations are identical to those above (see Automatic ("curl|bash") above).
If you've pulled this repository, you can also use ATFile by simply calling ./atfile.sh β it functions just as a regular compiled version of ATFile, including reading from the same config file. Debug messages are turned on by default: disable these by setting ATFILE_DEBUG=0.
Config locations are identical to those above (see Automatic ("curl|bash") above).
Using a development version against your ATProto account could potentially inadvertently damage records.
See atfile help.
To compile, run ./atfile.sh build. The built version will be available at ./bin/atfile-<version>[+git.<hash>].sh.
Various environment variables can be exported to control various aspects of the development version. These are as follows:
ATFILE_DEVEL_ENABLE_PIPING<int> (default:0)
Allow piping (useful to test installation) (e.g.cat ./atfile.sh | bash)ATFILE_DEVEL_ENABLE_PUBLISH<int> (default:0)
Publish build to ATProto repository (to allow for updating) as the last step when runningrelease. Several requirements must be fulfilled to succeed:ATFILE_DEVEL_DIST_USERNAMEmust be set
By default, this is set to$didinatfile.sh(see ποΈ Building β Meta). Ideally, you should not set this variable as updates in the built version will not be fetched from the correct placeATFILE_DEVEL_DIST_PASSWORDmust be set- No tests should return an Error (Warning is acceptable)
- Git commit must be tagged
Other ATFILE_DEVEL_ environment variables are visible in the codebase, but these are computed internally and cannot be set/modified.
Various build directives can be set in files to control various aspects of the development version. These are set with # atfile-devel= directive at the top of the file, using commas to separate values. These are as follows:
ignore-build
Do not include file in the final compiled build
Various meta variables can be set to be available in the final compiled build (usually found in help). These are found in atfile.sh under # Meta. These variables are as follows:
author<string>
Copyright authordid<did>
DID of copyright author. Also used as the source for published builds, unlessATFILE_DEVEL_DIST_USERNAMEis set (see ποΈ Building β Environment variables)repo<uri>
Repository URL of source codeversion<string>
Version in the format of<major>.<minor>[.<patch>]. Not following this format will cause unintended issues. Git hashes (+git.abc1234) are added automatically during build when a git tag is not applied to the current commityear<int>
Copyright year
Development takes place on Tangled (@zio.sh/atfile), with GitHub (ziodotsh/atfile) acting as a mirror. Use Tangled for your contributions, for both Issues and Pulls. As Tangled is powered by ATProto, you already have an account (unsure? Try logging in with your Bluesky handle).
When submitting Pulls, target the dev branch: main is the current stable production version, and Pulls will be rejected targeting this branch.
- Paul Frazee β π¦ @pfrazee.com
His kind words - Laurens Hof β π¦ @laurenshof.online
Featuring ATFile on The Fediverse Report: "Last Week in the ATmosphere β Oct 2024 week 4" - Samir β π @bdotsamir
Testing, and diagnosing problems with, support for macOS (macos) - Astra β π¦ @astra.blue
Various PRs; testing, and diagnosing problems with, support for MinGW (linux-mingw) and Termux (linux-termux) - (Forgot about you? You know what to do)
- ΒΉ You can bypass OS detection in one of two ways:
- Set
ATFILE_DISABLE_UNSUPPORTED_OS_WARN=1
Be careful! There's a reason some OSes are not supported - Set
ATFILE_FORCE_OS=<os>
This overrides the OS detected. Possible values:bsd,haiku,linux,linux-mingw,linux-musl,linux-termux,macos,serenity, andsolaris.
- Set
- Β² musl-powered distros do not use GNU/glibc packages, and have problems currently
- Known musl distros: Alpine, Chimera, Dragora, Gentoo (musl), Morpheus, OpenWrt, postmarketOS, Sabotage, Void
- Bypassing OS detection (see ΒΉ) will cause unintended behavior
- Β³ As long as you have Bash installed, running from another shell will not be problematic (
#!/usr/bin/env bashforces Bash)