Skip to content

πŸ“¦βž”πŸ¦‹ Store and retrieve files on the ATmosphere

License

Notifications You must be signed in to change notification settings

ziodotsh/atfile

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ee79c1a Β· Mar 19, 2025
Nov 19, 2024
Mar 12, 2025
Jan 26, 2025
Mar 12, 2025
Oct 30, 2024
Dec 8, 2024
Nov 20, 2024
Jan 1, 2025
Mar 19, 2025
Dec 8, 2024
Oct 24, 2024
Mar 19, 2025

Repository files navigation

ATFile

Store and retrieve files on the ATmosphere (like Bluesky)
Written entirely in Bash Shell. No NodeJS here!

⬇️ Get ATFile  |  πŸ’£ Submit Issue  |  πŸ¦‹ @zio.sh


✨ Quick Start

curl -sSL https://zio.sh/atfile/install.sh | bash
echo 'ATFILE_USERNAME="<your-atproto-username>"' > ~/.config/atfile.env  # e.g. alice.bsky.social, did:plc:vdjlpwlhbnug4fnjodwr3vzh, did:web:twitter.com
echo 'ATFILE_PASSWORD="<your-atproto-password>"' >> ~/.config/atfile.env
atfile help

πŸ‘€ Using

βœ… Requirements

  • OSΒΉ
    • 🟑 Linux: GNU, MinGW and Termux only; muslΒ² not supported
    • 🟒 macOS: Compatible with built-in version of Bash (3.2)
    • 🟑 Windows: MinGW (Cygwin, Git Bash, MSYS2, etc.) and WSL (see Linux caveats above)
      • This repository does not provide a native version for Windows
    • 🟒 BSD: FreeBSD, NetBSD and OpenBSD; other non-detected BSDs should work (see ΒΉ)
    • 🟒 Haiku: Yes, really
    • πŸ”΄ Solaris: Has issues; low priority
  • BashΒ³: 3.x or later
  • Packages
    • curl
    • ExifTool (exiftool) (optional: set ATFILE_SKIP_NI_EXIFTOOL=1 to ignore)
    • file (only on *BSD, macOS, or Linux)
    • GnuPG (gpg) (optional: needed for upload-crypt, fetch-crypt)
    • jq
    • MediaInfo (mediainfo) (optional: set ATFILE_SKIP_NI_MEDIAINFO=1 to ignore)
    • md5sum (optional: set ATFILE_SKIP_NI_MD5SUM=1 to ignore)
      • Both GNU and BusyBox versions supported
    • websocat (optional: needed for stream)
  • PDS: Bluesky PDS
    • Other PDSs (such as millipds) 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 on the app
  • ATProto account
    • bsky.network (@*.bsky.social) accounts supported
      • If you can, limit the amount of files you upload to Bluesky's servers. It's a miracle this even works with, what's currently, an entirely free service.
      • Heed the copyright warning: do not upload copyrighted files.
    • did:web accounts supported!

πŸ€” (Todo)

(Todo)

πŸ—οΈ Building

(Todo)


⌨️ Contributing

Development mainly takes place on Tangled, with GitHub acting as a mirror. If possible, please use Tangled for your contributions: since it is powered by ATProto, you can log in using your Bluesky account.

When submitting Pull Requests, target the dev branch: main is the current stable production version, and PRs will be rejected targeting this branch.

🀝 Acknowledgements


  • ΒΉ You can bypass OS detection in one of two ways:
    • Set ATFILE_SKIP_UNSUPPORTED_OS=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: bsd-freebsd, bsd-netbsd, bsd-openbsd
      • Linux: linux, linux-mingw, linux-musl, linux-termux
      • Other: haiku, macos, solaris
  • Β² 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 work, but dates will not be handled correctly
  • Β³ As long as you have Bash installed, running from another shell will not be problematic (#!/usr/bin/env bash forces Bash)