<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Java on Phosphor BBS</title>
		<link>https://phosphorbbs.net/tags/java/</link>
		<description>Recent content in Java on Phosphor BBS</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Tue, 20 Oct 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://phosphorbbs.net/tags/java/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>The Case of the Vanishing Blink</title>
				<link>https://phosphorbbs.net/blog/the-case-of-the-vanishing-blink/</link>
				<pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://phosphorbbs.net/blog/the-case-of-the-vanishing-blink/</guid>
				<description>&lt;p&gt;For years, picking an item on the Phosphor main menu did a small, satisfying thing: the row flashed — inverted video for about 150 milliseconds — and then the next screen took over. It&amp;rsquo;s a 65-byte courtesy. Two tiny frames: highlight the row, unhighlight the row, go.&lt;/p&gt;&#xA;&lt;p&gt;Then one day the flash was just gone in Terminal.app&amp;rsquo;s telnet client. Not intermittently. Gone. MuffinTerm still showed it. The web client showed it, but only one flash instead of two. Three different clients, three different answers, one unchanged server. By the time we sat down to hunt it, every standard explanation had already been eliminated: the code was untouched since the feature shipped, the server was provably running the current build, the user&amp;rsquo;s preferences and theme tested innocent, and the same binary rendered the blink perfectly against a test instance. Same client, same server, same account. Different port. Blink on one, gone on the other.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Synchronized Updates and Frame Coalescing: How Phosphor Paints Atomic Screens</title>
				<link>https://phosphorbbs.net/blog/synchronized-updates-and-frame-coalescing/</link>
				<pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://phosphorbbs.net/blog/synchronized-updates-and-frame-coalescing/</guid>
				<description>&lt;p&gt;A BBS screen is a grid of characters, and for as long as character grids have flown over dial-up lines and TCP sockets alike, they have had one chronic way of embarrassing themselves: tearing. A full-screen repaint travels as a stream of cursor moves and color changes, and a client on a slow link — or a busy one — can catch the middle of it. You&amp;rsquo;ve seen the result: half the old screen with half the new one written over it, a status bar flashing the wrong colors for a tenth of a second, a table redrawn one row at a time like a document slowly printing.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The Case of the Invisible Popups</title>
				<link>https://phosphorbbs.net/blog/the-case-of-the-invisible-popups/</link>
				<pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://phosphorbbs.net/blog/the-case-of-the-invisible-popups/</guid>
				<description>&lt;p&gt;The session log screen has two popups: [H] on a row pops up that connection&amp;rsquo;s full history, and Enter pops up the session&amp;rsquo;s details. The SysOp account-review screen pops up a confirmation with the temp password when you approve a request. File lists pop up a preview panel. All four had been built the same way — a &lt;code&gt;Window&lt;/code&gt;, a hint list, a &lt;code&gt;Label&lt;/code&gt; shoved into the contents panel — and all four now shared the same bug report: &lt;em&gt;the popup doesn&amp;rsquo;t appear.&lt;/em&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Publishing 0.1.1: The Deploy That Exited 0 and Published Nothing</title>
				<link>https://phosphorbbs.net/blog/publishing-0-1-1-the-deploy-that-exited-zero/</link>
				<pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://phosphorbbs.net/blog/publishing-0-1-1-the-deploy-that-exited-zero/</guid>
				<description>&lt;p&gt;jterm 0.1.1 is on Maven Central. The build that put it there was green in seventeen seconds of test time — and took nine and a half minutes of wall clock, plus a mid-flight correction when we discovered the first deploy had quietly published nothing at all. This post is the release notes for the &lt;em&gt;process&lt;/em&gt;, because the failure mode is one every maintainer of a Central-published library will hit.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The Screen That Lied: Building Idle Timers That Actually Tick</title>
				<link>https://phosphorbbs.net/blog/idle-timers-that-actually-tick-window-auto-refresh/</link>
				<pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://phosphorbbs.net/blog/idle-timers-that-actually-tick-window-auto-refresh/</guid>
				<description>&lt;p&gt;Here&amp;rsquo;s a bug report you can&amp;rsquo;t reproduce with a test: &lt;em&gt;&amp;ldquo;the sessions view shows a list of users logged in, and when they change state Connected → disconnected the display updates immediately — but the idle time doesn&amp;rsquo;t update. If I quit the window and reopen it, the idle times are current again.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;The sysop was right, and the cause was architectural. Every screen in &lt;a href=&#34;https://phosphorbbs.net&#34;&gt;Phosphor BBS&lt;/a&gt; is drawn by our own terminal UI toolkit, jterm — a pure-Java, lanterna-style TUI framework with double-buffered, diff-based refresh. That diff-based refresh is the crown jewel: when you redraw, you only pay for the cells that changed. But it had a blind spot.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Two Dialects, One Schema: Supporting H2 and Postgres Without Losing Your Mind</title>
				<link>https://phosphorbbs.net/blog/two-dialects-one-schema-h2-and-postgres/</link>
				<pubDate>Fri, 07 Aug 2026 00:00:00 +0000</pubDate>
				<guid>https://phosphorbbs.net/blog/two-dialects-one-schema-h2-and-postgres/</guid>
				<description>&lt;p&gt;A BBS should boot on a laptop with no database server installed. It should also run a production community for years on a real database with real operational tools. Those are different requirements, and Phosphor satisfies both by maintaining &lt;strong&gt;one schema in two dialects&lt;/strong&gt;: PostgreSQL for production, embedded H2 for zero-config installs.&lt;/p&gt;&#xA;&lt;p&gt;This post is the field guide to what that actually costs — the failure modes, the patterns that keep them manageable, and the bugs we hit so you don&amp;rsquo;t have to.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
