install · two minutes
drop otto
on your app.
One script tag. Your team flags bugs while testing. Otto reads each report, finds the relevant code, and opens a draft PR on the right repo. Never auto-merges.
create an account see how it works
what you'll need
- a cursor account with an API key required
- a github repo where Otto should open PRs required
- a page in your app to drop the widget onto required
01
create a project
Sign in at /dashboard/. Each project owns a widget snippet and routes feedback to its primary repo.
in the dashboard
projects → + new project → name → create
You'll land on the project's detail page with a getting-started checklist. Wire the Cursor key and install the GitHub App from Settings, then come back to set this project's primary repo.
02
paste the snippet
Once team setup is done, the project detail page shows a ready-to-paste snippet with the project's secret baked in. Drop it on the staging or prod build of your app — feedback from anyone using the widget on that page lands in this project.
what the snippet looks like
<script
src="https://ottoagent.app/otto.js"
data-endpoint="https://<your-convex>.convex.site/ingest/widget"
data-secret="wk_abc123…"
defer
></script>
One script tag. No build tools, no SDK, no framework requirements. Works in any HTML page.
03
file feedback
A pixel-otter button appears bottom-right of your page. Click it to start recording. Click again to stop and review what you captured. Submit, and Otto opens a draft PR within a few minutes.
what otto sends to cursor
- your description of what's wrong
- the page URL where the feedback was filed
- console errors from the last few seconds
- viewport + user agent for layout context
trust contract
- PRs always land as draft. Otto fails closed if it can't verify draft status.
- Scoped to its own branch. Otto never pushes to main.
- Original feedback + confidence land in the PR description. You can see exactly what Otto read.
- Existing tests cannot be weakened. Hard-coded into the agent prompt.
questions
Hit a wall? Open a discussion on GitHub or ping @DanJCleary on X.