Moe Loubani
Back to projects
AlwaysAI
WebSocketsDebian live-buildnode-ptyTurborepoReact 19Express 5

AlwaysAI

Bootable Thin Client With a Pluggable AI Provider Layer

Apr 2026

USB-boot thin client where one authenticated WebSocket server multiplexes PTYs, filesystem, exec and AI.

A self-hostable thin-client desktop. A Debian live-build ISO boots any PC into a browser-based desktop backed by one authenticated WebSocket server for PTYs, filesystem, command execution, state sync, and AI routing.

Overview

AlwaysAI is a thin-client design for the AI era. Flash the ISO to a USB drive, boot any PC, and get a browser-based desktop (Terminal, AI Assistant, Journal, Browser, Messenger) backed by a self-hostable server that owns the filesystem, PTYs, state, and AI routing. The device is disposable and the session lives on the server.

My Role

I designed and built AlwaysAI end to end: the bootable image, the desktop shell, the server and wire protocol, and the test setup.

Architecture

A pnpm and Turborepo monorepo:

  • apps/desktop: React 19 and Vite shell using Zustand for app state, xterm.js for terminals, and react-rnd for draggable, resizable windows.
  • apps/server: Express 5 and a ws WebSocket backend handling JWT auth (bcrypt), AI provider routing, node-pty terminal sessions, filesystem access, command execution, and state sync.
  • packages/shared: types and utilities shared by desktop and server.
  • bootable: Debian live-build scripts that produce the ISO.
  • e2e: Playwright tests against the running desktop and server pair.
  • Dockerized dev and prod.

Key Engineering Decisions

  • Shared types package for the wire protocol. Desktop and server import the same types, so the protocol cannot drift between them.
  • One authenticated WebSocket carrying terminals, filesystem, exec, and AI. This keeps a single auth and connection path, while the server keeps those concerns separated so they do not bleed into each other.
  • AI providers behind a common interface. Anthropic, OpenAI, and Ollama are pluggable under apps/server/src/providers, so the client works unchanged across them.
  • Server URL baked in at build time. The ISO build accepts ALWAYSAI_SERVER_URL, so anyone can point their own USB at their own self-hosted server.
  • A lean live image. It has to come up on arbitrary hardware and land in a working shell with zero configuration.

Reliability & Security

  • JWT-authenticated filesystem, exec, and state APIs.
  • Playwright end-to-end tests run against the real desktop and server pair.