Skip to main content

Behaviorally realistic human mouse and keyboard I/O simulation and bot detection.

Project description

humanio

Behaviorally realistic human I/O simulation and bot detection — for both mouse and keyboard.

humanio generates human-like input data (mouse trajectories and keystroke event streams) grounded in motor-control and keystroke-dynamics research, and ships matching detectors that score input as human or bot.

The generators never touch the OS by default — they produce timed event data that you feed into whatever automation backend you use (PyAutoGUI, Playwright, Selenium, …). Actually moving the cursor is opt-in via MouseExecutor.

humanio is proprietary, subscription software distributed as compiled binaries. Generation and detection calls are metered. A metered free tier is available (anonymous or signed-in); a subscription removes the cap. See Licensing below. Source code is not provided.

humanio
├── mouse    HumanMouse · MovementDetector · MouseExecutor
└── typing   SimulationEngine · BotClassifier · TypistProfile · KeystrokeEvent

Demo

Human-like input (teal/green) vs a naive bot (red) — side by side, scored live by the matching detector. The human mouse path curves and corrects through submovements; the bot moves in straight constant-velocity lines. The human typing stream varies its timing and fixes a typo; the bot types at a perfectly uniform cadence.

humanio demo

Watch the video — regenerate it with pip install "humanio[viz]" then python examples/visualize.py.


Installation

pip install humanio

To enable real cursor replay (MouseExecutor), install the optional extra:

pip install "humanio[mouse-control]"   # adds pyautogui

On first use the library establishes a metered free-tier session. To unlock unlimited use, activate a subscription:

import humanio
humanio.activate("YOUR-LICENSE-KEY")

Mouse

Generate a human-like trajectory and check it against the detector:

from humanio.mouse import HumanMouse, MovementDetector

mouse = HumanMouse(seed=42)
trajectory = mouse.generate(start=(100, 200), end=(800, 450), target_width=20)
# trajectory is a list[Point] with (x, y, t) — t in seconds from movement start.

detector = MovementDetector()
result = detector.classify(trajectory)
print(result.label, f"{result.confidence:.0%}")   # e.g. "human 87%"
print(result.explanations)                         # which rules, if any, flagged it

Every trajectory models Fitts's Law timing, an asymmetric bell-shaped velocity profile, 2–5 overlapping minimum-jerk submovements, signal-dependent neuromotor noise, undershoot-and-correct behavior, lateral path curvature, and homing-phase micro-jitter. Per-user variation comes from a UserProfile:

from humanio._shared.types import UserProfile

profile = HumanMouse.random_profile(seed=7)   # plausible randomized individual
mouse = HumanMouse(profile=profile, seed=7)

Replaying through the real cursor (requires the mouse-control extra):

from humanio.mouse import MouseExecutor

executor = MouseExecutor(speed_multiplier=1.0)
executor.execute_with_click(trajectory, button="left")

Typing

The simulator produces a list of KeystrokeEvents with realistic inter-key timing, errors and corrections. It never sleeps — schedule the events yourself using event.press_time_ms.

from humanio.typing import SimulationEngine, BotClassifier, TypistProfile

profile = TypistProfile.average()      # or .expert() / .novice() / TypistProfile(base_wpm=55, error_rate=0.04)
engine = SimulationEngine(profile)

events = engine.type_text("Hello, world! This is a typing simulation.")
for ev in events[:5]:
    print(f"{ev.key!r:8}  press={ev.press_time_ms:7.1f}ms  dwell={ev.dwell_ms:5.1f}ms")

classifier = BotClassifier()
result = classifier.classify(events)
print(result.verdict, f"bot_probability={result.bot_probability:.2f}")
print(result.feature_scores)   # per-feature breakdown

See examples/typing_example.py for a fuller walkthrough, including scheduling events against pyautogui and contrasting a human-like stream with a perfectly-uniform bot stream.


Licensing

humanio is metered. Each generation/detection call costs one or more actions against your current tier:

Tier How to get it Allowance
Anonymous nothing — just run it small monthly quota
Free account humanio.login("account-id") larger monthly quota
Subscriber humanio.activate("LICENSE-KEY") unlimited
import humanio

humanio.activate("YOUR-LICENSE-KEY")   # unlock a subscription
print(humanio.status())                # tier, usage, quota, reset time

try:
    traj = HumanMouse(seed=1).generate((0, 0), (800, 400))
except humanio.QuotaExceeded as e:
    print("Free-tier limit reached — subscribe at", e.url)
except humanio.SubscriptionRequired as e:
    print("Renew at", e.url)

Usage is metered server-side, so quotas can't be reset by clearing local state. Subscription status is cached with a short offline grace window and re-validated periodically. How this is enforced (compiled binaries, a device-bound tamper-evident ledger, server-anchored usage, per-release secret rotation, Ed25519-signed responses) is summarized in docs/architecture/licensing.md.

Try the whole flow locally (no Stripe/Cryptlex)

python examples/licensing_demo.py     # anonymous → free → subscriber, in-process

Or against the real reference server with signed responses:

pip install ".[server]"
uvicorn server.app:app --port 8000           # prints its signing public key
# in another shell:
HUMANIO_BACKEND_URL=http://127.0.0.1:8000 \
HUMANIO_SERVER_PUBKEY_HEX=<printed key> \
HUMANIO_DEV_TIER=anonymous \
python -c "import humanio; from humanio.mouse import HumanMouse; \
HumanMouse(seed=1).generate((0,0),(300,200)); print(humanio.status())"

Useful env vars for local/dev runs: HUMANIO_DEV_TIER (anonymous/free/ subscriber), HUMANIO_BACKEND_URL, HUMANIO_SERVER_PUBKEY_HEX, HUMANIO_LICENSE_KEY, HUMANIO_LEDGER_DIR.


Project layout

humanio/
├── src/humanio/
│   ├── mouse/         trajectory generation, detection, cursor replay
│   ├── typing/        keystroke simulation (simulation/) and detection (detection/)
│   ├── _license/      sign-in, subscription gating, metered free tier
│   └── _shared/       shared types (Point, Trajectory, UserProfile, …) and RNG
├── server/           reference licensing + metering server (FastAPI)
├── packaging/        per-build secret rotation + Nuitka compile
├── tests/
├── examples/
├── docs/
│   ├── research/      the research reports the models are built on
│   └── architecture/  licensing & hardening design
├── pyproject.toml
├── EULA.md
└── LICENSE

Documentation

The behavioral models are derived from the research compiled in docs/research/:

Development

pip install -e ".[dev]"
pytest

Responsible use

humanio is intended for legitimate purposes: testing the robustness of your own bot-detection systems, building accessibility and human-factors tooling, research, and QA automation. Do not use it to evade detection on systems you do not own or operate, or to violate any site's terms of service.

License

Proprietary © 2026 Jayden C. All rights reserved. Use is governed by the EULA; see LICENSE. No source code is licensed or provided.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

humanio-0.1.0-cp312-cp312-win_amd64.whl (547.4 kB view details)

Uploaded CPython 3.12Windows x86-64

humanio-0.1.0-cp312-cp312-manylinux_2_38_x86_64.whl (929.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.38+ x86-64

humanio-0.1.0-cp312-cp312-macosx_10_13_universal2.whl (611.3 kB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

humanio-0.1.0-cp311-cp311-win_amd64.whl (562.4 kB view details)

Uploaded CPython 3.11Windows x86-64

humanio-0.1.0-cp311-cp311-manylinux_2_38_x86_64.whl (829.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.38+ x86-64

humanio-0.1.0-cp311-cp311-macosx_10_9_universal2.whl (605.1 kB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

humanio-0.1.0-cp310-cp310-win_amd64.whl (538.6 kB view details)

Uploaded CPython 3.10Windows x86-64

humanio-0.1.0-cp310-cp310-manylinux_2_38_x86_64.whl (783.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.38+ x86-64

humanio-0.1.0-cp310-cp310-macosx_10_9_universal2.whl (586.3 kB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

humanio-0.1.0-cp39-cp39-win_amd64.whl (535.5 kB view details)

Uploaded CPython 3.9Windows x86-64

humanio-0.1.0-cp39-cp39-manylinux_2_38_x86_64.whl (775.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.38+ x86-64

humanio-0.1.0-cp39-cp39-macosx_10_9_universal2.whl (573.3 kB view details)

Uploaded CPython 3.9macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file humanio-0.1.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: humanio-0.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 547.4 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for humanio-0.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1ce409e7cb8ee8e6d532594ada8888a3c7d3a6ddeb35b187449b8ef2b54d9f78
MD5 e0ebc4dddd5ed7e6e97e33a1f8ed2414
BLAKE2b-256 6b5b0ee4538abc2ecf9bf1708e3f5c10290e09b139f3513ddc42d60cc1ca2bf3

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp312-cp312-win_amd64.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp312-cp312-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for humanio-0.1.0-cp312-cp312-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 c22835c54ba254412041d89bf1f7c96ea8da5936bd5b86aff8a763edaa8e9b89
MD5 a6d8929191c20acccdc06330b4726009
BLAKE2b-256 131bb9c829e3c3166683466128ab4ec17d0ed44089667d950a40f21c2c4bcd14

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp312-cp312-manylinux_2_38_x86_64.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for humanio-0.1.0-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 dd618c6cc1c7394b1abc56fc98f8dd02ddbde7b23cf3e57a5c752f2eb61bec4e
MD5 c04311c0f3879f60dac2bd18ad2038ae
BLAKE2b-256 07b2d66d4d06cf0b61a7ea1bf1b71c1edb40cc163ff17ab5042a9c2ac0d3e738

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp312-cp312-macosx_10_13_universal2.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: humanio-0.1.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 562.4 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for humanio-0.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 dd9acac38c89653247a69b2976bd0f59384ca10c1981b6003b4e2c6016f8cf2f
MD5 cdd53b5e076d07988b8cde3db4efdc3c
BLAKE2b-256 8e8cfde48bf235d3ae79849ed264640fd96d651bcfb8123361ec4abe04a29cb4

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp311-cp311-win_amd64.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp311-cp311-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for humanio-0.1.0-cp311-cp311-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 7df35ac25f9e7175682428c793b3c0f53cc0163b6a5bf1b8fd882d6635510339
MD5 448304065bba5ac14695e05c4a95f5ff
BLAKE2b-256 d1c6c906cdc51194c713dee0db0a1642a3916e4fbf1067a3f5d45f61a497e47b

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp311-cp311-manylinux_2_38_x86_64.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for humanio-0.1.0-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 c628134952bbd4420bb874008b13829ca708edd4e968c2bda287bbcb7d200757
MD5 e9ec2fe88fb5ff664bf5c5daa76c4493
BLAKE2b-256 47db2cc6270e695efc2477177a874ac9c84267d2a08ff229521d0238dd3c8ff5

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp311-cp311-macosx_10_9_universal2.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: humanio-0.1.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 538.6 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for humanio-0.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b912f151ed5a3d7e168b63726546209ed7d0c71e70ac3c6c260683f4de64e98f
MD5 91b3e877dd227a61873657de2e597a12
BLAKE2b-256 4545145b99aa39fed64f005d8a48dfc813ebd8de5ef65b42b4379affff5a8998

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp310-cp310-win_amd64.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp310-cp310-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for humanio-0.1.0-cp310-cp310-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 ec063efa0ace4fa28fbca214b107bd3d1849d3cdfec04c5d415a4effae648499
MD5 ee64b76ed6e7c13fa891254c5079d313
BLAKE2b-256 a8fbfc39e5219ff3fd8a25dba0ba6d88aa69e9578a3cba793a96f1689f4703a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp310-cp310-manylinux_2_38_x86_64.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for humanio-0.1.0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d70bbd0b6707d7c7effff579862fdae431ad65f663ddfb403130bbe9eadcfbf1
MD5 8b41b808df0c0247e572730173d3fce9
BLAKE2b-256 1aed1fb0eb3e3e9cba9a2e52a6185e44196436b9486d83433844b5bd7851a9f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp310-cp310-macosx_10_9_universal2.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: humanio-0.1.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 535.5 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for humanio-0.1.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6bbe521232581aa8cbb7807c5fb2ba6c9025e245b0dd76526ce705125a59750d
MD5 59100c968fbf5708e7abee0f258a6132
BLAKE2b-256 760199d5e3bb8560c8be1c32ecdc87497f95fa33597b1e1745d12d8f8c4fc8fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp39-cp39-win_amd64.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp39-cp39-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for humanio-0.1.0-cp39-cp39-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 ec58205dfd5916315c4341b40a30deb9dc60136f2cce1afbd8e436d1f358f94f
MD5 6664e303592e8b5930ab09c1a6c3d761
BLAKE2b-256 3529eefe6bd42738272b6e6727197265e25cce2454efb6ec728aa97c73f55389

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp39-cp39-manylinux_2_38_x86_64.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file humanio-0.1.0-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for humanio-0.1.0-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 46f1ca0a19954b7b6c3818819fb94397f090173a08682d441222ced3351242b8
MD5 eda6997fb71202cea0068e28e6bc1665
BLAKE2b-256 7832400282d26aa0459be81f72015185f80f51512d6c8e15231d625c8fc3a8b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for humanio-0.1.0-cp39-cp39-macosx_10_9_universal2.whl:

Publisher: release.yml on CogForgeLabs/HumanIO

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page