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 51.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-51.48.0.tar.gz | 1.5 MB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| invisible_core-51.48.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.5 MB
Release files / invisible_core-51.48.0.tar.gz
| Download URL | invisible_core-51.48.0.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
84fd662eb6fba5f4f4f3f9d072bd02285f127273f20919ef44b130847ddd2bce
|
|
BLAKE2b-256 checksum How to use checksums |
6731690a26cf62bb9d48e3cce5ef17fbc876863c6d985779800561eb2b36eedf
|
| 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-51.48.0-py3-none-any.whl
| Download URL | invisible_core-51.48.0-py3-none-any.whl |
|---|---|
| Size | 1.1 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ff76541a5b592a712010dbdd36055eff438f4208aaa65cc3af4eb789bb68206b
|
|
BLAKE2b-256 checksum How to use checksums |
f215f2de91603a3b95032008218d40b99b0211a74c57f10372763c8b7a5c3b77
|
| 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 51.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.