<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/blog/rss.xsl" type="text/xsl" media="screen" ?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lazyweb - jwz</title>
	<atom:link href="https://cdn.jwz.org/blog/tag/lazyweb/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.jwz.org/blog/</link>
	<description></description>
	<lastBuildDate>Sun, 12 Apr 2026 03:34:31 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://cdn.jwz.org/blog/tag/lazyweb/feed/"/>
	<item>
		<title>Still seeking Basecamp alternative</title>
		<link>https://www.jwz.org/blog/2026/04/still-seeking-basecamp-alternative/</link>
					<comments>https://www.jwz.org/blog/2026/04/still-seeking-basecamp-alternative/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sun, 12 Apr 2026 03:34:31 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[corporations]]></category>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[www]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk6E</guid>

					<description><![CDATA[I asked this 6 months ago and got no good answers so let's try again.

Against my better judgment, I let my staff start using Basecamp about 8 years ago, and now I want to ditch it for something open source and self-hosted.

Several people suggested Nextcloud. After much ...]]></description>
										<content:encoded><![CDATA[<DIV STYLE="text-align: center; width: 35%; max-width: 1202px; margin: 0 0 1em 1em; float: right;"><A HREF="https://cdn.jwz.org/images/2024/comments/1dd6a28f022908d-1.png" data-size="1202x884"><IMG SRC="https://cdn.jwz.org/images/scaled/768/2024/comments/1dd6a28f022908d-1.png" WIDTH=1202 HEIGHT=884 STYLE="width: 100%; height: auto; border: 1px solid; margin-bottom: 0.5em" SRCSET="https://cdn.jwz.org/images/2024/comments/1dd6a28f022908d-1.png 1202w, https://cdn.jwz.org/images/scaled/1024/2024/comments/1dd6a28f022908d-1.png 1024w, https://cdn.jwz.org/images/scaled/768/2024/comments/1dd6a28f022908d-1.png 768w, https://cdn.jwz.org/images/scaled/640/2024/comments/1dd6a28f022908d-1.png 640w, https://cdn.jwz.org/images/scaled/360/2024/comments/1dd6a28f022908d-1.png 360w" SIZES="(max-width: 660px) 35vw, 26em" LOADING="lazy" data-size="1202x884"></A></DIV>I asked this <A HREF="https://www.jwz.org/blog/2025/10/basecamp-alternative/">6 months ago</A> and got no good answers so let's try again. <P>Against my better judgment, I let my staff start using Basecamp about 8 years ago, and now I want to ditch it for something open source and self-hosted. <P>Several people suggested <A HREF="https://nextcloud.com/">Nextcloud</A>. After much pain, I got that installed, and finally convinced my general manager to take a look at it. Here is his review: <P><BLOCKQUOTE STYLE="margin: 1em 0 1em 1.5em; padding: 0.75em 0.5em 0.75em 1em; border: 1px solid; border-left: 4px solid;"> <P>I spent more time poking at this today, and on several occasions it took it 20-30 seconds to respond to link clicks. <P>I've also spent some time reading the manual, and... I hate these people so much. it's all about how to access your data with various protocols, and nothing about how to use the actual software or WTF the software is expected to do or how you might use it. <P>It looks like the "todo lists" is all those "cards". They even have an example set that implies each card has more details, but opening them, it just says DESCRIPTION and you can't edit it. <P>I cannot make any sense out of this. Is it mostly hosting infrasrtucture that is used by other, more sane front-ends? it alludes to a bunch of features, but it seems like those are "apps" that you have to add. on it's own, it's about as friendly as teaching a Boomer to set up a linux desktop so they can check emails. <P>On a scale of 1 to 10, I'd rate this "I'd rather have my gums planed".</BLOCKQUOTE> <P>A few other people suggested <A HREF="https://www.openproject.org/">Openproject</A>. <P>It seems that the only method of installation that Openproject documents is "install an entire VM" or <A HREF="https://www.openproject.org/docs/installation-and-operations/installation/packaged/">"install these RPMs"</A> and of course they don't have a package for the OS that I use ("Amazon Linux 2023"). There's not a single mention of how one might go about installing from source, so I don't even know where to begin trying to test it out. <P>Also they say "whatever you do, don't install our software on a server that has anything else running on it, because we might completely scorch anything that isn't ours." Confidence-inspiring! <P>Even more confidence-inspiring: <I>"A user you've blocked has previously contributed to this repository: <u>Claude</u>".</I> So it's slopware, too. <P>I am now soliciting suggestions. Please give me <I>non-terrible</I> suggestions. <P><B>What I am seeking:</B> <P><ul> <li> Create and organize sets of documents. </li><li> Create tasks and assign them to people. </li><li> Sometimes with due dates. </li><li> In both of these things, edit text, with basic styling and inlined images, WYSIWYG, including from a phone. </li><li> Attach things like PDFs. </li><li> 100% locally hosted. </li><li> Not paying a monthly fee to an <A HREF="https://jakelazaroff.com/words/dhh-is-way-worse-than-i-thought/">unhinged fascist</A> to keep my files on their computer. </li></ul> <P><B>What I don't care about: Anything not on that list, including but not limited to:</B> <P><ul><li> <tt>git</tt>; </li><li> Markdown; </li><li> AWS buckets; </li><li> Dropbox; </li><li> Learning what business-brain buzzwords like "Gantt" or "Scrum" mean. </li></ul> <P><B>Things that should not need to be said but do:</B> <P><ul><li> Do not suggest software that you do not use. </li><li> Do not just Google it for me. </li></ul> <P><A HREF="https://www.jwz.org/blog/2025/10/basecamp-alternative/">Previously</A>, <A HREF="https://www.jwz.org/blog/2024/06/modern-web-technologies/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/04/still-seeking-basecamp-alternative/feed/</wfw:commentRss>
			<slash:comments>39</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2024/comments/1dd6a28f022908d-1.png" width="1202" height="884" length="1426128" type="image/png"/>
	</item>
		<item>
		<title>Popup video</title>
		<link>https://www.jwz.org/blog/2026/04/popup-video-2/</link>
					<comments>https://www.jwz.org/blog/2026/04/popup-video-2/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Fri, 10 Apr 2026 22:30:45 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mpegs]]></category>
		<category><![CDATA[phones]]></category>
		<category><![CDATA[www]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk6C</guid>

					<description><![CDATA[Last year I wrote popup-video.js, a Google-surveillance-defeating YouTube player. You may have noticed it in action on the DNA Lounge calendar pages and galleries but I've made some improvements recently.

The web page contains only a locally-hosted thumbnail. Nothing from ...]]></description>
										<content:encoded><![CDATA[<DIV STYLE="text-align: center; width: 30%; max-width: 400px; margin: 0 0 1em 1em; float: right;"><A HREF="https://www.jwz.org/hacks/#popup-video"><VIDEO STYLE="width: 100%; height: auto; border: 1px solid; margin-bottom: 0.5em" LOOP AUTOPLAY PLAYSINLINE MUTED WIDTH="400" HEIGHT="268"><SOURCE SRC="https://cdn.jwz.org/images/scaled/mp4/2026/429ff68b7d6e10330ab1dfecdeaf8481.mp4" TYPE="video/mp4" /></VIDEO></A></DIV><A HREF="https://www.jwz.org/blog/2025/06/popup-video/">Last year</A> I wrote <A HREF="https://www.jwz.org/hacks/#popup-video">popup-video.js</A>, a Google-surveillance-defeating YouTube player. You may have noticed it in action on the <A HREF="https://www.dnalounge.com/calendar/2026/05-15d.html">DNA Lounge calendar pages</A> and <A HREF="https://www.dnalounge.com/gallery/">galleries</A> but I've made some improvements recently. <P><ul> <li> The web page contains only a locally-hosted thumbnail. Nothing from YouTube is loaded until someone clicks play. This means no surveillance trackers on every one of your pages that has a video, and also the pages load dozens fewer megabytes. <P></li><li> When you click play, a fake-window pops up inside the page with a YouTube player. <P></li><li> Clicking anywhere makes it go away. <P></li><li> There's a "minimize" button that makes it drop back down into the place where the thumbnail was and continue playing. <P></li><li> If the inline thumb is nearly as wide as the page, it plays inline instead of doing the popup thing (this is often the case on mobile). <P></li><li> It works on <A HREF="https://www.jwz.org/blog/2026/04/jwz-mixtape-258/">playlists</A> as well as single videos. <P></li><li> For single videos, it generates an <A HREF="https://www.dnalounge.com/gallery/2026/03-28/">ad-hoc playlist</A> of all of the other YouTube videos linked on the current page, so the "previous" and "next" buttons show those. <P></li><li> It works on <A HREF="https://www.jwz.org/blog/2025/10/hand-cranked-they-live-transformation/">portrait videos</A> and <A HREF="https://www.jwz.org/blog/2026/03/monarch-title-sequence/">videos with weird aspect ratios</A>. </li></ul> <P>Dear Lazyweb, <P>If you understand the ever-changing rules about auto-play, perhaps you can offer some guidance. <P>On desktop Safari, you have to click twice to get the first video to play: the YouTube player pops up but does not then auto-play, unless you have done <I>"Website settings / Allow all auto-play"</I> for jwz.org. This is -- what's the word -- <I>fucked up,</I> because the creation of the IFRAME and the sending of the "play" event all happen underneath the user's "click" event, so this <I>should</I> be considered interactive. <P>And on mobile Safari you always have to click twice. <P>(I don't remember what the situation is on Chrome or Firefox on account of not caring.) <P><I>Anyway,</I> if you know how to make it play with one click instead of two, I would like to know how to do that. Your suggestion should take the form of, "Here's a modified version of your JS file that works". Your <I>speculation</I> is acknowledged and ignored. <P><A HREF="https://www.jwz.org/blog/2025/06/popup-video/">Previously</A>, <A HREF="https://www.jwz.org/blog/2024/06/the-ever-changing-rules-about-autoplay-2/">previously</A>, <A HREF="https://www.jwz.org/blog/2019/01/the-ever-changing-rules-about-autoplay/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/04/popup-video-2/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2026/429ff68b7d6e10330ab1dfecdeaf8481.gif" width="400" height="268" length="259671" type="image/gif"/>
	</item>
		<item>
		<title>I just like saying &quot;Dicks Rewards&quot;</title>
		<link>https://www.jwz.org/blog/2026/04/i-just-like-saying-dicks-rewards/</link>
					<comments>https://www.jwz.org/blog/2026/04/i-just-like-saying-dicks-rewards/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Fri, 10 Apr 2026 18:25:39 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[corporations]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[spam]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk58</guid>

					<description><![CDATA[So what is with all of this amateurish phishing spam that has been sliding right past SpamAssassin like shit through a goose for the past few months? Has someone recently discovered a new technique for finding open relays that will SPF-sign anything?

Received: from ...]]></description>
										<content:encoded><![CDATA[<DIV STYLE="text-align: center; width: 35%; max-width: 25em; margin: 0 0 1em 1em; float: right; overflow-x: hidden; overflow-y: auto; max-height: 28em"><A HREF="https://cdn.jwz.org/images/2026/spam.jpg" data-size="500x13574"><IMG SRC="https://cdn.jwz.org/images/2026/spam.jpg" WIDTH=500 HEIGHT=13574 STYLE="width: 100%; height: auto; border: 1px solid; margin-bottom: 0.5em" SRCSET="https://cdn.jwz.org/images/2026/spam.jpg 500w, https://cdn.jwz.org/images/scaled/360/2026/spam.jpg 360w" SIZES="(max-width: 660px) 35vw, 26em" LOADING="lazy" data-size="500x13574"></A></DIV> So what is <I>with</I> all of this amateurish phishing spam that has been sliding right past SpamAssassin like shit through a goose for the past few months? Has someone recently discovered a new technique for finding open relays that will SPF-sign anything? <P><blockquote STYLE="margin: 1em 0 1em 1.5em; padding: 0.75em 0.5em 0.75em 1em; border: 1px solid; border-left: 4px solid;"><tt style="font-size:7pt"><B>Received:</B> from mail.vividdreamqb.name (milestone.clevervistakb.com &#x5B;170.130.167.11&#x5D;)<BR> <B>From:</B> Dicks Rewards Team &lt;dicksp0@vividdreamqb.name&gt;<BR> <B>Subject:</B> Final notice: YETI Beach Lounge Wagon unlocked by your gear score<BR> <B>Message-ID:</B> &lt;RUxA2tTL-gy3-hDiWXM33jfhjh3zp@vividdreamqb.name&gt;<BR> <B>X-Request-ID:</B> d36d3311-8a4b-4ac9-91b0-4afeee106923<BR> <B>Feedback-ID:</B> jhkmk:vividdreamqb.name:mail<br> <b>X-Spam-Report: </b><BR> &nbsp; &nbsp; &#x2A; 0.0 HTML_MESSAGE BODY: HTML included in message<BR> &nbsp; &nbsp; &#x2A; 0.4 KHOP_HELO_FCRDNS Relay HELO differs from its IP's reverse DNS</tt></blockquote> <P>I can't even tell who has been popped here. "clevervistakb.com" and "vividdreamqb.name" have the same IPs but different registrars (maybe that's a TLD thing?) It's also not clear to me which of those domains <tt>sender_access</tt> matches on. <P>I have, however, come to the conclusion that that there are simply too many web sites. <P><A HREF="https://www.jwz.org/blog/2026/04/sms-chatbots-are-going-great/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/12/today-in-google-broke-email-2/">previously</A>, <A HREF="https://www.jwz.org/blog/2025/03/opendmarc-redux/">previously</A>, <A HREF="https://www.jwz.org/blog/2025/03/spam-pro-tip/">previously</A>, <A HREF="https://www.jwz.org/blog/2025/02/im-clicking-a-cow-4/">previously</A>, <A HREF="https://www.jwz.org/blog/2025/02/im-clicking-a-cow-3/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/09/ses-or-staring-down-the-dragon/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/02/spamnesty/">previously</A>, <A HREF="https://www.jwz.org/blog/2023/11/theres-a-real-epidemic-of-dead-moms-out-there-be-careful-everybody/">previously</A>, <A HREF="https://www.jwz.org/blog/2020/12/instagram-where-security-is-job-1-1a/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/04/i-just-like-saying-dicks-rewards/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2026/spam.jpg" width="500" height="13574" length="1788080" type="image/jpeg"/>
	</item>
		<item>
		<title>GLES 1.x transparency</title>
		<link>https://www.jwz.org/blog/2026/03/gles-1-x-transparency/</link>
					<comments>https://www.jwz.org/blog/2026/03/gles-1-x-transparency/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 05:48:50 +0000</pubDate>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[phones]]></category>
		<category><![CDATA[xscreensaver]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk5Y</guid>

					<description><![CDATA[Dear Lazyweb, why doesn't alpha blending work when lighting is enabled on Android? Transparency works with glColor but not with glMaterial.

GL_VERSION in the Android simulator is "OpenGL ES-CM 1.1 (4.1 Metal - 88.1)".

This works fine on iOS and Cocoa, so it's not strictly ...]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, why doesn't alpha blending work when lighting is enabled on Android? Transparency works with <tt>glColor</tt> but not with <tt>glMaterial</tt>. <P><tt>GL_VERSION</tt> in the Android simulator is "OpenGL ES-CM 1.1 (4.1 Metal - 88.1)". <P>This works fine on iOS and Cocoa, so it's not strictly a GLES thing, just Android. GLSL is not involved. <P>Test case: <P><pre style="border:1px solid; padding: 1em; margin: 1em; font-size: smaller; overflow: auto; max-height: 10em;">Bool lights_p = time(0) &amp; 1; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable (GL_BLEND); glDisable (GL_COLOR_MATERIAL); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #define glColor4fv(v) glColor4f (v[0], v[1], v[2], v[3]) GLfloat c1[] = { 1, 0, 0, 0.5 }; GLfloat c2[] = { 0, 1, 0, 0.5 }; GLfloat v[] = { 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, }; glVertexPointer (3, GL_FLOAT, 0, v); glEnableClientState (GL_VERTEX_ARRAY); if (lights_p) { GLfloat amb[] = {0.5, 0.5, 0.5, 1}; glLightfv (GL_LIGHT0, GL_AMBIENT, amb); glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); glColor3f (0, 0, 0); } else { glDisable (GL_LIGHTING); glDisable (GL_LIGHT0); } if (lights_p) glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1); else glColor4fv (c1); glDrawArrays (GL_TRIANGLES, 0, 6); glPushMatrix(); glTranslatef (0.5, 0.25, 0); if (lights_p) glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2); else glColor4fv (c2); glDrawArrays (GL_TRIANGLES, 0, 6); glPopMatrix(); glDisableClientState (GL_VERTEX_ARRAY); glVertexPointer (3, GL_FLOAT, 0, 0);</pre>]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/03/gles-1-x-transparency/feed/</wfw:commentRss>
			<slash:comments>20</slash:comments>
		
		
			</item>
		<item>
		<title>Google Pass, redux</title>
		<link>https://www.jwz.org/blog/2026/03/google-pass-redux/</link>
					<comments>https://www.jwz.org/blog/2026/03/google-pass-redux/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sat, 21 Mar 2026 20:05:00 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[corporations]]></category>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[phones]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk45</guid>

					<description><![CDATA[Dear Lazyweb,

Four years ago I asked whether "Google Pass" was a thing that I needed to give a shit about and consensus was, "no, nobody uses that." But I have heard anecdotally, recently, that this might no longer be true. Thoughts?

The goal here is, "reduce the amount of ]]></description>
										<content:encoded><![CDATA[<DIV STYLE="text-align: center; width: 30%; max-width: 640px; margin: 0 0 1em 1em; float: right;"><A HREF="https://cdn.jwz.org/images/2016/passbook.png" data-size="640x1136"><IMG SRC="https://cdn.jwz.org/images/2016/passbook.png" WIDTH=640 HEIGHT=1136 STYLE="width: 100%; height: auto; border: 1px solid; margin-bottom: 0.5em" SRCSET="https://cdn.jwz.org/images/2016/passbook.png 640w, https://cdn.jwz.org/images/scaled/360/2016/passbook.png 360w" SIZES="(max-width: 660px) 30vw, 22em" LOADING="lazy" data-size="640x1136"></A></DIV>Dear Lazyweb, <P>Four years ago I <A HREF="https://www.jwz.org/blog/2022/07/google-pass/">asked whether "Google Pass" was a thing that I needed to give a shit about</A> and consensus was, "no, nobody uses that." But I have heard anecdotally, recently, that this might no longer be true. Thoughts? <P>The goal here is, "reduce the amount of time it takes for someone standing in front of my nightclub to wave their QR code at the door staff." On iOS, Apple Wallet supports that goal very well. <P>Note: I don't use Android and know as little about its ecosystem as possible, so please use small words. <P><A HREF="https://www.jwz.org/blog/2022/07/google-pass/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/02/your-personal-information-is-very-important-to-us-part-four/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/11/your-personal-information-is-very-important-to-us-part-three/">previously</A>, <A HREF="https://www.jwz.org/blog/2020/01/apples-war-on-their-developers-continues-apace/">previously</A>, <A HREF="https://www.jwz.org/blog/2022/04/qr-scanning/">previously</A>, <A HREF="https://www.jwz.org/blog/2016/01/apple-pass-push-notifications/">previously</A>, <A HREF="https://www.jwz.org/blog/2021/04/apple-pay-and-google-pay/">previously</A>, <A HREF="https://www.jwz.org/blog/2021/04/google-pay/">previously</A>, <A HREF="https://www.jwz.org/blog/2019/07/apple-pay-is-a-dumpster-fire/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/03/google-pass-redux/feed/</wfw:commentRss>
			<slash:comments>125</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2016/passbook.png" width="640" height="1136" length="143384" type="image/png"/>
	</item>
		<item>
		<title>macOS 26 guest user</title>
		<link>https://www.jwz.org/blog/2026/03/macos-26-guest-user/</link>
					<comments>https://www.jwz.org/blog/2026/03/macos-26-guest-user/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sun, 15 Mar 2026 10:33:55 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mac]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk4f</guid>

					<description><![CDATA[Dear Lazyweb,

Back in the heady days of macOS 14, you could customize the default reset-to environment of the "guest" user (Safari bookmarks, items on Dock, etc.) by copying stuff into "/System/Library/User Template/English.lproj/". And of course macOS 26 seems to have ...]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, <P>Back in the heady days of macOS 14, you could customize the default reset-to environment of the "guest" user (Safari bookmarks, items on Dock, etc.) by copying stuff into <tt>"/System/Library/User Template/English.lproj/"</tt>. And of course macOS 26 seems to have completely fucked this. How do you accomplish this now? <P><A HREF="https://www.jwz.org/blog/2025/04/great-moments-in-sorting-2/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/04/apple-is-still-the-heavyweight-champion-of-progress-bar-lies/">previously</A>, <A HREF="https://www.jwz.org/blog/2025/01/i-hate-you-milkman-apple/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/09/maybe-later-intensifies/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/05/great-moments-in-sorting/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/04/fucking-apple-8/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/06/ds_store/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/03/macos-26-guest-user/feed/</wfw:commentRss>
			<slash:comments>20</slash:comments>
		
		
			</item>
		<item>
		<title>Linux Xft Unicode fonts</title>
		<link>https://www.jwz.org/blog/2026/03/linux-xft-unicode-fonts/</link>
					<comments>https://www.jwz.org/blog/2026/03/linux-xft-unicode-fonts/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Mon, 02 Mar 2026 20:11:33 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[xscreensaver]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk39</guid>

					<description><![CDATA[Dear Lazyweb, can someone show me a straightforward example of an X11 program calling XftDrawStringUtf8 that succeeds in displaying Japanese characters? On Debian 13 with "fonts-noto" installed, "lxterminal" can do it but XScreenSaver still can't seem to display anything ...]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, can someone show me a straightforward example of an X11 program calling <tt>XftDrawStringUtf8</tt> that succeeds in displaying Japanese characters? On Debian 13 with "fonts-noto" installed, "lxterminal" can do it but XScreenSaver still can't seem to display anything more complicated than Cyrillic. <P>E.g. <tt>"unicrud --block Katakana"</tt>. <P> The actual XFT font I get from <tt>XftFontOpenXlfd("-&#x2A;-sans serif-bold-r-&#x2A;-&#x2A;-&#x2A;-180-&#x2A;-&#x2A;-&#x2A;-&#x2A;-&#x2A;-&#x2A;")</tt> is <P><pre style="font-size:smaller; max-height: 10em; overflow: auto; border: 1px solid; padding: 1em; margin: 1em">Noto Sans-300 :familylang=en :style=Bold :stylelang=en :fullname=Noto Sans Bold :fullnamelang=en :slant=0 :weight=200 :width=100 :pixelsize=401.899 :foundry=GOOG :antialias=True :hintstyle=1 :hinting=True :verticallayout=False :autohint=False :globaladvance=True :file=/usr/share/fonts/truetype/noto/NotoSans-Bold.ttf :index=0 :outline=True :scalable=True :dpi=96.4557 :rgba=5 :scale=1 :minspace=False :fontversion=131334 :capability=otlayout\:DFLT otlayout\:cyrl otlayout\:grek otlayout\:latn :fontformat=TrueType :embolden=False :embeddedbitmap=True :decorative=False :lcdfilter=1 :namelang=en :prgname=unicrud :postscriptname=NotoSans-Bold :color=False :symbol=False :variable=False :fonthashint=True :order=0 :namedinstance=False :fontwrapper=SFNT</pre> <P><A HREF="https://www.jwz.org/blog/2021/02/x11-fonts/">Previously</A>, <A HREF="https://www.jwz.org/blog/2022/09/fix-it-with-eyes-unicode-edition/">previously</A>, <A HREF="https://www.jwz.org/blog/2018/07/just-gonna-leave-this-regexp-here/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/03/linux-xft-unicode-fonts/feed/</wfw:commentRss>
			<slash:comments>42</slash:comments>
		
		
			</item>
		<item>
		<title>Let Friction Ring</title>
		<link>https://www.jwz.org/blog/2026/02/let-friction-ring/</link>
					<comments>https://www.jwz.org/blog/2026/02/let-friction-ring/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Fri, 27 Feb 2026 18:55:15 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[toys]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk33</guid>

					<description><![CDATA[Dear Lazyweb,

I have this pulley wheel, 50mm inside diameter, 4mm groove. I need a rubber traction ring to go inside it. I cannot find anyone who will sell this to me.

The ring must be flat or concave, not round like a typical gasket seal O-ring, or the string its pulling ...]]></description>
										<content:encoded><![CDATA[<DIV STYLE="text-align: center; width: 35%; max-width: 1800px; margin: 0 0 1em 1em; float: right;"><A HREF="https://cdn.jwz.org/images/2026/curtainwheel.jpg" data-size="1800x2400"><IMG SRC="https://cdn.jwz.org/images/scaled/768/2026/curtainwheel.jpg" WIDTH=1800 HEIGHT=2400 STYLE="width: 100%; height: auto; border: 1px solid; margin-bottom: 0.5em" SRCSET="https://cdn.jwz.org/images/2026/curtainwheel.jpg 1800w, https://cdn.jwz.org/images/scaled/1280/2026/curtainwheel.jpg 1280w, https://cdn.jwz.org/images/scaled/1024/2026/curtainwheel.jpg 1024w, https://cdn.jwz.org/images/scaled/768/2026/curtainwheel.jpg 768w, https://cdn.jwz.org/images/scaled/640/2026/curtainwheel.jpg 640w, https://cdn.jwz.org/images/scaled/360/2026/curtainwheel.jpg 360w" SIZES="(max-width: 660px) 35vw, 26em" LOADING="lazy" data-size="1800x2400"></A></DIV>Dear Lazyweb, <P>I have <A HREF="https://www.amazon.com/gp/product/B07C779WWY">this pulley wheel</A>, 50mm inside diameter, 4mm groove. I need a rubber traction ring to go inside it. I cannot find anyone who will sell this to me. <P>The ring must be <I>flat</I> or <I>concave</I>, not <I>round</I> like a typical gasket seal O-ring, or the string its pulling will just slide off the track. <P>Alternately, any similar-sized metal pulley wheel that comes with a friction surface pre-attached, 8mm axis hole with set screw. <P>I have tried coating it with sugru, but that is too soft and wears off after not-very-long. <P><BR><B>Update:</B> If you're going to say <I>"why don't you just"</I> or <I>"have you searched for"</I> without a purchase link to a product of the correct size, please know that you are not helping. <P><BR><A HREF="https://www.jwz.org/blog/2016/10/seeking-electric-motor-for-serious-relationship/">Previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/02/let-friction-ring/feed/</wfw:commentRss>
			<slash:comments>115</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2026/curtainwheel.jpg" width="1800" height="2400" length="79958" type="image/jpeg"/>
	</item>
		<item>
		<title>YouTube Oauth API fuckery</title>
		<link>https://www.jwz.org/blog/2026/02/youtube-oauth-api-fuckery/</link>
					<comments>https://www.jwz.org/blog/2026/02/youtube-oauth-api-fuckery/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Tue, 24 Feb 2026 19:08:53 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[corporations]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[www]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk3r</guid>

					<description><![CDATA[Dear Lazyweb,

I have two YouTube accounts, jwz and dnalounge, and I'm using the oauth API with both of them to automate uploads and stuff. With the DNA account, I am getting a refresh_token that lasts forever. But with the jwz one, I am getting a refresh_token that can only ]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, <P>I have two YouTube accounts, jwz and dnalounge, and I'm using the oauth API with both of them to automate uploads and stuff. With the DNA account, I am getting a <tt>refresh_token</tt> that lasts forever. But with the jwz one, I am getting a <tt>refresh_token</tt> that can only refresh the <tt>access_token</tt> for a week, and then I have to log in again. Any ideas what fuckery is afoot? <P>The DNA token does this: <P><pre style="border: 1px solid; padding: 1px; margin: 1px; overflow: auto; max-height: 10em;">GET https&#x3A;//www.googleapis.com/oauth2/v1/tokeninfo?access_token=<I><U>DNA_ACCESS_TOKEN_1</U></I> => access_type&#9;=> "offline", audience&#9;=> "<i><u>DNA_PROJECT_ID</u></i>.apps.googleusercontent.com", expires_in&#9;=> 3574, issued_to&#9;=> "<i><u>DNA_PROJECT_ID</u></i>.apps.googleusercontent.com", scope &#9;=> "https&#x3A;//www.googleapis.com/auth/youtube" POST https&#x3A;//accounts.google.com/o/oauth2/token client_id&#9;=> "<i><u>DNA_PROJECT_ID</u></i>.apps.googleusercontent.com", client_secret&#9;=> "<I><U>DNA_CLIENT_SECRET</U></I>", grant_type&#9;=> "refresh_token", refresh_token&#9;=> "<I><U>DNA_REFRESH_TOKEN</U></I>" result: access_token&#9;=> "<I><U>DNA_ACCESS_TOKEN_2</U></I>", expires_in&#9;=> 3599, scope &#9;=> "https&#x3A;//www.googleapis.com/auth/youtube", token_type&#9;=> "Bearer" token expiration 0:00:59:34 => 0:00:59:59</pre> <P>but the jwz token does this: <P><pre style="border: 1px solid; padding: 1px; margin: 1px; overflow: auto; max-height: 10em;">GET https&#x3A;//www.googleapis.com/oauth2/v1/tokeninfo?access_token=<I><U>JWZ_ACCESS_TOKEN_1</U></I> => access_type&#9;=> "offline", audience&#9;=> "<I><U>JWZ_PROJECT_ID</U></I>.apps.googleusercontent.com", expires_in&#9;=> 3413, issued_to&#9;=> "<I><U>JWZ_PROJECT_ID</U></I>.apps.googleusercontent.com" scope &#9;=> "https&#x3A;//www.googleapis.com/auth/youtube", POST https&#x3A;//accounts.google.com/o/oauth2/token client_id&#9;=> "<I><U>JWZ_CLIENT_ID</U></I>", client_secret&#9;=> "<I><U>JWZ_CLIENT_SECRET</U></I>", grant_type&#9;=> "refresh_token", refresh_token&#9;=> "<I><U>JWZ_REFRESH_TOKEN</U></I>" result: access_token&#9;=> "<I><U>JWZ_ACCESS_TOKEN_2</U></I>", expires_in&#9;=> 3599, refresh_token_expires_in&#9;=> 201701 scope &#9;=> "https&#x3A;//www.googleapis.com/auth/youtube", token_type&#9;=> "Bearer", token expiration 0:00:56:53 => 0:00:59:59 refresh expires in 2:00:01:41</pre> <P>Maybe I'm logging in wrong? I log in with user/pass/TOTP "jwz@jwz.org" which takes me to the channel <A HREF="https://www.youtube.com/yesthatjwz">"@yesthatjwz"</A> then I load: <P><tt style="font-size:smaller">https&#x3A;//accounts.google.com/o/oauth2/auth<WBR>?client_id=<I><U>JWZ_PROJECT_ID</U></I>.<wbr>apps.googleusercontent.com<wbr>&amp;redirect_uri=https&#x3A;//localhost<wbr>&amp;response_type=code<wbr>&amp;scope=https&#x3A;//www.googleapis.com/auth/youtube<wbr>&amp;access_type=offline</tt> <P>and it asks me to choose my "brand" account. There are three listed: <A HREF="https://www.youtube.com/dnalounge">"DNA Lounge"</A>, <A HREF="https://www.youtube.com/yesthatjwz">"yesthatjwz"</A>, and another "jwz" account. The selection that works is the "yestthatjwz" one. The mystery account is <A HREF="https://www.youtube.com/@alsojwz1853">@alsojwz1853</A> and I don't know why it exists but I'm afraid to delete it in case that breaks something. <P>When I sign in with "jwz@jwz.org", it takes me directly to my real channel, @yesthatjwz. <P>When I sign in with: "yesthatjwz" or "youtube@jwz.org" or "yesthatjwz@jwz.org", it asks me to select a channel: @yesthatjwz or "also jwz" @alsojwz1853. <P>Trying to sign in with "alsojwz1853" says "could not find your account". <P>Another clue: both the "DNA Lounge" and "yesthatjwz" accounts work with or without at-signs, <tt>/dnalounge</tt>, <tt>/@dnalounge</tt>, <tt>/yesthatjwz</tt> and <tt>/@yesthatjwz</tt>, but the other one only works as <tt>/@alsojwz1853</tt>, not as <tt>/alsojwz1853</tt>. Maybe because they are old accounts that pre-date YouTube being purchased by Google? Another difference is that the thing in <tt> console.cloud.google.com/<wbr>auth/<wbr>clients/<wbr><I><U>&#x2A;_PROJECT_ID</U></I></tt> for DNA is an "iOS client" created in 2014, but for "jwz" is a "Desktop client" created in 2024. There don't seem to be <I>any</I> settings. <P>But I still don't understand why the DNA and jwz accounts have different behavior. <P><A HREF="https://www.jwz.org/blog/2015/04/youtube-has-finally-destroyed-their-rss-feeds/">Previously</A>, <A HREF="https://www.jwz.org/blog/2023/05/dropbox-fuckery/">previously</A>, <A HREF="https://www.jwz.org/blog/2014/09/youtube-api-pl/">previously</A>, <A HREF="https://www.jwz.org/blog/2013/08/oauth-of-fealty/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/02/youtube-oauth-api-fuckery/feed/</wfw:commentRss>
			<slash:comments>32</slash:comments>
		
		
			</item>
		<item>
		<title>Remote</title>
		<link>https://www.jwz.org/blog/2026/02/remote/</link>
					<comments>https://www.jwz.org/blog/2026/02/remote/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Tue, 17 Feb 2026 08:29:26 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mac]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk3k</guid>

					<description><![CDATA[Dear Layzweb, what is the modern best way to remote desktop a Mac from a Mac through an ssh tunnel? I have had just about enough of NoMachine's bullshit. Not interested in anything that involves some Clown intermediary.]]></description>
										<content:encoded><![CDATA[Dear Layzweb, what is the modern best way to remote desktop a Mac from a Mac through an ssh tunnel? I have had just about enough of NoMachine's bullshit. Not interested in anything that involves some Clown intermediary.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/02/remote/feed/</wfw:commentRss>
			<slash:comments>49</slash:comments>
		
		
			</item>
		<item>
		<title>SVG triangulation</title>
		<link>https://www.jwz.org/blog/2026/02/svg-triangulation/</link>
					<comments>https://www.jwz.org/blog/2026/02/svg-triangulation/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Wed, 04 Feb 2026 02:04:01 +0000</pubDate>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[xscreensaver]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk25</guid>

					<description><![CDATA[Dear Lazyweb,

I need this SVG as a DXF, DWG or SKP with all of the polylines converted to triangular meshes. Can someone show me how, or just do it for me?

The conversion must preserve group names so that I can tell which ones are which.

Bonus level: can you find a ...]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, <P>I need <A HREF="https://commons.wikimedia.org/wiki/File:BlankMap-World-Equirectangular.svg">this SVG</A> as a DXF, DWG or SKP with all of the polylines converted to triangular meshes. Can someone show me how, or just do it for me? <P>The conversion must preserve group names so that I can tell which ones are which. <P>Bonus level: can you find a similar source map that <I>also</I> has US states? Must be equirectangular. <P><A HREF="https://www.jwz.org/blog/2024/07/null-island/">Previously</A>, <A HREF="https://www.jwz.org/blog/2024/05/geochron/">previously</A>, <A HREF="https://www.jwz.org/blog/2023/06/projection/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/02/svg-triangulation/feed/</wfw:commentRss>
			<slash:comments>27</slash:comments>
		
		
			</item>
		<item>
		<title>Zipbomb JSON</title>
		<link>https://www.jwz.org/blog/2026/01/zipbomb-json/</link>
					<comments>https://www.jwz.org/blog/2026/01/zipbomb-json/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sun, 01 Feb 2026 06:25:50 +0000</pubDate>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mad science]]></category>
		<category><![CDATA[pranks]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[www]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk2x</guid>

					<description><![CDATA[Someone who is not me should formulate a maximally-malicious JSON file. I made one with a nesting depth of ~182 million, but "jq" gives up early, at only around depth 3,000. So one trick would be to find the right balance of nesting and array length that stays under typical ...]]></description>
										<content:encoded><![CDATA[Someone who is not me should formulate a maximally-malicious JSON file. I made one with a nesting depth of ~182 million, but "jq" gives up early, at only around depth 3,000. So one trick would be to find the right balance of nesting and array length that stays under typical parsers' limits as long as possible, while requiring as much RAM as possible to get there. <P><B>Update:</B> Ok <I>fine</I>, since you have all failed me, I <a href="https://www.jwz.org/hacks/jsonbomb.pl">wrote a JSON bomb generator</a>. With a 10GB file, <tt>"jq"</tt> 1.8.1 takes a full minute to produce no output. <P><A HREF="https://www.jwz.org/blog/2024/02/harassing-botnets-with-zipbombs/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/07/i-have-glitchpegged-the-ai-bots/">previously</A>, <A HREF="https://www.jwz.org/blog/2025/10/exterminate-all-rational-ai-scrapers-redux-redux/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/01/zipbomb-json/feed/</wfw:commentRss>
			<slash:comments>34</slash:comments>
		
		
			</item>
		<item>
		<title>Re-implementing Patreon</title>
		<link>https://www.jwz.org/blog/2026/01/re-implementing-patreon/</link>
					<comments>https://www.jwz.org/blog/2026/01/re-implementing-patreon/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Thu, 29 Jan 2026 18:36:37 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[corporations]]></category>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[doomed]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk2l</guid>

					<description><![CDATA[Dear Lazyweb,

Do you have experience implementing recurring payments using authorize.net? Specifically, I'm interested in gotchas with replaying CIM tokens; best practices for retrying declines; dealing with expired cards, changed addresses, etc. Email me.

IMPORTANT: If ...]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, <P>Do you have experience implementing recurring payments using authorize.net? Specifically, I'm interested in gotchas with replaying CIM tokens; best practices for retrying declines; dealing with expired cards, changed addresses, etc. Email me. <P><B><I>IMPORTANT:</I></b> If you have never created a <tt>"create<wbr>Customer<wbr>Profile<wbr>From<wbr>Transaction<wbr>Request"</tt> XML node, this question is <b><I>not for you.</I></b> <P>I am not soliciting advice about what third party intermediary company I should pay rent to, and I don't ever want to hear the word Stripe. <P><A HREF="https://www.jwz.org/blog/2026/01/patreon-is-lying-again-and-blaming-apple-again/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/03/if-patreon-was-software-i-would-never-ever-upgrade-it/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/12/chargebacks/">previously</A>, <A HREF="https://www.jwz.org/blog/2022/06/patreon-api/">previously</A>, <A HREF="https://www.jwz.org/blog/2023/09/how-to-compete-with-patreon/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/01/re-implementing-patreon/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>iPad</title>
		<link>https://www.jwz.org/blog/2026/01/ipad/</link>
					<comments>https://www.jwz.org/blog/2026/01/ipad/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sat, 24 Jan 2026 22:33:02 +0000</pubDate>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mac]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk2S</guid>

					<description><![CDATA[My iPad is currently begging me to allow it to upgrade itself from 18 to 26. How much would I regret it if I said yes?]]></description>
										<content:encoded><![CDATA[My iPad is currently begging me to allow it to upgrade itself from 18 to 26. How much would I regret it if I said yes?]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/01/ipad/feed/</wfw:commentRss>
			<slash:comments>69</slash:comments>
		
		
			</item>
		<item>
		<title>WP remember me</title>
		<link>https://www.jwz.org/blog/2026/01/wp-remember-me/</link>
					<comments>https://www.jwz.org/blog/2026/01/wp-remember-me/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Mon, 19 Jan 2026 20:30:13 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk2J</guid>

					<description><![CDATA[Dear Lazyweb, as of recently the "remember me" checkbox on my /wp-admin/ login page is not clickable on iOS. It un-checks itself as soon as you click it. This does not happen on desktop. Any ideas?]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, as of recently the "remember me" checkbox on my /wp-admin/ login page is not clickable on iOS. It un-checks itself as soon as you click it. This does not happen on desktop. Any ideas? <P><A HREF="https://www.jwz.org/blog/2025/12/what-if-the-torment-nexus-was-fundamental-to-wordpress/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/07/popular/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/06/blocking-bogus-url-parameters/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/01/wp-remember-me/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>GPIO madness</title>
		<link>https://www.jwz.org/blog/2026/01/gpio-madness/</link>
					<comments>https://www.jwz.org/blog/2026/01/gpio-madness/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sun, 18 Jan 2026 19:24:49 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[phones]]></category>
		<category><![CDATA[retrocomputing]]></category>
		<category><![CDATA[toys]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk2F</guid>

					<description><![CDATA[Dear Lazyweb, riddle me this:

Boot Pi with HDMI monitor attached: works fine.
Boot without monitor: all GPIO inputs "flap" about once a second.
Plug in monitor: 10 seconds later, inputs start behaving normally.
Unplug monitor: remains good. Until reboot.

WTF?

Raspberry Pi ]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, riddle me this: <P><ol> <li> Boot Pi with HDMI monitor attached: works fine. </li><li> Boot without monitor: all GPIO inputs "flap" about once a second. </li><li> Plug in monitor: 10 seconds later, inputs start behaving normally. </li><li> Unplug monitor: remains good. Until reboot. </li></ol> <P>WTF? <P>Raspberry Pi 4 Model B Rev 1.5, Debian GNU/Linux 12 (bookworm) 12.11. Two different Pis, same behavior. <P>I guess I don't care <I>why</I> it wants a monitor so badly, so I tried to fake it out and convince it that one is there. Are are all of my config.txt changes: <P><pre style="border: 1px solid; padding: 1em; margin-left: 2em">#dtoverlay=vc4-kms-v3d dtoverlay=vc4-kms-v3d,noaudio max_framebuffers=2 [all] dtoverlay=disable-wifi dtoverlay=disable-bt framebuffer_width=1280 framebuffer_height=720 hdmi_force_hotplug=1 hdmi_drive=2 core_freq_min=500 core_freq=500</pre> <P>I tried adding this to commandline.txt, didn't help: <tt>video=HDMI-A-1:1920x1080M@60</tt> <P><A HREF="https://www.jwz.org/blog/2025/11/pi-4-spi-lossage/">Previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/01/gpio-madness/feed/</wfw:commentRss>
			<slash:comments>76</slash:comments>
		
		
			</item>
		<item>
		<title>fail2ban GC</title>
		<link>https://www.jwz.org/blog/2026/01/fail2ban-gc/</link>
					<comments>https://www.jwz.org/blog/2026/01/fail2ban-gc/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Thu, 08 Jan 2026 08:30:44 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[www]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk1e</guid>

					<description><![CDATA[Over the years I've accumulated thousands of fail2ban regexps. It's a performance impact. Is there some way to figure out which ones have not been hit in a while, to remove?]]></description>
										<content:encoded><![CDATA[Over the years I've accumulated thousands of fail2ban regexps. It's a performance impact. Is there some way to figure out which ones have not been hit in a while, to remove? <P><A HREF="https://www.jwz.org/blog/2025/09/fail2ban-2/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/05/user-agent-blocking/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/07/fail2ban/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/01/fail2ban-gc/feed/</wfw:commentRss>
			<slash:comments>35</slash:comments>
		
		
			</item>
		<item>
		<title>What The Fib</title>
		<link>https://www.jwz.org/blog/2026/01/what-the-fib/</link>
					<comments>https://www.jwz.org/blog/2026/01/what-the-fib/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Tue, 06 Jan 2026 21:49:53 +0000</pubDate>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[xscreensaver]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk1X</guid>

					<description><![CDATA[Every time I notice the layout of LEDs on these spotlights at the club, I cringe:

Why, why would you do that!

A square tiling makes sense. A triangular or hexagonal tiling makes more sense. A Fibonacci spiral makes the most sense. But what the absolute clustering-fuck is ...]]></description>
										<content:encoded><![CDATA[Every time I notice the layout of LEDs on these spotlights at the club, I cringe: <P><DIV STYLE="text-align: center; width: 100%; max-width: 300px; margin: 0 auto;"><A HREF="https://cdn.jwz.org/images/2026/img_4535.jpg" data-size="4032x3024"><IMG SRC="https://cdn.jwz.org/images/scaled/768/2026/img_4535.jpg" WIDTH=4032 HEIGHT=3024 STYLE="width: 100%; height: auto; border: 1px solid; margin-bottom: 0.5em" SRCSET="https://cdn.jwz.org/images/2026/img_4535.jpg 4032w, https://cdn.jwz.org/images/scaled/2048/2026/img_4535.jpg 2048w, https://cdn.jwz.org/images/scaled/1920/2026/img_4535.jpg 1920w, https://cdn.jwz.org/images/scaled/1280/2026/img_4535.jpg 1280w, https://cdn.jwz.org/images/scaled/1024/2026/img_4535.jpg 1024w, https://cdn.jwz.org/images/scaled/768/2026/img_4535.jpg 768w, https://cdn.jwz.org/images/scaled/640/2026/img_4535.jpg 640w, https://cdn.jwz.org/images/scaled/360/2026/img_4535.jpg 360w" SIZES="(max-width: 660px) 100vw, 72em" LOADING="lazy" data-size="4032x3024"></A></DIV> <P>Why, why would you do that! <P>A square tiling makes sense. A triangular or hexagonal tiling makes more sense. A Fibonacci spiral makes the most sense. But what the absolute clustering-fuck is this shit? This layout gets more cursed the more you look at it. <P><DIV ALIGN=CENTER><A HREF="https://www.jwz.org/blog/2022/01/cursed/">Previously</A>, <A HREF="https://www.jwz.org/blog/2023/06/projection/">previously</A>, <A HREF="https://www.jwz.org/blog/2021/04/cursed-computer-iceberg/">previously</A>, <A HREF="https://www.jwz.org/blog/2021/03/cursed-keyboard-image/">previously</A>.</DIV>]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2026/01/what-the-fib/feed/</wfw:commentRss>
			<slash:comments>34</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2026/img_4535.jpg" width="4032" height="3024" length="918401" type="image/jpeg"/>
	</item>
		<item>
		<title>Today in &quot;Google broke email&quot;</title>
		<link>https://www.jwz.org/blog/2025/12/today-in-google-broke-email-2/</link>
					<comments>https://www.jwz.org/blog/2025/12/today-in-google-broke-email-2/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Mon, 29 Dec 2025 20:40:36 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[corporations]]></category>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[doomed]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[spam]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk1C</guid>

					<description><![CDATA[I have just learned that, beginning in 3 days, my employees will no longer be able to receive their work email.

Apparently Google is dropping support for Gmail accounts being able to fetch mail from outside accounts. At all. And they announced this change less than 60 days ...]]></description>
										<content:encoded><![CDATA[<IMG SRC="https://cdn.jwz.org/images/2017/multipart.png" STYLE="width: 30%; height: auto; max-width: 615px; max-height: 297px; border: 0; box-sizing: border-box; margin: 0 0 1em 1em; float: right; clear: right;" SRCSET="https://cdn.jwz.org/images/2017/multipart.png 615w, https://cdn.jwz.org/images/scaled/360/2017/multipart.png 360w" SIZES="(max-width: 660px) 30vw, 22em" LOADING="lazy" data-size="615x297" WIDTH="615" HEIGHT="297"> I have just learned that, beginning in 3 days, my employees will no longer be able to receive their work email. <P>Apparently Google is <A HREF="https://www.forbes.com/sites/daveywinder/2025/10/03/gmail-says-it-wont-deliver-insecure-email-from-january-2026/">dropping support</A> for Gmail accounts being able to fetch mail from outside accounts. At all. And they <A HREF="https://support.google.com/mail/answer/16604719">announced</A> this change less than 60 days ago. (The announcement was in the basement, stairs, leopard, etc.) <P>What I want to accomplish is simple: <P><ol> <li> When email arrives for <B>employee@dnalounge.com</B>, have it delivered to the inbox of <B>dna_employee@gmail.com</B>. </li><li> When that employee is logged into that gmail account, have them able to send email with <B>employee@dnalounge.com</B> in the From: header. </li></ol> <P>This cannot be accomplished by simply having <b>mail.dnalounge.com</b> forward messages for <B>employee@dnalounge.com</B> to <B>dna_employee@gmail.com</B> because SPF destroyed email forwarding. Specifically: <P><ol> <li> <B>customer@example.com</B> sends mail to <B>employee@dnalounge.com</B>. </li><li> The SPF record of <b>example.com</b> includes <tt>"-all"</tt> (strict) as is now common. </li><li> <b>mail.dnalounge.com</b> forwards that messages to <B>dna_employee@gmail.com</B>. </li><li> Gmail says, <I>"example.com does not permit dnalounge.com to send email on their behalf"</I> and rejects it with "550 SPF hard fail". </li></ol> <P>My current email flow is this: <P><ol> <li> Inbound mail: <ol type="A"> <li> Email for <B>employee@dnalounge.com</B> arrives at my server. </li><li> Message is stored in my server's Dovecot/Maildir. </li><li> <B>dna_employee@gmail.com</B> has <I>"Import emails from my other account (POP3)"</I> selected, and Gmail has a saved plaintext copy of their <b>mail.dnalounge.com</b> email password to accomplish this. </li><li> Gmail polls and downloads their email over POP3 every 30-90 minutes, sometimes longer. <b><I>&larr;&nbsp;This is the thing that is going away.</I></b> </li><li> Gmail runs their aggressive spam filtering on that, and puts some subset of it into their Gmail inbox. <P></li></ol> </li><li> Outbound mail: <ol type="A" start=6> <li> <B>dna_employee@gmail.com</B> has its outgoing From address configured as <B>employee@dnalounge.com</B> (via <I>"Add another email address"</I>). </li><li> When they use Gmail to send mail from their <B>employee@dnalounge.com</B> address, Gmail delivers it to <b>mail.dnalounge.com</b>, authenticating with the saved plaintext copy of the employee's <b>mail.dnalounge.com</b> password. </li><li> <b>mail.dnalounge.com</b> delivers it to <B>customer@example.com</B>, so the SPF record matches <b>mail.dnalounge.com</b> as the origin (and I don't have to have my SPF record say <I>"any spammer on gmail.com is allowed to send mail pretending to be any dnalounge.com address."</I>). </li></ol> </li></ol> <P>The <A HREF="https://www.forbes.com/sites/daveywinder/2025/10/03/gmail-says-it-wont-deliver-insecure-email-from-january-2026/">linked article</A> says "Gmail will continue to support IMAP" which sounds like: "Gmail can still poll your server to download email, you just have to switch from POP to IMAP". That would be fine if it were true, but it is not. Gmail does not and has never supported importing email via IMAP into the Gmail MDA/MTA. It only supports adding an IMAP server as a second account in the MUA, which is not the same thing at all. <P>Now that Google is removing the ability to have Gmail poll my server to download messages, what are my options? <P>Here are some things that people will suggest that are unacceptable: <P><ol> <li> Have the dnalounge.com MX record point to some Google thing and let them take over 100% of my company's email. Fuck no. Also it wouldn't integrate with our internal systems, store, transactional emails, bounce processing, etc. <P></li><li> Have my employees' official business email addresses end in @gmail.com. Obviously no. (Maybe @aol.com though.) <P></li><li> Use "Sender Rewriting Scheme" to have dnalounge.com rewrite <B>customer@example.com</B> to <B><u>customer%example.com</u>@dnalounge.com</B> before forwarding it to <B>dna_employee@gmail.com</B>, which is insane, but also will cause any forwarded spam to be tallied against dnalounge.com and Google will just stop delivering them. At some point, <A HREF="https://support.google.com/mail/answer/175365?hl=en">Google's "best practices for forwarding" document</A> specifically dis-recommended SRS. <P></li><li> Find some other third-party email provider that still offers the POP3-download service that Gmail used to, and tell my staff, "Great news everybody! You have to switch from Gmail to Hotmail now." </li></ol> <P>So the only options that I think I have left are: <P><ol start=5> <li> Self-host IMAP. <ol type="A"> <li> Every employee gets their own IMAP account, hosted on my own server. </li><li> They can add that account to the Gmail mobile app or whatever, as a second IMAP account that is not Gmail. Which is apparently still supported. For now. </li><li> My server is now responsible for storing all of their messages, including all of their spam. It is a vast amount of data. I will have to implement quotas. </li><li> My employees will be wasting a bunch of time trying to find and delete emails with the same giant attachment in each of the 30 messages in the same thread, and if they don't, mail to them will bounce. </li><li> "I can't find that old email any more" is a conversation that we will be having all the time. </li><li> My employees will be receiving <I>way</I> more spam, since Gmail's spam filtering is (presumably?) still more effective than what I can accomplish with some stock set of spamassassin rules. </li></ol> <P></li><li> Walk North until I reach the nearest fjord, board an ice floe, lie down, and wait for my bones to turn to dust. The ocean will sequester my carbon. I hope this email does not find you. </li></ol> <P>Do I have other options? <P>In summary, everything is terrible. <P><A HREF="https://www.jwz.org/blog/2022/08/today-in-google-broke-email/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/12/today-in-email-hegemony-2/">previously</A>, <A HREF="https://www.jwz.org/blog/2025/03/dmarc-and-spf/">previously</A>, <A HREF="https://www.jwz.org/blog/2025/01/new-gmail-war-crime-spotted-in-the-wild/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/09/ses-or-staring-down-the-dragon/">previously</A>, <A HREF="https://www.jwz.org/blog/2024/02/spamnesty/">previously</A>, <A HREF="https://www.jwz.org/blog/2022/09/the-oligopoly-has-won/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/12/today-in-google-broke-email-2/feed/</wfw:commentRss>
			<slash:comments>196</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2017/multipart.png" width="615" height="297" length="27614" type="image/png"/>
	</item>
		<item>
		<title>XQuartz EGL</title>
		<link>https://www.jwz.org/blog/2025/12/xquartz-egl-2/</link>
					<comments>https://www.jwz.org/blog/2025/12/xquartz-egl-2/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Mon, 15 Dec 2025 01:58:39 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[retrocomputing]]></category>
		<category><![CDATA[xscreensaver]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk0d</guid>

					<description><![CDATA[Dear Lazyweb,

Some time in the last ~6 months, eglCreatePlatformWindowSurface vanished from the libraries provided by MacPorts "mesa". Where do I find it? It is not in libGL and there is no libEGL.

macOS 14.7.7, mesa 25.3.1, xorg-libX11 1.8.12.]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, <P>Some time in the last ~6 months, <tt>eglCreatePlatformWindowSurface</tt> vanished from the libraries provided by MacPorts "mesa". Where do I find it? It is not in <TT>libGL</TT> and there is no <tt>libEGL</tt>. <P>macOS 14.7.7, mesa 25.3.1, xorg-libX11 1.8.12. <P><A HREF="https://www.jwz.org/blog/2025/07/xquartz-egl/">Previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/12/xquartz-egl-2/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Under Attack, Please Stand By</title>
		<link>https://www.jwz.org/blog/2025/12/under-attack-please-stand-by-2/</link>
					<comments>https://www.jwz.org/blog/2025/12/under-attack-please-stand-by-2/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Fri, 12 Dec 2025 15:26:16 +0000</pubDate>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[doomed]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[www]]></category>
		<guid isPermaLink="false">https://jwz.org/b/yk0T</guid>

					<description><![CDATA[Since yesterday my server has again been getting absolutely obliterated by AI scrapers. This time, though, load is below 1, but I'm getting up to 10 requests a second and all of my Apache workers are in state "R". "apachectl restart" fixes it... for a while. And fail2ban is ...]]></description>
										<content:encoded><![CDATA[<DIV STYLE="text-align: center; width: 35%; max-width: 900px; margin: 0 0 1em 1em; float: right;"><IMG SRC="https://cdn.jwz.org/images/scaled/768/2013/under_attack_pleas_stand_by_by_heder.png" WIDTH=900 HEIGHT=563 STYLE="width: 100%; height: auto; border: 1px solid; margin-bottom: 0.5em" SRCSET="https://cdn.jwz.org/images/2013/under_attack_pleas_stand_by_by_heder.png 900w, https://cdn.jwz.org/images/scaled/768/2013/under_attack_pleas_stand_by_by_heder.png 768w, https://cdn.jwz.org/images/scaled/640/2013/under_attack_pleas_stand_by_by_heder.png 640w, https://cdn.jwz.org/images/scaled/360/2013/under_attack_pleas_stand_by_by_heder.png 360w" SIZES="(max-width: 660px) 35vw, 26em" LOADING="lazy" data-size="900x563"></DIV> Since yesterday my server has again been getting <I>absolutely obliterated</I> by AI scrapers. This time, though, load is below 1, but I'm getting up to 10 requests a second and all of my Apache workers are in state "R". "apachectl restart" fixes it... for a while. And fail2ban is banning IPs full-tilt. <P>What levers do I have to pull on this? E.g. maybe it would be sensible to drop connections if they stay in "R" for more than a couple seconds? <P><A HREF="https://serverfault.com/questions/503657/apache-requests-stuck-in-reading-state">This 12 year old post</A> suggests some <tt>sysctl.conf</tt> changes, but I have no idea whether those suggestions are sensible today. My current settings for those are the defaults: <P><pre>net.ipv4.tcp_fin_timeout = 60 net.ipv4.ip_local_port_range = 32768 60999 net.core.somaxconn = 4096 net.core.netdev_max_backlog = 1000</pre> <P>In <tt>httpd.conf</tt>, some vhosts have "<tt>Timeout 240</tt>" because I really do have some CGIs that take that long to run, and you can't make exceptions on a per-URL basis. <P>I have <tt>reqtimeout_module</tt> loaded, with the default settings, which I believe are: <P><tt style="font-size:smaller">handshake=0 header=20-40,MinRate=500 body=20,MinRate=500</tt> <P><A HREF="https://www.jwz.org/blog/2025/06/under-attack-please-stand-by/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/10/exterminate-all-rational-ai-scrapers-redux-redux/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/12/under-attack-please-stand-by-2/feed/</wfw:commentRss>
			<slash:comments>96</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2013/under_attack_pleas_stand_by_by_heder.png" width="900" height="563" length="432495" type="image/png"/>
	</item>
		<item>
		<title>Video text remover</title>
		<link>https://www.jwz.org/blog/2025/12/video-text-remover/</link>
					<comments>https://www.jwz.org/blog/2025/12/video-text-remover/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sat, 06 Dec 2025 04:42:20 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[mpegs]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykyK</guid>

					<description><![CDATA[Is there a Mac app similar to Hitpaw Watermark Remover that is... not that? I bought it, and it's adequate but has some annoyances so I would like to try anything else.

Only use case I care about is: scrub thru video; select a series of rectangles and start/end times; run ...]]></description>
										<content:encoded><![CDATA[Is there a Mac app similar to Hitpaw Watermark Remover that is... not that? I bought it, and it's <I>adequate</I> but has some annoyances so I would like to try <I>anything</I> else. <P>Only use case I care about is: scrub thru video; select a series of rectangles and start/end times; run ffmpeg with a series of "delogo" filters. <P>Auto-detection or anything "AI" is an explicit non-goal. <P>Web search for this topic has been utterly poisoned by grifters. <P><A HREF="https://www.jwz.org/blog/2025/08/resize-pl/">Previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/12/video-text-remover/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title>XScreenSaver and PAM</title>
		<link>https://www.jwz.org/blog/2025/12/xscreensaver-and-pam/</link>
					<comments>https://www.jwz.org/blog/2025/12/xscreensaver-and-pam/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Thu, 04 Dec 2025 04:14:55 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[xscreensaver]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykx_</guid>

					<description><![CDATA[Lazyweb, I have PAM questions.

I added support for PAM to XScreenSaver in 1998, when PAM itself was a little two-year-old baby. Your keyboard was still PS2 and HDMI hadn't been invented yet. For lo these many decades, nobody could agree on what went in /etc/pam.conf or ...]]></description>
										<content:encoded><![CDATA[<A HREF="https://www.jwz.org/xscreensaver/"><IMG SRC="https://cdn.jwz.org/xscreensaver/logo.png" STYLE="width: 20%; height: auto; max-width: 600px; max-height: 600px; border: 0; box-sizing: border-box; margin: 0 0 1em 1em; float: right; clear: right;" SRCSET="https://cdn.jwz.org/xscreensaver/logo.png 600w, https://cdn.jwz.org/xscreensaver/logo.png 360w" SIZES="(max-width: 660px) 20vw, 15em" LOADING="lazy" data-size="600x600" WIDTH="600" HEIGHT="600"></A> Lazyweb, I have PAM questions. <P>I added support for PAM to XScreenSaver in 1998, when PAM itself was a little two-year-old baby. Your keyboard was still PS2 and HDMI hadn't been invented yet. For lo these many decades, nobody could agree on what went in <tt>/etc/pam.conf</tt> or <tt>/etc/pam.d/login</tt> and it was all a giant mess. <P>Things that used to sometimes be true: <P><ul> <li> If <tt>/etc/pam.d/<wbr>xscreensaver</tt> didn't exist you couldn't unlock the screen at all. </li><li> "<tt>cp /etc/pam.d/login /etc/pam.d/xscreensaver</tt>" was insufficient, some lines had to be <I>omitted.</I> </li><li> You have to call <tt>pam_chauthtok()</tt> or an unauthorized user might be able to unlock. </li><li> No, if you call <tt>pam_chauthtok()</tt> it will always fail so don't do that. </li><li> No wait, actually you have to call <tt>pam_chauthtok()</tt> because it has side effects but you have to <I>ignore its failure</I>. </li><li> You have to <tt>PAM_REFRESH_CRED</tt> every time. </li><li> No wait, that doesn't work, you have to <tt>PAM_REINITIALIZE_CRED</tt> every time instead. But not on Solaris. </li></ul> <P>I could not even hazard a guess as to which of these things are still true, or how many decades ago they stopped being true, or which of them are influenced by Linux versus BSD versus Solaris versus HPUX versus AIX versus Kerberos or other things that nobody cares about any more. <P>So I am considering making the following changes: <P><ul> <li> Always call <tt>pam_chauthtok()</tt> and respect its result status. I <I>think</I> sshd does this. </li><li> Remove the <tt>configure</tt> option <tt>--enable-pam-check-account-type</tt> (which probably should always have been a runtime option, not a compile-time option, but here we are). </li><li> At installation time, create <tt>/etc/pam.d/xscreensaver</tt> as a file containing the single line "<tt>@include login</tt>" </li></ul> <P>What I would like to know is: will this break things on your system? Particular emphasis for this question on people running weird-assed obscure systems.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/12/xscreensaver-and-pam/feed/</wfw:commentRss>
			<slash:comments>23</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/xscreensaver/logo.png" width="600" height="600" length="26938" type="image/png"/>
	</item>
		<item>
		<title>xattr</title>
		<link>https://www.jwz.org/blog/2025/12/xattr/</link>
					<comments>https://www.jwz.org/blog/2025/12/xattr/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Tue, 02 Dec 2025 09:18:05 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[xscreensaver]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykx2</guid>

					<description><![CDATA[Dear Lazyweb, Double-You Tee Actual Fuck is this shit, and how do I make configure.ac figure it out:

Debian 12.11:

extern ssize_t getxattr (const char *__path, const char *__name, void *__value, size_t __size) __THROW __attr_access ((__write_only__, 3, 4));

macOS 14.7.7:

]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, Double-You Tee Actual Fuck is this shit, and how do I make configure.ac figure it out: <P>Debian 12.11: <P><tt> extern ssize_t getxattr (const char &#x2a;__path, const char &#x2a;__name, void &#x2a;__value, size_t __size) __THROW __attr_access ((__write_only__, 3, 4));</tt> <P>macOS 14.7.7: <P><tt>ssize_t getxattr(const char &#x2a;path, const char &#x2a;name, void &#x2a;value, size_t size, u_int32_t position, int options);</tt>]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/12/xattr/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title>Today in Hoffman Lenses</title>
		<link>https://www.jwz.org/blog/2025/11/today-in-hoffman-lenses-4/</link>
					<comments>https://www.jwz.org/blog/2025/11/today-in-hoffman-lenses-4/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Tue, 18 Nov 2025 20:58:37 +0000</pubDate>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[corporations]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[glitch]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[mad science]]></category>
		<category><![CDATA[mutants]]></category>
		<category><![CDATA[obey]]></category>
		<category><![CDATA[perversions]]></category>
		<category><![CDATA[space]]></category>
		<category><![CDATA[zombies]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykxj</guid>

					<description><![CDATA[There is only one acceptable use for "AI" video, and that is replacing faces with methane-breathing space capitalists.

I have been asking for access to this important technology for years but have not found it. Here is some circumstantial evidence that one such filter ...]]></description>
										<content:encoded><![CDATA[<DIV STYLE="text-align: center; width: 50%; max-width: 720px; margin: 0 0 1em 1em; float: right;"><DIV STYLE="display: inline-block; margin: 2px; width: 100%;" STYLE=" margin-bottom: 0.5em"><DIV STYLE="overflow: hidden; position: relative; padding-bottom: 56.25%; display: inline-block; width: 100%;" STYLE="padding-bottom: 178%"><VIDEO STYLE="position: absolute; top: 0; left: 0; border: 0; margin: 0; padding: 0; z-index: 1; width: 100%; height: 100%;" SRC="https://cdn.jwz.org/images/2025/c6cfebec-db94-4646-81c0-6cef4d51a2c3.mp4" AUTOPLAY LOOP MUTED PLAYSINLINE CONTROLS ALLOW="autoplay; fullscreen" ALLOWFULLSCREEN POSTER="https://cdn.jwz.org/images/2025/c6cfebec-db94-4646-81c0-6cef4d51a2c3.jpg"></VIDEO></DIV></DIV></DIV>There is only <I>one</I> acceptable use for "AI" video, and that is replacing faces with methane-breathing space capitalists. <P>I have been <A HREF="https://www.jwz.org/blog/2018/06/they-fake/">asking for access to this important technology for years</A> but have not found it. Here is some <A HREF="https://www.snapchat.com/lens/b1ffaff604ca437782a7798b3d7952b9">circumstantial evidence that one such filter exists</A>. I guess this is a Snapchat thing? How can I download and run this without using Snapchat? I assume the answer is "no". Ok, how else can I press button receive candy? <P><A HREF="https://www.jwz.org/blog/2023/11/happy-they-live-day-to-all-who-celebrate/">Previously</A>, <A HREF="https://www.jwz.org/blog/2021/10/they-loki/">previously</A>, <A HREF="https://www.jwz.org/blog/2018/06/they-fake/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/11/today-in-hoffman-lenses-4/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2025/c6cfebec-db94-4646-81c0-6cef4d51a2c3.jpg" length="63607" type="image/jpeg"/>
	</item>
		<item>
		<title>WTF ssh</title>
		<link>https://www.jwz.org/blog/2025/11/wtf-ssh/</link>
					<comments>https://www.jwz.org/blog/2025/11/wtf-ssh/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sat, 15 Nov 2025 20:48:35 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykxZ</guid>

					<description><![CDATA[Recently, I am unable to interactively ssh in to my home Mac. "ssh host whoami" works but if I try to get a shell, it hangs forever. ^C, ^Z and ~. don't work. The socket is in ESTABLISHED, and after about 2 1/2 minutes it dies with "client_loop: send disconnect: Broken ...]]></description>
										<content:encoded><![CDATA[Recently, I am unable to <I>interactively</I> ssh in to my home Mac. "ssh host whoami" works but if I try to get a shell, it hangs forever. ^C, ^Z and ~. don't work. The socket is in ESTABLISHED, and after about 2 1/2 minutes it dies with "client_loop: send disconnect: Broken pipe". The -v log looks exactly like it does for successful connections to other hosts up to that point. WTF? <P>macOS 14.7.7 running openssh @10.2p1. <P><BR> <B>Update:</B> The fix was to put <tt>"IPQoS none"</tt> in <tt>ssh<b><i>d</i></b>_config</tt>. It used to be sufficient for that to be in <tt>.ssh/config</tt> on the client side, but it seems that changed recently.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/11/wtf-ssh/feed/</wfw:commentRss>
			<slash:comments>48</slash:comments>
		
		
			</item>
		<item>
		<title>Pi 4 SPI lossage</title>
		<link>https://www.jwz.org/blog/2025/11/pi-4-spi-lossage/</link>
					<comments>https://www.jwz.org/blog/2025/11/pi-4-spi-lossage/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Wed, 05 Nov 2025 07:47:01 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mpegs]]></category>
		<category><![CDATA[phones]]></category>
		<category><![CDATA[retrocomputing]]></category>
		<category><![CDATA[toys]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykxE</guid>

					<description><![CDATA[Dear Lazyweb, any idea why switching from a Pi 3b to a Pi 4b made my MAX7219 start behaving like this? If I switch back, it's behaves properly. Same CF card, so no software differences.]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, any idea why switching from a Pi 3b to a Pi 4b made my MAX7219 start behaving like this? If I switch back, it's <A HREF="https://www.jwz.org/blog/2021/08/more-payphone-shenanigans/">behaves properly</A>. Same CF card, so no software differences. <P><DIV STYLE="text-align: center; width: 100%; max-width: 500px; margin: 0 auto;"><DIV STYLE="display: inline-block; margin: 2px; width: 100%;" STYLE=" margin-bottom: 0.5em"><DIV STYLE="overflow: hidden; position: relative; padding-bottom: 56.25%; display: inline-block; width: 100%;" STYLE="padding-bottom: 56%"><VIDEO STYLE="position: absolute; top: 0; left: 0; border: 0; margin: 0; padding: 0; z-index: 1; width: 100%; height: 100%;" SRC="https://cdn.jwz.org/images/2025/img_4423.mp4" AUTOPLAY LOOP MUTED PLAYSINLINE CONTROLS ALLOW="autoplay; fullscreen" ALLOWFULLSCREEN POSTER="https://cdn.jwz.org/images/2025/img_4423.jpg"></VIDEO></DIV></DIV></DIV> <P><A HREF="https://www.jwz.org/blog/2025/10/tool/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/10/excluding-a-volume-from-overlayfs/">previously</A>, <A HREF="https://www.jwz.org/blog/2023/04/hard/">previously</A>, <A HREF="https://www.jwz.org/blog/2021/08/more-payphone-shenanigans/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/11/pi-4-spi-lossage/feed/</wfw:commentRss>
			<slash:comments>81</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2025/img_4423.jpg" length="44480" type="image/jpeg"/>
	</item>
		<item>
		<title>excluding a volume from overlayfs</title>
		<link>https://www.jwz.org/blog/2025/10/excluding-a-volume-from-overlayfs/</link>
					<comments>https://www.jwz.org/blog/2025/10/excluding-a-volume-from-overlayfs/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Sun, 26 Oct 2025 04:09:41 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[linux]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykw5</guid>

					<description><![CDATA[Dear Lazyweb,

I have enabled overlay via raspi-config, but I would like my second "/rw/" partition on the same drive to remain writable. How do I do that? Raspberry Pi, Debian 12.11.

Filesystem Size Used Avail Use% Mounted on
/dev/mmcblk0p2 7.8G 6.5G 896M 89% ...]]></description>
										<content:encoded><![CDATA[Dear Lazyweb, <P>I have enabled overlay via raspi-config, but I would like my second "/rw/" partition on the same drive to remain writable. How do I do that? Raspberry Pi, Debian 12.11. <P><pre style="border: 1px solid; overflow: auto; padding: 1em">Filesystem Size Used Avail Use% Mounted on /dev/mmcblk0p2 7.8G 6.5G 896M 89% /media/root-ro tmpfs-root 454M 28M 427M 6% /media/root-rw overlayroot 454M 28M 427M 6% / /dev/mmcblk0p3 7.7G 37M 7.2G 1% /media/root-ro/rw /media/root-ro/rw 454M 28M 427M 6% /rw /etc/fstab: LABEL=rw /media/root-ro/rw ext4 ro,defaults,noatime 0 2 /media/root-ro/rw /rw overlay lowerdir=/media/root-ro/rw,upperdir=/media/root-rw/overlay/rw,workdir=/media/root-rw/overlay-workdir/rw 0 2</pre> <P><A HREF="https://www.jwz.org/blog/2024/01/scrolling-text-on-a-web-page-still-rocket-surgery/">Previously</A>, <A HREF="https://www.jwz.org/blog/2022/05/dhcp-antics/">previously</A>, <A HREF="https://www.jwz.org/blog/2021/08/more-payphone-shenanigans/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/10/excluding-a-volume-from-overlayfs/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
			</item>
		<item>
		<title>NextClown SSO SAML</title>
		<link>https://www.jwz.org/blog/2025/10/nextclown-sso-saml/</link>
					<comments>https://www.jwz.org/blog/2025/10/nextclown-sso-saml/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Fri, 10 Oct 2025 03:23:12 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykwT</guid>

					<description><![CDATA[I'm playing around with NextCloud and the first thing I would like to do is make it use my in-house, bespoke authentication system. It seems like the user_saml plugin might be the thing to mess with, since it uses the words "Authentication via Environment Variable" but I ...]]></description>
										<content:encoded><![CDATA[I'm playing around with NextCloud and the first thing I would like to do is make it use my in-house, bespoke authentication system. It seems like the <A HREF="https://github.com/nextcloud/user_saml">user_saml</A> plugin might be the thing to mess with, since it uses the words "Authentication via Environment Variable" but I have no idea what it means by that. <P>Ideally I'd have it just run a shell command for authentication, the way <A HREF="https://web.archive.org/web/20240630132143/https%3A//doc.dovecot.org/configuration_manual/authentication/checkpassword/#authentication-checkpassword">Qmail / Dovecot "passdb driver = checkpassword"</A> works, since I already have that working for IMAP... But if instead I have to write some stupid XML endpoint, that's not out of the question. <P>Any clue where to start? When I mess around on the /settings/admin/saml page it does not seem to be even attempting to load the URLs I entered. <P><BR><B>Update:</B> I got it working! It was... <I>a lot.</I> <ol><li> First activate the <a href="https://github.com/nextcloud/user_external/">"External user authentication"</a> app. </li><li> Note that it seems to be unmaintained and does not work, and apply <a href="https://github.com/nextcloud/user_external/issues/274#issuecomment-3340825853">this patch</a>. </li><li> Create a "run a shell command" plugin for it. There's <a href="https://code.tubul.net/rigrig/snippets/wiki/Nextcloud-external_user-Shell-script-authentication">this thing</a> which showed me how to do it, but that one passes passwords on the command line which is a <I>WTF</I> level of <I>nope</I>. So I wrote one that uses the <A HREF="https://web.archive.org/web/20240630132143/https%3A//doc.dovecot.org/configuration_manual/authentication/checkpassword/#authentication-checkpassword">Qmail / Dovecot "passdb checkpassword" protocol.</A> It looks like this: <p><pre style="border: 1px solid; padding: 1em; max-height: 10em; overflow: auto"> &lt;?php declare(strict_types=1); namespace OCA\UserExternal; class Shell extends Base { public function __construct(private string $command) {} public function checkPassword(string $uid, string $password): false|string { $fd = 3; $desc = [ $fd =&gt; [ "pipe", "r" ]]; $env = [ 'SERVICE' =&gt; 'nextcloud', 'AUTH_SERVICE' =&gt; 'nextcloud', 'REMOTE_IP' =&gt; $_SERVER['REMOTE_ADDR'] ?? '', ]; $proc = proc_open ($this-&gt;command, $desc, $pipes, null, $env); if (is_resource ($proc)) { fwrite ($pipes[$fd], "$uid\000$password"); fclose ($pipes[$fd]); $ret = proc_close ($proc); if ($ret === 0) { $this-&gt;storeUser ($uid); return $uid; } } return false; } }</pre> </li><li> Then enable it by adding this to <tt>config/config.php</tt>: <pre style="border: 1px solid; padding: 1em; max-height: 10em; overflow: auto"> 'user_backends' =&gt; [ [ 'class' =&gt; '\OCA\UserExternal\Shell', 'arguments' =&gt; [ '/where/it/is/checkpassword true' ]]], </pre> </li><li> If you had a stock account with a NextCloud password, and then switch to logging in to that account with this mechanism, it will log you out every 5 minutes with <I>"Session token credentials are invalid".</I> The only solution I found was to delete the account and allow it to be re-created when logging in for the first time via <tt> user_external</tt>. </li></ol> Super easy! Barely an inconvenience! <P><br><A HREF="https://www.jwz.org/blog/2025/10/basecamp-alternative/">Previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/10/nextclown-sso-saml/feed/</wfw:commentRss>
			<slash:comments>37</slash:comments>
		
		
			</item>
		<item>
		<title>Basecamp alternative</title>
		<link>https://www.jwz.org/blog/2025/10/basecamp-alternative/</link>
					<comments>https://www.jwz.org/blog/2025/10/basecamp-alternative/#comments</comments>
		
		<dc:creator><![CDATA[jwz]]></dc:creator>
		<pubDate>Tue, 07 Oct 2025 18:00:09 +0000</pubDate>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[corporations]]></category>
		<category><![CDATA[dnalounge]]></category>
		<category><![CDATA[firstperson]]></category>
		<category><![CDATA[lazyweb]]></category>
		<guid isPermaLink="false">https://jwz.org/b/ykwH</guid>

					<description><![CDATA[Against my better judgment, I let my staff start using Basecamp about 7 years ago, and now, for reasons, I would prefer to just be self-hosting everything like we should have done from the start. Do you have experience making the transition from Basecamp to something open ...]]></description>
										<content:encoded><![CDATA[<DIV STYLE="text-align: center; width: 35%; max-width: 500px; margin: 0 0 1em 1em; float: right;"><A HREF="https://cdn.jwz.org/images/2016/clown-computing.png" data-size="500x325"><IMG SRC="https://cdn.jwz.org/images/2016/clown-computing.png" WIDTH=500 HEIGHT=325 STYLE="width: 100%; height: auto; border: 1px solid; margin-bottom: 0.5em" SRCSET="https://cdn.jwz.org/images/2016/clown-computing.png 500w, https://cdn.jwz.org/images/scaled/360/2016/clown-computing.png 360w" SIZES="(max-width: 660px) 35vw, 26em" LOADING="lazy" data-size="500x325"></A></DIV>Against my better judgment, I let my staff start using Basecamp about 7 years ago, and now, <A HREF="https://jakelazaroff.com/words/dhh-is-way-worse-than-i-thought/">for reasons</A>, I would prefer to just be self-hosting everything like we should have done from the start. Do you have experience making the transition from Basecamp to something open source and self-hosted? <P>To be clear, what we use Basecamp for is task management, document editing and file storage, and that's about it. I gather that Basecamp is buzzword-compatible with all kind of other business-brain crap that we have never used, but I don't know what "Gantt" or "Scrum" mean and don't care to. <P>I think what we need is just a bug tracker and a wiki, whose UI isn't terrible, and that also works well on mobile. <P>Suggestions? <P>Things that should not need to be said but do: <P><ul> <li> Do not suggest software that you do not use. </li><li> Do not just Google it for me. </li></ul> <P><A HREF="https://www.jwz.org/blog/2024/06/modern-web-technologies/">Previously</A>, <A HREF="https://www.jwz.org/blog/2025/08/lol-github-2/">previously</A>.]]></content:encoded>
					
					<wfw:commentRss>https://cdn.jwz.org/blog/2025/10/basecamp-alternative/feed/</wfw:commentRss>
			<slash:comments>93</slash:comments>
		
		
		<enclosure url="https://cdn.jwz.org/images/2016/clown-computing.png" width="500" height="325" length="239730" type="image/png"/>
	</item>
	</channel>
</rss>
