The Browser-Native BCI Operating System
Connect 8 to 48 channels over Web Bluetooth or Web Serial directly into a Chromium tab. Packet decoding, Hampel despiking, Butterworth IIR filtering, Worker FFT, 3D head topography, a 15 Hz programmable JS lab, and 35+ neural experiences execute client-side. No drivers, no account required.
[01 · CLOUD ARCHITECTURE]
Trace every surface in the browser tab
Pick a Cloud subsystem to inspect its signal inputs, client-side execution path, and live output format. Hover any specification row to highlight its nodes on the diagram.
Live output preview
Values in the live panel are simulated to illustrate the runtime contract of each Cloud surface.
[02 · SESSION LOBBY & TRANSPORTS]
Nine hardware & lab sources. Zero drivers.
On load, cloud.pieeg.com/lobby probes browser Web Bluetooth and Web Serial readiness, remembers authorized USB serial ports for one-click reconnect, and adapts the 3D topomap montage to your board automatically.
IronBCI
1 × ADS12998-ch · 250 Hz · 24-bit
Standalone 8-channel wireless wearable for scalp EEG, EOG, EMG, and ECG.
IronBCI-16
2 × ADS129916-ch · 250 Hz · 24-bit
Dual-chip 16-channel BLE acquisition for full 10-20 scalp montages.
PiEEG XR
ADS1299 + STM32WB8-ch · 250 Hz · Face Mask
10 dry Ag/AgCl pads in a VR facial interface. Auto-loads the 3D face montage.
PiEEG XR-16
2 × ADS129916-ch · 250 Hz · Face + Occipital
Combines facial EMG/EOG mask pads with an occipital visual-cortex cluster.
Octopus 16
2 × ADS131M0816-ch · 250 Hz · ESP32-S3
Coin-sized spring-loaded pogo-pin array. Flash firmware in-browser, pair over BLE.
Kraken-48
6 × ADS131M0848-ch · 250 Hz · 3 × Octopus
Aggregates three wireless Octopus-16 nodes over a single XIAO ESP32-S3 USB receiver.
Aura VR
109-byte BLE frames8-ch sEMG · 6-axis IMU
Wrist/palm sEMG plus gravity-compensated 6-axis IMU with live 3D hand kinematics.
IronBCI-32
4 × AD7771 + STM32H732-ch · 500 Hz · High-Density
32-channel wet-electrode research rig speaking the FreeEEG wire protocol over USB.
No Hardware? Run Synthetic or Custom Mock
Launch instant in-browser streams (demo:8, demo:16, demo:32, demo:auravr) or open Mock Studio (/mock) to stack scripted blinks, bands, 60 Hz mains, and EMG bursts.
Raspberry Pi & Jetson SPI via WebSocket
Using PiEEG-8, PiEEG-16, or JNEEG on GPIO SPI? Run pieeg-server locally (with optional pieeg-core Rust DSP speedup) and point the Cloud lobby at ws://raspberrypi.local:1616.
Join a Live Relay or Browse Cloud Library
Paste a session code or open /live/:relayId to watch a shared experiment in real time with live viewer count, or explore public datasets in /library with zero login.
[03 · LIVE LAB (BIO-PEN) · CLOUD.PIEEG.COM/LAB]
Write multi-stage DSP & classifiers at 15 Hz. Share in one URL.
Live Lab runs a reactive chain of JavaScript cells inside a dedicated Web Worker against the live 2-second 250 Hz ring buffer. If no board is paired when you open a shared /lab/:penId link, it boots directly on the 8-channel simulated stream so every pipeline runs immediately.
const clean = car(win); const ch0 = detrend(clean[0] || []); check(Math.abs(mean(ch0)) < 1e-3, "DC offset removed (mean ~ 0 uV)"); return ch0; // → auto-plots time-domain waveform trace
const model = lda(dataset.X, dataset.y, 0.25);
const cv = loroCV(dataset.X, dataset.y, dataset.reps, "lda");
const x = features(frame);
check(cv.balancedAccuracy >= 0.6, "Held-out LORO-CV balanced accuracy >= 60%");
return {
label: model.predict(x),
probs: model.predictProba(x),
loroBalancedAccuracy: cv.balancedAccuracy,
}; // → auto-plots live class probability bars + LORO badgeRecord 2-second labelled repetitions (rest, active, or custom classes) or click Seed Demo Epochs. The Arena benchmarks your pipeline against reference Shrinkage-LDA and L2 Logistic Regression, showing both trial-grouped LORO-CV balanced accuracy and naive sample-split k-fold accuracy side-by-side so temporal autocorrelation leakage is exposed.
Save any pipeline via cloud permalinks (/lab/:id), self-contained base64 URLs (/lab?pen=…), or portable .biopen.json bundles. Guest creators receive a local SHA-256 X-Pen-Token to update their pen without an account; visitors who edit and save mint a forked /lab/:newId.
Pre-Bound Worker Primitives
car(win)bipolar(chA, chB)detrend(s)zscore(s)rms(s)lineLength(s)slopeSignChanges(s)fft(s)psd(s, fs, maxHz)bandpower(s, [lo, hi])cohensD(a, b)features(frame)lda(X, y, shrinkage)logreg(X, y)loroCV(X, y, reps)crossValScore(X, y, k)check(cond, msg)Return-Driven Auto-Visualizer
number | { value, unit }Monospace readout + 120-tick rolling sparklinenumber[] (> 16 items)Time-domain waveform trace with zero-line & µV peaknumber[] (<= 16) | { labels, values }Color-coded channel or feature bar chart{ freqs, power, peakHz }Power spectrum curve with 8-12 Hz alpha band marked{ matrix, labels }2D covariance or LORO-CV confusion heatmap{ label, probs, loroBalancedAccuracy }Live BCI decoder probability bars + LORO badge[04 · LOCAL BRIDGE & NEURAL STREAM · WEBRTC P2P → OSC]
One TouchDesigner OSC In CHOP receives the whole headset.
Browser tabs cannot send raw UDP packets directly to local creative-coding tools. PiEEG Local Bridge (~5 MB standalone Rust/Tokio binary) pairs with your browser tab via a 6-character share code and opens a direct, DTLS-encrypted WebRTC P2P data channel over loopback or LAN. Zero signal frames route through the cloud.
/pieeg)/pieeg/focus, /pieeg/relax, /pieeg/engagement, /pieeg/dominant/pieeg/delta, /pieeg/theta, /pieeg/alpha, /pieeg/beta, /pieeg/gamma/pieeg/blink/pieeg/ch1/level … /pieeg/chN/level/pieeg/ch1/alpha … /pieeg/chN/gammaHow P2P Pairing Works
- 1Run
pieeg-local-bridgeon Windows, macOS, or Linux. It opens127.0.0.1:47800and shows a 6-character share code. - 2In
cloud.pieeg.com, open Local Bridge, enter the 6-character code, and complete the one-time HTTPS SDP/ICE handshake. - 3Flip Neural Stream to Streaming (or use
useLocalBridge().send()from any experience or Live Lab stage).
Built-In Target Presets & Diagnostics
Includes one-click presets for TouchDesigner (port 7000), Max/MSP & Ableton, VRChat Avatars (port 9000), and custom OSC roots, plus mDNS (_osc._udp) auto-discovery and a copyable diagnostics report that detects background tab timer throttling.
[35+ BROWSER-NATIVE EXPERIENCES]
Browser-first ML. Explainable weights. Honest cross-validation.
Every experience in cloud.pieeg.com/experiences is lazy-loaded into its own JS chunk, reads ring buffers via refs to preserve 60 fps, explains its protocol and sensor limits up front, and reports trial-grouped cross-validation rather than inflated sample splits.
Mushroom Body Decoder
Live EEG band powers drive projection-neuron inputs of the Drosophila mushroom body (~2,000 Kenyon cells, 5% sparse coding, trained KC-to-MBON readout).
Silent Speech Interface
Placement-agnostic subvocal sEMG word decoder. Epoched on muscle onset, fit with per-word L2 + group-lasso logistic classifiers and LORO-CV readiness.
Face Trainer v2
Common-Average Reference + 40-D time/spectral features across 8 channels. Group-lasso exposes per-electrode importance bars for every expression.
octoAuth
Octopus-16 neck sEMG challenge-response demo: verifies unpredictable isometric action liveness and person-specific sternocleidomastoid spatial maps.
octoCaptcha
Issues a random blink-count nonce after a GO cue and verifies corneal-retinal Fp1/Fp2 morphology, bilateral coherence, and human inter-blink jitter.
Signal Lab
Three-world DSP curriculum (Time Domain, Cleaning, Frequency Domain) where every lesson runs a live interactive sandbox on your real EEG stream.
BioPose Recorder
Aligns webcam body-stick keypoints alongside live multichannel biosignal traces for review, timeline marking, and JSON/CSV export (camera pixels never stored).
Rorschach Recorder & Dataset Labs
Guided trial protocols (Rorschach Recorder, Aura Dataset Lab) that package native-rate EEG/sEMG, trial tables, and multimodal Excel/CSV archives.
[05 · DATA ARCHITECTURE & DEPLOYMENT MODES]
What stays in your tab, and the three opt-in paths that touch a server
PiEEG Cloud is a static web application. Acquisition, filtering, spike rejection, spectral analysis, on-device classifiers, and local CSV recording run on your machine with no background upload.
Web Bluetooth and Web Serial streams, DSP, FFT, 3D head maps, trained pattern weights (in localStorage), Local Bridge WebRTC P2P frames, and local CSV downloads never talk to PiEEG servers.
When you start a relay, frames pass through our Fly.io (London) relay in transit to whoever holds your /live/:relayId link and are immediately discarded. Relay signal data is not recorded or logged.
Recordings stay on your disk until you explicitly upload one to Cloud Library (DigitalOcean Spaces, London) or save a /lab/:id Bio-Pen. Visibility (private, unlisted, public), embargo date, and permanent deletion are under your control.
Signing in to manage uploaded sessions uses your email and a 6-digit one-time code (MongoDB, Dublin). No passwords are stored. This is separate from the local 6-digit --auth code verified by a self-hosted pieeg-server.
| Layer | PiEEG Cloud (cloud.pieeg.com) | Self-Hosted (pieeg-server) |
|---|---|---|
| Installation | None: open cloud.pieeg.com in Chrome, Edge, Brave, or Opera | pip install pieeg-server (Python 3.10+ on Pi, Jetson, Linux, macOS, Windows) |
| Hardware Input | IronBCI 8/16, PiEEG XR 8/16, Octopus-16, Aura VR (Web Bluetooth); IronBCI-32, Kraken-48 (Web Serial) | All BLE & USB Serial boards + Raspberry Pi / Jetson GPIO SPI shields (PiEEG-8, PiEEG-16, JNEEG) |
| DSP & FFT | Client-side in the browser tab (Hampel, Butterworth IIR, 256-pt Worker FFT) | Server-side Python or optional pieeg-core Rust wheel (~1057× faster bandpass) |
| Local App Output | WebRTC P2P to Local Bridge (5 MB Rust app) → UDP OSC for TouchDesigner, Max/MSP, VRChat | Native Lab Streaming Layer (--lsl), VRChat UDP OSC (--osc), and HTTP webhooks |
| AI Copilot | Buddy (buddy.pieeg.com): 100% in-tab, 10 read-only tools, BYO LLM key or local Ollama | PiEEG Agent (pieeg-agent): LSL perception cascade, Jupyter notebook generator, MCP server |
Open a tab and inspect the signal
Pair a board over Web Bluetooth or Web Serial, launch a synthetic stream in Mock Studio, or write a 15 Hz pipeline in Live Lab.