Local-first · free & open source

A smooth, configurable gaze target for eye-movement work.

Sweeps, circles, infinity figures, and steady fixation holds — a ball you set moving or hold still, shaped to the session, running as a tiny app on your own machine.

Zoetrope opens like a desktop app in its own chromeless window. One self-contained binary — no account to create, no cloud in the loop, nothing you configure ever leaves your computer.

GPLv3 · Linux, macOS & Windows · a tool for use with a qualified practitioner, not a treatment

Every motion the work needs

One animation engine, many shapes. Build a playlist of patterns, tune each one, and play it back at a steady, calibrated pace — every pattern moves at the same on-screen speed at a given setting.

Linear sweeps

Horizontal, vertical, and both diagonals — the ball tracks edge to edge at a constant pace. The classic left-right pass, plus every axis in between.

Circles & figure-8s

Clockwise or counter-clockwise revolutions, and true figure-8s built from two tangent circles — in both the and 8 orientations.

Infinity ∞ & Lissajous

Smooth infinity traces, lobes side-by-side or stacked, clockwise or counter — the continuous, flowing path many practitioners reach for.

Serpentine & lightbulbs

Closed-loop raster scans across a configurable number of lanes, with rounded U-turns — or turns that balloon into circular bulbs the ball loops around.

Free-angle bounce

Set an initial heading and let the ball ricochet off the edges — a wandering path that never repeats the same way twice.

Edge-linger pulse

An optional vision-training dwell: the ball pauses and grows at each extreme of a sweep, then shrinks and reverses — peripheral feedback so the eyes can travel to the edge and pick it back up smoothly.

Position sequences

A separate engine that steps through named gaze targets on a 3×3 grid plus center — the basis for IEMT, saccade and anti-saccade drills, and brainspotting fixation. Park the ball on a single target for a still fixation hold, or step between targets with the dwell (up to 120s) and smooth-pursuit transit times you set.

Smooth-pursuit transitions

Between fixation points the ball glides on a cosine ease-in-out — a true smooth pursuit, not a jump — with the dwell and transit times you set.

Named playlists & libraries

Keep any number of playlists, filed under free-form categories like Continuous, IEMT, or EMDR. Switch the active one from a picker; each has its own loop-or-stop behavior.

Per-item control

Every item takes its own color, repeat count, direction, angle, and an optional speed override — so one playlist can mix a slow warm-up with a brisk set.

One dial, one pace

A single speed knob sets the ball's on-screen pixel speed; every pattern is normalized by its path length, so a circle and a sweep move at the same pace at a given setting.

Transport & keyboard

Play, pause, stop, skip, and restart from a transport bar, or drive it hands-free: Space to play/pause, / to move between patterns, Home to the top.

Entirely offline

Serves its own UI on 127.0.0.1 and saves your config to a JSON file on disk. No telemetry, no phone-home, no analytics — the only thing it opens is your browser.

See it in action

A full-screen canvas for the animation and a tucked-away editor for everything else. Dark, quiet, and out of the way during a session.

A ball tracing an infinity figure on a full black canvas
A ball on a full-screen canvas, tracing an infinity figure
The editor panel showing global controls and the pattern library
The editor: global controls, library, and per-item settings
A position-sequence editor with a 3 by 3 grid of gaze targets
Position sequences for IEMT and fixation work
The library picker showing playlists grouped by category
Playlists, filed by category

Why Zoetrope

100% local

It runs on your machine and serves itself on localhost. No account, no cloud, no session ever leaves the room.

Free & open

GPLv3, source in the open. No subscription, no per-seat licence, no hardware to buy or replace.

One binary

A single self-contained download that opens like a desktop app. Nothing to configure, no runtime to install.

Endlessly configurable

Thirteen pattern types, per-item tuning, named playlists, and a position-sequence engine that spans several modalities.

What Zoetrope is — and what it isn't

Zoetrope is a configurable gaze-target animator — software that moves a ball on a screen. It is not a treatment, not a medical device, and not a substitute for clinical care.

The included IEMT presets, and any named modality it can be used for — EMDR, saccade training, anti-saccade, brainspotting fixation, smooth-pursuit vision work — are starting templates for use with a qualified practitioner of that modality. The shipped IEMT sequences are drafts, not canonical clinical protocols.

Nothing on this page or in the app is a therapeutic claim. Zoetrope makes no promise of any outcome. If you are seeking care, work with a licensed professional.

How Zoetrope compares

A look at the tool itself — cost, platform, and configurability. Not a comparison of clinical effectiveness. ✅ built in · 🟡 partial / add-on · ❌ not available

Capability Zoetrope bilateralstimulation.io REMDR NeuroTek light bar
Price Free FreePro add-ons Subscription Hardware
Open source (GPLv3)
Runs offline, no hosted service browser / hosted browser / hosted local hardware
No account required
No dedicated hardware any computer requires the device
Visual bilateral stimulation
Pattern variety beyond horizontal 13 patterns 🟡limited 8 patterns mostly horizontal
Configurable playlists / sequences 🟡 🟡
Beyond EMDR (IEMT · saccade · fixation)
Audio / tactile bilateral stimulation visual only audio · tactile add-on 🟡add-on
Teletherapy / remote control single-user, local

Reach for a hosted tool like bilateralstimulation.io or REMDR when you need audio or tactile stimulation, teletherapy, or therapist-side remote control over the internet; reach for a dedicated light bar when you want purpose-built hardware. Reach for Zoetrope when you want a free, open, offline, endlessly-configurable visual gaze target that never leaves your machine. Comparison covers the tools as software and hardware only — it says nothing about clinical outcomes, and Zoetrope is not a treatment.

How it works

Download the build for your OS and open it. On Linux the .deb adds Zoetrope to your app menu; every platform also has a standalone binary.

# Debian / Ubuntu — installs to your applications menu
sudo apt install ./Zoetrope-*.deb
zoetrope

Or build it yourself — it's one Go module, no build step for the UI (assets are embedded):

git clone https://github.com/daniel-alexander4/zoetrope
cd zoetrope
go build .
./zoetrope        # opens the UI in a chromeless app-mode window

On launch it picks a free port on 127.0.0.1, reads or creates config.json in your OS user-config directory, and opens the UI in an installed Chromium-family browser (falling back to a normal tab). Quit by closing the window — the server notices and shuts itself down. Your playlists persist between runs.

Download

Free and GPLv3, for Linux, macOS, and Windows. Builds are unsigned — your OS may warn on first launch; open it anyway.

Linux

Debian & Ubuntu get a .deb that adds Zoetrope to your app menu. Any other distro: the static zoetrope-…-linux-amd64 binary runs anywhere.

Download .deb (Debian / Ubuntu)

Static binary (any distro)

macOS

A universal Zoetrope.app (Apple Silicon + Intel), zipped. Unsigned, so right-click → Open the first time.

Download for macOS

Windows

A standalone Zoetrope-…-windows-amd64.exe — no console window, nothing to install. SmartScreen may warn; choose More info → Run anyway.

Download for Windows

All platforms

Every build, checksum, and the full source live on the releases page.

All downloads & source

On Debian or Ubuntu, install the downloaded package:

sudo apt install ./Zoetrope-*.deb

Shape the motion to the session.

A free, open, offline gaze target you tune to the work in front of you.