We're doing that with libpng. Every time we release a tarball, we make two copies (a current copy and an archive copy) on the libpng ftp/http site (libpng.download/src):
libpng16/libpng-1.6.32.tar.xz
archive/libpng16/xz/libpng-1.6.32.tar.xz
Then when we make a new release (e.g., 1.6.33), we remove libpng16/libpng-1.6.32.tar.xz and then repeat the above, creating
libpng16/libpng-1.6.33.tar.xz
archive/xz/libpng16/libpng-1.6.33.tar.xz
After this operation, the archive directory contains
archive/xz/libpng16/libpng-1.6.32.tar.xz
archive/xz/libpng16/libpng-1.6.33.tar.xz
and all previous versions back to libpng-1.6.0.tar.xz
There are other branches (libpng00, libpng10, libpng12, libpng14, libpng15, and libpng17) that contain the complete 22-year history of libpng releases.
When we release a "beta" tarball, the process is similar, except
that a copy goes into the "beta" subdirectory:
beta/libpng16/libpng-1.6.33beta01.tar.xz
archive/xz/libpng16/libpng-1.6.33beta01.tar.xz
If you prefer another format, you can use "7z", "zip", or "gz"
in place of "xz".
If you prefer to get your source out of the "git" repository,
that's taken care of by "tagging" every release, so you can
extract any particular release by means of its tag.
If you don't trust us to maintain the historical copies, you can always
download the particular version you want to save and archive it on your own host or web site. Since libpng is open source, nothing prevents you from doing that.