Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 153 additions & 0 deletions docs/landing/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Silphe &mdash; your mouse has a signature as personal as your handwriting</title>
<meta name="description" content="Silphe is a tiny, fully local desktop game and Python library that captures your own pointer-movement signature — the overshoot, the correction, the tremor, the chase — and shows how it drifts over time. Your data never leaves your machine.">

<meta property="og:title" content="Silphe">
<meta property="og:description" content="Your mouse has a signature as personal as your handwriting. Silphe learns it — locally, on your own machine.">
<meta property="og:image" content="https://thrivetech.ai/silphe/og.png">
<meta property="og:url" content="https://thrivetech.ai/silphe/">
<meta property="og:type" content="website">

<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Silphe">
<meta name="twitter:description" content="A desktop game that learns how you move the mouse — and watches it drift.">
<meta name="twitter:image" content="https://thrivetech.ai/silphe/og.png">

<style>
:root {
--bg: #0d1117;
--surface: #161b22;
--border: #30363d;
--text: #e6edf3;
--muted: #8b949e;
--green: #39d353;
--green-dim: #26a641;
--gold: #e3b341;
--purple: #a371f7;
--red: #f85149;
--mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
}
* { box-sizing: border-box; }
html, body {
margin: 0; padding: 0;
background: var(--bg); color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
line-height: 1.6; -webkit-font-smoothing: antialiased;
}
a { color: var(--green); text-decoration: none; }
a:hover { text-decoration: underline; }
main { max-width: 760px; margin: 0 auto; padding: 56px 24px 96px; }

.greek { color: var(--muted); font-family: var(--mono); letter-spacing: 2px; font-size: 15px; }
h1 { font-size: 64px; letter-spacing: -2px; margin: 6px 0 8px; line-height: 1; }
.tagline { font-size: 22px; color: var(--text); margin: 0 0 32px; max-width: 640px; }
.tagline strong { color: var(--green); font-weight: 600; }

.hero { width: 100%; border: 1px solid var(--border); border-radius: 12px; background: #010409; margin: 0 0 40px; display: block; }

h2 { font-size: 26px; letter-spacing: -0.5px; margin: 48px 0 12px; }
p { color: #c9d1d9; }
.muted { color: var(--muted); }

pre {
background: var(--surface); border: 1px solid var(--border); border-radius: 8px;
padding: 16px 18px; overflow-x: auto; font-family: var(--mono); font-size: 15px; color: var(--text);
}
code { font-family: var(--mono); }

.cols { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 16px 0; }
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; padding: 18px 20px; }
.card h3 { margin: 0 0 6px; font-size: 17px; }
.card.acquire h3 { color: var(--gold); }
.card.track h3 { color: var(--purple); }
.card.hold h3 { color: var(--red); }
.card.andvari h3 { color: var(--gold); }
.card p { margin: 0; font-size: 15px; color: var(--muted); }

.pill { display: inline-block; font-family: var(--mono); font-size: 12px; color: var(--muted);
border: 1px solid var(--border); border-radius: 999px; padding: 3px 12px; margin: 0 6px 6px 0; }

.links { display: flex; flex-wrap: wrap; gap: 12px; margin: 24px 0 0; }
.btn { border: 1px solid var(--border); border-radius: 8px; padding: 10px 18px; color: var(--text);
background: var(--surface); font-weight: 600; }
.btn.primary { background: var(--green-dim); border-color: var(--green); color: #03110a; }

footer { margin-top: 72px; padding-top: 24px; border-top: 1px solid var(--border); color: var(--muted); font-size: 14px; }

@media (max-width: 600px) {
h1 { font-size: 44px; }
.tagline { font-size: 19px; }
.cols { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<main>
<div class="greek">&sigma;&#943;&lambda;&phi;&eta; &middot; the small creature that runs in the dark</div>
<h1>Silphe</h1>
<p class="tagline">Your mouse has a signature as personal as your handwriting. Silphe learns it &mdash; and shows you how it <strong>moves, holds, hunts, and drifts</strong> over time.</p>

<!-- Human path (green: overshoot, correction, tremor) vs robot line (red: straight, sterile) -->
<svg class="hero" viewBox="0 0 760 300" role="img" aria-label="A human cursor path overshoots and corrects toward a target; a robot path goes straight.">
<!-- target -->
<circle cx="600" cy="92" r="26" fill="none" stroke="#30363d" stroke-width="2"/>
<circle cx="600" cy="92" r="16" fill="none" stroke="#484f58" stroke-width="2"/>
<circle cx="600" cy="92" r="4" fill="#39d353"/>
<!-- start -->
<circle cx="90" cy="232" r="5" fill="#8b949e"/>
<!-- robot: straight, dashed -->
<path d="M90,232 L600,92" fill="none" stroke="#f85149" stroke-width="2" stroke-dasharray="5 6" opacity="0.7"/>
<!-- human: ballistic launch, overshoot past target, corrective hops, tremor settle -->
<path d="M90,232
C 250,150 420,70 660,52
C 612,74 560,104 624,96
C 596,90 590,112 612,100
C 600,95 603,86 600,92"
fill="none" stroke="#39d353" stroke-width="2.5" stroke-linecap="round"
style="filter: drop-shadow(0 0 6px rgba(57,211,83,0.45));"/>
<text x="300" y="206" fill="#f85149" font-family="Consolas,monospace" font-size="13" opacity="0.8">robot &mdash; straight, no tremor</text>
<text x="120" y="120" fill="#39d353" font-family="Consolas,monospace" font-size="13">you &mdash; overshoot, correct, tremor</text>
</svg>

<p>Not whether you hit the target &mdash; <em>how you miss it on the way there.</em> Silphe is two things in one: a Python <strong>library</strong> that generates human-fidelity pointer movement and quantifies the movement you record, and a tiny <strong>game</strong> that captures yours while you play. Both are pure standard library. All of it is <strong>fully local</strong>.</p>

<h2>Install</h2>
<pre>pip install silphe</pre>
<p class="muted">No third-party dependencies. Generating and analyzing movement works on any OS; driving the real cursor is Windows-only.</p>

<h2>Why it's interesting</h2>
<p><strong>Everyone clones voices; nobody clones movement.</strong> Your pointer path is as individual as a fingerprint &mdash; and far less guarded. Silphe separates two things most tools blur:</p>
<p><strong>Predictive vs. reactive.</strong> Ride a smoothly drifting target and you track it with near-zero lag &mdash; you <em>predict</em> its path. Chase an evasive one and you're ~200&nbsp;ms behind &mdash; pure human reaction time. (First real session: ~7&nbsp;ms on the smooth dot, ~230&nbsp;ms on the runner. Textbook.)</p>
<p><strong>It drifts.</strong> Reaction, accuracy, tremor, and tracking shift with the time of day, fatigue, and the years &mdash; and Silphe plots the <em>arc</em>. The open question it's built to ask: when your scores climb, are you genuinely quicker, or have you just <em>learned the board</em>?</p>

<h2>The games (calibration in a clown costume)</h2>
<div class="cols">
<div class="card acquire"><h3>Acquire</h3><p>Hit the small gold target. Fitts's law: distance &times; size.</p></div>
<div class="card track"><h3>Track</h3><p>Follow a slowly drifting dot. Smooth pursuit, near-zero lag.</p></div>
<div class="card hold"><h3>Hold</h3><p>Keep dead still on a single red pixel. Your physiological tremor.</p></div>
<div class="card andvari"><h3>Andvari</h3><p>Hunt the roach through the maze; flush it from its hiding holes. Reactive chase.</p></div>
</div>
<pre>silphe-play # play
silphe-arc # your fingerprint over time</pre>

<h2>Privacy</h2>
<p>Your movement never leaves your computer. Local capture, local model, local analysis &mdash; no cloud, no telemetry, no account, no network calls. The recordings are plain files on your disk; read, move, or delete them whenever you like. Your silly walk is nobody's business but yours.</p>
<p><a href="privacy.html">Read the full privacy note &rarr;</a></p>

<div class="links">
<a class="btn primary" href="https://pypi.org/project/silphe/">pip install silphe</a>
<a class="btn" href="https://github.com/martymcenroe/silphe">GitHub</a>
<a class="btn" href="privacy.html">Privacy</a>
</div>

<footer>
Silphe &middot; a <a href="https://thrivetech.ai">Thrive Tech</a> project &middot; the library is
<a href="https://github.com/martymcenroe/silphe/blob/main/LICENSE">Apache-2.0</a>.
</footer>
</main>
</body>
</html>
68 changes: 68 additions & 0 deletions docs/landing/privacy.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Silphe Privacy &mdash; your movement data never leaves your computer</title>
<meta name="description" content="Silphe is local-first. Your pointer-movement recordings are written to your own machine and stay there — no cloud, no telemetry, no account, no network calls.">
<meta property="og:title" content="Silphe Privacy">
<meta property="og:description" content="Your movement data never leaves your computer.">
<meta property="og:url" content="https://thrivetech.ai/silphe/privacy.html">
<meta property="og:type" content="website">
<style>
:root {
--bg: #0d1117; --surface: #161b22; --border: #30363d;
--text: #e6edf3; --muted: #8b949e; --green: #39d353;
--mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
}
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; background: var(--bg); color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
line-height: 1.6; -webkit-font-smoothing: antialiased; }
a { color: var(--green); text-decoration: none; }
a:hover { text-decoration: underline; }
main { max-width: 680px; margin: 0 auto; padding: 56px 24px 96px; }
.back { font-family: var(--mono); font-size: 14px; color: var(--muted); }
h1 { font-size: 40px; letter-spacing: -1px; margin: 14px 0 6px; }
.lede { font-size: 20px; color: var(--green); margin: 0 0 32px; font-weight: 600; }
h2 { font-size: 21px; margin: 36px 0 8px; }
p, li { color: #c9d1d9; }
strong { color: var(--text); }
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; padding: 4px 22px; }
code { font-family: var(--mono); background: var(--surface); border: 1px solid var(--border);
border-radius: 5px; padding: 1px 6px; font-size: 14px; }
footer { margin-top: 64px; padding-top: 22px; border-top: 1px solid var(--border); color: var(--muted); font-size: 14px; }
</style>
</head>
<body>
<main>
<div class="back"><a href="index.html">&larr; Silphe</a></div>
<h1>Privacy</h1>
<p class="lede">Your movement data never leaves your computer.</p>

<h2>What Silphe records</h2>
<p>When you play, Silphe records the path of your pointer &mdash; positions and timestamps &mdash; and a few per-task numbers (reaction time, accuracy, tremor, tracking). That's all.</p>

<h2>Where it goes</h2>
<div class="card">
<p>Nowhere. It is written to a recordings folder on your own machine and stays there. There is:</p>
<ul>
<li><strong>No cloud upload.</strong></li>
<li><strong>No telemetry, no analytics, no "anonymized" exhaust.</strong></li>
<li><strong>No account, no login, no network calls at all</strong> for the core capture, analysis, and arc view.</li>
</ul>
</div>

<h2>Why this matters</h2>
<p>The exact wobble of your hand is about as personal as data gets &mdash; it can reveal fatigue, intoxication, and motor or cognitive change. That is precisely why Silphe is built local-first. Your signature is yours.</p>

<h2>Your data, your control</h2>
<p>The recordings are plain text (<code>JSONL</code>) on your disk. Read them, move them, or delete them whenever you like &mdash; they're just files.</p>

<h2>Contact</h2>
<p><a href="mailto:privacy@thrivetech.ai">privacy@thrivetech.ai</a></p>

<footer>Silphe &middot; a <a href="https://thrivetech.ai">Thrive Tech</a> project.</footer>
</main>
</body>
</html>
Loading