<feed xmlns='http://www.w3.org/2005/Atom'>
<title>slosh.git/contrib/chrome/bit-drift.kdl, branch master</title>
<subtitle>an opinionated terminal multiplexer in C with programmable pane chrome</subtitle>
<id>https://git.sl0p.foo/slosh.git/atom/contrib/chrome/bit-drift.kdl?h=master</id>
<link rel='self' href='https://git.sl0p.foo/slosh.git/atom/contrib/chrome/bit-drift.kdl?h=master'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/slosh.git/'/>
<updated>2026-08-18T19:26:00Z</updated>
<entry>
<title>slosh: rename the project from sl0ppty</title>
<updated>2026-08-18T19:26:00Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-08-18T19:26:00Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/slosh.git/commit/?id=b9e53cace4eb75263077df8623b011e66f5f2241'/>
<id>urn:sha1:b9e53cace4eb75263077df8623b011e66f5f2241</id>
<content type='text'>
sl0p + pty was error-prone to type and the zero made it worse; slosh
(slop + sh) is one syllable, impossible to typo, and slosh.foo is ours.

Mechanical rename everywhere it appears: binary, env vars (SLOSH,
SLOSH_SESSION, SLOSH_BIN, SLOSH_CONFIG), socket dir (/tmp/slosh-&lt;uid&gt;,
$XDG_RUNTIME_DIR/slosh), config path (~/.config/slosh), header guards,
src/sl0ppty.h -&gt; src/slosh.h, contrib/sl0ppty-dev -&gt; contrib/slosh-dev,
the driving-slosh skill, docs and tests. The sl0ppi fork references and
the sl0p theme stay: one is history, the other is the brand.

The rename surfaced a latent bug in test_osc5577: the hello-reply
answer always appeared on screen twice (ECHOCTL echo plus cat -v), but
a seven-character implementation name happened to wrap the second copy
across the 60-column boundary, so counting substrings in wrapped text
found one and passed for the wrong reason. A five-character name moved
the wrap and exposed it. The loop guard itself is correct -- with echo
off before the request there is exactly one reply -- so the test now
counts on de-wrapped text and tolerates the pane's own echo.
</content>
</entry>
<entry>
<title>sl0ppty: six chrome presets that need the new operators</title>
<updated>2026-08-16T14:25:56Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-08-16T14:25:56Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/slosh.git/commit/?id=2c3297c33678c961e3548d40052808c704c2c85b'/>
<id>urn:sha1:2c3297c33678c961e3548d40052808c704c2c85b</id>
<content type='text'>
    sine-comet      an arc gliding round, with a sine's shoulders
    marching-ants   two on, two off, stepping -- the selection marquee
    standing-wave   three lobes that do not travel; the pattern breathes
    bit-drift       position XOR clock, three bits: a machine thinking
    heartbeat       lub-dub, then a rest. For a state
    xor-barcode     the top rule as a barcode, sliding a character at a time

Each is a thing the old language could not say. `sin` and `TAU` give
`sin(TAU * p / perim)` -- this cell's position as an angle round one lap -- which
wraps at the corner for free, because so does a sine, and which fits any whole
number of lobes to the ring exactly. That last property is what makes a standing
wave stand: three lobes and three nodes, in the same places, breathing.

`&gt;&gt; 1 &amp; 1` is a two-cell dash pattern in two operators, with no multiply and no
table; adding a slice of the clock marches it. `^` gives a motif that reshuffles
rather than slides, which is what a machine looks like when it is thinking and
not what any ramp looks like. And `abs(sin())` over a full turn is two humps, so
a heartbeat is one expression and a window mask.

Two techniques worth stealing from these, and now in the README: **overdrive then
clip** (`* 14 - 3000` after a sine keeps only the top of the crest, turning a glow
over everything into an arc), and the **angle idiom** itself.

Every one of them was measured before it was written down -- the perimeter
unrolled into an intensity strip, frame by frame, so an effect that "should"
travel is seen travelling. Two candidates did not survive that: a Sierpinski
`(x &amp; y) == 0`, which on a ring lights the top and left solid and reads as a bug,
and a two-sine interference, which read as noise. `tests/test_chrome_presets.py`
picks up all six with no change, and asserts of each what it asserts of the other
seven: the frame moves, and the pane's own output does not.
</content>
</entry>
</feed>
