<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sl0ppi.git/README.md, branch main</title>
<subtitle>a sl0p.foo repository</subtitle>
<id>https://git.sl0p.foo/sl0ppi.git/atom/README.md?h=main</id>
<link rel='self' href='https://git.sl0p.foo/sl0ppi.git/atom/README.md?h=main'/>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/'/>
<updated>2026-08-13T14:32:42Z</updated>
<entry>
<title>docs: handover</title>
<updated>2026-08-13T14:32:42Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-08-13T14:32:42Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/commit/?id=694b9757423e8ed4b4bb0b57d4f8640687cc034c'/>
<id>urn:sha1:694b9757423e8ed4b4bb0b57d4f8640687cc034c</id>
<content type='text'>
Where the split-button work stopped, what is open, the traps that cost time, and
how to verify pane/layout/mouse work on a real session rather than in the test
harness.
</content>
</entry>
<entry>
<title>release: publish sl0ppi.sl0p.foo, and a script to keep it current</title>
<updated>2026-08-12T21:12:23Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-08-12T21:12:23Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/commit/?id=4e647e2173a9817a2250666f8298b3b05d13ece5'/>
<id>urn:sha1:4e647e2173a9817a2250666f8298b3b05d13ece5</id>
<content type='text'>
Phase 5, settled as build scripts rather than CI:

  make release   tests, then a fresh static-musl tarball
  make publish   render the site, upload, and verify against the live URL

publish.sh is deliberately dumb -- rsync, then ask the live site whether it
agrees (status codes plus a re-downloaded checksum) -- but it has two guard
rails that matter:

  - it refuses to republish a version whose bytes differ from what is already
    live. /releases/ is cached for a year, so the same URL serving two different
    tarballs would be undebuggable. Bump VERSION instead.
  - artifacts upload before latest.json, so the pointer never names a file that
    is not downloadable yet.

site/install.sh is POSIX sh and short on purpose, because people are being asked
to pipe it into a shell. It reads latest.json, downloads the versioned artifact,
VERIFIES ITS SHA256, and only then unpacks and runs the bundled installer.
Refusal was tested for real by serving a doctored latest.json: it stops with a
checksum mismatch and installs nothing.

Verified end to end from the public URL, in a throwaway HOME with node, npm,
bun, cargo and rustc replaced by poison stubs:

  curl -fsSL https://sl0ppi.sl0p.foo/install.sh | sh
  sl0ppij --version -&gt; 0.45.0+sl0p1
  pi --version      -&gt; 0.84.1
  sl0ppi doctor     -&gt; all good

The vhost itself is committed in the sl0pday repo, where that box's nginx config
lives.
</content>
</entry>
<entry>
<title>chore: initialize sl0ppi monorepo</title>
<updated>2026-08-12T17:34:09Z</updated>
<author>
<name>user</name>
<email>user@clank</email>
</author>
<published>2026-08-12T17:34:09Z</published>
<link rel='alternate' type='text/html' href='https://git.sl0p.foo/sl0ppi.git/commit/?id=c79bb78662a7a4e1d0c43c7382821d5dbc0732b1'/>
<id>urn:sha1:c79bb78662a7a4e1d0c43c7382821d5dbc0732b1</id>
<content type='text'>
</content>
</entry>
</feed>
