[Reid](https://reiddragon.neocities.org/) encouraged me on the Mastodon not to use placeholder or unknown pubDates in my RSS if I technically had an idea of when each article was published. And so I feel comfortable blaming this section of the article squarely on them, despite their protests. They have an incredible site banner.
Prior to starting to work on Aral's kitten per se, I was just using kitten as a markdown site generator and I did not have a rigorous method of dating entries. I guess I can recover these from the git, last commit times anyway (which I will treat as an approximation of the pubDate rather than lastBuild in this case).
Sorry about the shell one-liner in `uiop:run-program`. [Uiop](https://asdf.common-lisp.dev/uiop.html) is common lisp's __universal posix compatibility layer__ by Daniel Barlow etc.
```
(require "asdf")
(require "uiop")
(defun get-git-date (git-path path)
(uiop:run-program
(format nil
"~
cd ~a && git log -1 -- pretty=\\"format%medium\\" ~a ~
| grep -i date | cut -d' ' -f'5-'"
git-path path)
:output :string))
```
oh lucky me, another date format. By the way, [Zyd](https://zyd.lol/) linked us this piece of lisp time cultural history: https://naggum.no/lugm-time.html .
```
(defun git-time-to-rss (string)
"string like \\"Dec 26 19:43:01 2025 +1300\\"
returns (values rss-pubDate-string fipa-iso-8601-string iso-8601-string ut)
all in zulu time. ut is an integer."
(let* ((local-time
(format nil "~@{~?~}"
"~a" `(,(subseq string 16 20))
"~2,'0d" `(,(1+
(search `(,(subseq string 0 3))
'("Jan" "Feb" "Mar" "Apr" "May" "Jun"
"Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
:test 'string=)))
"~2,'0d" `(,(parse-integer (subseq string 4 6)))
"~a" '(t)
"~@{~2,'0d~}" (list
(parse-integer (subseq string 7 9) :junk-allowed t)
(parse-integer (subseq string 10 12) :junk-allowed t)
(parse-integer (subseq string 13 15)))
"000Z" '()))
(mag-offset (* (+ (* (parse-integer (subseq string 22 24)) 60)
(parse-integer (subseq string 24 26)))
60))
(ut (+
(fipa-iso8601-to-ut local-time)
(* mag-offset
(if (equal "+" (subseq string 21 22)) -1 +1)))))
(values
(ut-to-rfc882 ut)
(fipa-8601-from-ut+0 ut)
(iso8601-datetime ut)
ut)))
```
Oookay.
```
CL-USER> (get-git-date "~/screwlisps-kitten/" "index.page.js")
"Dec 26 19:43:01 2025 +1300
"
NIL
0
CL-USER> (git-time-to-rss *)
"Fri, 26 Dec 2025 06:43:01 Z"
"20251226T064301658Z"
"2025-12-26 06:43:01+0000"
3975720181
CL-USER>
```
aanndd
```
(loop :with path := "screwlisps-kitten/"
:for article :in *articles*
:for date := (cdr (assoc :date article))
:for raw-link := (cdr (assoc :link article))
:for link := (subseq raw-link
(if (char= (char raw-link 0) #\\/) 1 0)
(if (char= (char raw-link (1- (length raw-link))) #\\/)
(1- (length raw-link))
(length raw-link)))
:for md := (concatenate 'string link ".page.md")
:for lisp := (concatenate 'string link ".lisp")
:for merged-link := (make-pathname :directory `(:relative ,path) :name link)
:for merged-md := (make-pathname :directory `(:relative ,path) :name md)
:for merged-lisp := (make-pathname :directory `(:relative ,path) :name link :type "lisp")
:for probe-link := (probe-file merged-link)
:for probe-md := (probe-file merged-md)
:for probe-lisp := (probe-file merged-lisp)
:for git-date := (cond (probe-link (get-git-date path link))
(probe-md (get-git-date path md))
(probe-lisp (get-git-date path lisp)))
:for my-date := (nth-value 1 (git-time-to-rss git-date))
:do (setf (cdr (assoc :date article)) my-date))
```
alright well, you may never know the difference but there used to be placeholder values on all the old articles, and now there are my FIPA SL modified ISO-8601 there. https://gamerplus.org/@screwlisp/115913872930011830