Description
Public Reactions add lightweight visitor feedback to rows served through a Dotabase publication. A publication can enable reactions, after which anonymous visitors may cast or toggle an up/down reaction, retract it, and fetch the public tally. The API issues a signed visitor cookie and stores a coarse IP hash for abuse controls without requiring a Dots account.
Every operation first resolves the public slug and row through the publication visibility gate. Unknown publications, unpublished rows, rows outside published views, disabled reactions, and resolver faults all return the same non-disclosing not-found result. Tally reads are cache-friendly, while writes are uncached and enrolled in the public per-IP write bucket.
Selling Points
- Adds immediate audience signal to published knowledge without forcing visitors through account creation.
- Keeps reaction controls tied to each publication, so owners decide where engagement belongs.
- Returns simple public tallies suitable for roadmap voting, feedback, and content usefulness indicators.
- Uses signed visitor identity and rate limits to reduce trivial repeat abuse while preserving low-friction participation.
- Shares the publication’s fail-closed visibility boundary, preventing reactions from becoming a probe for hidden rows.
User Story
A team publishes a roadmap Dotabase and enables reactions. A visitor opens one roadmap item, clicks thumbs up, and immediately sees the updated tally. Clicking again toggles the vote off, while retract removes it explicitly. The team gets aggregate interest data without exposing internal user or tenant identifiers.
Extension Surface
This feature is configurable. Publication owners enable or disable the reactions engagement flag, and packages/api/src/routes/reactions.ts exposes cast, retract, and tally operations. The allowed reaction roster is the shipped thumbs-up/thumbs-down contract; external clients can automate it but cannot register new reaction kinds or replace visitor identity behavior.
Capabilities & Limits
- Casts, toggles, retracts, and tallies up/down reactions for a published row.
- Uses a signed visitor cookie plus coarse IP hashing and public write rate limits.
- Emits cacheable public tallies with ETag handling.
- Limit: reaction service requires deployment engagement secrets; unconfigured deployments return a clean unavailable response.
- Limit: the mechanism reduces casual duplication but is not identity-verified polling.
Implementation Map
packages/api/src/routes/reactions.tspackages/api/src/services/public-reactions-service.tspackages/api/src/routes/public.tspackages/api/src/middleware/rate-limit.ts