I see that almost all of the changes mentioned on the page are in fact already filed for inclusion:
https://github.com/mthom/scryer-prolog/pull/3379
https://github.com/mthom/scryer-prolog/pull/3383
https://github.com/mthom/scryer-prolog/pull/3387
https://github.com/mthom/scryer-prolog/pull/3390
If anyone is interested in contributing to Scryer Prolog and getting these changes included, please have a look and participate in the accompanying discussions, thank you a lot!
For everyone interested in Prolog and its applications, please also consider attending the Scryer Prolog Meetup 2026 on Oct. 24th and 25th in Vienna:
https://www.digitalaustria.gv.at/wissenswertes/events/scryer...
I hope to see several of you there!
Alex Petros phrased it extremely nicely and insightfully in his comment at https://lobste.rs/s/0cvxwk/prolog_basics_explained_with_poke...:
"I don't know if this will be a satisfying answer to your question, but since writing this blog post I find myself reaching for Prolog in cases that are entirely orthogonal to any kind of code I used to write before. There are definitely people in the Prolog community who like using it for web servers or whatnot, but for me personally it's more about unlocking a different skill tree. For instance, I've become better at identifying where custom parsers or DSLs might be a good fit for a problem."
The mentioned blog post by Alex is available from: https://unplannedobsolescence.com/blog/prolog-basics-pokemon... and was recently discussed here: https://news.ycombinator.com/item?id=48147091
For another example, please see factgraph.pl also by Alex: https://github.com/alexpetros/factgraph.pl
Prolog is great in applications that must be able to analyze, extend, adapt, reason about and give account of their own workings and results. As an example for this, please see An Executable Specification of Oncology Dose-Escalation Protocols with Prolog by David C. Norris and me: https://arxiv.org/abs/2402.08334
In this example and others like it, one of the things the formulation is able to do is to tell us what the next step should be. And far, far beyond that, the same formulation can be used in many other ways, for instance to enumerate all cases that can arise, or to complete partially known cases, or to retroactively answer questions such as "Was the trial performed according to protocol?" We say we can use a logic program in different modes. And further, since a Prolog program is a sequence of Prolog terms, we can also use Prolog to easily read and analyze the formulation, and verify correctness or optimality properties of the formulation. Further, we can apply different execution strategies, including strategies that keep track of the reasons why specific results arose, and thus also produce automatic explanations of computed results.
For 2000 years the name has been used for a mythological constellation, which takes the cake for being the "real" Gemini if that matters.
/'su.la/for the suffix of capsule in Spanish, Cápsula.

A Gemini protocol server written in Scryer Prolog.
sula depends on a patched Scryer Prolog which can be found here (branch js/fixes). The required patches are:
'$copy_stream'/2 builtin used for streaming binary file bodies to TLS clients without materialising the contents on the Prolog heap.library(pio)’s buffer_prepare_for_n/5 so that lazy reads from process pipes (and other streams whose at_end_of_stream/1 never reports true) terminate on EOF instead of spinning.socket_server_accept/4 that checks Scryer’s INTERRUPT flag, so SIGINT becomes a catchable '$interrupt_thrown' exception instead of being trapped behind a blocking syscall.rustls.tls_server_negotiate to include the optional client certificate.Build and install the patched Scryer:
git clone https://git.sagredo.dev/scryer-prolog -b js/fixes
cd scryer-prolog
cargo install --path .
openssl(1) must also be on PATH — it’s invoked at startup to read the CN from the configured identity certificate and verify it matches the configured hostname.
./sula.pl --addr HOST:PORT --hostname NAME --content DIR --certs DIR
sula.pl is a polyglot script: bash detects scryer-prolog on PATH and execs it with sula:run, halt as the entry goal.
Example:
./sula.pl \
--addr 127.0.0.1:1965 \
--hostname gmi.example.dev \
--content ./site \
--certs .
All options accept any order. Anything unrecognised is silently dropped.
| Option | Meaning | Default |
|---|---|---|
--addr HOST:PORT |
Bind address and port for the listening socket | 127.0.0.1:1965 |
--hostname NAME |
Expected CN of the certificate. Startup aborts on mismatch |
localhost |
--content DIR |
Root directory for served files | ./site |
--certs DIR |
Directory containing cert.pem and key.pem |
. |
Ctrl+C triggers a clean shutdown: the listening socket is closed, the top-level catch logs Shutting down, and the process exits 0.
rustls, PKCS#12 identity files.cert_is_for_hostname/2 shells out to openssl x509 and asserts the cert’s CN matches --hostname.mime/2, populated at startup from /etc/mime.types (parsed by a DCG in mime.pl). text/gemini is added for .gmi.format/3; binary responses streamed in native code through copy_stream/2 (file → TLS socket, no Prolog heap traffic).SIGINT via the patched Scryer socket_server_accept/4.sula.pl Polyglot launcher + main sula module (run/0, request loop).
config.pl CLI parsing (DCG) and config accessors (cert/1, addr/1, ...).
cert.pl Certificate loading + hostname-vs-CN check.
mime.pl /etc/mime.types parser (DCG) and mime/2 facts.
request.pl Request line reader.
gemini_uri.pl Gemini URI DCG (gemini://host[:port]/path[?query]).
ip.pl IP address recognition (rejected as Gemini hosts).
response.pl Response status code DCG.
log.pl Tagged log_msg/3.
banner.pl Reads banner.txt and emits it line-by-line via display_banner/1.