Java/Scala software engineer. Nine years of fault-tolerant distributed systems on the JVM — telecom data platforms, stream processing, cloud infrastructure. Kyiv, Ukraine.
Off the clock: air-quality sensors, ESP32 cameras, OBS Studio tooling and Scala 3 libraries.
Distributed systems that have to stay up. Most recently four years on a platform team building the data infrastructure behind cloud-native SaaS for telecom operators.
Before that: Spring Boot microservices handling 100M+ patient records for a top-3 US healthcare provider, and the core algorithms for a cross-border energy exchange connecting grid operators across six countries.
Scala (Cats, cats-effect, FS2, Akka, http4s, Monix) · Java 17 · Kafka · Kubernetes · Cassandra · Redis · AWS / Azure / GCP
None of what follows is commercial. It is unpaid engineering on problems I actually have — which is why most of it carries a real README, a CI pipeline and release binaries rather than a weekend of commits.
Control surfaces for OBS Studio, the open-source live-streaming program. Everything below drives it over obs-websocket 5.x, its built-in remote control protocol. The map at obs.worxbend.com shows how the pieces fit together.
| Project | What it is |
|---|---|
| scenedeck | Linux desktop controller — Rust, GTK4, libadwaita. Scenes, an audio mixer with live meters, scene-dependency inspection. On the Snap Store. |
| obsctl-rs | Terminal dashboard and scriptable CLI in one Rust binary. A daemon owns the OBS connection; the UI and CLI are thin clients over a Unix socket. 29 themes. |
| obs-stats | btop-style live dashboard that answers which stage dropped frames — renderer, encoder or network — rather than only that some were lost. |
| obsctl | The Crystal implementation of the same idea. One-line installer, static binaries. |
| multistream-manager | Set up a Twitch stream and a YouTube broadcast from one terminal form, then press Start Streaming. |
| twi | Keyboard-first Twitch chat in the terminal. Go, 57 themes, OAuth tokens that never reach the logs. |
| yc | YouTube live chat in the terminal, paced so the 10,000-unit daily API quota lasts until reset instead of running dry in three hours. |
| obs-effects | GPU-accelerated PixiJS 8 overlays and animated screens for OBS browser sources. |
| twitch-voxer | Self-hosted text-to-speech bot. Announces chat in the detected language, each chatter keeping a persistent voice. |
AirGradient makes open-source indoor air-quality monitors that expose their readings on the local network. I wanted those readings everywhere I look, and none of it going through a cloud account — so the same local endpoint now drives five different clients.
| Project | Platform |
|---|---|
| airgradient-cli | Rust CLI and live terminal dashboard |
| airgradient-desktop | GTK 4 + libadwaita desktop app |
| airgradient-gnome-extension | GNOME Shell panel indicator |
| airgradient-android | Kotlin + Jetpack Compose |
| airgradient-papr | ESP32 driving a LILYGO T5 4.7" e-paper display — air, weather, forecast |
| airgradient-observability | vmagent → VictoriaMetrics → Grafana, self-hosted |
They share one config file, so the CLI, the desktop app and the GNOME extension all point at the same device.
A camera pipeline built from the wire protocol up, because HTTP and WebSocket framing are more overhead than a microcontroller pushing JPEG frames needs.
- spycam — ESP32-CAM firmware. A camera task fills a single latest-frame slot; a sender task owns all network I/O and reconnects forever with exponential backoff. When the network falls behind, stale frames are dropped rather than queued.
- spycam-s3 — the same client for ESP32-S3 boards.
- instachron — the server side. A Go workspace of eight deployable services: the raw TCP receiver that republishes frames on a Unix socket, an HTTP API and web UI, restream proxies with image enhancement, upscaling and YOLOv8 object detection, an H.264 timelapse recorder, and an ffmpeg RTMP streamer.
The protocol is a long-lived raw TCP connection carrying repeated frames — a 16-byte big-endian header (magic, sequence number, payload length, camera timestamp) followed by exactly that many JPEG bytes. No HTTP, no delimiters, no text framing. It is documented precisely enough to write a receiver from scratch.
Also: led-matrix-controller (ESP8266 Wi-Fi TCP firmware driving a WS2812B 8×8 matrix), echo (a Go proxy turning webhooks into light shows on it), echoctl (Scala 3 CLI for that proxy), and deskctl (GTK4 controller for an ESP32-driven standing desk).
One YAML profile describing the machine you want, a plan you read before anything happens, then the parts that still need doing.
- fluxion — Java 25, GraalVM-native. Packages, Flatpaks, scripts, dotfiles, shell tooling, fonts and prebuilt binaries from one profile, with state recorded so reruns skip finished work.
- fluxion.cr — the Crystal implementation. CLI or TUI.
- binstaller — binary distributions from a declarative profile, with dry-run plans, SHA-256 verification and a lock file.
- nerd-fonts-installer — Go, checksum-verified downloads, interactive picker. On the Snap Store.
- dotbot-scala · dotbot-go — two implementations of the Dotbot dotfiles workflow, both shipping as single native binaries.
- system-bootstrap — multi-distro dotfiles and workstation setup for Fedora, Arch and openSUSE.
- scalacv — a Scala 3 API over
OpenCV 4.13. Typed constants instead of magic integers
(
ColorConversion.BgrToGray, not6); aManaged[A]that releases native handles exactly once and throws on use-after-release in Scala, before JNI turns the same mistake into a SIGSEGV with no stack trace; genuinely headless, so continuous integration needs no GUI toolkit. - glyphora — a terminal UI toolkit written the way Scala wants to be written. Reactive signals, 50+ widgets, composable motion, headless tests, GraalVM native-image builds.
- gitea-scala-client — Scala 3 client for the Gitea API. ZIO 2, sttp client4, zio-json, with the endpoint surface audited against the Gitea 1.26.2 OpenAPI contract.
- codeberg4s — Codeberg/Forgejo
client with a
Future-based API that leaks no effect system onto your classpath, two error rails (exceptions or typedEither), and validated types that make an illegal request path unrepresentable. - worxbend — the Mill monorepo the smaller libraries get cut from. Applications, shared libraries, deployment recipes and notes.
- data-engineering — Kafka, Kafka Connect and Apache Flink experiments, including a custom S3 sink partitioner.
| Account | What lives there |
|---|---|
| @w0rxbend | This one. The broadest range — firmware, overlays, libraries, ports. |
| @worxbend | The finished tools. Release binaries, install scripts, docs sites. |
| @oleksandr-balyshyn | Under my own name, kept small. |
All 80 projects, searchable, in one place → w0rxbend.github.io/personal-page




