summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authort <t@tjp.lol>2026-07-12 20:00:15 -0600
committert <t@tjp.lol>2026-07-12 20:03:27 -0600
commit0e602cfa7881f789c3e9f1d5f25db9a8179cd0fc (patch)
tree059b4c6761f3f61bc202ed5e685791b96be0074a
parent92bd4424db18b10ec28653ba6c20efe22ef1637b (diff)
site updates
-rw-r--r--about/index.html.tmpl2
-rw-r--r--feed.xml.tmpl43
-rw-r--r--index.html.tmpl27
-rw-r--r--notes/index.html.tmpl14
-rw-r--r--projects/index.html.tmpl10
-rw-r--r--site.tmpl71
-rw-r--r--style.css22
-rw-r--r--weblog/a-new-post-script.md4
-rw-r--r--weblog/advent-of-code.md4
-rw-r--r--weblog/aerc-surprised-me.md6
-rw-r--r--weblog/back-to-classics-the-picture-of-dorian-gray.md4
-rw-r--r--weblog/better-current-word-search-vim.md4
-rw-r--r--weblog/censorship.md4
-rw-r--r--weblog/dealerships-are-the-worst.md4
-rw-r--r--weblog/deplatforming.md4
-rw-r--r--weblog/from-packer-to-lazy-nvim.md4
-rw-r--r--weblog/geminis-killer-app.md4
-rw-r--r--weblog/gopher-item-types-a-gemini-miss.md4
-rw-r--r--weblog/guppy-v03.md4
-rw-r--r--weblog/happy-hacking.md4
-rw-r--r--weblog/index.html.tmpl4
-rw-r--r--weblog/jujutsu-is-the-real-deal.md4
-rw-r--r--weblog/leveling-up-the-toolkit.md4
-rw-r--r--weblog/missing-the-point.md4
-rw-r--r--weblog/neovim-lua.md4
-rw-r--r--weblog/nntp-a-great-protocol-for-bridging.md6
-rw-r--r--weblog/obligatory-first-post.md4
-rw-r--r--weblog/on-helicopter-parenting.md4
-rw-r--r--weblog/programming-language-learning.md4
-rw-r--r--weblog/runit-again.md4
-rw-r--r--weblog/the-baddies.md4
-rw-r--r--weblog/the-simple-joys-of-the-humble-slide-rule.md4
-rw-r--r--weblog/upcoming-gemini-projects.md4
33 files changed, 187 insertions, 110 deletions
diff --git a/about/index.html.tmpl b/about/index.html.tmpl
index 70ca851..e2a5c1b 100644
--- a/about/index.html.tmpl
+++ b/about/index.html.tmpl
@@ -19,7 +19,7 @@
</div>
<section>
- <h2 class="sec">elsewhere</h2>
+ <h2>elsewhere</h2>
<ul class="links">
<li><span class="k">email</span><a href="mailto:t@tjp.lol">t@tjp.lol</a></li>
<li><span class="k">code</span><a href="https://code.tjp.lol/">self-hosted cgit</a></li>
diff --git a/feed.xml.tmpl b/feed.xml.tmpl
index c95aa53..8952437 100644
--- a/feed.xml.tmpl
+++ b/feed.xml.tmpl
@@ -3,19 +3,48 @@
<subtitle>Notes, code, and longer thoughts from an elder-millennial software engineer in Salt Lake City.</subtitle>
<link href="https://tjp.lol/feed.xml" rel="self"/>
<link href="https://tjp.lol/"/>
- {{$posts := sortPages (index .Pages "weblog") "post_date"}}{{with slicePages $posts 0 1}}<updated>{{range .}}{{rfc3339 (index .Meta "post_date")}}{{end}}</updated>{{else}}<updated>2026-07-11T00:00:00Z</updated>{{end}}
+ {{$posts := sortPages (index .Pages "weblog") "post_date" "mod_time" -}}
+ {{with slicePages $posts 0 1 -}}
+ <updated>
+ {{- range . -}}
+ {{$post_date := or (index .Meta "post_date") .ModTime -}}
+ {{rfc3339 $post_date}}
+ {{- end -}}
+ </updated>
+ {{- else -}}
+ <updated>2026-07-11T00:00:00Z</updated>
+ {{- end}}
<id>https://tjp.lol/</id>
<author>
<name>tjp</name>
<email>t@tjp.lol</email>
</author>
- {{range $posts}}<entry>
+ {{range $posts -}}
+ {{$post_date := or (index .Meta "post_date") .ModTime -}}
+ <entry>
<title>{{.Title}}</title>
<link href="{{.CanonicalURL}}"/>
<id>{{.CanonicalURL}}</id>
- <published>{{rfc3339 (index .Meta "post_date")}}</published>
- <updated>{{if index .Meta "updated"}}{{rfc3339 (index .Meta "updated")}}{{else}}{{rfc3339 (index .Meta "post_date")}}{{end}}</updated>
- {{with .Sections}}<content type="html">{{xml (index . 0)}}</content>
- {{end}}
- </entry>{{end}}
+ <published>{{rfc3339 $post_date}}</published>
+ <updated>
+ {{- if index .Meta "updated" -}}
+ {{rfc3339 (index .Meta "updated")}}
+ {{- else -}}
+ {{rfc3339 $post_date}}
+ {{- end -}}
+ </updated>
+ <content type="html">
+ {{- $sawH1 := false}}
+ {{- $lede := true}}
+ {{- range .Sections}}
+ {{- if and $sawH1 $lede}}
+ {{- xml .}}
+ {{- $lede = false}}
+ {{- else if eq (printf "%.3s" .) "<h1"}}
+ {{- $sawH1 = true}}
+ {{- end}}
+ {{- end -}}
+ </content>
+ </entry>
+ {{- end}}
</feed>
diff --git a/index.html.tmpl b/index.html.tmpl
index 59a87e3..7d2376a 100644
--- a/index.html.tmpl
+++ b/index.html.tmpl
@@ -24,19 +24,30 @@
</section>
<section>
- <h2 class="sec">recent posts</h2>
- {{$posts := sortPages (index .Pages "weblog") "post_date"}}{{with $posts}}<ul class="posts">
- {{range slicePages . 0 5}}<li><time datetime="{{date (index .Meta "post_date") "2006-01-02"}}">{{date (index .Meta "post_date") "2006-01-02"}}</time><a href="{{rel "index.html" .OutputPath}}">{{.Title}}</a></li>{{end}}
+ <h2>recent posts</h2>
+ {{- $posts := sortPages (index .Pages "weblog") "post_date" "mod_time"}}
+ {{- with $posts}}
+ <ul class="posts">
+ {{- range slicePages . 0 5}}
+ {{- $post_date := or (index .Meta "post_date") .ModTime}}
+ <li><time datetime="{{date $post_date "2006-01-02"}}">{{date $post_date "2006-01-02"}}</time><a href="{{rel "index.html" .OutputPath}}">{{.Title}}</a></li>
+ {{- end}}
</ul>
- {{end}}<p style="margin-top:.9rem;font-size:.9rem;"><a href="/weblog/">all posts &rarr;</a></p>
+ {{- end}}
+ <p style="margin-top:.9rem;font-size:.9rem;"><a href="/weblog/">all posts &rarr;</a></p>
</section>
<section>
- <h2 class="sec">recently changed notes</h2>
- {{$notes := sortPages (index .Pages "notes") "ModTime"}}{{with $notes}}<ul>
- {{range slicePages . 0 5}}<li><a href="{{rel "index.html" .OutputPath}}">{{.Title}}</a></li>{{end}}
+ <h2>recently changed notes</h2>
+ {{- $notes := sortPages (index .Pages "notes") "ModTime"}}
+ {{- with $notes}}
+ <ul>
+ {{- range slicePages . 0 5}}
+ <li><a href="{{rel "index.html" .OutputPath}}">{{.Title}}</a></li>
+ {{- end}}
</ul>
- {{end}}<p style="margin-top:.9rem;font-size:.9rem;"><a href="/notes/">notes &rarr;</a></p>
+ {{- end}}
+ <p style="margin-top:.9rem;font-size:.9rem;"><a href="/notes/">notes &rarr;</a></p>
</section>
</main>
diff --git a/notes/index.html.tmpl b/notes/index.html.tmpl
index 848a087..66c1f43 100644
--- a/notes/index.html.tmpl
+++ b/notes/index.html.tmpl
@@ -13,19 +13,23 @@
{{template "header" .}}
<main>
<section class="intro">
- <p>This is a digital garden; a public slice of the persistent notes I keep synced across my devices.</p>
+ <p>A public slice of the persistent notes I keep synced across my devices.</p>
</section>
<section>
- <h2 class="sec">start here</h2>
+ <h2>start here</h2>
<ul>
- <li><a href="/notes/sync/recipes/">My Recipes</a></li>
- <li><a href="/notes/sync/recipes/cocktails/">Cocktail Recipes</a></li>
+ <li>
+ <a href="/notes/sync/recipes/">My Recipes</a>
+ <ul>
+ <li><a href="/notes/sync/recipes/cocktails/">Cocktail Recipes</a></li>
+ </ul>
+ </li>
</ul>
</section>
<!--<section>
- <h2 class="sec">all notes</h2>
+ <h2>all notes</h2>
{{$notes := sortPages (index .Pages "notes") "mod_time"}}{{with $notes}}<div class="note-index">
{{range .}}<a href="{{rel "notes/index.html" .OutputPath}}">{{.Title}}</a>{{end}}
</div>{{end}}
diff --git a/projects/index.html.tmpl b/projects/index.html.tmpl
index a6708c2..4e5fa47 100644
--- a/projects/index.html.tmpl
+++ b/projects/index.html.tmpl
@@ -18,22 +18,22 @@
</section>
<section>
- <h2 class="sec">current</h2>
+ <h2>current</h2>
- <h3 class="sec">pantograph</h3>
+ <h3>pantograph</h3>
<ul>
<li><a href="https://code.tjp.lol/pantograph.git"><span class="k">pantograph</span></a> - a minimal AI TUI agent in zig with extensions in lua (<a href="/pantograph">project page</a>)</li>
<li><a href="https://code.tjp.lol/libpantograph.git"><span class="k">libpantograph</span></a> - the zig agent SDK behind pantograph, with several other language bindings</li>
<li><a href="https://code.tjp.lol/panto-agent.git"><span class="k">panto-agent</span></a> - collection of baseline extensions bringing pantograph up to snuff as a coding agent</li>
</ul>
- <h3 class="sec">this site</h3>
+ <h3>this site</h3>
<ul>
<li><a href="https://code.tjp.lol/weft.git"><span class="k">weft</span></a> - a small static site generator</li>
<li><a href="https://code.tjp.lol/tjp_lol.git"><span class="k">tjp.lol</span></a> - repo tracking the markdown and other sources; builds with weft</li>
</ul>
- <h3 class="sec">small web protocols</h3>
+ <h3>small web protocols</h3>
<ul>
<li><a href="https://code.tjp.lol/sliderule.git"><span class="k">sliderule</span></a> - Go tools for building for small web protocols</li>
<li><a href="https://code.tjp.lol/syw.git"><span class="k">show-your-work</span></a> - git repo browser built on sliderule</li>
@@ -42,7 +42,7 @@
</section>
<section>
- <h2 class="sec">archived</h2>
+ <h2>archived</h2>
</section>
</main>
diff --git a/site.tmpl b/site.tmpl
index 6299dce..28175b5 100644
--- a/site.tmpl
+++ b/site.tmpl
@@ -1,21 +1,29 @@
-{{define "head"}}<!DOCTYPE html>
+{{define "head" -}}
+<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{if eq .OutputPath "about/index.html"}}About &amp; colophon{{else}}{{.Title}}{{end}} — tjp.lol</title>
-{{with index .Meta "description"}}<meta name="description" content="{{.}}">
-{{end}}<link rel="stylesheet" href="{{rel .OutputPath "style.css"}}">
-{{if or (eq .OutputPath "weblog/index.html") (index .Meta "post_date")}}<link rel="alternate" type="application/atom+xml" title="tjp.lol" href="{{rel .OutputPath "feed.xml"}}">
-{{end}}</head>
+{{with index .Meta "description" -}}
+<meta name="description" content="{{.}}">
+{{end -}}
+<link rel="stylesheet" href="{{rel .OutputPath "style.css"}}">
+{{if eq (printf "%.7s" .URL) "/weblog" -}}
+<link rel="alternate" type="application/atom+xml" title="tjp.lol" href="{{rel .OutputPath "feed.xml"}}">
+{{end -}}
+</head>
<body>
<div class="wrap">
{{end}}
-{{define "header"}} <header class="site">
+{{define "header" -}}
+ <header class="site">
<h1 class="brand"><a href="{{rel .OutputPath "/"}}">~tjp<span class="cur"> $_</span></a></h1>
- {{if eq .OutputPath "index.html"}}<p class="tag">Elder millennial in Salt Lake City, Utah.</p>
- {{end}}<nav class="main">
+ {{if eq .OutputPath "index.html" -}}
+ <p class="tag">Elder millennial in Salt Lake City, Utah.</p>
+ {{end -}}
+ <nav class="main">
<a href="{{rel .OutputPath "/about/"}}"{{if eq .OutputPath "about/index.html"}} aria-current="page"{{end}}>about</a>
<a href="{{rel .OutputPath "/weblog/"}}"{{if eq .OutputPath "weblog/index.html"}} aria-current="page"{{end}}>weblog</a>
<a href="{{rel .OutputPath "/notes/"}}"{{if eq .OutputPath "notes/index.html"}} aria-current="page"{{end}}>notes</a>
@@ -25,7 +33,8 @@
</header>
{{end}}
-{{define "footer"}} <footer>
+{{define "footer" -}}
+ <footer>
<!-- <div class="ring">
<span>webring:</span>
<a href="#">&larr; prev</a><a href="#">rand</a><a href="#">next &rarr;</a>
@@ -38,30 +47,43 @@
</html>
{{end}}
-{{define "page"}}{{template "head" .}}{{template "header" .}}
+{{define "page" -}}
+{{template "head" .}}
+{{template "header" .}}
<main>
<article class="post">
- <div class="post-head">
- <h1>{{.Title}}</h1>
- </div>
<div class="note-body">
{{joinSections .Sections}}
</div>
</article>
</main>
-{{template "footer" .}}{{end}}
+{{template "footer" .}}
+{{end}}
-{{define "weblog"}}{{template "head" .}}{{template "header" .}}
+{{define "weblog" -}}
+{{template "head" .}}
+{{template "header" .}}
+ {{$post_date := or (index .Meta "post_date") .ModTime -}}
<main>
<article class="post">
<div class="post-head">
- <p class="meta"><a href="{{rel .OutputPath "weblog/index.html"}}" style="text-decoration:none;">&larr; weblog</a> &nbsp;/&nbsp; <time datetime="{{date (index .Meta "post_date") "2006-01-02"}}">{{date (index .Meta "post_date") "2006-01-02"}}</time></p>
- <h1>{{.Title}}</h1>
+ <p class="meta"><a href="{{rel .OutputPath "weblog/index.html"}}" style="text-decoration:none;">&larr; weblog</a> &nbsp;/&nbsp; <time datetime="{{date $post_date "2006-01-02"}}">{{date $post_date "2006-01-02"}}</time></p>
</div>
- {{with .Sections}}{{with index . 0}}<div style="font-size:1.2em">{{.}}</div>{{end}}
- {{joinSections (slice . 1)}}{{end}}
+ {{- $sawH1 := false}}
+ {{- $lede := true}}
+ {{- range .Sections}}
+ {{- if and $sawH1 $lede -}}
+<div style="font-size:1.2em">{{.}}</div>
+ {{- $lede = false}}
+ {{- else}}
+ {{- .}}
+ {{- if eq (printf "%.3s" .) "<h1"}}
+ {{- $sawH1 = true}}
+ {{- end}}
+ {{- end}}
+ {{- end}}
</article>
<nav class="post-nav">
@@ -69,14 +91,16 @@
</nav>
</main>
-{{template "footer" .}}{{end}}
+{{template "footer" .}}
+{{end}}
-{{define "notes"}}{{template "head" .}}{{template "header" .}}
+{{define "notes" -}}
+{{template "head" .}}
+{{template "header" .}}
<main>
<article class="post">
<div class="post-head">
<p class="meta"><a href="{{rel .OutputPath "notes/index.html"}}" style="text-decoration:none;">&larr; notes</a></p>
- <h1>{{.Title}}</h1>
</div>
<div class="note-body">
@@ -85,4 +109,5 @@
</article>
</main>
-{{template "footer" .}}{{end}}
+{{template "footer" .}}
+{{end}}
diff --git a/style.css b/style.css
index 8dbb40e..25a5357 100644
--- a/style.css
+++ b/style.css
@@ -20,7 +20,7 @@ body{
margin:0; background:var(--bg); color:var(--fg);
font-family:var(--sans); line-height:1.62; -webkit-text-size-adjust:100%;
}
-code,kbd,samp,pre,.mono,nav.main a,time,.k,h1.brand,h2.sec{font-family:var(--mono);}
+code,kbd,samp,pre,.mono,nav.main a,time,.k,h1.brand{font-family:var(--mono);}
a{color:var(--accent); text-decoration:underline; text-underline-offset:2px; text-decoration-thickness:1px;}
a:hover{color:var(--accent-hover);}
@@ -30,6 +30,11 @@ a:visited{color:var(--accent);}
img{max-width:100%; height:auto;}
hr{border:0; border-top:1px dashed var(--rule); margin:2rem 0;}
+/* content lists (chrome lists like ul.posts/.links/.tags opt out via list-style:none + own sizes) */
+ol,ul{font-size:.96em; line-height:1.45;}
+ol li,ul li{margin:.15rem 0;}
+li::marker{font-family:var(--mono); color:var(--muted); font-size:.85em;}
+
/* ---- masthead ---- */
header.site{padding:2.4rem 0 1.2rem;}
h1.brand{font-size:1.5rem; margin:0; font-weight:700; letter-spacing:-.02em;}
@@ -46,9 +51,14 @@ nav.main a[aria-current="page"]{color:var(--accent);}
main{padding:1.4rem 0 1rem;}
section{margin:2.2rem 0;}
-.sec{letter-spacing:.02em; color:var(--muted); font-weight:400; margin:0 0 .9rem;}
-h2.sec::before{content:"## "; color:var(--accent);}
-h3.sec::before{content:"### "; color:var(--accent);}
+h1:not(.brand),h2,h3,h4,h5{font-family:var(--mono); color:var(--muted); font-weight:400;
+ letter-spacing:.02em; margin:0 0 .9rem;}
+h1:not(.brand)::before{content:"# ";}
+h2::before{content:"## ";}
+h3::before{content:"### ";}
+h4::before{content:"#### ";}
+h5::before{content:"##### ";}
+:is(h1:not(.brand),h2,h3,h4,h5)::before{color:var(--accent);}
.intro p{margin:0 0 .9rem; font-size:1.06rem;}
@@ -75,13 +85,13 @@ ul.posts a:hover{color:var(--accent); text-decoration:underline;}
/* ---- long-form article ---- */
article.post{font-size:1.08rem; line-height:1.7;}
article.post .post-head{margin:0 0 2rem;}
-article.post h1{font-size:1.85rem; line-height:1.2; letter-spacing:-.02em; margin:.2rem 0 .5rem; font-family:var(--sans);}
+article.post h1{font-size:1.85rem; line-height:1.2; letter-spacing:-.02em; margin:.2rem 0 .5rem;}
+article.post > h1,article.post .note-body > h1{margin-bottom:2.2rem;}
article.post .meta{color:var(--muted); font-size:.85rem; font-family:var(--mono);}
article.post h2{font-size:1.3rem; margin:2.2rem 0 .7rem; letter-spacing:-.01em;}
article.post h3{font-size:1.08rem; margin:1.8rem 0 .5rem;}
article.post p{margin:0 0 1.1rem;}
article.post ul,article.post ol{margin:0 0 1.1rem; padding-left:1.3rem;}
-article.post li{margin:.3rem 0;}
article.post blockquote{margin:1.4rem 0; padding:.2rem 0 .2rem 1.1rem; border-left:3px solid var(--accent);
color:var(--muted); font-style:italic;}
article.post code{background:var(--card); padding:.1rem .35rem; border-radius:3px; font-size:.9em;}
diff --git a/weblog/a-new-post-script.md b/weblog/a-new-post-script.md
index c4ad068..713a18d 100644
--- a/weblog/a-new-post-script.md
+++ b/weblog/a-new-post-script.md
@@ -2,6 +2,8 @@
post_date: 2023-05-09
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# A new-post script
I got to take a new "newpost" script for a spin just now and was really pleased with it.
@@ -26,5 +28,3 @@ EDIT: it was worth a shot, it works great.
Where I *really* wanted to get with this script was something I could run which would unify (a) posting a new post, and (b) sending a request to antenna to alert it to the new post. If this isn't one-and-the-same step from a workflow standpoint, I will *definitely* forget to do the second part. And in the future, if more active aggregators in the Antenna style pop up, I can add them to the script once and have them integrated from there on out.
Shoddy multi-language paradigm or not, it was a pretty big and important step to get *some* automation in place.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/advent-of-code.md b/weblog/advent-of-code.md
index 46ecdc3..5b40fd4 100644
--- a/weblog/advent-of-code.md
+++ b/weblog/advent-of-code.md
@@ -2,6 +2,8 @@
post_date: 2023-12-11
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Advent of Code
AoC '23 is off to a great start.
@@ -11,5 +13,3 @@ The problems are good ones and lots of fun, but it definitely feels like less of
I've been collecting my solutions in this gemini capsule, along with those of anyone on this pubnix who wish to participate.
[Ctrl-C.Club Advent of Code aggregated solutions](gemini://gemini.ctrl-c.club/~tjp/p/aoc23/)
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/aerc-surprised-me.md b/weblog/aerc-surprised-me.md
index b84cc42..170b930 100644
--- a/weblog/aerc-surprised-me.md
+++ b/weblog/aerc-surprised-me.md
@@ -2,6 +2,8 @@
post_date: 2024-08-24
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Aerc surprised me
I've never been particularly happy with CLI or TUI email options. Aerc might just finally change that.
@@ -21,7 +23,3 @@ On top of the program itself, aerc ships with a directory of filter scripts, uti
With these scripts and the structure of the program itself (modal, command-based, unix-oriented), and some really smart inventions like built-in folder name remapping, aerc satisfies the itch for a good old-timey UNIX program, while simultaneously anticipating the needs of an email client in the 2020s.
I'm loving it.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
-
-> I also still use aerc.
diff --git a/weblog/back-to-classics-the-picture-of-dorian-gray.md b/weblog/back-to-classics-the-picture-of-dorian-gray.md
index f8053a9..ca1a9ef 100644
--- a/weblog/back-to-classics-the-picture-of-dorian-gray.md
+++ b/weblog/back-to-classics-the-picture-of-dorian-gray.md
@@ -2,6 +2,8 @@
post_date: 2023-09-04
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Back to classics: The Picture of Dorian Gray
Every once in a while I like to pull out an old classic book.
@@ -17,5 +19,3 @@ I was already aware of the plot of The Picture of Dorian Gray, but I don't belie
And the characters! The dialogue forms these characters into more clear, distinct, and full humans than what most authors ever pull off. They are at once varying levels of clever, optimistic/pessimistic, artistic, and have dramatically different motivations. I usually find that an author's characters are (probably) just reflecting different aspects of the author's own character, and are thus limited to being less than a full person, lest they overlap too much with other characters. I don't know how Wilde conceives of these characters and so effortlessly gives them complete voices of their own, but he does.
I'm thoroughly enjoying this, and even just having barely cracked it open, I can heartily recommend it.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/better-current-word-search-vim.md b/weblog/better-current-word-search-vim.md
index fa06126..44cc443 100644
--- a/weblog/better-current-word-search-vim.md
+++ b/weblog/better-current-word-search-vim.md
@@ -2,6 +2,8 @@
post_date: 2022-07-03
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Better current word search in vim
I noticed something when I was refactoring my vim configs for the Nth time last week, which [I wrote about in a bit more detail here](./neovim-lua.md). It's a bit of vim configuration that I've been copying forward without thinking about it for years and years, never even remotely considering pruning it because it's so useful. I also came up with it myself but havne't ever really put any effort into sharing it, so here we are.
@@ -24,5 +26,3 @@ The mappings above copy that behavior (perform it as you would do it directly, e
You see by the default naive cword search, any larger words which fully contain your search term would also show up as results. Try searching for a single letter variable that way and you'll have a bad time.
I think of this as a fantastic example of the utility of programmatic configuration (the sort that's made all the more powerful by using lua over VimL) - you're free to make the editor better in a hundred minor ways to smooth out your editing workflows, and in a way which is itself very much like maintaining code: build yourself a useful abstraction and don't have to think about it too much any more.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/censorship.md b/weblog/censorship.md
index 7553f62..4f68262 100644
--- a/weblog/censorship.md
+++ b/weblog/censorship.md
@@ -2,6 +2,8 @@
post_date: 2024-01-03
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# "censorship"
A domain was blocked from Antenna after a political post was made. That sounds bad.
@@ -19,5 +21,3 @@ Then I read the original post and my shock transferred entirely elsewhere.
Besides being a lie, this is an utterly despicable, de-humanizing, and genocide-cheering statement. There are few who would dispute the validity of Israel's stated goal of eradicating Hamas. Equating Hamas with all Palestinians is therefore an explicit call to wipe out an ethnic people group.
Look, I think the bar should be _really_ high before we go banning someone from public discourse channels. My dude cleared it and then some.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/dealerships-are-the-worst.md b/weblog/dealerships-are-the-worst.md
index bda1255..ee544d2 100644
--- a/weblog/dealerships-are-the-worst.md
+++ b/weblog/dealerships-are-the-worst.md
@@ -2,6 +2,8 @@
post_date: 2023-11-03
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Dealerships are the worst
My Honda is great. All dealerships are _incredibly_ bad by comparison.
@@ -17,5 +19,3 @@ So I call the nearest Honda dealership. Of course, if I had any confidence that
Finally I figure I'll just check YouTube university and immediately find a 2 minute video that tears my original assumption to shreds. There's a super easy way to open the key fob, with some small plastic tabs even intentionally built in to make this easier. Then it's just a CR2032 battery cell inside: common, cheap, and available at the local grocery store. I've made the trip to the grocery store and replaced the battery in less time than I spent on hold trying to just make the appointment.
This is kind of what Honda is known for, and I should have expected it from the get-go: inexpensive, super practical, user-focused design choices. CRVs used to come with a small folding table stored above the spare tire! I find the disparity so jarring between the car manufacturer and the physical locations that represent their brand to consumers.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/deplatforming.md b/weblog/deplatforming.md
index ff42aa2..81ea119 100644
--- a/weblog/deplatforming.md
+++ b/weblog/deplatforming.md
@@ -2,6 +2,8 @@
post_date: 2024-01-04
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# deplatforming
We've really got to raise the bar in talking about issues of free speech in small web spaces, myself included.
@@ -18,5 +20,3 @@ Happily there seems to be agreement that the operator of Antenna has the right t
But there is a massive gulf between "I don't like this" and "this is dangerous". It's 2024 and we have a pretty solid understanding of where the natural echo chambers of our self-selected online communities lead. There's no need to chalk up this ban action to "the mod doesn't like this speech" when an equal or better explanation is "the mod doesn't want their platform to be a place where people can be radicalized".
Free speech must have limits. If calls for genocide (explicit or implied) don't reach your limit, I submit that your position is intellectually lazy.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/from-packer-to-lazy-nvim.md b/weblog/from-packer-to-lazy-nvim.md
index 9ab0c95..0ab471f 100644
--- a/weblog/from-packer-to-lazy-nvim.md
+++ b/weblog/from-packer-to-lazy-nvim.md
@@ -2,6 +2,8 @@
post_date: 2023-11-01
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# From packer to lazy.nvim
I ported my vim configuration again.
@@ -41,5 +43,3 @@ All in all, the new setup on lazy.nvim is superior to what I had with packer in
Mason is managing a limited set of LSP options so everything is right there - what you've installed and what you haven't. Lazy.nvim is different because the set of vim plugins you haven't installed is pretty much unknowable. However, it is telling that strings like 'pluginname' automatically reference vim.org/scripts, and strings like 'author/name' automatically reference github.com. With that in mind, it would be great if the Lazy UI offered a means of searching vim.org scripts and public github repos. There would probably be github rate limits to contend with, but otherwise it seems like something that should be doable.
Finally, as I mentioned before it would be amazing to have a UI like Mason but which manages treesitter parsers. I wouldn't expect this to come from lazy.nvim, it's just another plugin that should exist.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/geminis-killer-app.md b/weblog/geminis-killer-app.md
index a47533f..79c7799 100644
--- a/weblog/geminis-killer-app.md
+++ b/weblog/geminis-killer-app.md
@@ -2,6 +2,8 @@
post_date: 2023-05-09
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Gemini's Killer App
[Joel of innerteapot.com wrote about Gemini's focus on text.](gemini://innerteapot.com/gemlog/20230509-geminis-killer-app.gmi)
@@ -15,5 +17,3 @@ Gemini will also never be attractive to corporate interests because it will neve
If Gemini successfully holds off capitalism, the only motive for publishing into geminispace is passion. This is the real killer app: nobody has a job writing for Gemini. It's all passion, because Gemini doesn't allow the incentive structures to support anything else.
~tjp
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/gopher-item-types-a-gemini-miss.md b/weblog/gopher-item-types-a-gemini-miss.md
index 74aae4f..dd0621e 100644
--- a/weblog/gopher-item-types-a-gemini-miss.md
+++ b/weblog/gopher-item-types-a-gemini-miss.md
@@ -2,6 +2,8 @@
post_date: 2023-09-04
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Gopher item types: A Gemini miss?
Hardly new, I know - a geminaut questions a design decision in the protocol.
@@ -33,5 +35,3 @@ MAP [6] Other Gopher clients for various platforms
Will this link take me to another gopher menu? Show me a text file? Render an image? Download a binary file? Bounce me over to WWW? It's rather fantastic to get the visual cues that clients provide, and that's made possible by the information being embedded in the link itself in the underlying protocol.
I miss that clarity when browsing gemini.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/guppy-v03.md b/weblog/guppy-v03.md
index 068fa25..787bc2e 100644
--- a/weblog/guppy-v03.md
+++ b/weblog/guppy-v03.md
@@ -2,6 +2,8 @@
post_date: 2023-10-25
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Guppy v0.3
It feels like there's a renaissance of text client/server protocols in the small web these days, and I love seeing these come out.
@@ -89,5 +91,3 @@ Here are a few suggestions, informed by existing implementations (like TCP), whi
- Split apart message type and sequence number. You get the rest of the possible message types as room for expansion. Also it makes the next suggestion work.
- Precisely define the size of sequence numbers, and allow them to wrap around. Any number in the range can now be chosen as the starting point, and incrementing from the maximum value gets you to zero. Now there's no arbitrary limit to your total message size.
- Don't bother retrying acks. If the server doesn't get one it'll retransmit its packet, and the client now *should* ack duplicate packets that it receives.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/happy-hacking.md b/weblog/happy-hacking.md
index 2cb0cad..19072d3 100644
--- a/weblog/happy-hacking.md
+++ b/weblog/happy-hacking.md
@@ -2,6 +2,8 @@
post_date: 2023-01-10
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Happy hacking
Winter has been a great time for "for me" coding projects.
@@ -35,5 +37,3 @@ I definitely want to keep investing in gus, and I'm excited about the little com
I hope you may also find the time and mental and emotional energy to pursue things that fill you up in 2023!
~tjp
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/index.html.tmpl b/weblog/index.html.tmpl
index 9548c44..435d73c 100644
--- a/weblog/index.html.tmpl
+++ b/weblog/index.html.tmpl
@@ -18,9 +18,9 @@
<p><a href="{{rel .OutputPath "/feed.xml"}}">Atom feed</a></p>
</section>
- {{$posts := sortPages (index .Pages "weblog") "post_date"}}{{with $posts}}<section>
+ {{$posts := sortPages (index .Pages "weblog") "post_date" "mod_time"}}{{with $posts}}<section>
<ul class="posts">
- {{range .}}<li><time datetime="{{date (index .Meta "post_date") "2006-01-02"}}">{{date (index .Meta "post_date") "2006-01-02"}}</time><a href="{{rel "weblog/index.html" .OutputPath}}">{{.Title}}</a></li>{{end}}
+ {{range .}}{{$post_date := or (index .Meta "post_date") .ModTime}}<li><time datetime="{{date $post_date "2006-01-02"}}">{{date $post_date "2006-01-02"}}</time><a href="{{rel "weblog/index.html" .OutputPath}}">{{.Title}}</a></li>{{end}}
</ul>
</section>{{end}}
</main>
diff --git a/weblog/jujutsu-is-the-real-deal.md b/weblog/jujutsu-is-the-real-deal.md
index 83ba324..3f1216e 100644
--- a/weblog/jujutsu-is-the-real-deal.md
+++ b/weblog/jujutsu-is-the-real-deal.md
@@ -2,6 +2,8 @@
post_date: 2025-03-22
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Jujutsu is the Real Deal
An experience report from using jj as my primary git frontend for a few months.
@@ -45,5 +47,3 @@ All this is great, but plenty of later VCSes can claim to be better than git in
So when I said "You can view JJ as a really simple automation of this \[git\] workflow", I *really* meant that. This is also why the revision objects within jj's changes are so much like git's commits - they actually are git commits. I've been using jj now for about 6 weeks as my *only* VCS tool, and have continued uninterrupted working with a team that uses git and github. There's really no reason not to give it a go.
~tjp
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/leveling-up-the-toolkit.md b/weblog/leveling-up-the-toolkit.md
index 254ddcf..d0edf2d 100644
--- a/weblog/leveling-up-the-toolkit.md
+++ b/weblog/leveling-up-the-toolkit.md
@@ -2,6 +2,8 @@
post_date: 2024-11-20
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Leveling up the toolkit
A story of exploration, optimization, and how awesome open-source tooling can be.
@@ -205,5 +207,3 @@ cmd-alt-shift-b = ['move-node-to-workspace B', 'exec-and-forget /usr/local/bin/s
cmd-alt-shift-c = ['move-node-to-workspace C', 'exec-and-forget /usr/local/bin/sketchybar --trigger aerospace_workspace_change']
...
```
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/missing-the-point.md b/weblog/missing-the-point.md
index 431a9ae..a545c51 100644
--- a/weblog/missing-the-point.md
+++ b/weblog/missing-the-point.md
@@ -2,6 +2,8 @@
post_date: 2023-05-29
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Missing The Point
Daniel Stenberg (cURL author) wrote a critique of the gemini specification.
@@ -41,5 +43,3 @@ By my count:
Kneejerk defensiveness is just going to prevent us from learning what we can, even from imperfect sources.
~tjp
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/neovim-lua.md b/weblog/neovim-lua.md
index c51486d..7f64006 100644
--- a/weblog/neovim-lua.md
+++ b/weblog/neovim-lua.md
@@ -2,6 +2,8 @@
post_date: 2022-06-29
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Neovim's lua config support
I ported all my vim configs to lua over the weekend and I've never been happier with them.
@@ -15,5 +17,3 @@ But lua is a proper programming language. I intuitively understand how to break
Granted, so far I haven't made very full use of these capabilities, since it was already a fairly sizable task just to port vimscript to lua 1-for-1 (but I did break it into separate topical files that makes them all much more digestable as a reader). But even being a language that supports such a refactor, under language constructs that behave like I expect, makes it feel entirely different.
I highly recommend making that jump, even if you don't have any particular configuration improvement to tackle simultaneously. With any sort of background in programming, it'll give you a fresh feeling that your editor is now far more configurable than before.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/nntp-a-great-protocol-for-bridging.md b/weblog/nntp-a-great-protocol-for-bridging.md
index 769d5b9..91d451f 100644
--- a/weblog/nntp-a-great-protocol-for-bridging.md
+++ b/weblog/nntp-a-great-protocol-for-bridging.md
@@ -2,9 +2,11 @@
post_date: 2023-05-17
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# NNTP - a great protocol for bridging?
-This gemlog is hosted on ctrl-c.club, a "place for the curious to poke around and play." It's a multi-user unix box as a social network. We have public hosting for the web and gemini, email accounts, IRC rooms, command-line games, and a custom bulletin-board software built by a member called iris.
+This gemlog is hosted on `ctrl-c.club`, a "place for the curious to poke around and play." It's a multi-user unix box as a social network. We have public hosting for the web and gemini, email accounts, IRC rooms, command-line games, and a custom bulletin-board software built by a member called iris.
The original iris client is a pretty bare-bones TUI, pretty much just ruby with readline and some terminal colors. As I started enjoying using it, I was also getting back into usenet newsgroups - which are still around if not exactly thriving. I realized that these systems were functionally really similar, but built on extremely different building blocks. But I wanted access to the relatively mature TUI clients available for newsgroups for browsing iris threads.
@@ -28,5 +30,3 @@ Some sort of micro-blogging format could be a great fit as well, and twtxt is ni
I'm increasingly thinking of the newsgroups NNTP protocol as a medium for following conversations and excited about the possibilities of a sort of bitlbee-for-newsgroups.
~tjp
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/obligatory-first-post.md b/weblog/obligatory-first-post.md
index 24cdcc1..94ef87c 100644
--- a/weblog/obligatory-first-post.md
+++ b/weblog/obligatory-first-post.md
@@ -2,6 +2,8 @@
post_date: 2022-05-22
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Obligatory "first post!"
I made it. I'm a gemini blogger. A gemlogger.
@@ -16,5 +18,3 @@ I'm an old soul, always very interested in old technology, and intrigued with ho
One down, four to go.
-t
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/on-helicopter-parenting.md b/weblog/on-helicopter-parenting.md
index cec92a9..143210a 100644
--- a/weblog/on-helicopter-parenting.md
+++ b/weblog/on-helicopter-parenting.md
@@ -2,6 +2,8 @@
post_date: 2022-06-14
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# On helicopter parenting
I did an interesting thing rather automatically today, and it made me think.
@@ -13,5 +15,3 @@ It wasn't until a few curves later that I realized there had been another, subco
Why did I do that? On paper, the second group should have been more perilous - no parent around, and no heightened alertness as to the giant metal boxes flying by in close proximity. But I'm going to side with my own subconscious and say that it's the other way around. The first girls had not been sufficiently taught how to be safe for their mother to let them walk along the street alone, the seconds girls had. The first girls' mother, being on edge, put everyone around them on edge, while the second girls' cool demeaner put everyone at ease.
On autopilot, I am like the first girls' mother with my own kids. I know it's my job to protect them, I can't remotely bear the thought of something happening to them, and so I do the thing that comes most naturally under those values. It takes a step back, and a smidgen of intentionality, to realize that over-protection actually endangers them. That the safest kids are the ones that know how to keep themselves safe, to a degree that the adults in their life know deep in their bones that they'll be safe.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/programming-language-learning.md b/weblog/programming-language-learning.md
index a512dd1..fba158d 100644
--- a/weblog/programming-language-learning.md
+++ b/weblog/programming-language-learning.md
@@ -2,6 +2,8 @@
post_date: 2023-05-09
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Programming language learning
I'm doing ziglings right now, currently on (checks tmux pane) number 70.
@@ -21,5 +23,3 @@ I remember actually learning zig the first time and going through ziglearn:
[ziglearn - a more traditional feature rundown / tutorial](https://ziglearn.org/)
and I think that while ziglings is pretty much awesome for what I'm using it for, I'd recommend actually digging in and making an honest effort to *learn material* first to anyone learning zig for the first time.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/runit-again.md b/weblog/runit-again.md
index 1bb2509..6423c01 100644
--- a/weblog/runit-again.md
+++ b/weblog/runit-again.md
@@ -2,6 +2,8 @@
post_date: 2023-04-06
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Runit again
I wonder how well runit shortcomings could be patched with a package of additional utilities.
@@ -29,5 +31,3 @@ Still noodling on this one.
---
[^1]: I was mistaken here. Alpine advertises being based on musl libc and busybox. While busybox does include a minimal runit implementation, Alpine also ships with OpenRC which it uses as pid 1 by default.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/the-baddies.md b/weblog/the-baddies.md
index 5653d7c..9147746 100644
--- a/weblog/the-baddies.md
+++ b/weblog/the-baddies.md
@@ -2,6 +2,8 @@
post_date: 2023-04-06
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# The Baddies
The governor of Mississippi just [declared April](https://www.mississippifreepress.org/32351/gov-reeves-declares-confederate-heritage-month-a-30-year-old-mississippi-tradition) to be "Confederate Heritage Month". Turns out it's the 30th year of this tradition, but this is the first I've heard of it.
@@ -25,5 +27,3 @@ But the way my father steered the conversation led to me learning about slavery,
Taking in the "Confederate Heritage Month" news today is a stark reminder of how few southern boys had a dad like mine.
~tjp
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/the-simple-joys-of-the-humble-slide-rule.md b/weblog/the-simple-joys-of-the-humble-slide-rule.md
index 41bfd32..f5f1437 100644
--- a/weblog/the-simple-joys-of-the-humble-slide-rule.md
+++ b/weblog/the-simple-joys-of-the-humble-slide-rule.md
@@ -2,6 +2,8 @@
post_date: 2023-05-17
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# The simple joys of the humble slide rule
A slide rule is almost the simplest possible machine.
@@ -30,5 +32,3 @@ It's exactly the same conflation of factors that makes me love reading and writi
And so I submit to geminispace that I suspect lots more of us here might find a fascinating diversion in learning slide rules.
~tjp
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
diff --git a/weblog/upcoming-gemini-projects.md b/weblog/upcoming-gemini-projects.md
index 6ace46a..2f8fa8f 100644
--- a/weblog/upcoming-gemini-projects.md
+++ b/weblog/upcoming-gemini-projects.md
@@ -2,6 +2,8 @@
post_date: 2023-09-15
---
+> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`
+
# Upcoming Gemini projects
I've got some buns in the oven. Wait that came out wrong.
@@ -42,5 +44,3 @@ I think some of the ready-to-go capabilities of sliderule make this a pretty tra
- gophermap->markdown conversion
Add in charm's bubbletea and we've got *so much* of the hard stuff taken care of. [Bubbletea](https://github.com/charmbracelet/bubbletea) provides a TUI application framework including a nice colorful renderer of markdown content.
-
-> Note: This was ported from my old gemini capsule, still served on gemini at `gemini.ctrl-c.club/~tjp`