Recently Written · git

recentlywritten

my writings (done recently)

git clone https://github.com/equwal/recentlywritten

Log | Files | Refs


commit d6b347a51f5bf2522c28e990028bce6a55546c6f
Spenser Truex <truex@equwal.com>
2026-05-12 23:07:27 -0700

initial commit

 build.sh           |  94 +++++++++++++++++++++++++
 index.html         |  33 +++++++++
 posts/lisprant.md  |  13 ++++
 site/index.html    |  33 +++++++++
 site/lisprant.html |  50 ++++++++++++++
 site/style.css     | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 style.css          | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 621 insertions(+)
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..fab1e01
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,94 @@
+#!/bin/sh
+# build.sh — converts posts/*.md to site/ using pandoc
+# Usage: sh build.sh
+
+set -e
+
+POSTS_DIR="posts"
+SITE_DIR="site"
+CSS="../style.css"   # relative path from inside site/
+
+# ── setup ──────────────────────────────────────────────────
+rm -rf "$SITE_DIR"
+mkdir -p "$SITE_DIR"
+cp style.css "$SITE_DIR/style.css"
+
+# pandoc HTML template for individual posts
+TEMPLATE="template.html"
+cat > "$TEMPLATE" << 'TMPL'
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8" />
+  <meta name="viewport" content="width=device-width, initial-scale=1" />
+  <title>$title$ — Recently Written</title>
+  <link rel="stylesheet" href="style.css" />
+</head>
+<body>
+<div id="container">
+
+  <div id="top">
+    <a class="site-title" href="index.html">Recently Written</a>
+    <nav>
+      <a href="index.html">Home</a>
+    </nav>
+  </div>
+
+  <h1>$title$</h1>
+  <div class="post-meta">$date$</div>
+
+  $body$
+
+  <div id="footer">
+    <a href="index.html">← Home</a> ·
+    Powered by <a href="https://neuron.zettel.page">Neuron</a>
+  </div>
+
+</div>
+</body>
+</html>
+TMPL
+
+# ── build each post ─────────────────────────────────────────
+LIST=""   # accumulate post-list items (newest first)
+
+# collect posts and sort by date descending
+for md in "$POSTS_DIR"/*.md; do
+    slug=$(basename "$md" .md)
+    title=$(grep '^title:' "$md" | sed 's/title: *//')
+    date=$(grep '^date:'  "$md" | sed 's/date: *//')
+
+    pandoc \
+        --from markdown \
+        --to html5 \
+        --template "$TEMPLATE" \
+        --metadata title="$title" \
+        --metadata date="$date" \
+        --output "$SITE_DIR/${slug}.html" \
+        "$md"
+
+    # prepend to list so newest-first after sort
+    LIST="$(printf '%s\n' "${date}|${slug}|${title}")\n${LIST}"
+done
+
+# ── build index ─────────────────────────────────────────────
+# sort descending by date, emit list items
+POST_ITEMS=""
+printf '%b' "$LIST" | sort -r | while IFS='|' read -r date slug title; do
+    [ -z "$slug" ] && continue
+    printf '<li><span class="post-date">%s</span><a href="%s.html">%s</a></li>\n' \
+        "$date" "$slug" "$title"
+done > /tmp/rw-items.txt
+
+ITEMS=$(cat /tmp/rw-items.txt)
+
+# inject post list into index.html using awk
+awk -v items="<ul class=\"post-list\">$(cat /tmp/rw-items.txt)</ul>" \
+    '{ gsub(/<!-- POST_LIST -->/, items); print }' \
+    index.html > "$SITE_DIR/index.html"
+
+# ── cleanup ──────────────────────────────────────────────────
+rm -f "$TEMPLATE" /tmp/rw-items.txt
+
+echo "Built $(ls "$SITE_DIR"/*.html | wc -l | tr -d ' ') pages → $SITE_DIR/"
+rsync -avzP --delete site/ root@honjimaku.com:/var/www/recentlywritten/
diff --git a/index.html b/index.html
new file mode 100755
index 0000000..f93cd38
--- /dev/null
+++ b/index.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8" />
+  <meta name="viewport" content="width=device-width, initial-scale=1" />
+  <title>Recently Written</title>
+  <link rel="stylesheet" href="style.css" />
+</head>
+<body>
+<div id="container">
+
+  <div id="top">
+    <a class="site-title" href="index.html">Recently Written</a>
+    <nav>
+      <a href="index.html">Home</a>
+    </nav>
+  </div>
+
+  <h1>Recently Written</h1>
+  <p style="color:#666; font-family: -apple-system, sans-serif; font-size:0.9rem; margin-bottom:2.5rem;">
+    A site full of things which I have recently written.
+  </p>
+
+  <!-- POST_LIST -->
+
+  <div id="footer">
+    Powered by <a href="https://neuron.zettel.page">deez nuts</a> ·
+    <a href="https://github.com/srid/neuron">the 'hub</a>
+  </div>
+
+</div>
+</body>
+</html>
diff --git a/posts/lisprant.md b/posts/lisprant.md
new file mode 100755
index 0000000..3bdc5bb
--- /dev/null
+++ b/posts/lisprant.md
@@ -0,0 +1,13 @@
+---
+title: Lisp Rant
+date: 2026-05-12
+---
+
+Read doug hoyte then come back and tell me static typing is better
+ecl is good for live servers (eg. "web") for obvious reasons
+every person who "uses lisp at work" refuses to share details so I know that lisp in production does not exist and they are larping
+solving the problem with a well-fitted language and modifying the (lisp) compiler mogs leet coders because of Kolomogorov complexity (see Graham's stuff) 
+props to style_warning for making his username a lisp shibboleth
+Before vibecoding I knew plenty of stack overflow copy-pasters etc. Before vibecode it was still the case that your average interviewee could not solve a basic coding question. Reading a programming book and doing some of the exercises will take you farther than l33tcode bullshit ever will. You can also be vaccinated against AI retardation.
+Also before vibecode I started to notice that 99% of the time I could solve problems with unix-philosophy tools and duct tape instead of reinventing the wheel. There is so much stuff on the internet which is easily accessible. This is still the case although the well has been poisoned quite a bit because tools rarely work anymore. The Bipolar Lisp Programmer finally won against Mel The Real Programmer. 
+schizo rant over back to your regular scheduled programming
\ No newline at end of file
diff --git a/site/index.html b/site/index.html
new file mode 100644
index 0000000..c3b5741
--- /dev/null
+++ b/site/index.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8" />
+  <meta name="viewport" content="width=device-width, initial-scale=1" />
+  <title>Recently Written</title>
+  <link rel="stylesheet" href="style.css" />
+</head>
+<body>
+<div id="container">
+
+  <div id="top">
+    <a class="site-title" href="index.html">Recently Written</a>
+    <nav>
+      <a href="index.html">Home</a>
+    </nav>
+  </div>
+
+  <h1>Recently Written</h1>
+  <p style="color:#666; font-family: -apple-system, sans-serif; font-size:0.9rem; margin-bottom:2.5rem;">
+    A site full of things which I have recently written.
+  </p>
+
+  <ul class="post-list"><li><span class="post-date">2026-05-12</span><a href="lisprant.html">Lisp Rant</a></li></ul>
+
+  <div id="footer">
+    Powered by <a href="https://neuron.zettel.page">deez nuts</a> ·
+    <a href="https://github.com/srid/neuron">the 'hub</a>
+  </div>
+
+</div>
+</body>
+</html>
diff --git a/site/lisprant.html b/site/lisprant.html
new file mode 100755
index 0000000..956798c
--- /dev/null
+++ b/site/lisprant.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8" />
+  <meta name="viewport" content="width=device-width, initial-scale=1" />
+  <title>Lisp Rant — Recently Written</title>
+  <link rel="stylesheet" href="style.css" />
+</head>
+<body>
+<div id="container">
+
+  <div id="top">
+    <a class="site-title" href="index.html">Recently Written</a>
+    <nav>
+      <a href="index.html">Home</a>
+    </nav>
+  </div>
+
+  <h1>Lisp Rant</h1>
+  <div class="post-meta">2026-05-12</div>
+
+  <p>Read doug hoyte then come back and tell me static typing is better
+  ecl is good for live servers (eg. “web”) for obvious reasons every
+  person who “uses lisp at work” refuses to share details so I know that
+  lisp in production does not exist and they are larping solving the
+  problem with a well-fitted language and modifying the (lisp) compiler
+  mogs leet coders because of Kolomogorov complexity (see Graham’s
+  stuff) props to style_warning for making his username a lisp
+  shibboleth Before vibecoding I knew plenty of stack overflow
+  copy-pasters etc. Before vibecode it was still the case that your
+  average interviewee could not solve a basic coding question. Reading a
+  programming book and doing some of the exercises will take you farther
+  than l33tcode bullshit ever will. You can also be vaccinated against
+  AI retardation. Also before vibecode I started to notice that 99% of
+  the time I could solve problems with unix-philosophy tools and duct
+  tape instead of reinventing the wheel. There is so much stuff on the
+  internet which is easily accessible. This is still the case although
+  the well has been poisoned quite a bit because tools rarely work
+  anymore. The Bipolar Lisp Programmer finally won against Mel The Real
+  Programmer. schizo rant over back to your regular scheduled
+  programming</p>
+
+  <div id="footer">
+    <a href="index.html">← Home</a> ·
+    Powered by <a href="https://neuron.zettel.page">Neuron</a>
+  </div>
+
+</div>
+</body>
+</html>
diff --git a/site/style.css b/site/style.css
new file mode 100755
index 0000000..b0c81d6
--- /dev/null
+++ b/site/style.css
@@ -0,0 +1,199 @@
+/* recentlywritten — neuron-inspired stylesheet */
+
+:root {
+  --text:       #222;
+  --muted:      #666;
+  --faint:      #999;
+  --border:     #ddd;
+  --bg:         #fff;
+  --bg-code:    #f5f5f5;
+  --link:       #2185d0;
+  --link-hover: #1a69a4;
+  --max-width:  680px;
+  --font-body:  'Georgia', serif;
+  --font-ui:    -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+  --font-mono:  'Menlo', 'Consolas', monospace;
+}
+
+*, *::before, *::after { box-sizing: border-box; }
+
+html {
+  font-size: 17px;
+  line-height: 1.7;
+}
+
+body {
+  font-family: var(--font-body);
+  color: var(--text);
+  background: var(--bg);
+  margin: 0;
+  padding: 0 1rem 4rem;
+}
+
+/* ── layout ── */
+#container {
+  max-width: var(--max-width);
+  margin: 0 auto;
+}
+
+/* ── top nav ── */
+#top {
+  display: flex;
+  align-items: baseline;
+  justify-content: space-between;
+  padding: 1.2rem 0 1rem;
+  border-bottom: 1px solid var(--border);
+  margin-bottom: 2.5rem;
+  font-family: var(--font-ui);
+  font-size: 0.85rem;
+}
+
+#top a.site-title {
+  font-size: 1rem;
+  font-weight: 700;
+  color: var(--text);
+  text-decoration: none;
+  letter-spacing: -0.01em;
+}
+
+#top a.site-title:hover { color: var(--link); }
+
+#top nav a {
+  color: var(--muted);
+  text-decoration: none;
+  margin-left: 1.25rem;
+}
+
+#top nav a:hover { color: var(--link); }
+
+/* ── headings ── */
+h1 {
+  font-family: var(--font-body);
+  font-size: 1.9rem;
+  font-weight: bold;
+  line-height: 1.25;
+  letter-spacing: -0.02em;
+  margin: 0 0 0.25rem;
+  color: var(--text);
+}
+
+h2 {
+  font-size: 1.25rem;
+  margin: 2rem 0 0.5rem;
+  color: var(--text);
+}
+
+h3 {
+  font-size: 1.05rem;
+  margin: 1.5rem 0 0.4rem;
+  color: var(--text);
+}
+
+/* ── post meta ── */
+.post-meta {
+  font-family: var(--font-ui);
+  font-size: 0.8rem;
+  color: var(--faint);
+  margin-bottom: 2rem;
+}
+
+/* ── prose ── */
+p { margin: 0 0 1rem; }
+
+a { color: var(--link); }
+a:hover { color: var(--link-hover); }
+
+ul, ol {
+  margin: 0 0 1rem 1.4rem;
+  padding: 0;
+}
+
+li { margin-bottom: 0.25rem; }
+
+blockquote {
+  margin: 1.5rem 0;
+  padding: 0 0 0 1.2rem;
+  border-left: 3px solid var(--border);
+  color: var(--muted);
+  font-style: italic;
+}
+
+blockquote p { margin: 0; }
+
+hr {
+  border: none;
+  border-top: 1px solid var(--border);
+  margin: 2.5rem 0;
+}
+
+/* ── code ── */
+code {
+  font-family: var(--font-mono);
+  font-size: 0.82em;
+  background: var(--bg-code);
+  padding: 1px 4px;
+  border-radius: 3px;
+}
+
+pre {
+  background: var(--bg-code);
+  border: 1px solid var(--border);
+  border-radius: 4px;
+  padding: 1rem;
+  overflow-x: auto;
+  margin: 1rem 0 1.5rem;
+}
+
+pre code {
+  background: none;
+  padding: 0;
+  font-size: 0.85rem;
+}
+
+/* ── post list (homepage) ── */
+.post-list {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+.post-list li {
+  display: flex;
+  gap: 1.5rem;
+  align-items: baseline;
+  padding: 0.6rem 0;
+  border-bottom: 1px solid var(--border);
+  margin: 0;
+}
+
+.post-list li:first-child { border-top: 1px solid var(--border); }
+
+.post-date {
+  font-family: var(--font-ui);
+  font-size: 0.8rem;
+  color: var(--faint);
+  white-space: nowrap;
+  flex-shrink: 0;
+  min-width: 5.5rem;
+}
+
+.post-list a {
+  text-decoration: none;
+  color: var(--text);
+  font-size: 1rem;
+}
+
+.post-list a:hover { color: var(--link); }
+
+/* ── footer ── */
+#footer {
+  margin-top: 3rem;
+  padding-top: 1rem;
+  border-top: 1px solid var(--border);
+  font-family: var(--font-ui);
+  font-size: 0.78rem;
+  color: var(--faint);
+}
+
+#footer a { color: var(--faint); }
+#footer a:hover { color: var(--link); }
diff --git a/style.css b/style.css
new file mode 100755
index 0000000..b0c81d6
--- /dev/null
+++ b/style.css
@@ -0,0 +1,199 @@
+/* recentlywritten — neuron-inspired stylesheet */
+
+:root {
+  --text:       #222;
+  --muted:      #666;
+  --faint:      #999;
+  --border:     #ddd;
+  --bg:         #fff;
+  --bg-code:    #f5f5f5;
+  --link:       #2185d0;
+  --link-hover: #1a69a4;
+  --max-width:  680px;
+  --font-body:  'Georgia', serif;
+  --font-ui:    -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+  --font-mono:  'Menlo', 'Consolas', monospace;
+}
+
+*, *::before, *::after { box-sizing: border-box; }
+
+html {
+  font-size: 17px;
+  line-height: 1.7;
+}
+
+body {
+  font-family: var(--font-body);
+  color: var(--text);
+  background: var(--bg);
+  margin: 0;
+  padding: 0 1rem 4rem;
+}
+
+/* ── layout ── */
+#container {
+  max-width: var(--max-width);
+  margin: 0 auto;
+}
+
+/* ── top nav ── */
+#top {
+  display: flex;
+  align-items: baseline;
+  justify-content: space-between;
+  padding: 1.2rem 0 1rem;
+  border-bottom: 1px solid var(--border);
+  margin-bottom: 2.5rem;
+  font-family: var(--font-ui);
+  font-size: 0.85rem;
+}
+
+#top a.site-title {
+  font-size: 1rem;
+  font-weight: 700;
+  color: var(--text);
+  text-decoration: none;
+  letter-spacing: -0.01em;
+}
+
+#top a.site-title:hover { color: var(--link); }
+
+#top nav a {
+  color: var(--muted);
+  text-decoration: none;
+  margin-left: 1.25rem;
+}
+
+#top nav a:hover { color: var(--link); }
+
+/* ── headings ── */
+h1 {
+  font-family: var(--font-body);
+  font-size: 1.9rem;
+  font-weight: bold;
+  line-height: 1.25;
+  letter-spacing: -0.02em;
+  margin: 0 0 0.25rem;
+  color: var(--text);
+}
+
+h2 {
+  font-size: 1.25rem;
+  margin: 2rem 0 0.5rem;
+  color: var(--text);
+}
+
+h3 {
+  font-size: 1.05rem;
+  margin: 1.5rem 0 0.4rem;
+  color: var(--text);
+}
+
+/* ── post meta ── */
+.post-meta {
+  font-family: var(--font-ui);
+  font-size: 0.8rem;
+  color: var(--faint);
+  margin-bottom: 2rem;
+}
+
+/* ── prose ── */
+p { margin: 0 0 1rem; }
+
+a { color: var(--link); }
+a:hover { color: var(--link-hover); }
+
+ul, ol {
+  margin: 0 0 1rem 1.4rem;
+  padding: 0;
+}
+
+li { margin-bottom: 0.25rem; }
+
+blockquote {
+  margin: 1.5rem 0;
+  padding: 0 0 0 1.2rem;
+  border-left: 3px solid var(--border);
+  color: var(--muted);
+  font-style: italic;
+}
+
+blockquote p { margin: 0; }
+
+hr {
+  border: none;
+  border-top: 1px solid var(--border);
+  margin: 2.5rem 0;
+}
+
+/* ── code ── */
+code {
+  font-family: var(--font-mono);
+  font-size: 0.82em;
+  background: var(--bg-code);
+  padding: 1px 4px;
+  border-radius: 3px;
+}
+
+pre {
+  background: var(--bg-code);
+  border: 1px solid var(--border);
+  border-radius: 4px;
+  padding: 1rem;
+  overflow-x: auto;
+  margin: 1rem 0 1.5rem;
+}
+
+pre code {
+  background: none;
+  padding: 0;
+  font-size: 0.85rem;
+}
+
+/* ── post list (homepage) ── */
+.post-list {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+.post-list li {
+  display: flex;
+  gap: 1.5rem;
+  align-items: baseline;
+  padding: 0.6rem 0;
+  border-bottom: 1px solid var(--border);
+  margin: 0;
+}
+
+.post-list li:first-child { border-top: 1px solid var(--border); }
+
+.post-date {
+  font-family: var(--font-ui);
+  font-size: 0.8rem;
+  color: var(--faint);
+  white-space: nowrap;
+  flex-shrink: 0;
+  min-width: 5.5rem;
+}
+
+.post-list a {
+  text-decoration: none;
+  color: var(--text);
+  font-size: 1rem;
+}
+
+.post-list a:hover { color: var(--link); }
+
+/* ── footer ── */
+#footer {
+  margin-top: 3rem;
+  padding-top: 1rem;
+  border-top: 1px solid var(--border);
+  font-family: var(--font-ui);
+  font-size: 0.78rem;
+  color: var(--faint);
+}
+
+#footer a { color: var(--faint); }
+#footer a:hover { color: var(--link); }