botmask
Containerized human-behavior browser automation toolkit. Installable as a plugin in other projects that need browser automation while evading anti-bot systems.
What is this?
A reusable, containerized browser-automation kit that simulates realistic human behavior (Bezier-curve mouse movement, inertia scrolling, natural delays, typo typing, warm-up sessions, reading simulation, auth-barrier detection) on top of Brave Browser + Patchright.
Extracted from the career-ops pipeline (~/Proyectos/ai/jobs) into an isolated, installable
package so it can be dropped into any project that needs stealthy browser interaction.
Stack
| Layer | Tool |
|---|---|
| Runtime | Docker / Docker Compose |
| Browser | Brave (Chromium; ad-blocking, anti-fingerprinting) |
| Automation | Patchright (undetectable Playwright fork, CDP) |
| Human behavior | human_behavior module (this project) |
| Config | config module, env-driven (inherited from jobs) |
| Hardening | BrowserForge headers (planned), OS-level input fallback (planned) |
Decision (Phase 0, docs/decision.md): Brave only. Firefox engines (camoufox,
invisible_playwright) were evaluated and discarded. Hard targets are handled with
OS-level input (Xvfb + xdotool/PyAutoGUI) + graceful challenge detection.
How the AI knows where to click
See docs/interaction-model.md. Short version: the AI picks elements from a numbered
accessibility tree (never pixel coordinates); the script resolves element → bounding box →
humanized mouse path. OS-level input maps viewport → screen coords via a one-time window
offset calibration.
Container usage
Local (real display, like jobs) — develop target
Shares the host display into the container (Wayland socket + X11). compose.yaml
builds the develop stage (no virtual display stack).
cp .env.example .env # adjust DISPLAY, WAYLAND_DISPLAY for your host
docker compose up -d --build
Volumes: .:/app, /tmp/.X11-unix, /run/user/<UID>/wayland-0. CDP exposed at :9222.
Server (no monitor) — Xvfb + noVNC — deploy target
The server override lives in .gitlab/compose.yaml; a future GitLab CI step copies it
to compose.override.yaml (which Docker Compose auto-loads), then:
docker compose up -d --build # target=deploy via the override
Runs Brave headful on an Xvfb virtual display; watch it at http://<host>:6080 (noVNC) or
VNC at :5900. Same element→box→input logic — only the display source differs.
start.sh auto-detects the mode from the environment: with DISPLAY/WAYLAND_DISPLAY
present it runs the browser directly; with none (or VIRTUAL_DISPLAY=true) it boots the
Xvfb stack first. On every start it also provisions Python packages + browser binaries at
runtime (pip install . + patchright install chromium), cached in the cache volume
(/root/.cache — pip wheels + browsers) so the image itself stays small.
Status
- Phase 0 — Evaluation: COMPLETE →
docs/decision.md - Phase 1 — Package extraction & container scaffold: IN PROGRESS
config.pymigrated ✅ · Dockerfile (develop/deploy) + compose + start.sh scaffolded ✅- Fitts + overshoot mouse port ⏳ ·
human_behavior.pymigration ⏳ (seeTODO.md)
Docker targets (multistage)
| Target | For | Display | Build |
|---|---|---|---|
develop (default via compose.yaml) |
local dev on host Wayland/X11 | host display | docker build --target develop -t botmask:develop . |
deploy (default target of plain docker build) |
headless machine / CI | Xvfb + noVNC | docker build --target deploy -t botmask:deploy . |
Base image is Debian python:slim — Brave requires glibc and cannot run on Alpine/musl.
Migrating from jobs
What can and cannot be reused from the jobs project: docs/migration-from-jobs.md.
Metadata
Release files for botmask 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| botmask-0.1.2.tar.gz | 28.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| botmask-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 55.6 kB
Release files / botmask-0.1.2.tar.gz
| Download URL | botmask-0.1.2.tar.gz |
|---|---|
| Size | 28.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3a8581076b6bc43b2e85c7f85ff3fc56b54d64fc1f7497f1e04c9722ccf2d5b0
|
|
BLAKE2b-256 checksum How to use checksums |
aa78cc51b4b3136407bee81a58430fc38ff3aea6aaedc2b57d8889d31aa0d9e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency logRelease files / botmask-0.1.2-py3-none-any.whl
| Download URL | botmask-0.1.2-py3-none-any.whl |
|---|---|
| Size | 26.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3d70508290693057882844c3f02ba4043e4df51d43712b1f5da9fe0232f28cb4
|
|
BLAKE2b-256 checksum How to use checksums |
22ddc21b41a49ef2904cb83a1e2e4a957cf00fb4d377d85069f8cf78449bf2c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency log