Skip to main content

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)

Source distribution for silphe 0.1.0
File Size Uploaded
silphe-0.1.0.tar.gz 29.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for silphe 0.1.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page