
How It Started
Web automation has become a cat-and-mouse game. Modern bot detection systems have learned to identify automated browsers through predictable patterns: bots click exactly 500ms after page load, mouse travels in straight lines to targets, every keystroke at identical intervals, mechanical scrolling, and zero mistakes or hesitation. This made legitimate automation tasks increasingly difficult. Testing tools got blocked on production sites. Web scraping for research hit endless CAPTCHAs. QA automation failed due to bot detection. Monitoring tools got IP banned. Data collection became unreliable.Building the Solution
I builtdefinitely-not-a-robot, a Puppeteer wrapper that embraces human imperfection as a feature. By introducing deliberate randomness and natural movement patterns, it makes automated browsers virtually indistinguishable from human users.
The package leverages puppeteer-extra with StealthPlugin and adds layers of human-like behaviors: Bezier curve mouse movements that arc naturally like a human hand, variable typing speeds based on ASCII key distances, random micro-movements during idle time, natural hesitation before important clicks, and debug visualization to see exactly how the “human” moves.
The Technical Build
Core Architecture
Language: TypeScript for type safety Bundler: ESBuild for fast compilation Base: Puppeteer-extra with StealthPlugin Output: CommonJS for broad compatibilityKey Implementations
Bezier Mouse Movement Algorithm
ASCII-Based Typing Delays
Jitter Movement System
- 3-95 pixel random movements
- Returns to original position
- Simulates idle hand tremor
- Configurable intensity and count
API Design
What We Built
The package includes Bezier curve paths instead of straight lines, 50-150ms random click delays for natural hesitation, WPM-based typing with variable speeds (default 40 WPM), debug mode showing red path visualization, and zero dependencies beyond the Puppeteer ecosystem.The Results
The package is now used for QA testing - running tests on production without triggering bot detection. Web scraping teams use it for collecting public data for research and analysis. Automation developers build reliable workflows that don’t break. Monitoring tools track competitor sites without getting banned. It’s published on npm asdefinitely-not-a-robot with a GitHub repository containing working examples, a demo automation of shadcn/ui interface, and clear documentation with TypeScript types.
What We Learned
Randomness is the key. The difference between bot and human is unpredictability. Humans don’t move in straight lines. Typing speed varies based on key distance. Everyone has idle hand movements. Mistakes and corrections are natural. Debug visualization matters. The red path tracing was crucial for development. We could see exactly how the mouse moves, verify Bezier curves look natural, spot mechanical patterns instantly, and tune parameters visually. Simplicity wins. Rather than complex ML models, simple randomization worked better. Bezier curves for natural arcs, normal distribution for delays, ASCII distance for typing variance, basic jitter for idle movement. What made it work was mathematical foundations (Bezier curves and easing functions), observation of how humans actually move and type, debug-first development with visual feedback, modular design with separate utilities for each behavior, and TypeScript catching edge cases during development. The project proved simple randomization can defeat bot detection, showed legitimate use cases need human-like automation, demonstrated the importance of imperfection in automation, and set a template for ethical automation tools.Open Source
definitely-not-a-robot on GitHub
Technologies Used
TypeScript
Puppeteer
ESBuild
Stealth Plugin
Bezier Curves
Canvas API
Code Example
Here’s how the package handles a typical automation flow:Ethical Note
While this tool can bypass bot detection, it’s designed for legitimate use cases: testing, research, monitoring, and accessibility. The project includes clear disclaimers about responsible use and explicitly discourages malicious applications. As we note in the README: “Beep Boop. We don’t condone this behaviour.” — But sometimes you need to test your production site without getting blocked.Frequently Asked Questions
How does this package make automation look human?
How does this package make automation look human?
What makes the Bezier curve mouse movement effective?
What makes the Bezier curve mouse movement effective?
How does the typing simulation work?
How does the typing simulation work?
What is the debug mode and why is it important?
What is the debug mode and why is it important?
What are legitimate use cases for this tool?
What are legitimate use cases for this tool?
How does it compare to regular Puppeteer automation?
How does it compare to regular Puppeteer automation?
What technical foundation makes the human simulation work?
What technical foundation makes the human simulation work?
How does the jitter movement system work?
How does the jitter movement system work?
What makes this approach better than existing bot detection evasion?
What makes this approach better than existing bot detection evasion?
How can developers get started with this package?
How can developers get started with this package?