commit 27863e175cdb4f513838952537bfb9107fab8745 equwal <truex@equwal.com> 2026-09-22 17:34:26 -0700 Add a preview image for link previews
build.sh | 3 +- index.html | 3 +- site/25-noveloj.html | 3 +- site/3000-Vocab-Flashcards-3k-Final-Solution.html | 3 +- site/A-new-way-to-release-code.html | 3 +- ...-All-Japanese-All-The-Time-Mirror-at-xm0co.html | 3 +- site/Add-my-RSS-feed-to-your-feed-reader.html | 3 +- site/Brazil.html | 3 +- site/CSV.html | 3 +- site/Dont-Self-Host-Self-Locally.html | 3 +- site/Dont-use-make-uninstall.html | 3 +- site/Fish-Based-Navigation.html | 3 +- site/Forthe.html | 3 +- ...Generate-your-OWN-internet-web-site-easily.html | 3 +- site/Get-on-mailing-lists-like-it-is-1989.html | 3 +- site/Git-extra-worktrees-ROCK.html | 3 +- site/Hackermen-neomutt-config.html | 3 +- site/Hey-kids-want-to-learn-the-unix-way.html | 3 +- site/How-Japanese-Aquire-Books.html | 3 +- .../How-to-Beat-Emacs-M-x-dunnet-in-5-minutes.html | 3 +- ...Learn-a-Language-According-to-The-Internet.html | 3 +- ...anage-100000-digital-books-in-15-languages.html | 3 +- site/How-to-take-notes-not-self-help-advice.html | 3 +- site/Install-Anki.html | 3 +- site/Install-Nix-on-Gentoo.html | 3 +- site/Learn-Kanji-in-a-Fortnight.html | 3 +- site/Mailing-list-in-one-line.html | 3 +- ...Minimal-nvim-config-optional-AI-slop-enjoy.html | 3 +- ...arning-for-multiple-languages-PREORDER-NOW.html | 3 +- ...bout-polyglot-language-learning-LISTEN-NOW.html | 3 +- site/Newport.html | 3 +- site/Nixtoo-Genux-released.html | 3 +- site/POSIX-pipes-for-Lisp.html | 3 +- ...Podcast-Now-Goes-on-The-YouTubecom-Website.html | 3 +- ...-Long-Live-The-Queue-Antennapod-shill-post.html | 3 +- ...n-analogy-for-proper-AI-Driven-Development.html | 3 +- site/SL--Dependency-Language.html | 3 +- site/Start-emailing-your-patches-GUIDE.html | 3 +- ...-Macros-in-Alexandria-Code-Revival-Project.html | 3 +- ...n-android-into-247-portable-polyglot-radio.html | 3 +- ...nglo-your-literacy-materials-and-your-life.html | 3 +- ...stem-for-many-instances-of-simple-programs.html | 3 +- ...YOU-need-NixOS-on-your-desktop-and-servers.html | 3 +- site/WhyHow-to-host-a-bunch-of-crap-locally.html | 3 +- site/about.html | 633 ++++++------ site/aintitinit-Claude-INITIALIZER.html | 3 +- site/alt-hacks-zips.html | 3 +- site/alt-hacks.html | 3 +- site/biblio.html | 3 +- site/books.html | 3 +- site/budhismaj-rakontoj.html | 3 +- site/call.html | 3 +- site/cervido.html | 3 +- site/dmenu-scripts-repo-released.html | 3 +- site/donate.html | 3 +- site/esperantaj-artikoloj.html | 3 +- site/esperantaj-audoj.html | 3 +- site/esperantaj-libroj.html | 3 +- site/esperantaj-noveloj.html | 3 +- site/esperantaj-vortaroj.html | 3 +- site/esperanto-three-steps.html | 3 +- site/esperanto.html | 3 +- site/glider.html | 3 +- site/iilchat-setup-too-easy.html | 3 +- site/index.html | 3 +- site/install-9front.html | 3 +- site/install-gentoo-hints.html | 3 +- site/irc-relay.html | 3 +- site/key.html | 3 +- site/la-faraono.html | 3 +- site/lair.html | 3 +- site/lesperant2.html | 3 +- site/link-farm.html | 3 +- site/lisprant.html | 3 +- site/matrix.html | 3 +- site/meti-limon.html | 3 +- site/newport-reference-manual.html | 3 +- site/norda-naturo.html | 3 +- site/projects.html | 633 ++++++------ site/release.html | 3 +- site/rss.xml | 1042 ++++++++++---------- site/rut.html | 3 +- site/sbm.html | 3 +- site/serpentoj-en-la-puto.html | 3 +- site/static/og.png | Bin 0 -> 20610 bytes site/sten-johansson.html | 3 +- site/tag-gen.html | 3 +- site/tmpl-insanely-simple-templates.html | 3 +- site/youtube.html | 99 +- static/og.png | Bin 0 -> 20610 bytes 90 files changed, 1373 insertions(+), 1286 deletions(-)
diff --git a/build.sh b/build.sh index 43095c5..c9b7663 100755 --- a/build.sh +++ b/build.sh @@ -44,7 +44,8 @@ cat > "$TEMPLATE" << 'TMPL' <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="$title$" /> <meta property="og:url" content="$url$" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/index.html b/index.html index 1c925fb..6afa43b 100755 --- a/index.html +++ b/index.html @@ -10,7 +10,8 @@ <meta property="og:title" content="Recently Written" /> <meta property="og:description" content="Posts about Lisp, Unix, language learning and Esperanto." /> <meta property="og:url" content="https://recentlywritten.com/" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/25-noveloj.html b/site/25-noveloj.html index 09957c3..8ef5e01 100755 --- a/site/25-noveloj.html +++ b/site/25-noveloj.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="25 Noveloj" /> <meta property="og:url" content="https://recentlywritten.com/25-noveloj.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/3000-Vocab-Flashcards-3k-Final-Solution.html b/site/3000-Vocab-Flashcards-3k-Final-Solution.html index 3f2799d..f9f8184 100755 --- a/site/3000-Vocab-Flashcards-3k-Final-Solution.html +++ b/site/3000-Vocab-Flashcards-3k-Final-Solution.html @@ -10,7 +10,8 @@ Solution) — Recently Written</title> <meta property="og:title" content="3000 Vocab Flashcards (3k Final Solution)" /> <meta property="og:url" content="https://recentlywritten.com/3000-Vocab-Flashcards-3k-Final-Solution.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/A-new-way-to-release-code.html b/site/A-new-way-to-release-code.html index 68613a4..340f348 100755 --- a/site/A-new-way-to-release-code.html +++ b/site/A-new-way-to-release-code.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="A new way to release code" /> <meta property="og:url" content="https://recentlywritten.com/A-new-way-to-release-code.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/AJATT-All-Japanese-All-The-Time-Mirror-at-xm0co.html b/site/AJATT-All-Japanese-All-The-Time-Mirror-at-xm0co.html index 364c3e9..24e6dfa 100755 --- a/site/AJATT-All-Japanese-All-The-Time-Mirror-at-xm0co.html +++ b/site/AJATT-All-Japanese-All-The-Time-Mirror-at-xm0co.html @@ -10,7 +10,8 @@ xm0.co — Recently Written</title> <meta property="og:title" content="AJATT (All Japanese All The Time Mirror) at xm0.co" /> <meta property="og:url" content="https://recentlywritten.com/AJATT-All-Japanese-All-The-Time-Mirror-at-xm0co.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Add-my-RSS-feed-to-your-feed-reader.html b/site/Add-my-RSS-feed-to-your-feed-reader.html index b0b53cc..2917eaa 100755 --- a/site/Add-my-RSS-feed-to-your-feed-reader.html +++ b/site/Add-my-RSS-feed-to-your-feed-reader.html @@ -9,7 +9,8 @@ <meta property="og:title" content="Add my RSS feed to your feed reader" /> <meta property="og:url" content="https://recentlywritten.com/Add-my-RSS-feed-to-your-feed-reader.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Brazil.html b/site/Brazil.html index e453ee6..0f6122e 100755 --- a/site/Brazil.html +++ b/site/Brazil.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Brazil" /> <meta property="og:url" content="https://recentlywritten.com/Brazil.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/CSV.html b/site/CSV.html index c4a8078..8b8c467 100755 --- a/site/CSV.html +++ b/site/CSV.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="CSV" /> <meta property="og:url" content="https://recentlywritten.com/CSV.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Dont-Self-Host-Self-Locally.html b/site/Dont-Self-Host-Self-Locally.html index 1dc4ac2..7e4b77f 100755 --- a/site/Dont-Self-Host-Self-Locally.html +++ b/site/Dont-Self-Host-Self-Locally.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Don't Self-Host: Self-Locally" /> <meta property="og:url" content="https://recentlywritten.com/Dont-Self-Host-Self-Locally.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Dont-use-make-uninstall.html b/site/Dont-use-make-uninstall.html index dcc89b9..0f83cc0 100755 --- a/site/Dont-use-make-uninstall.html +++ b/site/Dont-use-make-uninstall.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Don't use make (un)install" /> <meta property="og:url" content="https://recentlywritten.com/Dont-use-make-uninstall.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Fish-Based-Navigation.html b/site/Fish-Based-Navigation.html index 4bc2868..024e7c1 100755 --- a/site/Fish-Based-Navigation.html +++ b/site/Fish-Based-Navigation.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Fish-Based Navigation" /> <meta property="og:url" content="https://recentlywritten.com/Fish-Based-Navigation.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Forthe.html b/site/Forthe.html index 95ad079..26e1f83 100755 --- a/site/Forthe.html +++ b/site/Forthe.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Forthe" /> <meta property="og:url" content="https://recentlywritten.com/Forthe.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Generate-your-OWN-internet-web-site-easily.html b/site/Generate-your-OWN-internet-web-site-easily.html index c6b3ca0..5ce3cdb 100755 --- a/site/Generate-your-OWN-internet-web-site-easily.html +++ b/site/Generate-your-OWN-internet-web-site-easily.html @@ -10,7 +10,8 @@ easily — Recently Written</title> <meta property="og:title" content="Generate your OWN internet web site easily" /> <meta property="og:url" content="https://recentlywritten.com/Generate-your-OWN-internet-web-site-easily.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Get-on-mailing-lists-like-it-is-1989.html b/site/Get-on-mailing-lists-like-it-is-1989.html index a357296..edaf382 100755 --- a/site/Get-on-mailing-lists-like-it-is-1989.html +++ b/site/Get-on-mailing-lists-like-it-is-1989.html @@ -9,7 +9,8 @@ <meta property="og:title" content="Get on mailing lists like it is 1989" /> <meta property="og:url" content="https://recentlywritten.com/Get-on-mailing-lists-like-it-is-1989.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Git-extra-worktrees-ROCK.html b/site/Git-extra-worktrees-ROCK.html index 3d177da..9300d5b 100755 --- a/site/Git-extra-worktrees-ROCK.html +++ b/site/Git-extra-worktrees-ROCK.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Git extra worktrees ROCK" /> <meta property="og:url" content="https://recentlywritten.com/Git-extra-worktrees-ROCK.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Hackermen-neomutt-config.html b/site/Hackermen-neomutt-config.html index 392b801..048d189 100755 --- a/site/Hackermen-neomutt-config.html +++ b/site/Hackermen-neomutt-config.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Hackermen neomutt config" /> <meta property="og:url" content="https://recentlywritten.com/Hackermen-neomutt-config.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Hey-kids-want-to-learn-the-unix-way.html b/site/Hey-kids-want-to-learn-the-unix-way.html index 07dda1b..ad3a9f1 100755 --- a/site/Hey-kids-want-to-learn-the-unix-way.html +++ b/site/Hey-kids-want-to-learn-the-unix-way.html @@ -9,7 +9,8 @@ <meta property="og:title" content="Hey kids, want to learn the unix way" /> <meta property="og:url" content="https://recentlywritten.com/Hey-kids-want-to-learn-the-unix-way.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/How-Japanese-Aquire-Books.html b/site/How-Japanese-Aquire-Books.html index 473a7bd..54feb59 100755 --- a/site/How-Japanese-Aquire-Books.html +++ b/site/How-Japanese-Aquire-Books.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="How Japanese Aquire Books" /> <meta property="og:url" content="https://recentlywritten.com/How-Japanese-Aquire-Books.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/How-to-Beat-Emacs-M-x-dunnet-in-5-minutes.html b/site/How-to-Beat-Emacs-M-x-dunnet-in-5-minutes.html index a1b87f2..26192af 100755 --- a/site/How-to-Beat-Emacs-M-x-dunnet-in-5-minutes.html +++ b/site/How-to-Beat-Emacs-M-x-dunnet-in-5-minutes.html @@ -10,7 +10,8 @@ minutes. — Recently Written</title> <meta property="og:title" content="How to Beat Emacs M-x dunnet in 5 minutes." /> <meta property="og:url" content="https://recentlywritten.com/How-to-Beat-Emacs-M-x-dunnet-in-5-minutes.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/How-to-Learn-a-Language-According-to-The-Internet.html b/site/How-to-Learn-a-Language-According-to-The-Internet.html index e6ce6e2..01372d3 100755 --- a/site/How-to-Learn-a-Language-According-to-The-Internet.html +++ b/site/How-to-Learn-a-Language-According-to-The-Internet.html @@ -10,7 +10,8 @@ Internet — Recently Written</title> <meta property="og:title" content="How to Learn a Language According to The Internet" /> <meta property="og:url" content="https://recentlywritten.com/How-to-Learn-a-Language-According-to-The-Internet.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/How-to-manage-100000-digital-books-in-15-languages.html b/site/How-to-manage-100000-digital-books-in-15-languages.html index b4ec704..18b21a1 100755 --- a/site/How-to-manage-100000-digital-books-in-15-languages.html +++ b/site/How-to-manage-100000-digital-books-in-15-languages.html @@ -10,7 +10,8 @@ languages — Recently Written</title> <meta property="og:title" content="How to manage 100,000 digital books in 15 languages" /> <meta property="og:url" content="https://recentlywritten.com/How-to-manage-100000-digital-books-in-15-languages.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/How-to-take-notes-not-self-help-advice.html b/site/How-to-take-notes-not-self-help-advice.html index 4be2172..44ca50a 100755 --- a/site/How-to-take-notes-not-self-help-advice.html +++ b/site/How-to-take-notes-not-self-help-advice.html @@ -10,7 +10,8 @@ advice — Recently Written</title> <meta property="og:title" content="How to take notes: not self-help advice" /> <meta property="og:url" content="https://recentlywritten.com/How-to-take-notes-not-self-help-advice.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Install-Anki.html b/site/Install-Anki.html index c2b6af1..8d56c57 100755 --- a/site/Install-Anki.html +++ b/site/Install-Anki.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Install Anki" /> <meta property="og:url" content="https://recentlywritten.com/Install-Anki.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Install-Nix-on-Gentoo.html b/site/Install-Nix-on-Gentoo.html index 21b3882..7ae45eb 100755 --- a/site/Install-Nix-on-Gentoo.html +++ b/site/Install-Nix-on-Gentoo.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Install Nix on Gentoo" /> <meta property="og:url" content="https://recentlywritten.com/Install-Nix-on-Gentoo.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Learn-Kanji-in-a-Fortnight.html b/site/Learn-Kanji-in-a-Fortnight.html index 6cc56f4..7869bf6 100755 --- a/site/Learn-Kanji-in-a-Fortnight.html +++ b/site/Learn-Kanji-in-a-Fortnight.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Learn Kanji in a Fortnight" /> <meta property="og:url" content="https://recentlywritten.com/Learn-Kanji-in-a-Fortnight.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Mailing-list-in-one-line.html b/site/Mailing-list-in-one-line.html index 148e0fd..b528381 100755 --- a/site/Mailing-list-in-one-line.html +++ b/site/Mailing-list-in-one-line.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content=""Mailing list" in one line" /> <meta property="og:url" content="https://recentlywritten.com/Mailing-list-in-one-line.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Minimal-nvim-config-optional-AI-slop-enjoy.html b/site/Minimal-nvim-config-optional-AI-slop-enjoy.html index eed6a63..1881d20 100755 --- a/site/Minimal-nvim-config-optional-AI-slop-enjoy.html +++ b/site/Minimal-nvim-config-optional-AI-slop-enjoy.html @@ -10,7 +10,8 @@ <meta property="og:title" content="Minimal nvim config optional AI slop (enjoy!)" /> <meta property="og:url" content="https://recentlywritten.com/Minimal-nvim-config-optional-AI-slop-enjoy.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/New-book-coming-soon-about-language-learning-for-multiple-languages-PREORDER-NOW.html b/site/New-book-coming-soon-about-language-learning-for-multiple-languages-PREORDER-NOW.html index 76f3f85..33abe48 100755 --- a/site/New-book-coming-soon-about-language-learning-for-multiple-languages-PREORDER-NOW.html +++ b/site/New-book-coming-soon-about-language-learning-for-multiple-languages-PREORDER-NOW.html @@ -10,7 +10,8 @@ languages)! PREORDER NOW! — Recently Written</title> <meta property="og:title" content="New book coming soon about language learning (for multiple languages)! PREORDER NOW!" /> <meta property="og:url" content="https://recentlywritten.com/New-book-coming-soon-about-language-learning-for-multiple-languages-PREORDER-NOW.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/New-podcast-about-polyglot-language-learning-LISTEN-NOW.html b/site/New-podcast-about-polyglot-language-learning-LISTEN-NOW.html index 79d8b53..74bea57 100755 --- a/site/New-podcast-about-polyglot-language-learning-LISTEN-NOW.html +++ b/site/New-podcast-about-polyglot-language-learning-LISTEN-NOW.html @@ -10,7 +10,8 @@ NOW!) — Recently Written</title> <meta property="og:title" content="New podcast about polyglot language learning (LISTEN NOW!)" /> <meta property="og:url" content="https://recentlywritten.com/New-podcast-about-polyglot-language-learning-LISTEN-NOW.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Newport.html b/site/Newport.html index 6235ab2..54a487c 100755 --- a/site/Newport.html +++ b/site/Newport.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Newport" /> <meta property="og:url" content="https://recentlywritten.com/Newport.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Nixtoo-Genux-released.html b/site/Nixtoo-Genux-released.html index 717853c..4aa3c1c 100755 --- a/site/Nixtoo-Genux-released.html +++ b/site/Nixtoo-Genux-released.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Nixtoo Genux™ released" /> <meta property="og:url" content="https://recentlywritten.com/Nixtoo-Genux-released.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/POSIX-pipes-for-Lisp.html b/site/POSIX-pipes-for-Lisp.html index b78534d..ab9b5d3 100755 --- a/site/POSIX-pipes-for-Lisp.html +++ b/site/POSIX-pipes-for-Lisp.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="POSIX pipes for Lisp" /> <meta property="og:url" content="https://recentlywritten.com/POSIX-pipes-for-Lisp.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Polyglot-Podcast-Now-Goes-on-The-YouTubecom-Website.html b/site/Polyglot-Podcast-Now-Goes-on-The-YouTubecom-Website.html index 738bf5d..3bcdd9e 100755 --- a/site/Polyglot-Podcast-Now-Goes-on-The-YouTubecom-Website.html +++ b/site/Polyglot-Podcast-Now-Goes-on-The-YouTubecom-Website.html @@ -10,7 +10,8 @@ Website — Recently Written</title> <meta property="og:title" content="Polyglot Podcast Now Goes on The YouTube.com Website" /> <meta property="og:url" content="https://recentlywritten.com/Polyglot-Podcast-Now-Goes-on-The-YouTubecom-Website.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Polyglot-Radio-is-Dead-Long-Live-The-Queue-Antennapod-shill-post.html b/site/Polyglot-Radio-is-Dead-Long-Live-The-Queue-Antennapod-shill-post.html index caafb4f..caf13d6 100755 --- a/site/Polyglot-Radio-is-Dead-Long-Live-The-Queue-Antennapod-shill-post.html +++ b/site/Polyglot-Radio-is-Dead-Long-Live-The-Queue-Antennapod-shill-post.html @@ -10,7 +10,8 @@ post) — Recently Written</title> <meta property="og:title" content="Polyglot Radio is Dead: Long Live The Queue (Antennapod shill post)" /> <meta property="og:url" content="https://recentlywritten.com/Polyglot-Radio-is-Dead-Long-Live-The-Queue-Antennapod-shill-post.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/REPL-Driven-Development-as-an-analogy-for-proper-AI-Driven-Development.html b/site/REPL-Driven-Development-as-an-analogy-for-proper-AI-Driven-Development.html index 9648d4f..b1f3b2c 100755 --- a/site/REPL-Driven-Development-as-an-analogy-for-proper-AI-Driven-Development.html +++ b/site/REPL-Driven-Development-as-an-analogy-for-proper-AI-Driven-Development.html @@ -10,7 +10,8 @@ Development — Recently Written</title> <meta property="og:title" content="REPL Driven Development as an analogy for proper AI Driven Development" /> <meta property="og:url" content="https://recentlywritten.com/REPL-Driven-Development-as-an-analogy-for-proper-AI-Driven-Development.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/SL--Dependency-Language.html b/site/SL--Dependency-Language.html index 64d0df4..b7d2e9e 100755 --- a/site/SL--Dependency-Language.html +++ b/site/SL--Dependency-Language.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="SL--Dependency Language" /> <meta property="og:url" content="https://recentlywritten.com/SL--Dependency-Language.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Start-emailing-your-patches-GUIDE.html b/site/Start-emailing-your-patches-GUIDE.html index 0fd3f7c..939f2d9 100755 --- a/site/Start-emailing-your-patches-GUIDE.html +++ b/site/Start-emailing-your-patches-GUIDE.html @@ -9,7 +9,8 @@ <meta property="og:title" content="Start emailing your patches GUIDE" /> <meta property="og:url" content="https://recentlywritten.com/Start-emailing-your-patches-GUIDE.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Toplevel-Macros-in-Alexandria-Code-Revival-Project.html b/site/Toplevel-Macros-in-Alexandria-Code-Revival-Project.html index 3a4b781..df7151c 100755 --- a/site/Toplevel-Macros-in-Alexandria-Code-Revival-Project.html +++ b/site/Toplevel-Macros-in-Alexandria-Code-Revival-Project.html @@ -10,7 +10,8 @@ Project — Recently Written</title> <meta property="og:title" content="Toplevel Macros in Alexandria: Code Revival Project" /> <meta property="og:url" content="https://recentlywritten.com/Toplevel-Macros-in-Alexandria-Code-Revival-Project.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Turn-an-android-into-247-portable-polyglot-radio.html b/site/Turn-an-android-into-247-portable-polyglot-radio.html index 103b7cd..550c5fc 100755 --- a/site/Turn-an-android-into-247-portable-polyglot-radio.html +++ b/site/Turn-an-android-into-247-portable-polyglot-radio.html @@ -10,7 +10,8 @@ radio — Recently Written</title> <meta property="og:title" content="Turn an android into 24/7 portable polyglot radio" /> <meta property="og:url" content="https://recentlywritten.com/Turn-an-android-into-247-portable-polyglot-radio.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Unanglo-your-literacy-materials-and-your-life.html b/site/Unanglo-your-literacy-materials-and-your-life.html index 6291c1c..5680c31 100755 --- a/site/Unanglo-your-literacy-materials-and-your-life.html +++ b/site/Unanglo-your-literacy-materials-and-your-life.html @@ -10,7 +10,8 @@ life) — Recently Written</title> <meta property="og:title" content="Unanglo your literacy materials (and your life)" /> <meta property="og:url" content="https://recentlywritten.com/Unanglo-your-literacy-materials-and-your-life.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Using-an-init-system-for-many-instances-of-simple-programs.html b/site/Using-an-init-system-for-many-instances-of-simple-programs.html index 42ca21c..6d3a82a 100755 --- a/site/Using-an-init-system-for-many-instances-of-simple-programs.html +++ b/site/Using-an-init-system-for-many-instances-of-simple-programs.html @@ -10,7 +10,8 @@ programs — Recently Written</title> <meta property="og:title" content="Using an init system for many instances of simple programs" /> <meta property="og:url" content="https://recentlywritten.com/Using-an-init-system-for-many-instances-of-simple-programs.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/Why-YOU-need-NixOS-on-your-desktop-and-servers.html b/site/Why-YOU-need-NixOS-on-your-desktop-and-servers.html index 24bbd6b..8e431ac 100755 --- a/site/Why-YOU-need-NixOS-on-your-desktop-and-servers.html +++ b/site/Why-YOU-need-NixOS-on-your-desktop-and-servers.html @@ -10,7 +10,8 @@ servers — Recently Written</title> <meta property="og:title" content="Why YOU need NixOS on your desktop and servers" /> <meta property="og:url" content="https://recentlywritten.com/Why-YOU-need-NixOS-on-your-desktop-and-servers.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/WhyHow-to-host-a-bunch-of-crap-locally.html b/site/WhyHow-to-host-a-bunch-of-crap-locally.html index b894bdd..87bb90e 100755 --- a/site/WhyHow-to-host-a-bunch-of-crap-locally.html +++ b/site/WhyHow-to-host-a-bunch-of-crap-locally.html @@ -10,7 +10,8 @@ locally — Recently Written</title> <meta property="og:title" content="Why/How to host a bunch of crap locally" /> <meta property="og:url" content="https://recentlywritten.com/WhyHow-to-host-a-bunch-of-crap-locally.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/about.html b/site/about.html index 6195709..307ccee 100644 --- a/site/about.html +++ b/site/about.html @@ -1,316 +1,317 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <title>About — Recently Written</title> - <meta property="og:type" content="article" /> - <meta property="og:site_name" content="Recently Written" /> - <meta property="og:title" content="About" /> - <meta property="og:url" content="https://recentlywritten.com/about.html" /> - <meta name="twitter:card" content="summary" /> - <link rel="stylesheet" href="style.css" /> - <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> -</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> - <a href="about.html">about</a> - <a href="lair.html">code</a> - <a href="git/index.html">git</a> - <a href="youtube.html">youtube</a> - <a href="esperanto.html">esperanto</a> - <a href="call.html">contact</a> - <a href="rss.xml">rss</a> - </nav> - </div> - - <h1 class="post-title">About</h1> - - <p>Spenser Truex. Free tarballs.</p> - <p>Tools for language learners, e-ink readers and Android, small Unix - programs, and Common Lisp. Support the work at <a - href="https://ko-fi.com/truex">ko-fi.com/truex</a>.</p> - <h2 id="sites">Sites</h2> - <ul> - <li><a href="https://subread.space">subread.space</a> - Line up an - audiobook with its ebook. Get read-along subtitles, EPUB 3 read-along - books, and subtitled video. Free in the browser.</li> - <li><a href="https://honjimaku.com">honjimaku.com</a> - A library of - Japanese subtitles for audiobooks, and Subrep live captions by share - link.</li> - <li><a href="https://sbm.subread.space">sbm.subread.space</a> - sbm - Sync: one plain bookmark file, the same on every device. Free, - AGPL.</li> - <li><a href="https://hentaibun.online">hentaibun.online</a> - Reading - lists and tools to learn kanbun and kobun.</li> - <li><a href="https://recentlywritten.com">recentlywritten.com</a> - - Writing on Unix, Lisp, Nix, Esperanto, and language learning. (<a - href="https://equwal.com">equwal.com</a> goes here.)</li> - <li><a href="https://ko-fi.com/truex">ko-fi.com/truex</a> - - Support.</li> - </ul> - <h2 id="subread">SubRead</h2> - <p>Read along with audiobooks, and mine the words.</p> - <ul> - <li><a - href="https://github.com/equwal/subread.space">subread.space</a> - - Read an <code>.srt</code> one line at a time with the space bar. Works - with Yomitan, furigana, and pitch accent markup.</li> - <li><a href="https://github.com/equwal/subplz-web">subplz-web</a> - - The aligner behind subread.space. The subtitle text comes from your - book, not from a transcript.</li> - <li><a - href="https://github.com/equwal/subread-android">subread-android</a> - - SubRead on Android. Times an audiobook against its ebook on the - device.</li> - <li><a - href="https://github.com/equwal/subread-extension">subread-extension</a> - - Show your own <code>.srt</code> over a YouTube video, in time. - Chrome and Firefox.</li> - <li><a - href="https://github.com/equwal/subread-overlay">subread-overlay</a> - - Show <code>.srt</code> lines over any Android media player. Tap a word - to look it up.</li> - <li><a - href="https://github.com/equwal/subread-dictionary">subread-dictionary</a> - - Pop-up dictionary for Android. Reads Yomitan dictionaries, with - local audio.</li> - <li><a - href="https://github.com/equwal/subread.koplugin">subread.koplugin</a> - - KOReader plugin. The book follows the narration, from an - <code>.srt</code> made by subread.space.</li> - <li><a - href="https://github.com/equwal/subrep-android">subrep-android</a> - - Live captions of the phone’s sound, made on the phone by Whisper, - shared by link.</li> - <li><a - href="https://github.com/equwal/desktop-subtitle-replay">desktop-subtitle-replay</a> - - Live subtitles for anything on your screen. Replay a sentence and - mine it into Anki.</li> - <li><a href="https://github.com/equwal/honjimaku">honjimaku</a> - The - honjimaku.com server. Fork of <a - href="https://github.com/Rapptz/jimaku">jimaku</a>.</li> - <li><a href="https://github.com/equwal/kikiyomi">kikiyomi</a> - - Audiobook player for Japanese learners, in the browser. Fork of <a - href="https://github.com/rtr46/kikiyomi">kikiyomi</a>.</li> - <li><a - href="https://github.com/equwal/Hoshi-Reader-Android">Hoshi-Reader-Android</a> - - Fork with a <code>subread</code> branch: audiobook read-along in the - Hoshi Reader EPUB reader.</li> - <li><a href="https://github.com/equwal/chimahon">chimahon</a> - Fork - with a <code>readalong</code> branch for the Mihon immersion - reader.</li> - <li><a href="https://github.com/equwal/dickt.store">dickt.store</a> - - Bring-your-own-key Yomitan dictionary converter.</li> - <li><a - href="https://github.com/equwal/vibeslop-dickt">vibeslop-dickt</a> - - Make your own Yomitan dictionary in a few minutes.</li> - </ul> - <h2 id="rebind-suite">Rebind suite</h2> - <p>Hardware buttons for e-ink readers and Android 12+.</p> - <ul> - <li><a href="https://github.com/equwal/rebind">rebind</a> - Remap - volume keys, Power, page-turn buttons, and the Viwoods AI key. Tap, - double tap, hold, and combinations. Free beta APK.</li> - <li><a href="https://github.com/equwal/assistkey">assistkey</a> - Key - remapper for the Viwoods AiPaper Reader: AI key, volume keys, and - Power.</li> - <li><a - href="https://github.com/equwal/awesome-rebind">awesome-rebind</a> - - Extensions and companion apps for Rebind.</li> - <li><a href="https://github.com/equwal/ink-recents">ink-recents</a> - - Recent-apps switcher for e-ink. No animation. Swipe up to close.</li> - <li><a href="https://github.com/equwal/ink-dim">ink-dim</a> - Set the - Viwoods frontlight below the lowest system level.</li> - <li><a href="https://github.com/equwal/ink-update">ink-update</a> - - Tells you when Rebind, Ink Recents, or Ink Dim has a new version.</li> - </ul> - <h2 id="sbm">sbm</h2> - <p>Fuzzy search thousands of bookmarks, on every device.</p> - <ul> - <li><a href="https://github.com/equwal/sbm">sbm</a> - dmenu bookmarks. - Search and plumb them.</li> - <li><a href="https://github.com/equwal/sbm-android">sbm-android</a> - - sbm on Android. Share to add.</li> - <li><a - href="https://github.com/equwal/sbm-extension">sbm-extension</a> - sbm - for Firefox and Chrome.</li> - <li><a href="https://github.com/equwal/sbm-sync">sbm-sync</a> - Sync - server. One small Go program, plain files, AGPL.</li> - <li><a href="https://github.com/equwal/sbm-suckless">sbm-suckless</a> - - sbm before the rewrite. Suckless style.</li> - </ul> - <h2 id="tools-for-ai-agents">Tools for AI agents</h2> - <ul> - <li><a href="https://github.com/equwal/ideamine">ideamine</a> - Idea - inbox for Claude Code. <code>/idea</code> saves ideas at zero - tokens.</li> - <li><a - href="https://github.com/equwal/deploy-handoff">deploy-handoff</a> - - The agent drives the browser to the last deploy, billing, or pull - request step. You make the final click.</li> - <li><a href="https://github.com/equwal/memstate">memstate</a> - - Versioned memory for AI agents in one SQLite file. Fork; contributor - to <a - href="https://github.com/map588/memstate">map588/memstate</a>.</li> - <li><a - href="https://github.com/HACKERMEN-ORG/aintitinit">aintitinit</a> - - Claude initializer.</li> - <li><a - href="https://github.com/HACKERMEN-ORG/hackermen-neovim-config-file">hackermen-neovim-config-file</a> - - Minimal Neovim config with optional AI.</li> - </ul> - <h2 id="unix-and-suckless">Unix and suckless</h2> - <ul> - <li><a href="https://github.com/equwal/tmpl">tmpl</a> - Insanely - simple templates.</li> - <li><a - href="https://github.com/equwal/dmenu-scripts">dmenu-scripts</a> - Ask - for things with dmenu.</li> - <li><a href="https://github.com/equwal/dsad">dsad</a> - dmenu - interface for sad, the simple audio daemon.</li> - <li><a href="https://github.com/equwal/dpatchmail">dpatchmail</a> - - Patch programs from mail with dmenu.</li> - <li><a href="https://github.com/equwal/prompt-mail">prompt-mail</a> - - Mail questions and mail files with dmenu.</li> - <li><a href="https://github.com/equwal/dmodurl">dmodurl</a> - Change - URLs with dmenu.</li> - <li><a href="https://github.com/equwal/tnot">tnot</a> - Like tmux, but - not.</li> - <li><a - href="https://github.com/equwal/tiny-runlevels">tiny-runlevels</a> - - Use an init system for many instances of simple programs.</li> - <li><a - href="https://github.com/equwal/ii-lchat-metapackage">ii-lchat-metapackage</a> - - Get suckless IRC working.</li> - <li><a href="https://github.com/equwal/pass-simple">pass-simple</a> - - Minimal pass rewrite, with bug fixes.</li> - <li><a href="https://github.com/equwal/sacc-ebuild">sacc-ebuild</a> - - Gentoo ebuild for the sacc gopher client.</li> - <li><a href="https://github.com/equwal/nixtoo-genux">nixtoo-genux</a> - - Declarative Nix package manager setup.</li> - <li><a - href="https://github.com/equwal/xinput-persistence">xinput-persistence</a> - - xinput settings that survive reconnect and boot.</li> - <li><a - href="https://github.com/equwal/encrypted-home-backups">encrypted-home-backups</a> - - Automatic home backups to an encrypted partition.</li> - <li><a href="https://github.com/equwal/alt-hack0">alt-hack0</a> and <a - href="https://github.com/equwal/alt-hack">alt-hack</a> - The Hack font - with a normal zero, made by script.</li> - <li><a - href="https://github.com/equwal/minimak-tty-xkb">minimak-tty-xkb</a> - - Minimak keyboard layout for the TTY and XKB.</li> - </ul> - <h2 id="common-lisp-and-emacs">Common Lisp and Emacs</h2> - <ul> - <li><a - href="https://github.com/font-lock-cl/font-lock-cl">font-lock-cl</a> - - Better Common Lisp syntax highlighting for Emacs. On MELPA.</li> - <li><a href="https://github.com/equwal/coleslaw">coleslaw</a> - Emacs - mode for the Coleslaw static site generator. Also <a - href="https://github.com/equwal/coleslaw-snippets">coleslaw-snippets</a>.</li> - <li><a href="https://github.com/equwal/Forthe">Forthe</a> - Forth-like - DSL.</li> - <li><a href="https://github.com/equwal/sl">sl</a> and <a - href="https://github.com/equwal/defsl">defsl</a> - Dependency language - for Common Lisp.</li> - <li><a href="https://github.com/equwal/sigil">sigil</a> - - Documentation preprocessor for Common Lisp.</li> - <li><a href="https://github.com/equwal/posix-pipes">posix-pipes</a> - - Portable pipes from CLOCC.</li> - <li><a href="https://github.com/equwal/tag-gen">tag-gen</a> - Make - tags for each directory.</li> - <li><a href="https://github.com/equwal/cores">cores</a> and <a - href="https://github.com/equwal/clapt">clapt</a> - Save SBCL cores - with libraries loaded.</li> - <li><a - href="https://github.com/equwal/asdf-registration">asdf-registration</a> - - Register ASDF projects.</li> - <li><a href="https://github.com/equwal/CSV">CSV</a> - Read CSV into - Lisp lists.</li> - <li><a href="https://github.com/equwal/gendocs">gendocs</a> - Simple - document generation.</li> - <li><a href="https://github.com/equwal/len-cmp">len-cmp</a> - Fast - list length comparison.</li> - <li><a href="https://github.com/equwal/LispBrain">LispBrain</a> - - Brainfuck debugger on the Common Lisp debugger.</li> - <li><a - href="https://github.com/equwal/lisp-multithreaded-internet">lisp-multithreaded-internet</a> - - Multithreaded internet for Common Lisp.</li> - <li><a href="https://github.com/equwal/esperanto">esperanto</a> - - Compress natural language in Esperanto.</li> - <li><a href="https://github.com/equwal/librivox">librivox</a> - - Automatic YouTube upload of audiobooks.</li> - <li><a href="https://github.com/equwal/cl-yag">cl-yag</a> and <a - href="https://github.com/equwal/clic">clic</a> - Mirrors of Bitreich - Common Lisp projects.</li> - <li>Spacemacs layers: <a - href="https://github.com/equwal/timeclock">timeclock</a>, <a - href="https://github.com/equwal/rectangle">rectangle</a>, <a - href="https://github.com/equwal/ediff-spacemacs">ediff-spacemacs</a>, - <a href="https://github.com/equwal/slurp">slurp</a>, <a - href="https://github.com/equwal/quickurl">quickurl</a>, <a - href="https://github.com/equwal/common-lisp-sly">common-lisp-sly</a>.</li> - </ul> - <h2 id="upstream-contributions">Upstream contributions</h2> - <ul> - <li><a href="https://suckless.org">suckless</a> - <a - href="https://git.suckless.org/slstatus">slstatus</a>: “Not charging” - battery status. <a href="https://git.suckless.org/scroll">scroll</a>: - typo fix. Patches to dwm, dmenu, quark, and sacc on the mailing - lists.</li> - <li><a href="https://git.2f30.org/sad/">sad</a> (2f30) - - <code>status volume</code> protocol, pause toggle, volume bug fix, - simpler config macros.</li> - <li><a href="https://github.com/joaotavora/sly">SLY</a> - REPL and - debugger fixes, xref docs.</li> - <li><a href="https://github.com/syl20bnr/spacemacs">Spacemacs</a> - - Layers and bindings, cleanup of deprecated <code>cl</code> and - <code>use-package</code> code.</li> - <li><a href="https://github.com/coleslaw-org/coleslaw">Coleslaw</a> - - URL generation, post extensions, versioning plugin, docs.</li> - <li><a href="https://github.com/sharplispers/clx">CLX</a> - Composite - extension docs and exports.</li> - <li><a href="https://github.com/xach/quickproject">quickproject</a> - - Restarts for existing target files.</li> - <li><a href="https://github.com/abo-abo/swiper">ivy/swiper</a>, <a - href="https://github.com/emacs-w3m/emacs-w3m">emacs-w3m</a>, <a - href="https://github.com/Malabarba/Nameless">Nameless</a>, <a - href="https://github.com/vlime/vlime">vlime</a>, <a - href="https://github.com/froggey/Mezzano">Mezzano</a>, <a - href="https://github.com/usocket/usocket">usocket</a>, <a - href="https://github.com/s-expressionists/Trucler">Trucler</a>, <a - href="https://github.com/Sharp-CLOCC/Newport">Newport</a>.</li> - <li><code>make uninstall</code> targets: <a - href="https://github.com/adsr/mle">mle</a>, <a - href="https://github.com/termbox/termbox">termbox</a>, <a - href="https://github.com/raygard/wak">wak</a>, <a - href="https://github.com/muquit/grabc">grabc</a>, <a - href="https://github.com/younix/sj">sj</a>, <a - href="https://github.com/nosarthur/gita">gita</a>, <a - href="https://github.com/AltraMayor/f3">f3</a>, <a - href="https://github.com/PorQ-Pine/lisgd">lisgd</a>, <a - href="https://github.com/pgdr/moreutils">moreutils</a>, <a - href="https://github.com/eshrh/ames">ames</a>.</li> - <li><a href="https://github.com/LukeSmithxyz/voidrice">voidrice</a>, - <a - href="https://github.com/ggreer/the_silver_searcher">the_silver_searcher</a>, - <a href="https://github.com/PatrickF1/github.fish">github.fish</a>, <a - href="https://github.com/prabirshrestha/asyncomplete.vim">asyncomplete.vim</a>, - <a href="https://github.com/tunamayo04/Akusento">Akusento</a>.</li> - </ul> - - <div id="footer"> - <a href="index.html">← Home</a> · - <a href="https://github.com/equwal">Github</a> - </div> - -</div> -</body> -</html> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <title>About — Recently Written</title> + <meta property="og:type" content="article" /> + <meta property="og:site_name" content="Recently Written" /> + <meta property="og:title" content="About" /> + <meta property="og:url" content="https://recentlywritten.com/about.html" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> + <link rel="stylesheet" href="style.css" /> + <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> +</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> + <a href="about.html">about</a> + <a href="lair.html">code</a> + <a href="git/index.html">git</a> + <a href="youtube.html">youtube</a> + <a href="esperanto.html">esperanto</a> + <a href="call.html">contact</a> + <a href="rss.xml">rss</a> + </nav> + </div> + + <h1 class="post-title">About</h1> + + <p>Spenser Truex. Free tarballs.</p> + <p>Tools for language learners, e-ink readers and Android, small Unix + programs, and Common Lisp. Support the work at <a + href="https://ko-fi.com/truex">ko-fi.com/truex</a>.</p> + <h2 id="sites">Sites</h2> + <ul> + <li><a href="https://subread.space">subread.space</a> - Line up an + audiobook with its ebook. Get read-along subtitles, EPUB 3 read-along + books, and subtitled video. Free in the browser.</li> + <li><a href="https://honjimaku.com">honjimaku.com</a> - A library of + Japanese subtitles for audiobooks, and Subrep live captions by share + link.</li> + <li><a href="https://sbm.subread.space">sbm.subread.space</a> - sbm + Sync: one plain bookmark file, the same on every device. Free, + AGPL.</li> + <li><a href="https://hentaibun.online">hentaibun.online</a> - Reading + lists and tools to learn kanbun and kobun.</li> + <li><a href="https://recentlywritten.com">recentlywritten.com</a> - + Writing on Unix, Lisp, Nix, Esperanto, and language learning. (<a + href="https://equwal.com">equwal.com</a> goes here.)</li> + <li><a href="https://ko-fi.com/truex">ko-fi.com/truex</a> - + Support.</li> + </ul> + <h2 id="subread">SubRead</h2> + <p>Read along with audiobooks, and mine the words.</p> + <ul> + <li><a + href="https://github.com/equwal/subread.space">subread.space</a> - + Read an <code>.srt</code> one line at a time with the space bar. Works + with Yomitan, furigana, and pitch accent markup.</li> + <li><a href="https://github.com/equwal/subplz-web">subplz-web</a> - + The aligner behind subread.space. The subtitle text comes from your + book, not from a transcript.</li> + <li><a + href="https://github.com/equwal/subread-android">subread-android</a> - + SubRead on Android. Times an audiobook against its ebook on the + device.</li> + <li><a + href="https://github.com/equwal/subread-extension">subread-extension</a> + - Show your own <code>.srt</code> over a YouTube video, in time. + Chrome and Firefox.</li> + <li><a + href="https://github.com/equwal/subread-overlay">subread-overlay</a> - + Show <code>.srt</code> lines over any Android media player. Tap a word + to look it up.</li> + <li><a + href="https://github.com/equwal/subread-dictionary">subread-dictionary</a> + - Pop-up dictionary for Android. Reads Yomitan dictionaries, with + local audio.</li> + <li><a + href="https://github.com/equwal/subread.koplugin">subread.koplugin</a> + - KOReader plugin. The book follows the narration, from an + <code>.srt</code> made by subread.space.</li> + <li><a + href="https://github.com/equwal/subrep-android">subrep-android</a> - + Live captions of the phone’s sound, made on the phone by Whisper, + shared by link.</li> + <li><a + href="https://github.com/equwal/desktop-subtitle-replay">desktop-subtitle-replay</a> + - Live subtitles for anything on your screen. Replay a sentence and + mine it into Anki.</li> + <li><a href="https://github.com/equwal/honjimaku">honjimaku</a> - The + honjimaku.com server. Fork of <a + href="https://github.com/Rapptz/jimaku">jimaku</a>.</li> + <li><a href="https://github.com/equwal/kikiyomi">kikiyomi</a> - + Audiobook player for Japanese learners, in the browser. Fork of <a + href="https://github.com/rtr46/kikiyomi">kikiyomi</a>.</li> + <li><a + href="https://github.com/equwal/Hoshi-Reader-Android">Hoshi-Reader-Android</a> + - Fork with a <code>subread</code> branch: audiobook read-along in the + Hoshi Reader EPUB reader.</li> + <li><a href="https://github.com/equwal/chimahon">chimahon</a> - Fork + with a <code>readalong</code> branch for the Mihon immersion + reader.</li> + <li><a href="https://github.com/equwal/dickt.store">dickt.store</a> - + Bring-your-own-key Yomitan dictionary converter.</li> + <li><a + href="https://github.com/equwal/vibeslop-dickt">vibeslop-dickt</a> - + Make your own Yomitan dictionary in a few minutes.</li> + </ul> + <h2 id="rebind-suite">Rebind suite</h2> + <p>Hardware buttons for e-ink readers and Android 12+.</p> + <ul> + <li><a href="https://github.com/equwal/rebind">rebind</a> - Remap + volume keys, Power, page-turn buttons, and the Viwoods AI key. Tap, + double tap, hold, and combinations. Free beta APK.</li> + <li><a href="https://github.com/equwal/assistkey">assistkey</a> - Key + remapper for the Viwoods AiPaper Reader: AI key, volume keys, and + Power.</li> + <li><a + href="https://github.com/equwal/awesome-rebind">awesome-rebind</a> - + Extensions and companion apps for Rebind.</li> + <li><a href="https://github.com/equwal/ink-recents">ink-recents</a> - + Recent-apps switcher for e-ink. No animation. Swipe up to close.</li> + <li><a href="https://github.com/equwal/ink-dim">ink-dim</a> - Set the + Viwoods frontlight below the lowest system level.</li> + <li><a href="https://github.com/equwal/ink-update">ink-update</a> - + Tells you when Rebind, Ink Recents, or Ink Dim has a new version.</li> + </ul> + <h2 id="sbm">sbm</h2> + <p>Fuzzy search thousands of bookmarks, on every device.</p> + <ul> + <li><a href="https://github.com/equwal/sbm">sbm</a> - dmenu bookmarks. + Search and plumb them.</li> + <li><a href="https://github.com/equwal/sbm-android">sbm-android</a> - + sbm on Android. Share to add.</li> + <li><a + href="https://github.com/equwal/sbm-extension">sbm-extension</a> - sbm + for Firefox and Chrome.</li> + <li><a href="https://github.com/equwal/sbm-sync">sbm-sync</a> - Sync + server. One small Go program, plain files, AGPL.</li> + <li><a href="https://github.com/equwal/sbm-suckless">sbm-suckless</a> + - sbm before the rewrite. Suckless style.</li> + </ul> + <h2 id="tools-for-ai-agents">Tools for AI agents</h2> + <ul> + <li><a href="https://github.com/equwal/ideamine">ideamine</a> - Idea + inbox for Claude Code. <code>/idea</code> saves ideas at zero + tokens.</li> + <li><a + href="https://github.com/equwal/deploy-handoff">deploy-handoff</a> - + The agent drives the browser to the last deploy, billing, or pull + request step. You make the final click.</li> + <li><a href="https://github.com/equwal/memstate">memstate</a> - + Versioned memory for AI agents in one SQLite file. Fork; contributor + to <a + href="https://github.com/map588/memstate">map588/memstate</a>.</li> + <li><a + href="https://github.com/HACKERMEN-ORG/aintitinit">aintitinit</a> - + Claude initializer.</li> + <li><a + href="https://github.com/HACKERMEN-ORG/hackermen-neovim-config-file">hackermen-neovim-config-file</a> + - Minimal Neovim config with optional AI.</li> + </ul> + <h2 id="unix-and-suckless">Unix and suckless</h2> + <ul> + <li><a href="https://github.com/equwal/tmpl">tmpl</a> - Insanely + simple templates.</li> + <li><a + href="https://github.com/equwal/dmenu-scripts">dmenu-scripts</a> - Ask + for things with dmenu.</li> + <li><a href="https://github.com/equwal/dsad">dsad</a> - dmenu + interface for sad, the simple audio daemon.</li> + <li><a href="https://github.com/equwal/dpatchmail">dpatchmail</a> - + Patch programs from mail with dmenu.</li> + <li><a href="https://github.com/equwal/prompt-mail">prompt-mail</a> - + Mail questions and mail files with dmenu.</li> + <li><a href="https://github.com/equwal/dmodurl">dmodurl</a> - Change + URLs with dmenu.</li> + <li><a href="https://github.com/equwal/tnot">tnot</a> - Like tmux, but + not.</li> + <li><a + href="https://github.com/equwal/tiny-runlevels">tiny-runlevels</a> - + Use an init system for many instances of simple programs.</li> + <li><a + href="https://github.com/equwal/ii-lchat-metapackage">ii-lchat-metapackage</a> + - Get suckless IRC working.</li> + <li><a href="https://github.com/equwal/pass-simple">pass-simple</a> - + Minimal pass rewrite, with bug fixes.</li> + <li><a href="https://github.com/equwal/sacc-ebuild">sacc-ebuild</a> - + Gentoo ebuild for the sacc gopher client.</li> + <li><a href="https://github.com/equwal/nixtoo-genux">nixtoo-genux</a> + - Declarative Nix package manager setup.</li> + <li><a + href="https://github.com/equwal/xinput-persistence">xinput-persistence</a> + - xinput settings that survive reconnect and boot.</li> + <li><a + href="https://github.com/equwal/encrypted-home-backups">encrypted-home-backups</a> + - Automatic home backups to an encrypted partition.</li> + <li><a href="https://github.com/equwal/alt-hack0">alt-hack0</a> and <a + href="https://github.com/equwal/alt-hack">alt-hack</a> - The Hack font + with a normal zero, made by script.</li> + <li><a + href="https://github.com/equwal/minimak-tty-xkb">minimak-tty-xkb</a> - + Minimak keyboard layout for the TTY and XKB.</li> + </ul> + <h2 id="common-lisp-and-emacs">Common Lisp and Emacs</h2> + <ul> + <li><a + href="https://github.com/font-lock-cl/font-lock-cl">font-lock-cl</a> - + Better Common Lisp syntax highlighting for Emacs. On MELPA.</li> + <li><a href="https://github.com/equwal/coleslaw">coleslaw</a> - Emacs + mode for the Coleslaw static site generator. Also <a + href="https://github.com/equwal/coleslaw-snippets">coleslaw-snippets</a>.</li> + <li><a href="https://github.com/equwal/Forthe">Forthe</a> - Forth-like + DSL.</li> + <li><a href="https://github.com/equwal/sl">sl</a> and <a + href="https://github.com/equwal/defsl">defsl</a> - Dependency language + for Common Lisp.</li> + <li><a href="https://github.com/equwal/sigil">sigil</a> - + Documentation preprocessor for Common Lisp.</li> + <li><a href="https://github.com/equwal/posix-pipes">posix-pipes</a> - + Portable pipes from CLOCC.</li> + <li><a href="https://github.com/equwal/tag-gen">tag-gen</a> - Make + tags for each directory.</li> + <li><a href="https://github.com/equwal/cores">cores</a> and <a + href="https://github.com/equwal/clapt">clapt</a> - Save SBCL cores + with libraries loaded.</li> + <li><a + href="https://github.com/equwal/asdf-registration">asdf-registration</a> + - Register ASDF projects.</li> + <li><a href="https://github.com/equwal/CSV">CSV</a> - Read CSV into + Lisp lists.</li> + <li><a href="https://github.com/equwal/gendocs">gendocs</a> - Simple + document generation.</li> + <li><a href="https://github.com/equwal/len-cmp">len-cmp</a> - Fast + list length comparison.</li> + <li><a href="https://github.com/equwal/LispBrain">LispBrain</a> - + Brainfuck debugger on the Common Lisp debugger.</li> + <li><a + href="https://github.com/equwal/lisp-multithreaded-internet">lisp-multithreaded-internet</a> + - Multithreaded internet for Common Lisp.</li> + <li><a href="https://github.com/equwal/esperanto">esperanto</a> - + Compress natural language in Esperanto.</li> + <li><a href="https://github.com/equwal/librivox">librivox</a> - + Automatic YouTube upload of audiobooks.</li> + <li><a href="https://github.com/equwal/cl-yag">cl-yag</a> and <a + href="https://github.com/equwal/clic">clic</a> - Mirrors of Bitreich + Common Lisp projects.</li> + <li>Spacemacs layers: <a + href="https://github.com/equwal/timeclock">timeclock</a>, <a + href="https://github.com/equwal/rectangle">rectangle</a>, <a + href="https://github.com/equwal/ediff-spacemacs">ediff-spacemacs</a>, + <a href="https://github.com/equwal/slurp">slurp</a>, <a + href="https://github.com/equwal/quickurl">quickurl</a>, <a + href="https://github.com/equwal/common-lisp-sly">common-lisp-sly</a>.</li> + </ul> + <h2 id="upstream-contributions">Upstream contributions</h2> + <ul> + <li><a href="https://suckless.org">suckless</a> - <a + href="https://git.suckless.org/slstatus">slstatus</a>: “Not charging” + battery status. <a href="https://git.suckless.org/scroll">scroll</a>: + typo fix. Patches to dwm, dmenu, quark, and sacc on the mailing + lists.</li> + <li><a href="https://git.2f30.org/sad/">sad</a> (2f30) - + <code>status volume</code> protocol, pause toggle, volume bug fix, + simpler config macros.</li> + <li><a href="https://github.com/joaotavora/sly">SLY</a> - REPL and + debugger fixes, xref docs.</li> + <li><a href="https://github.com/syl20bnr/spacemacs">Spacemacs</a> - + Layers and bindings, cleanup of deprecated <code>cl</code> and + <code>use-package</code> code.</li> + <li><a href="https://github.com/coleslaw-org/coleslaw">Coleslaw</a> - + URL generation, post extensions, versioning plugin, docs.</li> + <li><a href="https://github.com/sharplispers/clx">CLX</a> - Composite + extension docs and exports.</li> + <li><a href="https://github.com/xach/quickproject">quickproject</a> - + Restarts for existing target files.</li> + <li><a href="https://github.com/abo-abo/swiper">ivy/swiper</a>, <a + href="https://github.com/emacs-w3m/emacs-w3m">emacs-w3m</a>, <a + href="https://github.com/Malabarba/Nameless">Nameless</a>, <a + href="https://github.com/vlime/vlime">vlime</a>, <a + href="https://github.com/froggey/Mezzano">Mezzano</a>, <a + href="https://github.com/usocket/usocket">usocket</a>, <a + href="https://github.com/s-expressionists/Trucler">Trucler</a>, <a + href="https://github.com/Sharp-CLOCC/Newport">Newport</a>.</li> + <li><code>make uninstall</code> targets: <a + href="https://github.com/adsr/mle">mle</a>, <a + href="https://github.com/termbox/termbox">termbox</a>, <a + href="https://github.com/raygard/wak">wak</a>, <a + href="https://github.com/muquit/grabc">grabc</a>, <a + href="https://github.com/younix/sj">sj</a>, <a + href="https://github.com/nosarthur/gita">gita</a>, <a + href="https://github.com/AltraMayor/f3">f3</a>, <a + href="https://github.com/PorQ-Pine/lisgd">lisgd</a>, <a + href="https://github.com/pgdr/moreutils">moreutils</a>, <a + href="https://github.com/eshrh/ames">ames</a>.</li> + <li><a href="https://github.com/LukeSmithxyz/voidrice">voidrice</a>, + <a + href="https://github.com/ggreer/the_silver_searcher">the_silver_searcher</a>, + <a href="https://github.com/PatrickF1/github.fish">github.fish</a>, <a + href="https://github.com/prabirshrestha/asyncomplete.vim">asyncomplete.vim</a>, + <a href="https://github.com/tunamayo04/Akusento">Akusento</a>.</li> + </ul> + + <div id="footer"> + <a href="index.html">← Home</a> · + <a href="https://github.com/equwal">Github</a> + </div> + +</div> +</body> +</html> diff --git a/site/aintitinit-Claude-INITIALIZER.html b/site/aintitinit-Claude-INITIALIZER.html index 2d7162e..69eee15 100755 --- a/site/aintitinit-Claude-INITIALIZER.html +++ b/site/aintitinit-Claude-INITIALIZER.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="aintitinit: Claude INITIALIZER" /> <meta property="og:url" content="https://recentlywritten.com/aintitinit-Claude-INITIALIZER.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/alt-hacks-zips.html b/site/alt-hacks-zips.html index 545ae39..3b05902 100755 --- a/site/alt-hacks-zips.html +++ b/site/alt-hacks-zips.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="alt-hack free tarballs" /> <meta property="og:url" content="https://recentlywritten.com/alt-hacks-zips.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/alt-hacks.html b/site/alt-hacks.html index 9569499..9b423fc 100755 --- a/site/alt-hacks.html +++ b/site/alt-hacks.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="alt-hack free tarballs" /> <meta property="og:url" content="https://recentlywritten.com/alt-hacks.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/biblio.html b/site/biblio.html index 8a0d69b..84025d1 100755 --- a/site/biblio.html +++ b/site/biblio.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="la sankta biblio" /> <meta property="og:url" content="https://recentlywritten.com/biblio.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/books.html b/site/books.html index 5b14a40..86c14cf 100755 --- a/site/books.html +++ b/site/books.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="books" /> <meta property="og:url" content="https://recentlywritten.com/books.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/budhismaj-rakontoj.html b/site/budhismaj-rakontoj.html index 6268a95..2784a83 100755 --- a/site/budhismaj-rakontoj.html +++ b/site/budhismaj-rakontoj.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="budhismaj rakontoj" /> <meta property="og:url" content="https://recentlywritten.com/budhismaj-rakontoj.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/call.html b/site/call.html index 66d3018..94ab897 100755 --- a/site/call.html +++ b/site/call.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Contact" /> <meta property="og:url" content="https://recentlywritten.com/call.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/cervido.html b/site/cervido.html index e0b166c..8f6ec97 100755 --- a/site/cervido.html +++ b/site/cervido.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="La Cervido" /> <meta property="og:url" content="https://recentlywritten.com/cervido.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/dmenu-scripts-repo-released.html b/site/dmenu-scripts-repo-released.html index 11bcdaa..b8cb31d 100755 --- a/site/dmenu-scripts-repo-released.html +++ b/site/dmenu-scripts-repo-released.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="dmenu scripts repo released" /> <meta property="og:url" content="https://recentlywritten.com/dmenu-scripts-repo-released.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/donate.html b/site/donate.html index 76259d3..62e3f5b 100755 --- a/site/donate.html +++ b/site/donate.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Donate" /> <meta property="og:url" content="https://recentlywritten.com/donate.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/esperantaj-artikoloj.html b/site/esperantaj-artikoloj.html index 3e4cab1..372a2ae 100755 --- a/site/esperantaj-artikoloj.html +++ b/site/esperantaj-artikoloj.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="eo artikoloj" /> <meta property="og:url" content="https://recentlywritten.com/esperantaj-artikoloj.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/esperantaj-audoj.html b/site/esperantaj-audoj.html index 9a9df99..fd6d14f 100755 --- a/site/esperantaj-audoj.html +++ b/site/esperantaj-audoj.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="audo" /> <meta property="og:url" content="https://recentlywritten.com/esperantaj-audoj.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/esperantaj-libroj.html b/site/esperantaj-libroj.html index caa2a1f..f2c4412 100755 --- a/site/esperantaj-libroj.html +++ b/site/esperantaj-libroj.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="eo libroj" /> <meta property="og:url" content="https://recentlywritten.com/esperantaj-libroj.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/esperantaj-noveloj.html b/site/esperantaj-noveloj.html index 8d69e54..e5c1157 100755 --- a/site/esperantaj-noveloj.html +++ b/site/esperantaj-noveloj.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="noveloj" /> <meta property="og:url" content="https://recentlywritten.com/esperantaj-noveloj.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/esperantaj-vortaroj.html b/site/esperantaj-vortaroj.html index e6db7af..66fac9c 100755 --- a/site/esperantaj-vortaroj.html +++ b/site/esperantaj-vortaroj.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="vortaroj" /> <meta property="og:url" content="https://recentlywritten.com/esperantaj-vortaroj.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/esperanto-three-steps.html b/site/esperanto-three-steps.html index 43beddb..2f7a980 100755 --- a/site/esperanto-three-steps.html +++ b/site/esperanto-three-steps.html @@ -9,7 +9,8 @@ <meta property="og:title" content="Three Steps to Esperanto Mastery" /> <meta property="og:url" content="https://recentlywritten.com/esperanto-three-steps.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/esperanto.html b/site/esperanto.html index aeddd3e..3d69277 100755 --- a/site/esperanto.html +++ b/site/esperanto.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="ligilo" /> <meta property="og:url" content="https://recentlywritten.com/esperanto.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/glider.html b/site/glider.html index aab9b68..b448c59 100755 --- a/site/glider.html +++ b/site/glider.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="The Glider" /> <meta property="og:url" content="https://recentlywritten.com/glider.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/iilchat-setup-too-easy.html b/site/iilchat-setup-too-easy.html index 8f14006..969ab9d 100755 --- a/site/iilchat-setup-too-easy.html +++ b/site/iilchat-setup-too-easy.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="ii/lchat setup (too easy)" /> <meta property="og:url" content="https://recentlywritten.com/iilchat-setup-too-easy.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/index.html b/site/index.html index 0f5804c..1936df3 100644 --- a/site/index.html +++ b/site/index.html @@ -10,7 +10,8 @@ <meta property="og:title" content="Recently Written" /> <meta property="og:description" content="Posts about Lisp, Unix, language learning and Esperanto." /> <meta property="og:url" content="https://recentlywritten.com/" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/install-9front.html b/site/install-9front.html index e87aec7..9002846 100755 --- a/site/install-9front.html +++ b/site/install-9front.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="install 9front" /> <meta property="og:url" content="https://recentlywritten.com/install-9front.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/install-gentoo-hints.html b/site/install-gentoo-hints.html index 125ed27..a693449 100755 --- a/site/install-gentoo-hints.html +++ b/site/install-gentoo-hints.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="install gentoo hints" /> <meta property="og:url" content="https://recentlywritten.com/install-gentoo-hints.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/irc-relay.html b/site/irc-relay.html index a7cfe96..328760c 100755 --- a/site/irc-relay.html +++ b/site/irc-relay.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="irc relay" /> <meta property="og:url" content="https://recentlywritten.com/irc-relay.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/key.html b/site/key.html index be2381a..6000a2b 100755 --- a/site/key.html +++ b/site/key.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Mail Encryption" /> <meta property="og:url" content="https://recentlywritten.com/key.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/la-faraono.html b/site/la-faraono.html index 83d67d4..f7d910f 100755 --- a/site/la-faraono.html +++ b/site/la-faraono.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="La Faraono" /> <meta property="og:url" content="https://recentlywritten.com/la-faraono.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/lair.html b/site/lair.html index 99bff3c..e1c1ef8 100755 --- a/site/lair.html +++ b/site/lair.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="equwal's lair" /> <meta property="og:url" content="https://recentlywritten.com/lair.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/lesperant2.html b/site/lesperant2.html index 10af8ea..b8f37ce 100755 --- a/site/lesperant2.html +++ b/site/lesperant2.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Je L'Esperantid 2.0" /> <meta property="og:url" content="https://recentlywritten.com/lesperant2.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/link-farm.html b/site/link-farm.html index 3774b3d..d31629d 100755 --- a/site/link-farm.html +++ b/site/link-farm.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="links" /> <meta property="og:url" content="https://recentlywritten.com/link-farm.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/lisprant.html b/site/lisprant.html index c06833f..11a4bf9 100755 --- a/site/lisprant.html +++ b/site/lisprant.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Lisp Rant" /> <meta property="og:url" content="https://recentlywritten.com/lisprant.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/matrix.html b/site/matrix.html index c869f5e..3fbffcf 100755 --- a/site/matrix.html +++ b/site/matrix.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="matrix homeserver" /> <meta property="og:url" content="https://recentlywritten.com/matrix.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/meti-limon.html b/site/meti-limon.html index 473f3cd..fcc449b 100755 --- a/site/meti-limon.html +++ b/site/meti-limon.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="meti limon" /> <meta property="og:url" content="https://recentlywritten.com/meti-limon.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/newport-reference-manual.html b/site/newport-reference-manual.html index 6ccf02b..b383dcc 100755 --- a/site/newport-reference-manual.html +++ b/site/newport-reference-manual.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Newport Reference Manual" /> <meta property="og:url" content="https://recentlywritten.com/newport-reference-manual.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/norda-naturo.html b/site/norda-naturo.html index bfb8018..e9ac67b 100755 --- a/site/norda-naturo.html +++ b/site/norda-naturo.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="norda naturo" /> <meta property="og:url" content="https://recentlywritten.com/norda-naturo.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/projects.html b/site/projects.html index d13705b..dcc3af1 100644 --- a/site/projects.html +++ b/site/projects.html @@ -1,316 +1,317 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <title>Projects — Recently Written</title> - <meta property="og:type" content="article" /> - <meta property="og:site_name" content="Recently Written" /> - <meta property="og:title" content="Projects" /> - <meta property="og:url" content="https://recentlywritten.com/projects.html" /> - <meta name="twitter:card" content="summary" /> - <link rel="stylesheet" href="style.css" /> - <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> -</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> - <a href="about.html">about</a> - <a href="lair.html">code</a> - <a href="git/index.html">git</a> - <a href="youtube.html">youtube</a> - <a href="esperanto.html">esperanto</a> - <a href="call.html">contact</a> - <a href="rss.xml">rss</a> - </nav> - </div> - - <h1 class="post-title">Projects</h1> - - <p>Spenser Truex. Free tarballs.</p> - <p>Tools for language learners, e-ink readers and Android, small Unix - programs, and Common Lisp. Support the work at <a - href="https://ko-fi.com/truex">ko-fi.com/truex</a>.</p> - <h2 id="sites">Sites</h2> - <ul> - <li><a href="https://subread.space">subread.space</a> - Line up an - audiobook with its ebook. Get read-along subtitles, EPUB 3 read-along - books, and subtitled video. Free in the browser.</li> - <li><a href="https://honjimaku.com">honjimaku.com</a> - A library of - Japanese subtitles for audiobooks, and Subrep live captions by share - link.</li> - <li><a href="https://sbm.subread.space">sbm.subread.space</a> - sbm - Sync: one plain bookmark file, the same on every device. Free, - AGPL.</li> - <li><a href="https://hentaibun.online">hentaibun.online</a> - Reading - lists and tools to learn kanbun and kobun.</li> - <li><a href="https://recentlywritten.com">recentlywritten.com</a> - - Writing on Unix, Lisp, Nix, Esperanto, and language learning. (<a - href="https://equwal.com">equwal.com</a> goes here.)</li> - <li><a href="https://ko-fi.com/truex">ko-fi.com/truex</a> - - Support.</li> - </ul> - <h2 id="subread">SubRead</h2> - <p>Read along with audiobooks, and mine the words.</p> - <ul> - <li><a - href="https://github.com/equwal/subread.space">subread.space</a> - - Read an <code>.srt</code> one line at a time with the space bar. Works - with Yomitan, furigana, and pitch accent markup.</li> - <li><a href="https://github.com/equwal/subplz-web">subplz-web</a> - - The aligner behind subread.space. The subtitle text comes from your - book, not from a transcript.</li> - <li><a - href="https://github.com/equwal/subread-android">subread-android</a> - - SubRead on Android. Times an audiobook against its ebook on the - device.</li> - <li><a - href="https://github.com/equwal/subread-extension">subread-extension</a> - - Show your own <code>.srt</code> over a YouTube video, in time. - Chrome and Firefox.</li> - <li><a - href="https://github.com/equwal/subread-overlay">subread-overlay</a> - - Show <code>.srt</code> lines over any Android media player. Tap a word - to look it up.</li> - <li><a - href="https://github.com/equwal/subread-dictionary">subread-dictionary</a> - - Pop-up dictionary for Android. Reads Yomitan dictionaries, with - local audio.</li> - <li><a - href="https://github.com/equwal/subread.koplugin">subread.koplugin</a> - - KOReader plugin. The book follows the narration, from an - <code>.srt</code> made by subread.space.</li> - <li><a - href="https://github.com/equwal/subrep-android">subrep-android</a> - - Live captions of the phone’s sound, made on the phone by Whisper, - shared by link.</li> - <li><a - href="https://github.com/equwal/desktop-subtitle-replay">desktop-subtitle-replay</a> - - Live subtitles for anything on your screen. Replay a sentence and - mine it into Anki.</li> - <li><a href="https://github.com/equwal/honjimaku">honjimaku</a> - The - honjimaku.com server. Fork of <a - href="https://github.com/Rapptz/jimaku">jimaku</a>.</li> - <li><a href="https://github.com/equwal/kikiyomi">kikiyomi</a> - - Audiobook player for Japanese learners, in the browser. Fork of <a - href="https://github.com/rtr46/kikiyomi">kikiyomi</a>.</li> - <li><a - href="https://github.com/equwal/Hoshi-Reader-Android">Hoshi-Reader-Android</a> - - Fork with a <code>subread</code> branch: audiobook read-along in the - Hoshi Reader EPUB reader.</li> - <li><a href="https://github.com/equwal/chimahon">chimahon</a> - Fork - with a <code>readalong</code> branch for the Mihon immersion - reader.</li> - <li><a href="https://github.com/equwal/dickt.store">dickt.store</a> - - Bring-your-own-key Yomitan dictionary converter.</li> - <li><a - href="https://github.com/equwal/vibeslop-dickt">vibeslop-dickt</a> - - Make your own Yomitan dictionary in a few minutes.</li> - </ul> - <h2 id="rebind-suite">Rebind suite</h2> - <p>Hardware buttons for e-ink readers and Android 12+.</p> - <ul> - <li><a href="https://github.com/equwal/rebind">rebind</a> - Remap - volume keys, Power, page-turn buttons, and the Viwoods AI key. Tap, - double tap, hold, and combinations. Free beta APK.</li> - <li><a href="https://github.com/equwal/assistkey">assistkey</a> - Key - remapper for the Viwoods AiPaper Reader: AI key, volume keys, and - Power.</li> - <li><a - href="https://github.com/equwal/awesome-rebind">awesome-rebind</a> - - Extensions and companion apps for Rebind.</li> - <li><a href="https://github.com/equwal/ink-recents">ink-recents</a> - - Recent-apps switcher for e-ink. No animation. Swipe up to close.</li> - <li><a href="https://github.com/equwal/ink-dim">ink-dim</a> - Set the - Viwoods frontlight below the lowest system level.</li> - <li><a href="https://github.com/equwal/ink-update">ink-update</a> - - Tells you when Rebind, Ink Recents, or Ink Dim has a new version.</li> - </ul> - <h2 id="sbm">sbm</h2> - <p>Fuzzy search thousands of bookmarks, on every device.</p> - <ul> - <li><a href="https://github.com/equwal/sbm">sbm</a> - dmenu bookmarks. - Search and plumb them.</li> - <li><a href="https://github.com/equwal/sbm-android">sbm-android</a> - - sbm on Android. Share to add.</li> - <li><a - href="https://github.com/equwal/sbm-extension">sbm-extension</a> - sbm - for Firefox and Chrome.</li> - <li><a href="https://github.com/equwal/sbm-sync">sbm-sync</a> - Sync - server. One small Go program, plain files, AGPL.</li> - <li><a href="https://github.com/equwal/sbm-suckless">sbm-suckless</a> - - sbm before the rewrite. Suckless style.</li> - </ul> - <h2 id="tools-for-ai-agents">Tools for AI agents</h2> - <ul> - <li><a href="https://github.com/equwal/ideamine">ideamine</a> - Idea - inbox for Claude Code. <code>/idea</code> saves ideas at zero - tokens.</li> - <li><a - href="https://github.com/equwal/deploy-handoff">deploy-handoff</a> - - The agent drives the browser to the last deploy, billing, or pull - request step. You make the final click.</li> - <li><a href="https://github.com/equwal/memstate">memstate</a> - - Versioned memory for AI agents in one SQLite file. Fork; contributor - to <a - href="https://github.com/map588/memstate">map588/memstate</a>.</li> - <li><a - href="https://github.com/HACKERMEN-ORG/aintitinit">aintitinit</a> - - Claude initializer.</li> - <li><a - href="https://github.com/HACKERMEN-ORG/hackermen-neovim-config-file">hackermen-neovim-config-file</a> - - Minimal Neovim config with optional AI.</li> - </ul> - <h2 id="unix-and-suckless">Unix and suckless</h2> - <ul> - <li><a href="https://github.com/equwal/tmpl">tmpl</a> - Insanely - simple templates.</li> - <li><a - href="https://github.com/equwal/dmenu-scripts">dmenu-scripts</a> - Ask - for things with dmenu.</li> - <li><a href="https://github.com/equwal/dsad">dsad</a> - dmenu - interface for sad, the simple audio daemon.</li> - <li><a href="https://github.com/equwal/dpatchmail">dpatchmail</a> - - Patch programs from mail with dmenu.</li> - <li><a href="https://github.com/equwal/prompt-mail">prompt-mail</a> - - Mail questions and mail files with dmenu.</li> - <li><a href="https://github.com/equwal/dmodurl">dmodurl</a> - Change - URLs with dmenu.</li> - <li><a href="https://github.com/equwal/tnot">tnot</a> - Like tmux, but - not.</li> - <li><a - href="https://github.com/equwal/tiny-runlevels">tiny-runlevels</a> - - Use an init system for many instances of simple programs.</li> - <li><a - href="https://github.com/equwal/ii-lchat-metapackage">ii-lchat-metapackage</a> - - Get suckless IRC working.</li> - <li><a href="https://github.com/equwal/pass-simple">pass-simple</a> - - Minimal pass rewrite, with bug fixes.</li> - <li><a href="https://github.com/equwal/sacc-ebuild">sacc-ebuild</a> - - Gentoo ebuild for the sacc gopher client.</li> - <li><a href="https://github.com/equwal/nixtoo-genux">nixtoo-genux</a> - - Declarative Nix package manager setup.</li> - <li><a - href="https://github.com/equwal/xinput-persistence">xinput-persistence</a> - - xinput settings that survive reconnect and boot.</li> - <li><a - href="https://github.com/equwal/encrypted-home-backups">encrypted-home-backups</a> - - Automatic home backups to an encrypted partition.</li> - <li><a href="https://github.com/equwal/alt-hack0">alt-hack0</a> and <a - href="https://github.com/equwal/alt-hack">alt-hack</a> - The Hack font - with a normal zero, made by script.</li> - <li><a - href="https://github.com/equwal/minimak-tty-xkb">minimak-tty-xkb</a> - - Minimak keyboard layout for the TTY and XKB.</li> - </ul> - <h2 id="common-lisp-and-emacs">Common Lisp and Emacs</h2> - <ul> - <li><a - href="https://github.com/font-lock-cl/font-lock-cl">font-lock-cl</a> - - Better Common Lisp syntax highlighting for Emacs. On MELPA.</li> - <li><a href="https://github.com/equwal/coleslaw">coleslaw</a> - Emacs - mode for the Coleslaw static site generator. Also <a - href="https://github.com/equwal/coleslaw-snippets">coleslaw-snippets</a>.</li> - <li><a href="https://github.com/equwal/Forthe">Forthe</a> - Forth-like - DSL.</li> - <li><a href="https://github.com/equwal/sl">sl</a> and <a - href="https://github.com/equwal/defsl">defsl</a> - Dependency language - for Common Lisp.</li> - <li><a href="https://github.com/equwal/sigil">sigil</a> - - Documentation preprocessor for Common Lisp.</li> - <li><a href="https://github.com/equwal/posix-pipes">posix-pipes</a> - - Portable pipes from CLOCC.</li> - <li><a href="https://github.com/equwal/tag-gen">tag-gen</a> - Make - tags for each directory.</li> - <li><a href="https://github.com/equwal/cores">cores</a> and <a - href="https://github.com/equwal/clapt">clapt</a> - Save SBCL cores - with libraries loaded.</li> - <li><a - href="https://github.com/equwal/asdf-registration">asdf-registration</a> - - Register ASDF projects.</li> - <li><a href="https://github.com/equwal/CSV">CSV</a> - Read CSV into - Lisp lists.</li> - <li><a href="https://github.com/equwal/gendocs">gendocs</a> - Simple - document generation.</li> - <li><a href="https://github.com/equwal/len-cmp">len-cmp</a> - Fast - list length comparison.</li> - <li><a href="https://github.com/equwal/LispBrain">LispBrain</a> - - Brainfuck debugger on the Common Lisp debugger.</li> - <li><a - href="https://github.com/equwal/lisp-multithreaded-internet">lisp-multithreaded-internet</a> - - Multithreaded internet for Common Lisp.</li> - <li><a href="https://github.com/equwal/esperanto">esperanto</a> - - Compress natural language in Esperanto.</li> - <li><a href="https://github.com/equwal/librivox">librivox</a> - - Automatic YouTube upload of audiobooks.</li> - <li><a href="https://github.com/equwal/cl-yag">cl-yag</a> and <a - href="https://github.com/equwal/clic">clic</a> - Mirrors of Bitreich - Common Lisp projects.</li> - <li>Spacemacs layers: <a - href="https://github.com/equwal/timeclock">timeclock</a>, <a - href="https://github.com/equwal/rectangle">rectangle</a>, <a - href="https://github.com/equwal/ediff-spacemacs">ediff-spacemacs</a>, - <a href="https://github.com/equwal/slurp">slurp</a>, <a - href="https://github.com/equwal/quickurl">quickurl</a>, <a - href="https://github.com/equwal/common-lisp-sly">common-lisp-sly</a>.</li> - </ul> - <h2 id="upstream-contributions">Upstream contributions</h2> - <ul> - <li><a href="https://suckless.org">suckless</a> - <a - href="https://git.suckless.org/slstatus">slstatus</a>: “Not charging” - battery status. <a href="https://git.suckless.org/scroll">scroll</a>: - typo fix. Patches to dwm, dmenu, quark, and sacc on the mailing - lists.</li> - <li><a href="https://git.2f30.org/sad/">sad</a> (2f30) - - <code>status volume</code> protocol, pause toggle, volume bug fix, - simpler config macros.</li> - <li><a href="https://github.com/joaotavora/sly">SLY</a> - REPL and - debugger fixes, xref docs.</li> - <li><a href="https://github.com/syl20bnr/spacemacs">Spacemacs</a> - - Layers and bindings, cleanup of deprecated <code>cl</code> and - <code>use-package</code> code.</li> - <li><a href="https://github.com/coleslaw-org/coleslaw">Coleslaw</a> - - URL generation, post extensions, versioning plugin, docs.</li> - <li><a href="https://github.com/sharplispers/clx">CLX</a> - Composite - extension docs and exports.</li> - <li><a href="https://github.com/xach/quickproject">quickproject</a> - - Restarts for existing target files.</li> - <li><a href="https://github.com/abo-abo/swiper">ivy/swiper</a>, <a - href="https://github.com/emacs-w3m/emacs-w3m">emacs-w3m</a>, <a - href="https://github.com/Malabarba/Nameless">Nameless</a>, <a - href="https://github.com/vlime/vlime">vlime</a>, <a - href="https://github.com/froggey/Mezzano">Mezzano</a>, <a - href="https://github.com/usocket/usocket">usocket</a>, <a - href="https://github.com/s-expressionists/Trucler">Trucler</a>, <a - href="https://github.com/Sharp-CLOCC/Newport">Newport</a>.</li> - <li><code>make uninstall</code> targets: <a - href="https://github.com/adsr/mle">mle</a>, <a - href="https://github.com/termbox/termbox">termbox</a>, <a - href="https://github.com/raygard/wak">wak</a>, <a - href="https://github.com/muquit/grabc">grabc</a>, <a - href="https://github.com/younix/sj">sj</a>, <a - href="https://github.com/nosarthur/gita">gita</a>, <a - href="https://github.com/AltraMayor/f3">f3</a>, <a - href="https://github.com/PorQ-Pine/lisgd">lisgd</a>, <a - href="https://github.com/pgdr/moreutils">moreutils</a>, <a - href="https://github.com/eshrh/ames">ames</a>.</li> - <li><a href="https://github.com/LukeSmithxyz/voidrice">voidrice</a>, - <a - href="https://github.com/ggreer/the_silver_searcher">the_silver_searcher</a>, - <a href="https://github.com/PatrickF1/github.fish">github.fish</a>, <a - href="https://github.com/prabirshrestha/asyncomplete.vim">asyncomplete.vim</a>, - <a href="https://github.com/tunamayo04/Akusento">Akusento</a>.</li> - </ul> - - <div id="footer"> - <a href="index.html">← Home</a> · - <a href="https://github.com/equwal">Github</a> - </div> - -</div> -</body> -</html> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <title>Projects — Recently Written</title> + <meta property="og:type" content="article" /> + <meta property="og:site_name" content="Recently Written" /> + <meta property="og:title" content="Projects" /> + <meta property="og:url" content="https://recentlywritten.com/projects.html" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> + <link rel="stylesheet" href="style.css" /> + <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> +</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> + <a href="about.html">about</a> + <a href="lair.html">code</a> + <a href="git/index.html">git</a> + <a href="youtube.html">youtube</a> + <a href="esperanto.html">esperanto</a> + <a href="call.html">contact</a> + <a href="rss.xml">rss</a> + </nav> + </div> + + <h1 class="post-title">Projects</h1> + + <p>Spenser Truex. Free tarballs.</p> + <p>Tools for language learners, e-ink readers and Android, small Unix + programs, and Common Lisp. Support the work at <a + href="https://ko-fi.com/truex">ko-fi.com/truex</a>.</p> + <h2 id="sites">Sites</h2> + <ul> + <li><a href="https://subread.space">subread.space</a> - Line up an + audiobook with its ebook. Get read-along subtitles, EPUB 3 read-along + books, and subtitled video. Free in the browser.</li> + <li><a href="https://honjimaku.com">honjimaku.com</a> - A library of + Japanese subtitles for audiobooks, and Subrep live captions by share + link.</li> + <li><a href="https://sbm.subread.space">sbm.subread.space</a> - sbm + Sync: one plain bookmark file, the same on every device. Free, + AGPL.</li> + <li><a href="https://hentaibun.online">hentaibun.online</a> - Reading + lists and tools to learn kanbun and kobun.</li> + <li><a href="https://recentlywritten.com">recentlywritten.com</a> - + Writing on Unix, Lisp, Nix, Esperanto, and language learning. (<a + href="https://equwal.com">equwal.com</a> goes here.)</li> + <li><a href="https://ko-fi.com/truex">ko-fi.com/truex</a> - + Support.</li> + </ul> + <h2 id="subread">SubRead</h2> + <p>Read along with audiobooks, and mine the words.</p> + <ul> + <li><a + href="https://github.com/equwal/subread.space">subread.space</a> - + Read an <code>.srt</code> one line at a time with the space bar. Works + with Yomitan, furigana, and pitch accent markup.</li> + <li><a href="https://github.com/equwal/subplz-web">subplz-web</a> - + The aligner behind subread.space. The subtitle text comes from your + book, not from a transcript.</li> + <li><a + href="https://github.com/equwal/subread-android">subread-android</a> - + SubRead on Android. Times an audiobook against its ebook on the + device.</li> + <li><a + href="https://github.com/equwal/subread-extension">subread-extension</a> + - Show your own <code>.srt</code> over a YouTube video, in time. + Chrome and Firefox.</li> + <li><a + href="https://github.com/equwal/subread-overlay">subread-overlay</a> - + Show <code>.srt</code> lines over any Android media player. Tap a word + to look it up.</li> + <li><a + href="https://github.com/equwal/subread-dictionary">subread-dictionary</a> + - Pop-up dictionary for Android. Reads Yomitan dictionaries, with + local audio.</li> + <li><a + href="https://github.com/equwal/subread.koplugin">subread.koplugin</a> + - KOReader plugin. The book follows the narration, from an + <code>.srt</code> made by subread.space.</li> + <li><a + href="https://github.com/equwal/subrep-android">subrep-android</a> - + Live captions of the phone’s sound, made on the phone by Whisper, + shared by link.</li> + <li><a + href="https://github.com/equwal/desktop-subtitle-replay">desktop-subtitle-replay</a> + - Live subtitles for anything on your screen. Replay a sentence and + mine it into Anki.</li> + <li><a href="https://github.com/equwal/honjimaku">honjimaku</a> - The + honjimaku.com server. Fork of <a + href="https://github.com/Rapptz/jimaku">jimaku</a>.</li> + <li><a href="https://github.com/equwal/kikiyomi">kikiyomi</a> - + Audiobook player for Japanese learners, in the browser. Fork of <a + href="https://github.com/rtr46/kikiyomi">kikiyomi</a>.</li> + <li><a + href="https://github.com/equwal/Hoshi-Reader-Android">Hoshi-Reader-Android</a> + - Fork with a <code>subread</code> branch: audiobook read-along in the + Hoshi Reader EPUB reader.</li> + <li><a href="https://github.com/equwal/chimahon">chimahon</a> - Fork + with a <code>readalong</code> branch for the Mihon immersion + reader.</li> + <li><a href="https://github.com/equwal/dickt.store">dickt.store</a> - + Bring-your-own-key Yomitan dictionary converter.</li> + <li><a + href="https://github.com/equwal/vibeslop-dickt">vibeslop-dickt</a> - + Make your own Yomitan dictionary in a few minutes.</li> + </ul> + <h2 id="rebind-suite">Rebind suite</h2> + <p>Hardware buttons for e-ink readers and Android 12+.</p> + <ul> + <li><a href="https://github.com/equwal/rebind">rebind</a> - Remap + volume keys, Power, page-turn buttons, and the Viwoods AI key. Tap, + double tap, hold, and combinations. Free beta APK.</li> + <li><a href="https://github.com/equwal/assistkey">assistkey</a> - Key + remapper for the Viwoods AiPaper Reader: AI key, volume keys, and + Power.</li> + <li><a + href="https://github.com/equwal/awesome-rebind">awesome-rebind</a> - + Extensions and companion apps for Rebind.</li> + <li><a href="https://github.com/equwal/ink-recents">ink-recents</a> - + Recent-apps switcher for e-ink. No animation. Swipe up to close.</li> + <li><a href="https://github.com/equwal/ink-dim">ink-dim</a> - Set the + Viwoods frontlight below the lowest system level.</li> + <li><a href="https://github.com/equwal/ink-update">ink-update</a> - + Tells you when Rebind, Ink Recents, or Ink Dim has a new version.</li> + </ul> + <h2 id="sbm">sbm</h2> + <p>Fuzzy search thousands of bookmarks, on every device.</p> + <ul> + <li><a href="https://github.com/equwal/sbm">sbm</a> - dmenu bookmarks. + Search and plumb them.</li> + <li><a href="https://github.com/equwal/sbm-android">sbm-android</a> - + sbm on Android. Share to add.</li> + <li><a + href="https://github.com/equwal/sbm-extension">sbm-extension</a> - sbm + for Firefox and Chrome.</li> + <li><a href="https://github.com/equwal/sbm-sync">sbm-sync</a> - Sync + server. One small Go program, plain files, AGPL.</li> + <li><a href="https://github.com/equwal/sbm-suckless">sbm-suckless</a> + - sbm before the rewrite. Suckless style.</li> + </ul> + <h2 id="tools-for-ai-agents">Tools for AI agents</h2> + <ul> + <li><a href="https://github.com/equwal/ideamine">ideamine</a> - Idea + inbox for Claude Code. <code>/idea</code> saves ideas at zero + tokens.</li> + <li><a + href="https://github.com/equwal/deploy-handoff">deploy-handoff</a> - + The agent drives the browser to the last deploy, billing, or pull + request step. You make the final click.</li> + <li><a href="https://github.com/equwal/memstate">memstate</a> - + Versioned memory for AI agents in one SQLite file. Fork; contributor + to <a + href="https://github.com/map588/memstate">map588/memstate</a>.</li> + <li><a + href="https://github.com/HACKERMEN-ORG/aintitinit">aintitinit</a> - + Claude initializer.</li> + <li><a + href="https://github.com/HACKERMEN-ORG/hackermen-neovim-config-file">hackermen-neovim-config-file</a> + - Minimal Neovim config with optional AI.</li> + </ul> + <h2 id="unix-and-suckless">Unix and suckless</h2> + <ul> + <li><a href="https://github.com/equwal/tmpl">tmpl</a> - Insanely + simple templates.</li> + <li><a + href="https://github.com/equwal/dmenu-scripts">dmenu-scripts</a> - Ask + for things with dmenu.</li> + <li><a href="https://github.com/equwal/dsad">dsad</a> - dmenu + interface for sad, the simple audio daemon.</li> + <li><a href="https://github.com/equwal/dpatchmail">dpatchmail</a> - + Patch programs from mail with dmenu.</li> + <li><a href="https://github.com/equwal/prompt-mail">prompt-mail</a> - + Mail questions and mail files with dmenu.</li> + <li><a href="https://github.com/equwal/dmodurl">dmodurl</a> - Change + URLs with dmenu.</li> + <li><a href="https://github.com/equwal/tnot">tnot</a> - Like tmux, but + not.</li> + <li><a + href="https://github.com/equwal/tiny-runlevels">tiny-runlevels</a> - + Use an init system for many instances of simple programs.</li> + <li><a + href="https://github.com/equwal/ii-lchat-metapackage">ii-lchat-metapackage</a> + - Get suckless IRC working.</li> + <li><a href="https://github.com/equwal/pass-simple">pass-simple</a> - + Minimal pass rewrite, with bug fixes.</li> + <li><a href="https://github.com/equwal/sacc-ebuild">sacc-ebuild</a> - + Gentoo ebuild for the sacc gopher client.</li> + <li><a href="https://github.com/equwal/nixtoo-genux">nixtoo-genux</a> + - Declarative Nix package manager setup.</li> + <li><a + href="https://github.com/equwal/xinput-persistence">xinput-persistence</a> + - xinput settings that survive reconnect and boot.</li> + <li><a + href="https://github.com/equwal/encrypted-home-backups">encrypted-home-backups</a> + - Automatic home backups to an encrypted partition.</li> + <li><a href="https://github.com/equwal/alt-hack0">alt-hack0</a> and <a + href="https://github.com/equwal/alt-hack">alt-hack</a> - The Hack font + with a normal zero, made by script.</li> + <li><a + href="https://github.com/equwal/minimak-tty-xkb">minimak-tty-xkb</a> - + Minimak keyboard layout for the TTY and XKB.</li> + </ul> + <h2 id="common-lisp-and-emacs">Common Lisp and Emacs</h2> + <ul> + <li><a + href="https://github.com/font-lock-cl/font-lock-cl">font-lock-cl</a> - + Better Common Lisp syntax highlighting for Emacs. On MELPA.</li> + <li><a href="https://github.com/equwal/coleslaw">coleslaw</a> - Emacs + mode for the Coleslaw static site generator. Also <a + href="https://github.com/equwal/coleslaw-snippets">coleslaw-snippets</a>.</li> + <li><a href="https://github.com/equwal/Forthe">Forthe</a> - Forth-like + DSL.</li> + <li><a href="https://github.com/equwal/sl">sl</a> and <a + href="https://github.com/equwal/defsl">defsl</a> - Dependency language + for Common Lisp.</li> + <li><a href="https://github.com/equwal/sigil">sigil</a> - + Documentation preprocessor for Common Lisp.</li> + <li><a href="https://github.com/equwal/posix-pipes">posix-pipes</a> - + Portable pipes from CLOCC.</li> + <li><a href="https://github.com/equwal/tag-gen">tag-gen</a> - Make + tags for each directory.</li> + <li><a href="https://github.com/equwal/cores">cores</a> and <a + href="https://github.com/equwal/clapt">clapt</a> - Save SBCL cores + with libraries loaded.</li> + <li><a + href="https://github.com/equwal/asdf-registration">asdf-registration</a> + - Register ASDF projects.</li> + <li><a href="https://github.com/equwal/CSV">CSV</a> - Read CSV into + Lisp lists.</li> + <li><a href="https://github.com/equwal/gendocs">gendocs</a> - Simple + document generation.</li> + <li><a href="https://github.com/equwal/len-cmp">len-cmp</a> - Fast + list length comparison.</li> + <li><a href="https://github.com/equwal/LispBrain">LispBrain</a> - + Brainfuck debugger on the Common Lisp debugger.</li> + <li><a + href="https://github.com/equwal/lisp-multithreaded-internet">lisp-multithreaded-internet</a> + - Multithreaded internet for Common Lisp.</li> + <li><a href="https://github.com/equwal/esperanto">esperanto</a> - + Compress natural language in Esperanto.</li> + <li><a href="https://github.com/equwal/librivox">librivox</a> - + Automatic YouTube upload of audiobooks.</li> + <li><a href="https://github.com/equwal/cl-yag">cl-yag</a> and <a + href="https://github.com/equwal/clic">clic</a> - Mirrors of Bitreich + Common Lisp projects.</li> + <li>Spacemacs layers: <a + href="https://github.com/equwal/timeclock">timeclock</a>, <a + href="https://github.com/equwal/rectangle">rectangle</a>, <a + href="https://github.com/equwal/ediff-spacemacs">ediff-spacemacs</a>, + <a href="https://github.com/equwal/slurp">slurp</a>, <a + href="https://github.com/equwal/quickurl">quickurl</a>, <a + href="https://github.com/equwal/common-lisp-sly">common-lisp-sly</a>.</li> + </ul> + <h2 id="upstream-contributions">Upstream contributions</h2> + <ul> + <li><a href="https://suckless.org">suckless</a> - <a + href="https://git.suckless.org/slstatus">slstatus</a>: “Not charging” + battery status. <a href="https://git.suckless.org/scroll">scroll</a>: + typo fix. Patches to dwm, dmenu, quark, and sacc on the mailing + lists.</li> + <li><a href="https://git.2f30.org/sad/">sad</a> (2f30) - + <code>status volume</code> protocol, pause toggle, volume bug fix, + simpler config macros.</li> + <li><a href="https://github.com/joaotavora/sly">SLY</a> - REPL and + debugger fixes, xref docs.</li> + <li><a href="https://github.com/syl20bnr/spacemacs">Spacemacs</a> - + Layers and bindings, cleanup of deprecated <code>cl</code> and + <code>use-package</code> code.</li> + <li><a href="https://github.com/coleslaw-org/coleslaw">Coleslaw</a> - + URL generation, post extensions, versioning plugin, docs.</li> + <li><a href="https://github.com/sharplispers/clx">CLX</a> - Composite + extension docs and exports.</li> + <li><a href="https://github.com/xach/quickproject">quickproject</a> - + Restarts for existing target files.</li> + <li><a href="https://github.com/abo-abo/swiper">ivy/swiper</a>, <a + href="https://github.com/emacs-w3m/emacs-w3m">emacs-w3m</a>, <a + href="https://github.com/Malabarba/Nameless">Nameless</a>, <a + href="https://github.com/vlime/vlime">vlime</a>, <a + href="https://github.com/froggey/Mezzano">Mezzano</a>, <a + href="https://github.com/usocket/usocket">usocket</a>, <a + href="https://github.com/s-expressionists/Trucler">Trucler</a>, <a + href="https://github.com/Sharp-CLOCC/Newport">Newport</a>.</li> + <li><code>make uninstall</code> targets: <a + href="https://github.com/adsr/mle">mle</a>, <a + href="https://github.com/termbox/termbox">termbox</a>, <a + href="https://github.com/raygard/wak">wak</a>, <a + href="https://github.com/muquit/grabc">grabc</a>, <a + href="https://github.com/younix/sj">sj</a>, <a + href="https://github.com/nosarthur/gita">gita</a>, <a + href="https://github.com/AltraMayor/f3">f3</a>, <a + href="https://github.com/PorQ-Pine/lisgd">lisgd</a>, <a + href="https://github.com/pgdr/moreutils">moreutils</a>, <a + href="https://github.com/eshrh/ames">ames</a>.</li> + <li><a href="https://github.com/LukeSmithxyz/voidrice">voidrice</a>, + <a + href="https://github.com/ggreer/the_silver_searcher">the_silver_searcher</a>, + <a href="https://github.com/PatrickF1/github.fish">github.fish</a>, <a + href="https://github.com/prabirshrestha/asyncomplete.vim">asyncomplete.vim</a>, + <a href="https://github.com/tunamayo04/Akusento">Akusento</a>.</li> + </ul> + + <div id="footer"> + <a href="index.html">← Home</a> · + <a href="https://github.com/equwal">Github</a> + </div> + +</div> +</body> +</html> diff --git a/site/release.html b/site/release.html index fc679c2..29abc5f 100755 --- a/site/release.html +++ b/site/release.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="release" /> <meta property="og:url" content="https://recentlywritten.com/release.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/rss.xml b/site/rss.xml index c3713b7..c195bf8 100644 --- a/site/rss.xml +++ b/site/rss.xml @@ -11,25 +11,25 @@ <link>https://recentlywritten.com/lisprant.html</link> <guid isPermaLink="true">https://recentlywritten.com/lisprant.html</guid> <pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate> - <description><![CDATA[<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> + <description><![CDATA[<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> ]]></description> </item> <item> @@ -37,46 +37,46 @@ regular scheduled programming</p> <link>https://recentlywritten.com/aintitinit-Claude-INITIALIZER.html</link> <guid isPermaLink="true">https://recentlywritten.com/aintitinit-Claude-INITIALIZER.html</guid> <pubDate>Tue, 09 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<p><a href="https://github.com/HACKERMEN-ORG/aintitinit" class="external-link">git -hub website repo</a></p> -<h2 id="claude-initializer">Claude INITIALIZER</h2> -<p>INITIALIZES a new git project in the directory if there isn’t one -already,<br /> -various files for claude in the directory to vibe code really -hard,<br /> -and hacks git to not track them.</p> -<p>The bare minimum necessary of course.</p> -<figure> -<a href="https://recentlywritten.com/static/gifmatrix.gif" target="_blank"><img src="https://recentlywritten.com/static/gifmatrix.gif" style="display:block;" alt="gifmatrix.gif" /></a> -</figure> -<h3 id="claude.md">CLAUDE.md</h3> -<p>This is the prompt claude will use in your project. Includes the -prompt<br /> -I had it generate, you can put anything you want in here.</p> -<h3 id="exclude-file">exclude (file)</h3> -<p>Appends this to the git exclusions to not track the claude-related -files</p> -<h3 id="mcp.json">.mcp.json</h3> -<p>The mcp servers you will use. There are a million already added by -the AI if you want to just use it as-ise.</p> -<h3 id="llms-full.txt">llms-full.txt</h3> -<p>Tells claude about the LLMs in -.mcp.jsonquire”cmp.utils.feedkeys”.run(2)<br /> -,</p> -<h3 id="regular-use">regular use</h3> -<pre><code>claude-init ; claude init</code></pre> -<h3 id="alias">alias</h3> -<p><code>ci</code> claude init.<br /> -<code>cli</code> try to continue, otherwise initialize in the -directory.</p> -<pre><code>alias ci='claude-init ; claude init' -alias cli='f(){ mkdir -p "$1" ; cd ${1:-.} ; claude-init ; claude init }; claude --continue || f'</code></pre> -<h3 id="todo">TODO</h3> -<ul> -<li>Automatically remove whitespace and base64 encode the CLAUDE.md -from</li> -</ul> -<p>the readable version to save tokens.</p> + <description><![CDATA[<p><a href="https://github.com/HACKERMEN-ORG/aintitinit" class="external-link">git +hub website repo</a></p> +<h2 id="claude-initializer">Claude INITIALIZER</h2> +<p>INITIALIZES a new git project in the directory if there isn’t one +already,<br /> +various files for claude in the directory to vibe code really +hard,<br /> +and hacks git to not track them.</p> +<p>The bare minimum necessary of course.</p> +<figure> +<a href="https://recentlywritten.com/static/gifmatrix.gif" target="_blank"><img src="https://recentlywritten.com/static/gifmatrix.gif" style="display:block;" alt="gifmatrix.gif" /></a> +</figure> +<h3 id="claude.md">CLAUDE.md</h3> +<p>This is the prompt claude will use in your project. Includes the +prompt<br /> +I had it generate, you can put anything you want in here.</p> +<h3 id="exclude-file">exclude (file)</h3> +<p>Appends this to the git exclusions to not track the claude-related +files</p> +<h3 id="mcp.json">.mcp.json</h3> +<p>The mcp servers you will use. There are a million already added by +the AI if you want to just use it as-ise.</p> +<h3 id="llms-full.txt">llms-full.txt</h3> +<p>Tells claude about the LLMs in +.mcp.jsonquire”cmp.utils.feedkeys”.run(2)<br /> +,</p> +<h3 id="regular-use">regular use</h3> +<pre><code>claude-init ; claude init</code></pre> +<h3 id="alias">alias</h3> +<p><code>ci</code> claude init.<br /> +<code>cli</code> try to continue, otherwise initialize in the +directory.</p> +<pre><code>alias ci='claude-init ; claude init' +alias cli='f(){ mkdir -p "$1" ; cd ${1:-.} ; claude-init ; claude init }; claude --continue || f'</code></pre> +<h3 id="todo">TODO</h3> +<ul> +<li>Automatically remove whitespace and base64 encode the CLAUDE.md +from</li> +</ul> +<p>the readable version to save tokens.</p> ]]></description> </item> <item> @@ -84,53 +84,53 @@ from</li> <link>https://recentlywritten.com/Hackermen-neomutt-config.html</link> <guid isPermaLink="true">https://recentlywritten.com/Hackermen-neomutt-config.html</guid> <pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<p><a href="https://github.com/HACKERMEN-ORG/neomutt-config" class="external-link">link -to git hub website repository</a></p> -<h2 id="why-this-exists">Why this exists</h2> -<p>So my friends can send me encrypted mail, bottom post, and -send/apply<br /> -patches.</p> -<p>> “I installed neomutt but I haven’t figured it out”</p> -<p>Neomutt defaults have legacy lock-in issues.</p> -<h2 id="barebones-neomutt-config">Barebones neomutt config</h2> -<h3 id="features">Features</h3> -<ul> -<li><p>optional PGP encryption/signing/both</p></li> -<li><p>Automatic PGP decryption</p></li> -<li><p>hjkl movement: navigate</p></li> -<li><p>n/p movement: read+page mails like in the GNUs client</p></li> -<li><p>open HTML mail in the $BROWSER with a bind</p></li> -<li><p>edit mail in the $EDITOR</p></li> -<li><p>Can setup multiple mailboxes (just source more files like -me-TEMPLATE)</p></li> -<li><p>arcane-config-TEMPLATE to keep user-specific config -separate</p></li> -<li><p>Lots of colors</p></li> -<li><p>A million default setting changes that don’t do much</p></li> -<li><p>signature</p></li> -</ul> -<h3 id="subjective-user-experience">Subjective User Experience</h3> -<p><a href="http://www.booksatoz.com/witsend/tea/orwell.htm" class="external-link">Like -this</a></p> -<h3 id="install">Install</h3> -<ul> -<li><p>clone to ~/.config/neomutt</p></li> -<li><p>install neomutt</p></li> -<li><p>install isync and sendmail for IMAP and SMTP</p></li> -<li><p>install notmuch to search your mails</p></li> -<li><p>install gpg (optional)</p></li> -<li><p>Edit and rename the TEMPLATE files</p></li> -<li><p>Edit the sources at the top of the neomuttrc to fit your -needs</p></li> -</ul> -<h3 -id="good-alias-to-do-background-mail-stuff-when-opening-the-client">Good -alias to do background mail stuff when opening the client</h3> -<h3 id="todo">TODO</h3> -<ul> -<li>Automatic WKD for automatic PGP encryption without manually adding -keys</li> -</ul> + <description><![CDATA[<p><a href="https://github.com/HACKERMEN-ORG/neomutt-config" class="external-link">link +to git hub website repository</a></p> +<h2 id="why-this-exists">Why this exists</h2> +<p>So my friends can send me encrypted mail, bottom post, and +send/apply<br /> +patches.</p> +<p>> “I installed neomutt but I haven’t figured it out”</p> +<p>Neomutt defaults have legacy lock-in issues.</p> +<h2 id="barebones-neomutt-config">Barebones neomutt config</h2> +<h3 id="features">Features</h3> +<ul> +<li><p>optional PGP encryption/signing/both</p></li> +<li><p>Automatic PGP decryption</p></li> +<li><p>hjkl movement: navigate</p></li> +<li><p>n/p movement: read+page mails like in the GNUs client</p></li> +<li><p>open HTML mail in the $BROWSER with a bind</p></li> +<li><p>edit mail in the $EDITOR</p></li> +<li><p>Can setup multiple mailboxes (just source more files like +me-TEMPLATE)</p></li> +<li><p>arcane-config-TEMPLATE to keep user-specific config +separate</p></li> +<li><p>Lots of colors</p></li> +<li><p>A million default setting changes that don’t do much</p></li> +<li><p>signature</p></li> +</ul> +<h3 id="subjective-user-experience">Subjective User Experience</h3> +<p><a href="http://www.booksatoz.com/witsend/tea/orwell.htm" class="external-link">Like +this</a></p> +<h3 id="install">Install</h3> +<ul> +<li><p>clone to ~/.config/neomutt</p></li> +<li><p>install neomutt</p></li> +<li><p>install isync and sendmail for IMAP and SMTP</p></li> +<li><p>install notmuch to search your mails</p></li> +<li><p>install gpg (optional)</p></li> +<li><p>Edit and rename the TEMPLATE files</p></li> +<li><p>Edit the sources at the top of the neomuttrc to fit your +needs</p></li> +</ul> +<h3 +id="good-alias-to-do-background-mail-stuff-when-opening-the-client">Good +alias to do background mail stuff when opening the client</h3> +<h3 id="todo">TODO</h3> +<ul> +<li>Automatic WKD for automatic PGP encryption without manually adding +keys</li> +</ul> ]]></description> </item> <item> @@ -138,64 +138,64 @@ keys</li> <link>https://recentlywritten.com/REPL-Driven-Development-as-an-analogy-for-proper-AI-Driven-Development.html</link> <guid isPermaLink="true">https://recentlywritten.com/REPL-Driven-Development-as-an-analogy-for-proper-AI-Driven-Development.html</guid> <pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<p>I recently “discovered” using an LLM to code with, and was looking -forward to doing some “REPL Driven Development” on it. Unfortunately, I -discovered that all of the vibe-coded vim plugins just use vim as a -(terrible) multiplexer for the Claude Code CLI program. The Emacs plugin -<a href="https://github.com/manzaltu/claude-code-ide.el" class="external-link">claude-code-ide.el</a> -does it right by having text selection and other send-to-repl-like -actions like a proper Lisp IDE does.</p> -<p>This was merely a lisp thing to do because the parentheses clearly -define selection to send. That’s no longer an issue, the LLM can filter -out the garbage in a way that a GOFAI symbolic rule-based pattern -matcher can’t.</p> -<p>The command line program likes to use diffs to edit files, and that -is reasonable, but vastly inferior to REPL Driven Development from a -scratch file. Below are some of my notes from 2019 for more context on -using the lisp REPL. With RDD, you will never type something directly -into a REPL again. “Never type into the REPL”.</p> -<p>It’s nice using grep to lookup some code I might have written 5 years -ago that would have been ephemeral and lost at the REPL.</p> -<h3 id="repl-driven-development">REPL driven development</h3> -<p>Stuard Halloway’s 2017 talk at Chicago Clojure:</p> -<p><a href="https://vimeo.com/223309989" class="external-link">vimeo</a><br /> -<a href="https://github.com/matthiasn/talk-transcripts/blob/master/Halloway_Stuart/REPLDrivenDevelopment.md" class="external-link">slide -notes</a></p> -<ul> -<li><p>DON’T type <em>into</em> the repl. Type into a file that you can -search later.</p></li> -<li><p>Use repl-interaction commands (like insert-in-repl, minibuffer, -etc.).</p></li> -<li><p>Have a plan to avoid wasting time (since repls are fun).</p></li> -<li><p>Know <em>all</em> the jump-to-documentation kinds of commands. -Searching for a regex,<br /> -jumping to the source of a thing, etc.</p></li> -<li><p>Analysing data carefully at the repl (don’t just stare at -stacktraces).</p></li> -<li><p>Debugging at O(log n)</p></li> -<li><p>Custom REPLs (especially debuggers/inspectors with breakpoints, -etc.)</p></li> -<li><p>Do use the debugger.</p></li> -</ul> -<h4 id="most-important-keystrokes">MOST important keystrokes</h4> -<ul> -<li><p>Execute a thing in the minibuffer</p></li> -<li><p>Tracing functions (or a short function to execute in the -minibuffer like =trace=)</p></li> -<li><p>Sending to repl from behind the point</p></li> -<li><p>Sending to repl from in front of the point</p></li> -<li><p>Sending the whole top-level expression at point to the -repl</p></li> -<li><p>Jump to the minibuffer (not for typing! just to see big -output)</p></li> -<li><p>A keystroke to jump back to the source file (or something like -windmove)</p></li> -<li><p><em>all</em> the documentation commands (search, jump to source, -doc-at-point, etc.)</p></li> -<li><p>Execute something and replace it with the output/write the output -as</p></li> -</ul> -<p>a comment in the scratch buffer.</p> + <description><![CDATA[<p>I recently “discovered” using an LLM to code with, and was looking +forward to doing some “REPL Driven Development” on it. Unfortunately, I +discovered that all of the vibe-coded vim plugins just use vim as a +(terrible) multiplexer for the Claude Code CLI program. The Emacs plugin +<a href="https://github.com/manzaltu/claude-code-ide.el" class="external-link">claude-code-ide.el</a> +does it right by having text selection and other send-to-repl-like +actions like a proper Lisp IDE does.</p> +<p>This was merely a lisp thing to do because the parentheses clearly +define selection to send. That’s no longer an issue, the LLM can filter +out the garbage in a way that a GOFAI symbolic rule-based pattern +matcher can’t.</p> +<p>The command line program likes to use diffs to edit files, and that +is reasonable, but vastly inferior to REPL Driven Development from a +scratch file. Below are some of my notes from 2019 for more context on +using the lisp REPL. With RDD, you will never type something directly +into a REPL again. “Never type into the REPL”.</p> +<p>It’s nice using grep to lookup some code I might have written 5 years +ago that would have been ephemeral and lost at the REPL.</p> +<h3 id="repl-driven-development">REPL driven development</h3> +<p>Stuard Halloway’s 2017 talk at Chicago Clojure:</p> +<p><a href="https://vimeo.com/223309989" class="external-link">vimeo</a><br /> +<a href="https://github.com/matthiasn/talk-transcripts/blob/master/Halloway_Stuart/REPLDrivenDevelopment.md" class="external-link">slide +notes</a></p> +<ul> +<li><p>DON’T type <em>into</em> the repl. Type into a file that you can +search later.</p></li> +<li><p>Use repl-interaction commands (like insert-in-repl, minibuffer, +etc.).</p></li> +<li><p>Have a plan to avoid wasting time (since repls are fun).</p></li> +<li><p>Know <em>all</em> the jump-to-documentation kinds of commands. +Searching for a regex,<br /> +jumping to the source of a thing, etc.</p></li> +<li><p>Analysing data carefully at the repl (don’t just stare at +stacktraces).</p></li> +<li><p>Debugging at O(log n)</p></li> +<li><p>Custom REPLs (especially debuggers/inspectors with breakpoints, +etc.)</p></li> +<li><p>Do use the debugger.</p></li> +</ul> +<h4 id="most-important-keystrokes">MOST important keystrokes</h4> +<ul> +<li><p>Execute a thing in the minibuffer</p></li> +<li><p>Tracing functions (or a short function to execute in the +minibuffer like =trace=)</p></li> +<li><p>Sending to repl from behind the point</p></li> +<li><p>Sending to repl from in front of the point</p></li> +<li><p>Sending the whole top-level expression at point to the +repl</p></li> +<li><p>Jump to the minibuffer (not for typing! just to see big +output)</p></li> +<li><p>A keystroke to jump back to the source file (or something like +windmove)</p></li> +<li><p><em>all</em> the documentation commands (search, jump to source, +doc-at-point, etc.)</p></li> +<li><p>Execute something and replace it with the output/write the output +as</p></li> +</ul> +<p>a comment in the scratch buffer.</p> ]]></description> </item> <item> @@ -203,74 +203,74 @@ as</p></li> <link>https://recentlywritten.com/Minimal-nvim-config-optional-AI-slop-enjoy.html</link> <guid isPermaLink="true">https://recentlywritten.com/Minimal-nvim-config-optional-AI-slop-enjoy.html</guid> <pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<p><a href="https://github.com/HACKERMEN-ORG/hackermen-neovim-config-file" class="external-link">code -on the git hub website</a></p> -<p>A friend sent me a neomutt configuration which was thousands of lines -of LLM code, using libraries where even the READMEs are written by LLMs. -Surprisingly, it worked pretty good. Human being were never any good at -writing VimScript anyway. Of course, to make even tiny edits, due to the -extreme unnecessary complexity brought in by the LLM, requires the use -of another LLM. Blargh!</p> -<p>The solution: actually use a decent, simple init written by a human, -and put the rest in the “optional” slop folder. Problem solved!</p> -<h2 id="install">Install</h2> -<p>Run nvim and do,<code>:PlugInstall</code>. BAM! Future travellers: -you should do <code>:PlugUpdate</code>.</p> -<h2 id="features">FEATURES</h2> -<ul> -<li><p><a href="http://danmidwood.com/content/2014/11/21/animated-paredit.html" class="external-link">Structural -editing</a></p></li> -<li><p>Global leader is Spacebar. Spacevim!</p></li> -<li><p>Local leader is comma.</p></li> -<li><p>Spellcheck and shellcheck keybindings.</p></li> -<li><p>(sane) Completion. See equwal’s -<a href="https://github.com/equwal/tag-gen" class="external-link">tag-gen</a> -project.</p></li> -<li><p>Which-key. Learn vim!</p></li> -<li><p>Goyo (For writing words. Automatically turns on when editing -neomutt buffers)</p></li> -<li><p><++> templating (see my <++> -<a href="https://recentlywritten.com/tmpl-insanely-simple-templates.html" class="external-link">tmpl</a> -project)</p></li> -<li><p>Ask what you meant using fzf when you try try to open a file that -doesn’t exist.</p></li> -<li><p>Save your place in the buffer for later.</p></li> -<li><p>mode line</p></li> -<li><p>Slightly modified vim defaults (very slightly). See the only file -for details.</p></li> -</ul> -<h2 id="non-features">NON-FEATURES</h2> -<ul> -<li><p>Not crazy modifications to vim defaults</p></li> -<li><p>Only one file (everything else in “slop” folder)</p></li> -<li><p>No major changes to the packages used</p></li> -<li><p>No window management. Use a terminal multiplexer.</p></li> -<li><p>No claude code. Same.</p></li> -</ul> -<p>Source your own config at the bottom of the init.lua and work from -these sane defaults.</p> -<h3 id="faq-frequent-answers-to-questions">FAQ: Frequent Answers to -Questions</h3> -<h4 -id="source-your-own-config-at-the-bottom-of-the-init.lua-and-work-from-these-sane-defaults">“Source -your own config at the bottom of the init.lua and work from these sane -defaults”</h4> -<p>Then, make changes to the init.lua and send a pull request.</p> -<h4 id="you-dont-need-claude-in-your-vim">You don’t need claude in your -vim</h4> -<p>ARGH. Just use dvtm/mtm/abduco or your window manager to deal with -it. None of the claude vim projects are smart enough to send parts of -buffers to the claude like slime does for lisp. Those claude vim -packages are just glorified terminals using vim as a (very bad) -multiplexer.</p> -<h4 id="plugged-is-better-than-lazy">Plugged *is* better than Lazy</h4> -<p>Lazy is written by AI. The point of this is to not be written -by<br /> -AI. Complex shit breaks!</p> -<h4 id="here-is-your-prompt-sir">Here is your prompt, SIR:</h4> -<pre><code>start adding individual feature s one by one which only take up 1-10 lines. Don't import all the config, just the most basic config. For individual lines, write what it does and ask to add it in. For packages, read the github pages and their default configuration to minimize the edits needed. Opt for the most default configuration if possible.</code></pre> -<h4 id="dont-add-hundreds-of-lines-of-ai-slop-to-my-config.">Don’t add -hundreds of lines of AI slop to my config.</h4> + <description><![CDATA[<p><a href="https://github.com/HACKERMEN-ORG/hackermen-neovim-config-file" class="external-link">code +on the git hub website</a></p> +<p>A friend sent me a neomutt configuration which was thousands of lines +of LLM code, using libraries where even the READMEs are written by LLMs. +Surprisingly, it worked pretty good. Human being were never any good at +writing VimScript anyway. Of course, to make even tiny edits, due to the +extreme unnecessary complexity brought in by the LLM, requires the use +of another LLM. Blargh!</p> +<p>The solution: actually use a decent, simple init written by a human, +and put the rest in the “optional” slop folder. Problem solved!</p> +<h2 id="install">Install</h2> +<p>Run nvim and do,<code>:PlugInstall</code>. BAM! Future travellers: +you should do <code>:PlugUpdate</code>.</p> +<h2 id="features">FEATURES</h2> +<ul> +<li><p><a href="http://danmidwood.com/content/2014/11/21/animated-paredit.html" class="external-link">Structural +editing</a></p></li> +<li><p>Global leader is Spacebar. Spacevim!</p></li> +<li><p>Local leader is comma.</p></li> +<li><p>Spellcheck and shellcheck keybindings.</p></li> +<li><p>(sane) Completion. See equwal’s +<a href="https://github.com/equwal/tag-gen" class="external-link">tag-gen</a> +project.</p></li> +<li><p>Which-key. Learn vim!</p></li> +<li><p>Goyo (For writing words. Automatically turns on when editing +neomutt buffers)</p></li> +<li><p><++> templating (see my <++> +<a href="https://recentlywritten.com/tmpl-insanely-simple-templates.html" class="external-link">tmpl</a> +project)</p></li> +<li><p>Ask what you meant using fzf when you try try to open a file that +doesn’t exist.</p></li> +<li><p>Save your place in the buffer for later.</p></li> +<li><p>mode line</p></li> +<li><p>Slightly modified vim defaults (very slightly). See the only file +for details.</p></li> +</ul> +<h2 id="non-features">NON-FEATURES</h2> +<ul> +<li><p>Not crazy modifications to vim defaults</p></li> +<li><p>Only one file (everything else in “slop” folder)</p></li> +<li><p>No major changes to the packages used</p></li> +<li><p>No window management. Use a terminal multiplexer.</p></li> +<li><p>No claude code. Same.</p></li> +</ul> +<p>Source your own config at the bottom of the init.lua and work from +these sane defaults.</p> +<h3 id="faq-frequent-answers-to-questions">FAQ: Frequent Answers to +Questions</h3> +<h4 +id="source-your-own-config-at-the-bottom-of-the-init.lua-and-work-from-these-sane-defaults">“Source +your own config at the bottom of the init.lua and work from these sane +defaults”</h4> +<p>Then, make changes to the init.lua and send a pull request.</p> +<h4 id="you-dont-need-claude-in-your-vim">You don’t need claude in your +vim</h4> +<p>ARGH. Just use dvtm/mtm/abduco or your window manager to deal with +it. None of the claude vim projects are smart enough to send parts of +buffers to the claude like slime does for lisp. Those claude vim +packages are just glorified terminals using vim as a (very bad) +multiplexer.</p> +<h4 id="plugged-is-better-than-lazy">Plugged *is* better than Lazy</h4> +<p>Lazy is written by AI. The point of this is to not be written +by<br /> +AI. Complex shit breaks!</p> +<h4 id="here-is-your-prompt-sir">Here is your prompt, SIR:</h4> +<pre><code>start adding individual feature s one by one which only take up 1-10 lines. Don't import all the config, just the most basic config. For individual lines, write what it does and ask to add it in. For packages, read the github pages and their default configuration to minimize the edits needed. Opt for the most default configuration if possible.</code></pre> +<h4 id="dont-add-hundreds-of-lines-of-ai-slop-to-my-config.">Don’t add +hundreds of lines of AI slop to my config.</h4> ]]></description> </item> <item> @@ -278,92 +278,92 @@ hundreds of lines of AI slop to my config.</h4> <link>https://recentlywritten.com/Using-an-init-system-for-many-instances-of-simple-programs.html</link> <guid isPermaLink="true">https://recentlywritten.com/Using-an-init-system-for-many-instances-of-simple-programs.html</guid> <pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<p><a href="https://github.com/equwal/tiny-runlevels" class="external-link">mirrored -on github for convenience here</a></p> -<p>Using OpenRC runlevels to have lots of instances of simple (network) -programs like quark for multiple http serving locally or -<a href="https://tools.suckless.org/ii/" class="external-link">ii</a> -(or -<a href="https://tools.suckless.org/sic/" class="external-link">sic</a>) -for IRC server connections.</p> -<p>To keep programs simple, they should not do the same process for -unrelated uses. It is much more complicated to configure and manage -multiple webservers in the same process (like how nginx does it) than -just one. Init systems are designed to manage processes, and should be -used instead. Do one thing etc. etc.</p> -<p>This is how to use the OpenRC runlevels for quark and ii runlevels as -examples.</p> -<h3 id="the-tree-on-my-machine">The Tree (on my machine)</h3> -<pre><code>/etc/runlevels -├── boot -│ └── ... -├── default -│ └── ... -├── irc-base -│ ├── oftc -> /etc/init.d/oftc -│ ├── liberachat -> /etc/init.d/liberachat -│ └── ... -├── net-base -│ ├── default -> ../default -│ └── quark -> ../quark -├── net-offline -│ ├── default -> ../default -│ └── net-base -> ../net-base -├── net-dns -│ ├── dnscrypt-proxy -> /etc/init.d/dnscrypt-proxy -│ └── unbound -> /etc/init.d/unbound -├── net-wifi -│ ├── dhcpcd -> /etc/init.d/dhcpcd -│ ├── net-base -> /etc/runlevels/net-base -│ ├── net-dns -> /etc/runlevels/net-dns -│ └── wpa_supplicant -> /etc/init.d/wpa_supplicant -├── net-wifi-irc -│ ├── irc-base -> ../irc-base -│ └── net-wifi -> ../net-wifi -├── quark -│ ├── quark-docs -> /etc/init.d/quark-docs -│ ├── quark-equwal -> /etc/init.d/quark-equwal -│ └── ... -├── shutdown -│ └── ... -└── sysinit - └── ...</code></pre> -<p>as you can see, IRC is connected after the real internet on wifi -(net-wifi), but quark runs on any network runlevel using net-base.</p> -<h3 id="how-to">How To:</h3> -<p>OpenRC has its own commands for making the runlevels, but I find them -confusing. Let’s just edit the files.</p> -<pre><code># make runlevel -mkdir /etc/runlevels/quark -# add services (as many as needed) -ln -s /etc/int.d/quark-whatever /etc/runlevels/quark -# add runlevel to parent -ln -s /etc/runlevels/default /etc/runlevels/quark -# Reload since openrc is in default -openrc default</code></pre> -<p>That works, but what about for networked IRC on a custom networking -runlevel? Just add it to the networking runlevel.</p> -<pre><code># (first, make a network runlevel that contains default! Without default the system will crash, obviously.) -mkdir /etc/runlevels/net-wifi -ln -s /etc/runlevels/net-wifi /etc/runlevels/default -ln -s /etc/init.d/wpa_supplicant /etc/runlevels/net-wifi -# etc. -# Now add the irc-base to the network runlevel -mkdir /etc/runlevels/irc-base -ln -s /etc/init.d/liberachat irc-base -ln -s /etc/init.d/oftc irc-base -ln -s /etc/runlevels/irc-base /etc/runlevels/net-wifi -openrc net-wifi</code></pre> -<h3 id="tool-restart-runlevel">Tool: restart-runlevel</h3> -<p>Openrc wants switch the whole stack <code>openrc runlevel</code> so I -made a little tool to just restart a specific runlevel. Nice for -debugging.</p> -<pre><code>#!/bin/bash - -for link in /etc/runlevels/${1}/* -do [[ -L "$link" && "$(readlink "$link")" == /etc/init.d/* ]] && \ - rc-service "$(basename "$link")" restart -done</code></pre> + <description><![CDATA[<p><a href="https://github.com/equwal/tiny-runlevels" class="external-link">mirrored +on github for convenience here</a></p> +<p>Using OpenRC runlevels to have lots of instances of simple (network) +programs like quark for multiple http serving locally or +<a href="https://tools.suckless.org/ii/" class="external-link">ii</a> +(or +<a href="https://tools.suckless.org/sic/" class="external-link">sic</a>) +for IRC server connections.</p> +<p>To keep programs simple, they should not do the same process for +unrelated uses. It is much more complicated to configure and manage +multiple webservers in the same process (like how nginx does it) than +just one. Init systems are designed to manage processes, and should be +used instead. Do one thing etc. etc.</p> +<p>This is how to use the OpenRC runlevels for quark and ii runlevels as +examples.</p> +<h3 id="the-tree-on-my-machine">The Tree (on my machine)</h3> +<pre><code>/etc/runlevels +├── boot +│ └── ... +├── default +│ └── ... +├── irc-base +│ ├── oftc -> /etc/init.d/oftc +│ ├── liberachat -> /etc/init.d/liberachat +│ └── ... +├── net-base +│ ├── default -> ../default +│ └── quark -> ../quark +├── net-offline +│ ├── default -> ../default +│ └── net-base -> ../net-base +├── net-dns +│ ├── dnscrypt-proxy -> /etc/init.d/dnscrypt-proxy +│ └── unbound -> /etc/init.d/unbound +├── net-wifi +│ ├── dhcpcd -> /etc/init.d/dhcpcd +│ ├── net-base -> /etc/runlevels/net-base +│ ├── net-dns -> /etc/runlevels/net-dns +│ └── wpa_supplicant -> /etc/init.d/wpa_supplicant +├── net-wifi-irc +│ ├── irc-base -> ../irc-base +│ └── net-wifi -> ../net-wifi +├── quark +│ ├── quark-docs -> /etc/init.d/quark-docs +│ ├── quark-equwal -> /etc/init.d/quark-equwal +│ └── ... +├── shutdown +│ └── ... +└── sysinit + └── ...</code></pre> +<p>as you can see, IRC is connected after the real internet on wifi +(net-wifi), but quark runs on any network runlevel using net-base.</p> +<h3 id="how-to">How To:</h3> +<p>OpenRC has its own commands for making the runlevels, but I find them +confusing. Let’s just edit the files.</p> +<pre><code># make runlevel +mkdir /etc/runlevels/quark +# add services (as many as needed) +ln -s /etc/int.d/quark-whatever /etc/runlevels/quark +# add runlevel to parent +ln -s /etc/runlevels/default /etc/runlevels/quark +# Reload since openrc is in default +openrc default</code></pre> +<p>That works, but what about for networked IRC on a custom networking +runlevel? Just add it to the networking runlevel.</p> +<pre><code># (first, make a network runlevel that contains default! Without default the system will crash, obviously.) +mkdir /etc/runlevels/net-wifi +ln -s /etc/runlevels/net-wifi /etc/runlevels/default +ln -s /etc/init.d/wpa_supplicant /etc/runlevels/net-wifi +# etc. +# Now add the irc-base to the network runlevel +mkdir /etc/runlevels/irc-base +ln -s /etc/init.d/liberachat irc-base +ln -s /etc/init.d/oftc irc-base +ln -s /etc/runlevels/irc-base /etc/runlevels/net-wifi +openrc net-wifi</code></pre> +<h3 id="tool-restart-runlevel">Tool: restart-runlevel</h3> +<p>Openrc wants switch the whole stack <code>openrc runlevel</code> so I +made a little tool to just restart a specific runlevel. Nice for +debugging.</p> +<pre><code>#!/bin/bash + +for link in /etc/runlevels/${1}/* +do [[ -L "$link" && "$(readlink "$link")" == /etc/init.d/* ]] && \ + rc-service "$(basename "$link")" restart +done</code></pre> ]]></description> </item> <item> @@ -371,18 +371,18 @@ done</code></pre> <link>https://recentlywritten.com/Mailing-list-in-one-line.html</link> <guid isPermaLink="true">https://recentlywritten.com/Mailing-list-in-one-line.html</guid> <pubDate>Sat, 06 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<h1 id="list-of-emails.txt">==> list-of-emails.txt <==</h1> -<pre><code>Your Name <youremail@example.com> -... -... -# ==> mailing-list.sh <== -#!/bin/sh -while read email; do neomutt -H "$MESSAGEFILE" "$email" < /dev/null; done < /dev/stdin</code></pre> -<p>Make an mbox email with neomutt of whatever.<br /> -Now run it.</p> -<pre><code>cat list-of-emails.txt | mailing-list.sh email-file.mbox</code></pre> -<p>Now make an alias in (zsh) for extreme FAST mailing</p> -<pre><code>alias mail2list='f(){ [ -n "$1" ] && cat /home/jose/.config/mailing-list/the-mailing-list | mailing-list "$1" }; f'</code></pre> + <description><![CDATA[<h1 id="list-of-emails.txt">==> list-of-emails.txt <==</h1> +<pre><code>Your Name <youremail@example.com> +... +... +# ==> mailing-list.sh <== +#!/bin/sh +while read email; do neomutt -H "$MESSAGEFILE" "$email" < /dev/null; done < /dev/stdin</code></pre> +<p>Make an mbox email with neomutt of whatever.<br /> +Now run it.</p> +<pre><code>cat list-of-emails.txt | mailing-list.sh email-file.mbox</code></pre> +<p>Now make an alias in (zsh) for extreme FAST mailing</p> +<pre><code>alias mail2list='f(){ [ -n "$1" ] && cat /home/jose/.config/mailing-list/the-mailing-list | mailing-list "$1" }; f'</code></pre> ]]></description> </item> <item> @@ -390,124 +390,124 @@ Now run it.</p> <link>https://recentlywritten.com/Dont-use-make-uninstall.html</link> <guid isPermaLink="true">https://recentlywritten.com/Dont-use-make-uninstall.html</guid> <pubDate>Sat, 06 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<p>Much like “sending a file over the internet”, “installing software” -has not been solved generally. There’s more than one way to do it. A -mixed system that uses both declarative and traditional package managers -in unison is the way to go for now. It would be ideal to package a -non-specific declarative package install definition together with the -source of programs, and make unnecessary the concept of a “package -maintainer” for each package manager. The existence of two declarative -package managers already suggests the need for an arbitrary standard -which can transformed into a definition for any declarative system.</p> -<p>I used an LLM to generate hundreds of uninstall targets for make and -submit patches to the authors. Three authors wouldn’t patch my changes -in. Are they right? The argument goes like this: the software should not -be installed using make because make doesn’t register file install -locations in any way. Therefore make only uninstalles the correct files -by coincidence. For installing, it can do a little bit better using the -<code>install</code> program.</p> -<p>There is a better way which has been around forever: just use the -build from the source tree.</p> -<p>Let’s consider how the ASDF manager for Common Lisp works (and by -extension, quicklisp, which gets ASDF systems from the internet). It has -a central registry variable with a list of paths, and it recurs down it -to findsystem definitions when the definition loader is called. Then it -loads the files into the lisp core. As a result there is no need to have -code and binaries in different places. If compiled, it will just store -the compiled files together with the source. To “uninstall”, just delete -that project’s directory. Let’s call this “in-situ” package -management.</p> -<p>With POSIX make and arbitrary build systems like it, the subordinate -model can’t work, because ASDF can’t possibly predetermine what binaries -to use and where to put them. The logic can’t be generalized in the -package manager, and has to be managed per-project. Every package -manager now needs thousands of packages with hundreds of maintainers. -Typical package managers do installs imperatively and tracking the file -location metadata in the system flies. When the binaries or libraries -are edited or moved by an outside program or a user without editing the -registry, (for example, by trying to re-install gcc manually from -source) it can break the system.</p> -<p>The simplest way to get this kind of management is to use the -symlinks to the files from directories in the PATH. If the installed -files change, but the path stays the same, they can be updated without -changing the “installed” data at all. IT’s still tenuous – an update to -the build system could change the locations of built binaries.</p> -<h2 -id="declarative-and-in-situ-package-managers-nix-and-guix">Declarative -and in-situ package managers: Nix and Guix</h2> -<p>The Nix package manager uses the model of keeping the binaries in the -package manager’s repo without “installing” them. This is why nix -systems can’t break unless impure hacks are used.. Since binaries and -libraries are not <em>moved</em>, there is no chance of overwriting -things or losing track of where they are!</p> -<p>Let’s not distribute installers in the code builders like make, but -instead build it and use it as-is from the folder using an in-situ -package manager. By chance, that’s exactly how declarative package -managers work, and not how traditional registry managers work.</p> -<p>The benefits of declarative package management are plentiful, but -come at the cost of making development of one’s own programs and -installation of as-yet unpackaged software from the source more -difficult. Even simple shell scripts added to the PATH can’t be done -simply, the whole abstraction of the package manager has to be invoked, -or some impure hacks are needed.</p> -<p>The declarative package managers can be installed on another linux -which has a traditional registry package manager and impure environment. -Why not have both? It is “possible” to install two traditional package -managers on the same system, and will almost immediately break it due to -out of sync dependency management. With in-situ and system registry -managers installed together there are no conflicts, because the in-situ -manager stays in its own folder.</p> -<p>Package management solutions:</p> -<ul> -<li><p>In the build system -(<code>make install/uninstall</code>)</p></li> -<li><p>Using symlinks in the path (<code>ln -s</code>)</p></li> -<li><p>In-situ</p></li> -<li><p>Declarative + in-situ</p></li> -<li><p>Traditional system registry package managers</p></li> -<li><p>Declarative meta-package management language (does not exist -yet).</p></li> -</ul> -<h2 -id="final-note-should-there-be-an-uninstall-target-in-the-makefile">Final -note: should there be an uninstall target in the Makefile?</h2> -<ul> -<li><p>No, if the makefile doesn’t “install” the software but just -builds it.</p></li> -<li><p>Yes, if the makefile does “install” the software, it should also -have a way to “uninstall” the software.</p></li> -</ul> -<h2 -id="final-note-but-i-want-to-uninstall-something-anyway-with-nothing-more-than-make-and-not-use-an-uninstall">Final -note: but I want to uninstall something anyway with nothing more than -make and not use an uninstall!</h2> -<h3 -id="use-make-install-to-a-destdir-to-see-what-files-it-installs-and-remove-them">Use -make install to a DESTDIR to see what files it installs and remove -them</h3> -<p>It is the best way, albeit tedious and manual.</p> -<p>“rofl0r” says:</p> -<p>As the maintainer of a -<a href="https://github.com/sabotage-linux/sabotage" class="external-link">linux -distro</a>, i quickly learned that the DESTDIR <<a -href="https://www.gnu.org/prep/standards/html_node/DESTDIR.html" -class="uri">https://www.gnu.org/prep/standards/html_node/DESTDIR.html</a>> -variable is really *the* key to cleanly track the files installed by -arbitrary source projects, apart from much more elaborate solutions such -as doing installs in a sandbox with before/after comparison or using -file-system monitoring (e.g. via ptrace). it allows to install all files -into an arbitrary location, which makes it easy to e.g. create a -filelist, or in the case of my distro, the DESTDIR is used as the final -location where the package actually lives. if we take curl as an -example, it would be installed with empty prefix and DESTDIR=/opt/curl, -so the curl binary would live in /opt/curl/bin/curl, headers in -/opt/curl/include, etc. the package manager, as the last step of the -build/install process, then iterates over all files in /opt/curl and -symlinks them into the root prefix, e.g. /bin/curl will point to -/opt/curl/bin/curl. uninstalling a package then is as easy as to iterate -again over the files in /opt/curl (or in my case a filelist made -thereof, to reduce the amount of syscalls) to remove the symlinks and -finally rm -rf /opt/curl to delete the actual files.</p> + <description><![CDATA[<p>Much like “sending a file over the internet”, “installing software” +has not been solved generally. There’s more than one way to do it. A +mixed system that uses both declarative and traditional package managers +in unison is the way to go for now. It would be ideal to package a +non-specific declarative package install definition together with the +source of programs, and make unnecessary the concept of a “package +maintainer” for each package manager. The existence of two declarative +package managers already suggests the need for an arbitrary standard +which can transformed into a definition for any declarative system.</p> +<p>I used an LLM to generate hundreds of uninstall targets for make and +submit patches to the authors. Three authors wouldn’t patch my changes +in. Are they right? The argument goes like this: the software should not +be installed using make because make doesn’t register file install +locations in any way. Therefore make only uninstalles the correct files +by coincidence. For installing, it can do a little bit better using the +<code>install</code> program.</p> +<p>There is a better way which has been around forever: just use the +build from the source tree.</p> +<p>Let’s consider how the ASDF manager for Common Lisp works (and by +extension, quicklisp, which gets ASDF systems from the internet). It has +a central registry variable with a list of paths, and it recurs down it +to findsystem definitions when the definition loader is called. Then it +loads the files into the lisp core. As a result there is no need to have +code and binaries in different places. If compiled, it will just store +the compiled files together with the source. To “uninstall”, just delete +that project’s directory. Let’s call this “in-situ” package +management.</p> +<p>With POSIX make and arbitrary build systems like it, the subordinate +model can’t work, because ASDF can’t possibly predetermine what binaries +to use and where to put them. The logic can’t be generalized in the +package manager, and has to be managed per-project. Every package +manager now needs thousands of packages with hundreds of maintainers. +Typical package managers do installs imperatively and tracking the file +location metadata in the system flies. When the binaries or libraries +are edited or moved by an outside program or a user without editing the +registry, (for example, by trying to re-install gcc manually from +source) it can break the system.</p> +<p>The simplest way to get this kind of management is to use the +symlinks to the files from directories in the PATH. If the installed +files change, but the path stays the same, they can be updated without +changing the “installed” data at all. IT’s still tenuous – an update to +the build system could change the locations of built binaries.</p> +<h2 +id="declarative-and-in-situ-package-managers-nix-and-guix">Declarative +and in-situ package managers: Nix and Guix</h2> +<p>The Nix package manager uses the model of keeping the binaries in the +package manager’s repo without “installing” them. This is why nix +systems can’t break unless impure hacks are used.. Since binaries and +libraries are not <em>moved</em>, there is no chance of overwriting +things or losing track of where they are!</p> +<p>Let’s not distribute installers in the code builders like make, but +instead build it and use it as-is from the folder using an in-situ +package manager. By chance, that’s exactly how declarative package +managers work, and not how traditional registry managers work.</p> +<p>The benefits of declarative package management are plentiful, but +come at the cost of making development of one’s own programs and +installation of as-yet unpackaged software from the source more +difficult. Even simple shell scripts added to the PATH can’t be done +simply, the whole abstraction of the package manager has to be invoked, +or some impure hacks are needed.</p> +<p>The declarative package managers can be installed on another linux +which has a traditional registry package manager and impure environment. +Why not have both? It is “possible” to install two traditional package +managers on the same system, and will almost immediately break it due to +out of sync dependency management. With in-situ and system registry +managers installed together there are no conflicts, because the in-situ +manager stays in its own folder.</p> +<p>Package management solutions:</p> +<ul> +<li><p>In the build system +(<code>make install/uninstall</code>)</p></li> +<li><p>Using symlinks in the path (<code>ln -s</code>)</p></li> +<li><p>In-situ</p></li> +<li><p>Declarative + in-situ</p></li> +<li><p>Traditional system registry package managers</p></li> +<li><p>Declarative meta-package management language (does not exist +yet).</p></li> +</ul> +<h2 +id="final-note-should-there-be-an-uninstall-target-in-the-makefile">Final +note: should there be an uninstall target in the Makefile?</h2> +<ul> +<li><p>No, if the makefile doesn’t “install” the software but just +builds it.</p></li> +<li><p>Yes, if the makefile does “install” the software, it should also +have a way to “uninstall” the software.</p></li> +</ul> +<h2 +id="final-note-but-i-want-to-uninstall-something-anyway-with-nothing-more-than-make-and-not-use-an-uninstall">Final +note: but I want to uninstall something anyway with nothing more than +make and not use an uninstall!</h2> +<h3 +id="use-make-install-to-a-destdir-to-see-what-files-it-installs-and-remove-them">Use +make install to a DESTDIR to see what files it installs and remove +them</h3> +<p>It is the best way, albeit tedious and manual.</p> +<p>“rofl0r” says:</p> +<p>As the maintainer of a +<a href="https://github.com/sabotage-linux/sabotage" class="external-link">linux +distro</a>, i quickly learned that the DESTDIR <<a +href="https://www.gnu.org/prep/standards/html_node/DESTDIR.html" +class="uri">https://www.gnu.org/prep/standards/html_node/DESTDIR.html</a>> +variable is really *the* key to cleanly track the files installed by +arbitrary source projects, apart from much more elaborate solutions such +as doing installs in a sandbox with before/after comparison or using +file-system monitoring (e.g. via ptrace). it allows to install all files +into an arbitrary location, which makes it easy to e.g. create a +filelist, or in the case of my distro, the DESTDIR is used as the final +location where the package actually lives. if we take curl as an +example, it would be installed with empty prefix and DESTDIR=/opt/curl, +so the curl binary would live in /opt/curl/bin/curl, headers in +/opt/curl/include, etc. the package manager, as the last step of the +build/install process, then iterates over all files in /opt/curl and +symlinks them into the root prefix, e.g. /bin/curl will point to +/opt/curl/bin/curl. uninstalling a package then is as easy as to iterate +again over the files in /opt/curl (or in my case a filelist made +thereof, to reduce the amount of syscalls) to remove the symlinks and +finally rm -rf /opt/curl to delete the actual files.</p> ]]></description> </item> <item> @@ -515,33 +515,33 @@ finally rm -rf /opt/curl to delete the actual files.</p> <link>https://recentlywritten.com/tmpl-insanely-simple-templates.html</link> <guid isPermaLink="true">https://recentlywritten.com/tmpl-insanely-simple-templates.html</guid> <pubDate>Sat, 06 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<p><a href="https://github.com/equwal/tmpl" class="external-link">git -repo here</a></p> -<p>Templates for all kinds of things. Just read a file into your editor -at the cursor and jump to the <++> locations.</p> -<p>Here is one such template:</p> -<pre><code>(defpackage :<++>-system (:use :cl :asdf)) -(in-package :<++>-system) -(defsystem <++> - :name "<++>" - :author "<++> <<++>@<++>.<++>>" - :version "<++>" - :maintainer "<++> <<++>@<++>.<++>>" - :license "GNU GPLv3.0" - :description "<++>" - ;; put the most general files first to minimize the "depends on" use - ;; and in that case you'll need :serial t - :serial <++> - :components ((:file "packages") - (:file "<++>" :depends-on ("<++>"))) - :weakly-depends-on (<++>) - :depends-on (<++>))</code></pre> -<h2 id="using-with-vim">Using with Vim</h2> -<pre><code>:read /path/to/tmpl/thing</code></pre> -<p>Make sure to add a templating shortcut to your leader key to jump to -the <code><++></code> spots.</p> -<pre><code> -- Templating shortcut - map("n", "<leader><Space>", "/<++><CR>dt>a<BS>", { desc = "Jump to next template placeholder" })</code></pre> + <description><![CDATA[<p><a href="https://github.com/equwal/tmpl" class="external-link">git +repo here</a></p> +<p>Templates for all kinds of things. Just read a file into your editor +at the cursor and jump to the <++> locations.</p> +<p>Here is one such template:</p> +<pre><code>(defpackage :<++>-system (:use :cl :asdf)) +(in-package :<++>-system) +(defsystem <++> + :name "<++>" + :author "<++> <<++>@<++>.<++>>" + :version "<++>" + :maintainer "<++> <<++>@<++>.<++>>" + :license "GNU GPLv3.0" + :description "<++>" + ;; put the most general files first to minimize the "depends on" use + ;; and in that case you'll need :serial t + :serial <++> + :components ((:file "packages") + (:file "<++>" :depends-on ("<++>"))) + :weakly-depends-on (<++>) + :depends-on (<++>))</code></pre> +<h2 id="using-with-vim">Using with Vim</h2> +<pre><code>:read /path/to/tmpl/thing</code></pre> +<p>Make sure to add a templating shortcut to your leader key to jump to +the <code><++></code> spots.</p> +<pre><code> -- Templating shortcut + map("n", "<leader><Space>", "/<++><CR>dt>a<BS>", { desc = "Jump to next template placeholder" })</code></pre> ]]></description> </item> <item> @@ -549,52 +549,52 @@ the <code><++></code> spots.</p> <link>https://recentlywritten.com/tag-gen.html</link> <guid isPermaLink="true">https://recentlywritten.com/tag-gen.html</guid> <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate> - <description><![CDATA[<p><a href="https://github.com/equwal/tag-gen" class="external-link">git -hub website link here</a></p> -<h2 id="purpose">PURPOSE:</h2> -<p>Specify which directories to generate tags for, and what kinds of -files<br /> -to generate them for in each. Good for tag jumping in an editor.</p> -<h2 id="requirements">Requirements</h2> -<ul> -<li><p>An ANSI Common Lisp</p></li> -<li><p>ASDF (for UIOP portable shell facilities)</p></li> -<li><p>A ctags-like program.</p></li> -<li><p>Desire</p></li> -</ul> -<h2 id="non-featuresnon-requirements">Non-features/Non-Requirements</h2> -<ul> -<li><p>Not multithreaded!</p></li> -<li><p>Works with any tag program (doesn’t do any tagging -itself)!</p></li> -<li><p>No special configuration language, just two sexps!</p></li> -<li><p>Does not use Roswell!</p></li> -<li><p>Works on my machine!</p></li> -</ul> -<h2 id="install">Install</h2> -<ol type="1"> -<li><p>put this folder somewhere</p></li> -<li><p>put the config folder somewhere</p></li> -<li><p>put the tag-gen.sh and tag-gen-root.sh somewhere</p></li> -<li><p>put the cron job in</p></li> -<li><p>put your configuration in</p></li> -</ol> -<p>Edit the config/ files with the paths you want tagged.</p> -<p>Add a command to cron like:</p> -<pre><code>*/29 * * * * su username -c 'tag-gen.sh /path/to/tag-gen/local.conf /usr/bin/etags' -*/29 * * * * su root -c 'tag-gen-root.sh /path/to/tag-gen/root.conf /usr/bin/etags'</code></pre> -<p>for routine tagging.</p> -<p>tags.conf needs to contain this kind of format:</p> -<pre><code>"/path/to/ctags/program" - -(("<directory>" ("<ext>"...)) - ...)</code></pre> -<p>The tags program reads the file extensions to infer what language to -do tags for. Specify the directories you want to use tag browsing -programs on.</p> -<p>See examples in config-examples. Configuration is -<strong>mandatory</strong> for the program to work. The format is just -read with the lisp reader and is very simple.</p> + <description><![CDATA[<p><a href="https://github.com/equwal/tag-gen" class="external-link">git +hub website link here</a></p> +<h2 id="purpose">PURPOSE:</h2> +<p>Specify which directories to generate tags for, and what kinds of +files<br /> +to generate them for in each. Good for tag jumping in an editor.</p> +<h2 id="requirements">Requirements</h2> +<ul> +<li><p>An ANSI Common Lisp</p></li> +<li><p>ASDF (for UIOP portable shell facilities)</p></li> +<li><p>A ctags-like program.</p></li> +<li><p>Desire</p></li> +</ul> +<h2 id="non-featuresnon-requirements">Non-features/Non-Requirements</h2> +<ul> +<li><p>Not multithreaded!</p></li> +<li><p>Works with any tag program (doesn’t do any tagging +itself)!</p></li> +<li><p>No special configuration language, just two sexps!</p></li> +<li><p>Does not use Roswell!</p></li> +<li><p>Works on my machine!</p></li> +</ul> +<h2 id="install">Install</h2> +<ol type="1"> +<li><p>put this folder somewhere</p></li> +<li><p>put the config folder somewhere</p></li> +<li><p>put the tag-gen.sh and tag-gen-root.sh somewhere</p></li> +<li><p>put the cron job in</p></li> +<li><p>put your configuration in</p></li> +</ol> +<p>Edit the config/ files with the paths you want tagged.</p> +<p>Add a command to cron like:</p> +<pre><code>*/29 * * * * su username -c 'tag-gen.sh /path/to/tag-gen/local.conf /usr/bin/etags' +*/29 * * * * su root -c 'tag-gen-root.sh /path/to/tag-gen/root.conf /usr/bin/etags'</code></pre> +<p>for routine tagging.</p> +<p>tags.conf needs to contain this kind of format:</p> +<pre><code>"/path/to/ctags/program" + +(("<directory>" ("<ext>"...)) + ...)</code></pre> +<p>The tags program reads the file extensions to infer what language to +do tags for. Specify the directories you want to use tag browsing +programs on.</p> +<p>See examples in config-examples. Configuration is +<strong>mandatory</strong> for the program to work. The format is just +read with the lisp reader and is very simple.</p> ]]></description> </item> </channel> diff --git a/site/rut.html b/site/rut.html index 27157c2..7983a54 100755 --- a/site/rut.html +++ b/site/rut.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="rut" /> <meta property="og:url" content="https://recentlywritten.com/rut.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/sbm.html b/site/sbm.html index adde1e1..dcf4c98 100755 --- a/site/sbm.html +++ b/site/sbm.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="sbm" /> <meta property="og:url" content="https://recentlywritten.com/sbm.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/serpentoj-en-la-puto.html b/site/serpentoj-en-la-puto.html index eecead2..eb63744 100755 --- a/site/serpentoj-en-la-puto.html +++ b/site/serpentoj-en-la-puto.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Serpentoj En La Puto" /> <meta property="og:url" content="https://recentlywritten.com/serpentoj-en-la-puto.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/static/og.png b/site/static/og.png new file mode 100644 index 0000000..6c5c386 Binary files /dev/null and b/site/static/og.png differ diff --git a/site/sten-johansson.html b/site/sten-johansson.html index 5f1f784..6ded973 100755 --- a/site/sten-johansson.html +++ b/site/sten-johansson.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="Noveloj de Sten Johansson" /> <meta property="og:url" content="https://recentlywritten.com/sten-johansson.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/tag-gen.html b/site/tag-gen.html index 1ce3bbb..3f2e0ba 100755 --- a/site/tag-gen.html +++ b/site/tag-gen.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="tag-gen" /> <meta property="og:url" content="https://recentlywritten.com/tag-gen.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/tmpl-insanely-simple-templates.html b/site/tmpl-insanely-simple-templates.html index b2c73f9..d4592f0 100755 --- a/site/tmpl-insanely-simple-templates.html +++ b/site/tmpl-insanely-simple-templates.html @@ -8,7 +8,8 @@ <meta property="og:site_name" content="Recently Written" /> <meta property="og:title" content="tmpl: insanely simple templates" /> <meta property="og:url" content="https://recentlywritten.com/tmpl-insanely-simple-templates.html" /> - <meta name="twitter:card" content="summary" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="style.css" /> <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> </head> diff --git a/site/youtube.html b/site/youtube.html index da41b45..b724743 100644 --- a/site/youtube.html +++ b/site/youtube.html @@ -1,49 +1,50 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <title>YouTube — Recently Written</title> - <meta property="og:type" content="article" /> - <meta property="og:site_name" content="Recently Written" /> - <meta property="og:title" content="YouTube" /> - <meta property="og:url" content="https://recentlywritten.com/youtube.html" /> - <meta name="twitter:card" content="summary" /> - <link rel="stylesheet" href="style.css" /> - <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> -</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> - <a href="about.html">about</a> - <a href="lair.html">code</a> - <a href="git/index.html">git</a> - <a href="youtube.html">youtube</a> - <a href="esperanto.html">esperanto</a> - <a href="call.html">contact</a> - <a href="rss.xml">rss</a> - </nav> - </div> - - <h1 class="post-title">YouTube</h1> - - <p>Two channels.</p> - <ul> - <li><a href="https://www.youtube.com/@therealtruex">Truex - (@therealtruex)</a> — the original language-learning channel.</li> - <li><a href="https://www.youtube.com/@muhlanguages">мои язычки - (@muhlanguages)</a> — languages and AI, the current one.</li> - </ul> - - <div id="footer"> - <a href="index.html">← Home</a> · - <a href="https://github.com/equwal">Github</a> - </div> - -</div> -</body> -</html> +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <title>YouTube — Recently Written</title> + <meta property="og:type" content="article" /> + <meta property="og:site_name" content="Recently Written" /> + <meta property="og:title" content="YouTube" /> + <meta property="og:url" content="https://recentlywritten.com/youtube.html" /> + <meta property="og:image" content="https://recentlywritten.com/static/og.png" /> + <meta name="twitter:card" content="summary_large_image" /> + <link rel="stylesheet" href="style.css" /> + <link rel="alternate" type="application/rss+xml" title="Recently Written" href="rss.xml" /> +</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> + <a href="about.html">about</a> + <a href="lair.html">code</a> + <a href="git/index.html">git</a> + <a href="youtube.html">youtube</a> + <a href="esperanto.html">esperanto</a> + <a href="call.html">contact</a> + <a href="rss.xml">rss</a> + </nav> + </div> + + <h1 class="post-title">YouTube</h1> + + <p>Two channels.</p> + <ul> + <li><a href="https://www.youtube.com/@therealtruex">Truex + (@therealtruex)</a> — the original language-learning channel.</li> + <li><a href="https://www.youtube.com/@muhlanguages">мои язычки + (@muhlanguages)</a> — languages and AI, the current one.</li> + </ul> + + <div id="footer"> + <a href="index.html">← Home</a> · + <a href="https://github.com/equwal">Github</a> + </div> + +</div> +</body> +</html> diff --git a/static/og.png b/static/og.png new file mode 100644 index 0000000..6c5c386 Binary files /dev/null and b/static/og.png differ