No accounts. No tracking. People type something, tag a mood, hit submit. A dashboard shows the vibe.
Updated March 2026
No accounts, no login, no tracking. People type a confession, pick a mood, and submit. Everyone can see what others have shared. The dashboard shows a pie chart of mood distribution, a timeline of post frequency, and a feed of recent confessions. Works well for campus boards, team icebreakers, or just letting people vent. An agent can set this up end-to-end: create the anonymous form, build the public feed dashboard with mood breakdown.
Architecture
| Tool | Role | Cost |
|---|---|---|
| Cloudflare Pages | Static site hosting | Free |
| Sutrena | Confession storage, public dashboard | $9/mo (Builder) |
Total cost: $9/mo
Builder starts at $9/month for 50 projects. Pro at $29/month covers 200 projects and all your other work too. Build five blueprints on Pro and it is still $29/month. That is where the value is — at scale.
A static HTML page. Users type a confession, optionally pick a mood, and submit. Sutrena stores it and makes it available through the public dashboard.
Four dashboard widgets: a feed of recent confessions (data table), a pie chart of moods, a line chart of posting frequency, and a total post count. The dashboard URL can be shared or embedded on the same page.
Form Definition
A required textarea for the confession and an optional mood selector. publicResults is on so anyone can view submissions. No identity fields collected at all.
{
"name": "Anonymous Confessions",
"fields": [
{
"name": "confession",
"label": "Your Confession",
"type": "textarea",
"required": true
},
{
"name": "mood",
"label": "Mood",
"type": "select",
"options": [
"Happy",
"Sad",
"Angry",
"Confused",
"Relieved"
]
}
],
"publicResults": true
}Dashboard Definition
Total confessions, mood breakdown pie chart, daily frequency, and the 50 most recent confessions with mood tags.
{
"version": 1,
"widgets": [
{
"type": "metric_card",
"title": "Total Confessions",
"value": "count(*)"
},
{
"type": "pie_chart",
"title": "Mood Distribution",
"groupBy": "mood"
},
{
"type": "line_chart",
"title": "Posts Per Day",
"groupBy": "$submitted_at:day"
},
{
"type": "data_table",
"title": "Recent Confessions",
"columns": [
"confession",
"mood"
],
"limit": 50,
"sortBy": "$submitted_at",
"sortOrder": "desc"
}
]
}Frontend Integration
A minimal form. No login, no cookies. Mood is optional. After posting, users can click through to the public dashboard to read everything. Replace the form and dashboard IDs with yours.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Anonymous Confessions</title>
<style>
body { font-family: system-ui, sans-serif; max-width: 480px; margin: 2rem auto; padding: 0 1rem; }
textarea { width: 100%; min-height: 120px; padding: 0.75rem; font-size: 1rem; }
select { width: 100%; padding: 0.5rem; margin-top: 0.5rem; }
button { margin-top: 1rem; padding: 0.75rem 2rem; font-size: 1rem; cursor: pointer; }
.success { color: green; margin-top: 1rem; }
</style>
</head>
<body>
<h1>Confess Anonymously</h1>
<p>No accounts, no tracking. Just say what you need to say.</p>
<form id="confession-form">
<textarea name="confession" placeholder="What's on your mind?" required></textarea>
<select name="mood">
<option value="">Pick a mood (optional)</option>
<option value="Happy">Happy</option>
<option value="Sad">Sad</option>
<option value="Angry">Angry</option>
<option value="Confused">Confused</option>
<option value="Relieved">Relieved</option>
</select>
<button type="submit">Post Anonymously</button>
</form>
<p id="status"></p>
<p><a href="https://sutrena.com/d/dsh_YOUR_DASHBOARD_ID">Read confessions</a></p>
<script>
const FORM_ID = "frm_YOUR_FORM_ID";
document.getElementById("confession-form").addEventListener("submit", async (e) => {
e.preventDefault();
const fd = new FormData(e.target);
const body = { confession: fd.get("confession") };
const mood = fd.get("mood");
if (mood) body.mood = mood;
const res = await fetch(
`https://sutrena.com/api/forms/${FORM_ID}/submit`,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
}
);
const status = document.getElementById("status");
if (res.ok) {
status.textContent = "Posted! Your confession is now live.";
status.className = "success";
e.target.reset();
} else {
status.textContent = "Something went wrong. Try again.";
}
});
</script>
</body>
</html>Sutrena does not collect IP addresses or fingerprints in submissions. There are no identity fields. The only data stored is what the user types. That said, if you add identity fields yourself, it stops being anonymous. Do not do that.
Delete submissions via the API. For automation, set up a webhook that forwards posts to a content moderation service and deletes flagged ones. Manual moderation works fine at small scale.
Yes. publicResults is true, so you can fetch submissions from the API and render them on your page. No auth needed for that.
Sutrena rate-limits the submit endpoint per IP. You can also set maxSubmissions to cap total posts, or closesAt for a deadline. It will not stop a determined spammer, but it handles casual abuse.
Sutrena is the web runtime for AI agents. Three primitives — pages, forms, and dashboards — accessible through one API. Your agent creates web artifacts, humans interact with them, and your agent gets the data back. Framework-agnostic. Works from any MCP client or HTTP client.
1. Get a trial key (no auth, no signup)
curl -X POST https://sutrena.com/api/trial2. Create a form + dashboard from a template
curl -X POST https://sutrena.com/api/forms \
-H "Authorization: Bearer st_trial_xxx" \
-H "Content-Type: application/json" \
-d '{"templateId": "waitlist", "createDashboard": true}'Get a trial API key instantly with no signup, or create an account for the full experience.