invisible_core
Pure config for a patched Firefox stealth profile - zero Playwright dependency.
seed → fingerprint profile → Firefox prefs, plus patched-binary download,
proxy config, geo/timezone resolution, and invisible_core.juggler: the client
that drives the engine over its own protocol, with the human input rhythm, which
every wrapper below shares instead of carrying a copy. Importing it does not start a browser,
which is the point: the same fingerprint config backs an automation wrapper and,
through it, an MCP server, without either depending on the other.
(It backed a desktop profile manager too, until that repository was deleted on
2026-08-18. The package it published, invisible-firefox, is still on PyPI.)
The shared foundation used by:
- invisible_playwright - the
Playwright automation wrapper (
InvisiblePlaywright). - invisible_selenium and invisible_puppeteer - the Selenium and pyppeteer APIs on the same engine.
And through it, for anyone who would rather prompt than script:
- invisible-playwright-mcp
- the wrapper as an MCP server, for a client that brings its own model.
- AIHawk - an interface and a model, from one command.
The engine itself lives in firefox_antidetect_patch, a Firefox patched at the C++ source level so the fingerprint is produced by the browser instead of injected into the page.
uv add invisible-core
from invisible_core import (ensure_binary, generate_profile, prepare_session_geo,
translate_profile_to_prefs)
profile = generate_profile(seed=42) # deterministic Bayesian fingerprint
geo = prepare_session_geo("auto", None) # zone and language of the exit (here, this machine's public IP)
prefs = translate_profile_to_prefs(profile, locale=geo.locale, timezone=geo.timezone)
binary = ensure_binary() # path to the patched Firefox binary
Same seed → same fingerprint, every time. The timezone is required: a session without one would run on the host's own zone.
What the fields actually mean
Which surfaces a browser fingerprint is made of, what each one gives away, and why consistency between them matters more than any single value, is written up at the invisible_playwright wiki. Those pages are about the problem, not about this package, and several of them record something we got wrong first. A few that document the exact fields this package generates:
- Pinning fingerprint fields -
how
pin=interacts with the Bayesian sampler, and which combinations it refuses because they don't occur on real hardware. - How to make Linux and macOS report real Windows fonts -
the font side of
generate_profile, and why the family list is bundled rather than sampled from the host. - Canvas and WebGL fingerprints, identical across OSes - why the same seed produces a byte-identical hash regardless of what's actually running underneath.
- Playwright timezone does not match the proxy IP - the surfaces this package's geo/timezone resolution has to keep in agreement.
Metadata
Release files for invisible-core 53.48.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 | Provenance | |
|---|---|---|---|---|
| invisible_core-53.48.0.tar.gz | 1.5 MB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| invisible_core-53.48.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.6 MB
Release files / invisible_core-53.48.0.tar.gz
| Download URL | invisible_core-53.48.0.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2c3731febe812fc23784996a3d3c6a3a8e6a67dab9478c906e21fe3f2ae4ad57
|
|
BLAKE2b-256 checksum How to use checksums |
7445ff2b7b69d8dae02a91ffa720fee41ed4c48ffc3a774f34d626d1dc5e1175
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / invisible_core-53.48.0-py3-none-any.whl
| Download URL | invisible_core-53.48.0-py3-none-any.whl |
|---|---|
| Size | 1.1 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8ba57a4301b51cc87a8b8ccb8e4be682386ff5ce162938c6608ac97fd30defc2
|
|
BLAKE2b-256 checksum How to use checksums |
988f34fd2ac8e93ad0dfe37c03262bba0cf4a3d23c9749a863a04602575babb6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Security for invisible-core 53.48.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.