Paintless
Fix the UI by pointing at it.
Paintless knows which line of code drew that button. Click it, say what is wrong in your own words, and an agent goes and changes it — on your machine while you watch, or as a pull request from whoever asked.
Seconds from click to change
The picker knows the exact file and line each element renders from. A local agent applies the edit, HMR shows it, one click commits it.
No lock-in, ever
Agents (Claude Code or any CLI), destinations (GitHub, Linear, webhooks), and framework mappers are all pluggable adapters behind one small protocol.
Production feedback that lands as PRs
Stakeholders click, describe, submit. Requests carry screenshots, selectors and source locations — triaged, approved, and delivered by your own server.
Your first change,
two commands in.
One command reads your framework, bundler and package manager,
then installs the packages and writes the config.
Start the dev host and click your way to a committed change.
npm create paintless@latest
# Detected: react · vite · pnpm
# → installs @paintless/react + @paintless/mapper-vite
# → writes paintless.config.ts
npx paintless devOne pipeline,
every workflow.
Paintless is a capture → route → execute → deliver pipeline.
Each stage is a pluggable adapter.
- 01CAPTUREPick an element
Selector path, source location, component trail, computed styles, and a highlighted screenshot are collected automatically.
- 02ROUTEDecide what happens
Config routes decide per environment and role — run an agent, or deliver the request straight to an issue tracker.
- 03DELIVERLand as PRs and tickets
Applied changes become branches and pull requests; raw requests become structured GitHub or Linear issues.
Destinations
One request. Wherever it needs to land.
A route decides per environment and per role. The same click can open a pull request for whoever fixes it and drop a card in the tool the person who asked already lives in. Paintless fans out, and one destination failing never costs you the others.
“make the amount bigger and red”
src/components/SummaryCard.tsx:15- GitHubAdaptera branch and a pull request
- GitLabAdaptera branch and a merge request
- LinearAdapteran issue in the right team
- SlackAdaptera message in the channel that asked
- NotionWebhooka row in your requests database
- JiraAdaptera ticket carrying the source location
- DiscordWebhooka post the whole server can see
- Anything with a URLYoursone typed function against the protocol
