The widget's appearance and enabled modes are controlled from your dashboard. The widget fetches its config on each load — changes take effect immediately, no redeploy needed.
Configure via dashboard
Go to product Settings → Board and edit the widget configuration there.
Available options
| Option | Type | Default | Description |
|---|---|---|---|
theme |
`"light" | "dark" | "auto"` |
accentColor |
string |
"#8083ff" |
Primary color for buttons and accents (hex). |
buttonLabel |
string |
"Feedback" |
Text shown on the floating feedback button. |
buttonPosition |
`"bottom-right" | "bottom-left"` | "bottom-right" |
modes |
`("text" | "screenshot" | "recording")[]` |
emailField |
`"required" | "optional" | "hidden"` |
logoUrl |
string? |
— | Custom logo URL shown in the widget header. |
Feedback modes
Text
Standard text form: title, description, email, image attachments.
Screenshot
- React SDK: instant page capture via
html2canvas— no prompt. - Script tag: browser Screen Capture API (one prompt per submission).
Recording (Pro+)
Screen + optional camera + optional mic, composited into one WebM. Up to 60 seconds. Both SDK paths use the same composite engine (video-stream-merger + MediaRecorder).
Configure via API
You can update widget config server-side if you want to deploy changes alongside code:
curl -X PATCH https://www.conclude.fyi/api/internal/boards/{boardId}/widget-config \
-H "Content-Type: application/json" \
-H "Cookie: __session=..." \
-d '{
"theme": "auto",
"accentColor": "#6366f1",
"modes": ["text", "screenshot", "recording"],
"emailField": "required"
}'
This route is internal and requires a Clerk session cookie — it's intended for the dashboard UI, not for unattended scripts. Most teams just use the dashboard.
Per-call overrides
You can override any config option at init time for a single session:
React SDK:
<FeedbackButton position="bottom-left" label="Bug report" accentColor="#6366f1" />
Script tag:
Conclude.init({
apiKey: "pk_live_...",
position: "bottom-right",
label: "Feedback",
theme: "auto",
});
Override values are merged with dashboard config on top. If you want to re-set a value to its default, omit it instead of passing null.
Branding
| Plan | Widget branding |
|---|---|
| Starter | Branded ("Powered by Conclude" footer) |
| Pro | Unbranded |
| Team | Unbranded |
Branding can't be toggled per board on Starter — it's a plan-level constraint.