Introduction
What's a Rough Feature
A Rough Feature is something a user builds inside your app by describing what they want. It might be a report, a form, or a different way to view their work. Rough uses AI to write the code, and the user can try it out and ask for changes without writing any code themselves.
For example, someone using a project management app might ask for a view of overdue tasks grouped by the person responsible. If your app gives Rough access to that task data, it can build the view for them.
Where Features appear
You choose where Features appear in your app. We call each of these places a Surface. You might add one to an existing dashboard, or give users a separate page for their custom features.
Each Surface has a set of capabilities that you provide. These let its Features read data or take actions in your app. For the overdue tasks example, you'd need a capability that reads tasks. If you also want users to mark tasks as complete from that view, you'd provide a capability for that too.
What users can build
Features can show buttons, forms, lists and charts, and use the capabilities available on their Surface. Some examples are:
- A report with the columns and filters a particular customer needs.
- A dashboard showing progress across several projects.
- A form that creates a record in your app.
- A small workflow that lets someone select several tasks and update them together.
You can also provide subscriptions, so a Feature stays up to date when your app's data changes rather than making the user refresh it.
What users can build depends on what you've made available. A Surface with read-only capabilities can support reports and custom views, but it can't support a workflow that changes records in your app.
Building and publishing
Users open the Feature Builder from your app and describe what they need. They can preview the result, ask for changes, and publish it when it's ready. The preview uses the sample data you supplied with your capabilities, rather than calling your app's live implementations.
Publishing makes that version available for your app to display. Users can keep working on changes without replacing the published version; the new version only goes live when they publish it.
Your integration decides which users share Features. For example, you can let everyone in the same customer account use the Features built for that account, or keep each user's Features separate.
What a Feature can access
Each Feature runs in its own iframe, separate from your app's page. It cannot directly read your app's cookies or browser storage, or change the rest of the page. It works with your app through the capabilities you've provided.
Those capabilities still need permission checks. If a Feature asks to update a task, your backend should check that the current user is allowed to update it, just as it would for a request from your own UI. AI-generated code and schema validation aren't substitutes for those checks.
The security page explains this in more detail, including how authentication and saved Feature data work.
What happens when your app changes?
Features depend on the capabilities you give them. If you remove a capability or change the data it returns, an existing Feature may stop working.
Keep Surface keys stable, and prefer adding capabilities to changing or removing ones people already use. Before changing an existing capability, check which Features depend on it. Rough doesn't version Surfaces for you today.
Is this a replacement for building features ourselves?
No. You still build and maintain your core product, including the capabilities that Rough uses. Rough gives users a way to make smaller additions for their own needs, without asking your team to build every variation.
It's also worth testing what users build. A Feature runs separately from your app's code, but it still uses browser resources and can make requests through your capabilities. An iframe doesn't guarantee that an expensive report or a large number of requests won't affect performance.
To see what building a Feature feels like, try a demo. To add it to your own app, follow the getting started guide.