A particle tunnel that flies forever: thousands of streaks and glints pulled through a wandering vanishing point, with drifting fog on the tunnel wall, a procedural starfield, occasional lightning, and the shockwaves it throws off. Nothing repeats — the camera drift, flow speed, and spin are all sums of sines at incommensurate periods, so the loop never lands in the same place twice.
It renders in WebGL inside a WKWebView hosted by a tiny ScreenSaverView.
The whole scene is one self-contained HTML file with no network access and no
external assets.
Download and unzip the release from
Releases,
double-click the .saver (or move it into ~/Library/Screen Savers/), then
pick Sliders Vortex in System Settings → Screen Saver.
Releases are signed with a Developer ID and notarized by Apple, so they install without a Gatekeeper warning.
Universal binary — Apple Silicon and Intel, macOS 11+.
make build # build SlidersVortex.saver (universal, ad-hoc signed)
make install # build and install into ~/Library/Screen Savers/
make test # run the test suite
make lint # swift-format --strict + inline-JS syntax check
make format # apply swift-format in place
make release # build and package dist/SlidersVortex-<version>.zip
make cleanmake install kills legacyScreenSaver and friends before copying, because
the kernel keeps the old bundle's signed pages mapped and will otherwise
SIGKILL the new one.
| Path | What it is |
|---|---|
Resources/vortex.html |
The entire scene — GLSL shaders and the render loop |
Sources/VortexView.swift |
ScreenSaverView host that loads the HTML into a WKWebView |
Resources/Info.plist |
Bundle metadata; NSPrincipalClass points at VortexView |
build.sh |
Builds and signs the .saver (the only place that does) |
Tests/VortexTests |
Wiring and bundle invariants (see below) |
images/ |
README artwork, captured from the scene itself |
poc/ |
The original prototype this grew out of, kept for provenance |
The scene is a single HTML file, so the failure mode that matters is a silent
one: WebGL reports a mis-wired program as a black screen, not an error. The
suite checks statically what the GPU would only tell you at runtime — that
every program names shaders that exist, every uniform cached in JS is still
declared by its shader, the attribute lists agree with the vertex strides,
no fragment shader reads a varying its vertex stage never writes, and no
shader block has been orphaned. Alongside those, it checks the three places
that agree only by convention: Info.plist, VortexView.swift, and
build.sh.
Tag and push; CI builds, signs, notarizes, staples, verifies both architectures, and publishes the zip.
git tag v1.1.0 && git push --tagsSigning needs six repository secrets — a Developer ID Application cert
(SIGNING_CERTIFICATE_P12_BASE64, SIGNING_CERTIFICATE_PASSWORD),
APPLE_TEAM_ID, and an App Store Connect key for notarytool
(APPLE_API_KEY_BASE64, APPLE_API_KEY_ID, APPLE_API_ISSUER_ID). CI fails
rather than publishing if the bundle turns out not to be Developer ID signed.
Local make build still signs ad-hoc, which is all a local install needs.
MIT — see LICENSE.

