[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