Generate and quantify human-fidelity pointer movement — your mouse's signature, captured locally.
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file silphe-0.1.0.tar.gz.
File metadata
- Download URL: silphe-0.1.0.tar.gz
- Upload date:
- Size: 29.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75f08ef0f65d4bf9671ba69ceb41d041ef7c955eca26d52aed5ba144891c82f6
|
|
| MD5 |
41758d2d9db4708e06363aa8822f773a
|
|
| BLAKE2b-256 |
3cf2a87797cc93b4a0a1ae66366cabe3e63036fb4baff1cd7d5e2116b9f35d3a
|
File details
Details for the file silphe-0.1.0-py3-none-any.whl.
File metadata
- Download URL: silphe-0.1.0-py3-none-any.whl
- Upload date:
- Size: 33.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a00e3078765f8befc5bdb7d9f5c561f8cdbd5234f1b0ae9816c6fab13706964a
|
|
| MD5 |
2a84c08f3717ef37bf3a5512271b50b4
|
|
| BLAKE2b-256 |
091c2e10da5dd70ba387bf249b76618e4e9a14ff27bab21ac85cf05ad1553259
|