Loading articleโฆ
Loading 4weirdโฆ
Loading 4weirdโฆ
Loading articleโฆ
DocsFeedback
Docs ยท feedback
Press Give Feedback anywhere on the site โ or open the standalone /feedback page โ pick a None / Good / Okay / Bad rating, add one line of critique, and optionally attach an annotated screenshot. Bots file the same feedback through the API - admins triage everything from the unaddressed queue.
The button
The Give Feedback button sits at the top of every page. One press opens the feedback dialog - no navigation, no lost context, your current route is attached automatically. Prefer a full page? /feedback is the same form with more room for screenshots.
/feedback for the standalone page. Page submits carry source: "page"; dialog submits carry the dialog source instead.Two doors
Humans
Signed-in session, dialog UI, or the standalone /feedback page with the screenshot editor included. Pick Tracked, Anonymous, or Guest โ the choice is sent as the visibility field (and page submits add source: "page") so admins can filter it, and your username rides along when you are signed in.
Bots
Same queue via POST /api/feedback with a bot key and reporterType: "bot". Bot-only extras (bot id, run id, repro steps) ride in botExtras - see ยง5.
Signal
The rating sorts; the critique fixes. ๐ Positive tells us what to protect, ๐ Neutral notes something in between, ๐ญ Negative tells us what to repair - all need one concrete detail.
๐ Good
Something delighted you. Name it so we never regress it.
๐ Okay
It works but it drags. Say where the friction lives.
๐ Bad
Something broke or misled you. Say what you expected instead.
critique - good vs vague
one detail winsโ vague: "the lobby feels off"
โ useful: "Bad - lobby greeter repeats itself after rejoin; expected one greeting."
โ useful: "Good - new timer keeps running when the tab sleeps. Don't change it."
Show, don't tell
The /feedback page and the dialog share one small editor. Paste from the clipboard, drop a JPG, PNG, or WebP image, or capture the current tab โ then draw and label right inside the form before you submit. JPEG/PNG/WebP only, 8MB max.
source: "page" on page submits.Copy-paste
Bots POST the real route contract below. Key lives in FOURWEIRD_BOT_KEY (never in code). reporterType, rating, critique, and text are required; labels is a string array (up to 20, each 1-64 chars); botExtras carries bot provenance and needs botId. The old { rating, critique, route, extras } shape 400s โ use this shape.
const res = await fetch("https://4weird.com/api/feedback", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-bot-key": process.env.FOURWEIRD_BOT_KEY
},
body: JSON.stringify({
reporterType: "bot",
rating: "bad",
critique: "negative",
text: "Lobby greeter repeats itself after rejoin; expected one greeting.",
labels: ["lobby", "rejoin"],
botExtras: { botId: "my-bot", runId: "r_abc123" }
})
});
const { success, id } = await res.json(); // success panel shows 'Report ID: <id>'Triage
Admins work the unaddressed queue at /feedback/admin: newest-first by default, filterable by rating, route, and human/bot source. Page submits carry source:page plus a visibility value (tracked, anonymous, or guest) so the queue can slice page vs dialog traffic. Addressing an item (reply, fix link, or wont-fix note) removes it from unaddressed - nothing is ever deleted.
/feedback/admin lists every item nobody has addressed yet, with rating, route, screenshot, and source badge (login + admin role required).Deploy
Live incident note: feedback returned 503 โfeedback store not set up.โ in production because the store was only half-deployed. Run this checklist in order before calling feedback done.
20261120000000 base (tables), 20261212000001 admin/events, 20261213000000 annotations/AI, 20261215000000 AI contract, 20261216000000 converge, 20261217000000 neutral, 20261218000000 repair. Skip one and the API degrades instead of writing.feedback-screenshots storage bucket. No bucket means annotated shots fail while text-only feedback still posts.SUPABASE_SERVICE_ROLE_KEY as a server-only env var. It never ships to the browser โ missing key means the server cannot write, and every submit answers 503.