Silphe
Your mouse has a signature as personal as your handwriting. Silphe learns it — and shows you how it moves, holds, hunts, and drifts over time.
Silphe (σίλφη — Ancient Greek for the small creature that runs in the dark) is a tiny, fully local instrument for your own visuomotor signature: how you, specifically, move a pointer. Not whether you hit the target — how you miss it on the way there: the overshoot, the correction, the tremor, the chase.
It has two halves:
- a library that generates human-fidelity pointer movement and quantifies the movement you record, and
- a game that captures your movement while you play.
It began as a mouse-calibration chore and turned into something more interesting.
Why it's interesting
- Everyone clones voices; nobody clones movement. Your pointer path is as individual as a fingerprint — and far less guarded.
- Predictive vs. reactive. Track a smooth target and you ride it with ~zero lag. Chase an evasive one and you're ~200 ms behind — pure human reaction time. Silphe measures both, separately.
- It drifts. Reaction, accuracy, tremor, tracking — they shift with the time of day, fatigue, a new medication, and the years. Silphe plots the arc.
- Your data never leaves your machine. Local capture, local model, local analysis. No cloud, no telemetry. Your silly walk is nobody's business but yours.
Install
pip install silphe
Pure standard library — no third-party runtime dependencies. Generating and analyzing movement works on any OS; driving the real OS cursor (silphe.cursor) is Windows-only.
Use the library
Generate a human-fidelity path — overshoot, corrections, tremor, dwell — on any platform:
import random
from silphe import MovementModel
model = MovementModel(rng=random.Random(0)) # seed for reproducibility
path = model.plan(0, 0, 400, 250) # -> [(x, y, dt), ...]
Drive the real cursor with a trusted OS click (Windows):
from silphe import HumanCursor
HumanCursor().click(960, 540)
Quantify a recorded session into an aggregate signature:
from silphe import load_recordings, session_signature
trials, _ = load_recordings() # ~/.silphe/recordings by default
sig = session_signature(trials)
print(sig["acquire"]["fitts"], sig["hold"]["tremor_hz"], sig["track"]["lag_ms"])
See the session schema.
Play (calibration in a clown costume)
A green-garden field with four tasks:
- Acquire — hit the small gold target (Fitts's law: distance × size)
- Track — follow a slowly drifting dot (smooth pursuit)
- Hold — keep dead still on a single red pixel (tremor)
- Andvari — hunt the roach through the maze: it runs the dark, hides under silver cells, and you switch tools (swatter → pick, press T) to flush it out and finish it
silphe-play # play (mouse)
silphe-play trackpad # tag the session as a trackpad
Then see yourself:
silphe-analyze # this session's aggregate signature
silphe-lag # are you late? temporal lag vs spatial offset vs noise
silphe-arc # the longitudinal dashboard — your fingerprint over time
silphe-demo # human vs robot cursor, side by side (Windows)
From a source checkout, the same modules run via python -m silphe.calibrate, python -m silphe.analyze, and so on.
The science, briefly
Fitts's law, corrective sub-movements, physiological tremor (4–12 Hz), smooth-pursuit lag, and the difference between getting faster and merely learning the board. See the science.
Privacy
Local-first, always — your movement never leaves your computer. See the privacy note.
License
Apache-2.0 — permissive, with a patent grant. Use it, fork it, build on it.
Metadata
Release files for silphe 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| silphe-0.1.0.tar.gz | 29.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| silphe-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 62.3 kB
Release files / silphe-0.1.0.tar.gz
| Download URL | silphe-0.1.0.tar.gz |
|---|---|
| Size | 29.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
75f08ef0f65d4bf9671ba69ceb41d041ef7c955eca26d52aed5ba144891c82f6
|
|
BLAKE2b-256 checksum How to use checksums |
3cf2a87797cc93b4a0a1ae66366cabe3e63036fb4baff1cd7d5e2116b9f35d3a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|
Release files / silphe-0.1.0-py3-none-any.whl
| Download URL | silphe-0.1.0-py3-none-any.whl |
|---|---|
| Size | 33.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a00e3078765f8befc5bdb7d9f5c561f8cdbd5234f1b0ae9816c6fab13706964a
|
|
BLAKE2b-256 checksum How to use checksums |
091c2e10da5dd70ba387bf249b76618e4e9a14ff27bab21ac85cf05ad1553259
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.0
|