we let your app talk
the widget was web only. now an ios or android app gets a key that can only create posts, and a prompt you paste into your agent. no webview.
the widget is a script tag.
an app has no script tag.
that's the whole bug. not the board. not the form. the door. if your product ships on a phone, hoot had no way in.
so i shipped a key that only knows how to create posts, and a prompt that builds the form for you.
the key can only do one thing
project → share → app.
generate a key. it shows once. i store the hash.
the key has one ability: create a pending post on your board. it can't read cards. it can't move them. it can't touch your mcp token. so it goes inside the binary and that's fine. the worst thing a stranger can do with it is send you feedback.
the request is the same shape the widget sends, minus the browser tricks:
POST /api/v1/posts
Authorization: Bearer <app key>
title, description, author_email
author_name, category_id, image (optional)
201 with the post id and status. 422 with the field errors. 429 when someone is loud.
it lands on the board as pending. same column as everything else. same email flow when it ships.
you don't write the form. your agent does
the moment the key appears, so does a prompt.
the key is already inside it. the base url is already inside it. the contract is already inside it. you copy one block and paste it into claude code or cursor or whatever is sitting in your app's repo.
the prompt asks for a native form. swiftui if it's swiftui. compose if it's compose. flutter if it's flutter. it says, in so many words, do not embed a webview.
this is what the agent built. it opens like the rest of the app.
it also tells the agent to call GET /api/v1/form when the form opens. that endpoint returns the labels in the device language, your categories, your button color, the same style you picked for the web widget. change a category on hoot and the app picks it up. no release.
if you'd rather write it by hand, the raw api is under a fold on the same tab. a curl. the field list. that's it.
a paused board still listens. on purpose.
if you stop paying and a board pauses, the dashboard locks. the app key does not.
feedback keeps landing. the person typing on the phone has no idea you're sorting out a card. they shouldn't eat the silence for that.
the mcp token behaves the other way. it locks with the dashboard. two keys, two rules, and the submit key is never accepted where the mcp token is.
why this
i don't need a mobile sdk.
i need the feedback from inside your app to end up in the same column as the feedback from your website, and i don't want you to build a form twice.
the agent already knows your codebase. it just needed the contract.
if you're already on hoot: settings → target platforms → tick ios or android. share → app. generate a key. paste the prompt.
if you're not: usehoot.app
ask. ship. let your app talk. 🦉