qlp turns a directory of local Common Lisp projects into a Quicklisp distribution: one directory per project becomes one release, every system its .asd files define becomes an entry in the system index.
It is a modern quickdist, with one difference that matters.
The difference: sub-systems
quickdist reads .asd files textually and keeps only the forms that literally say defsystem, so a system declared through a macro never reaches systems.txt and cannot be quickloaded.
qlp evaluates each .asd the way ASDF reads it — with ASDF's own registration function hooked — so macro-generated systems are published too. ironclad.asd alone defines about ninety of them.
(defmacro def-hello-subsystem (name)
`(defsystem ,name :depends-on ("hello") :components ((:file "hello"))))
(def-hello-subsystem "hello/extra")
hello hello.asd hello
hello hello.asd hello/extra hello
Use
qlp publish --name mydist --base-url https://dist.example.org \
--projects-dir ~/lisp/projects --dists-dir /srv/www/dist
It writes the files a Quicklisp client subscribes to — distinfo, releases.txt, systems.txt, one archive per project — and serves nothing itself: point any static file server at --dists-dir.
(ql-dist:install-dist "https://dist.example.org/mydist.txt" :prompt nil)
(ql:quickload "somepackage")
There is also qlp verify (checks the indexes against the archives, exit 1 on trouble) and qlp systems (lists what the projects define). Archives are reproducible: the same sources give a byte-identical .tgz.
Install
Binaries for Linux and macOS: releases page. Or build it — SBCL, Quicklisp, GNU tar and gzip:
make build