Building robust user interfaces with the most agonizing JS paradigm imaginable.
I'm Alex Vance, a full-stack engineer who believes developer experience has gotten too easy. `PainJS` forces developers to pray to DOM nodes, await variable setters, and handle passive-aggressive state mutations.
About PainJS Architecture
1. Faith-Based Rendering
Forget standard DOM updates. `document.prayToElement()` sends your requests into a probabilistic queue. If your devotion probability is under 0.5, the DOM politely ignores you.
2. Async Variables & Typos
Why assign variables instantly? In `PainJS`, setters return Promises that take seconds to resolve, and occasionally introduce typos to simulate authentic human mistakes.
3. Gaslighting State Engine
State management that actively lies. State will randomly mutate, deny it ever changed, or require explicit sacrificial calls to `Pain.performRitual()` to stabilize.
Featured Agony Projects
Rendered dynamically via PainJS probabilistic promise queues.
PainJS Interactive Feature Lab
Test the individual anti-patterns of the PainJS engine directly.
Async Variable Assignment
Anti-Pattern #1Set a variable with artificial async delay and a 30% chance of introducing an intentional typo.
Probabilistic DOM Rendering
Anti-Pattern #2Attempts to mutate an element. Success depends entirely on your devotion score.
Element Annoyance Event
Anti-Pattern #3This element gets frustrated if your cursor hovers too quickly or too frequently.
Triggers Pain.onElementAnnoyedByCursor()
Gaslighting Input Field
Anti-Pattern #4An input field that periodically deletes characters, insults your typing speed, or changes case.
Bound via Pain.bindGaslightInput()
Get In Touch (If Worthy)
Submitting this form requires passing the `Pain.onClickIfUserIsWorthy` check. Expect conditional button movement and randomized submission delays.