
// Agents and skills //
Paywall leaks
runs in Claude Code
A Claude Code skill that has Claude test, or set up the tests for, the paid area of a web app. It's for people about to open a subscriber area and for people who already have one and have never checked what the page delivers under the hood. Claude writes the seed data, the test sessions, and the tests, all against your local environment; running anything on the live site depends on your sign-off, and only on your own site. The core idea: paid test content gives itself away. Each paid text in the seed data carries a unique marker at the start and another at the end, and the test searches for those markers in the raw response of each route (the HTML and the data the framework sends along), before the browser hides anything. The same page is requested as a visitor, a logged-in user without a plan, a subscriber, and an admin. It starts by reading the project and figuring out where testing stands: no leak test, a suspected leak ("the text shows up in the page source"), a test that only looks at the screen, a test that passes end-to-end and nowhere else, or going to production. What it delivers: markers in the seed data, with two paid items, one free, and one draft; a leak test in Playwright, without a browser, with positive controls (whoever pays has to receive it) and a test that breaks when an unclassified marker appears; sessions per persona, with a lock that refuses any database that isn't local; a database test per persona, in plain Postgres, that sweeps what visitors, logged-in users, and former subscribers can read and attempts self-promotion; a boundary test in Vitest, with five rules read from the source code, among them "only one function reads the paid content"; and the probe, the sonda.py script, which requests each route as a visitor, or with a cookie passed through an environment variable, and says on which route each marker appeared. It comes with four reference sheets and five templates. Limitations: the test proves what it looks for. Content without a marker, routes off the list, and markers that arrive encoded or compressed aren't found; "clean" means "I didn't find what I looked for," for that persona, on those routes. In production there are no markers: the outside check uses excerpts of the real content, chosen by you. The skill doesn't stop copying by someone who paid and isn't a penetration test. The probe only does GET, doesn't execute JavaScript, and doesn't follow redirects to another page. The templates came from a system in Next.js 16 with Postgres and row-level security; the probe ran against a local toy server and the SQL templates on Postgres 18, and the leak test and the sessions passed the type checker but weren't run in this form: the final test is in your project. Streaming video and files served from a CDN are out of scope. Requirements: Python 3.8 or newer, only for the probe, which uses only the standard library, only does GET, makes one request per route, and never prints the cookie's value. By default it only accepts a local URL; any other URL requires the --site-proprio parameter, and it's for your own site. To install, unzip the .zip into ~/.claude/skills/.
- Runs in Claude Code
- Advanced
A Claude Code skill that has Claude test, or set up the tests for, the paid area of a web app. It's for people about to open a subscriber area and for people who already have one and have never checked what the page delivers under the hood. Claude writes the seed data, the test sessions, and the tests, all against your local environment; running anything on the live site depends on your sign-off, and only on your own site. The core idea: paid test content gives itself away. Each paid text in the seed data carries a unique marker at the start and another at the end, and the test searches for those markers in the raw response of each route (the HTML and the data the framework sends along), before the browser hides anything. The same page is requested as a visitor, a logged-in user without a plan, a subscriber, and an admin. It starts by reading the project and figuring out where testing stands: no leak test, a suspected leak ("the text shows up in the page source"), a test that only looks at the screen, a test that passes end-to-end and nowhere else, or going to production. What it delivers: markers in the seed data, with two paid items, one free, and one draft; a leak test in Playwright, without a browser, with positive controls (whoever pays has to receive it) and a test that breaks when an unclassified marker appears; sessions per persona, with a lock that refuses any database that isn't local; a database test per persona, in plain Postgres, that sweeps what visitors, logged-in users, and former subscribers can read and attempts self-promotion; a boundary test in Vitest, with five rules read from the source code, among them "only one function reads the paid content"; and the probe, the sonda.py script, which requests each route as a visitor, or with a cookie passed through an environment variable, and says on which route each marker appeared. It comes with four reference sheets and five templates. Limitations: the test proves what it looks for. Content without a marker, routes off the list, and markers that arrive encoded or compressed aren't found; "clean" means "I didn't find what I looked for," for that persona, on those routes. In production there are no markers: the outside check uses excerpts of the real content, chosen by you. The skill doesn't stop copying by someone who paid and isn't a penetration test. The probe only does GET, doesn't execute JavaScript, and doesn't follow redirects to another page. The templates came from a system in Next.js 16 with Postgres and row-level security; the probe ran against a local toy server and the SQL templates on Postgres 18, and the leak test and the sessions passed the type checker but weren't run in this form: the final test is in your project. Streaming video and files served from a CDN are out of scope. Requirements: Python 3.8 or newer, only for the probe, which uses only the standard library, only does GET, makes one request per route, and never prints the cookie's value. By default it only accepts a local URL; any other URL requires the --site-proprio parameter, and it's for your own site. To install, unzip the .zip into ~/.claude/skills/.
How to use
01
Copy the prompt
Use the Copy prompt button on this page.
02
Paste it into your AI
Open Claude Code in the project folder and paste the prompt.
03
Install the skill you downloaded
Install the downloaded file in Claude and call the skill in any chat.
In the package
- Prompt ready to copy and paste
- Skill as a .zip to install in Claude
Goes with
- End-to-end testing with personasPlaywright end-to-end tests that use the app as visitor, logged-in user, subscriber, and admin, on desktop and mobile, switching persona in one line.TestsPlaywrightAdvanced
- Project engineeringA method for taking a software project from idea to production with Claude Code, on any stack, for people who've never coded and for experienced devs.MethodSpecificationBeginner
- Security auditA security audit of your web app with a PDF report: where each problem is, how severe it is, and the fix. Only on systems you own, with a confirmed scope.SecurityAuditAdvanced


