Telemetry
Share Your Thoughts With Me captures a small set of events into the telemetry_event table.
Event types
| Type | When | Fields |
|------|------|--------|
| page_hit | A public HTML page returns 2xx/3xx | path, referrer, user_agent, session_id |
| post_started | Visitor lands on a post's first step | post_id, session_id |
| post_step_viewed | A subsequent step renders | post_id, step_id, session_id |
| post_step_answered | A step submission is accepted | post_id, step_id, session_id |
| post_completed | The final submit lands in the DB | post_id, post_version_id, session_id, payload.entry_id |
| post_abandoned | Derived view: started > 30 min ago, no completion | (derived at read time on /admin/telemetry) |
| admin_login | Admin signs in | actor=admin |
| api_key_created/api_key_disabled/api_key_deleted | API key lifecycle | payload.api_key_id |
| post_published | A draft is promoted to published | post_id |
| comment_moderated | An entry is hidden or shown | payload.entry_id, payload.is_hidden |
Storage
All telemetry rows live in the same Postgres database as feedback. They
carry a project_id, an event_type, optional post_id /
post_version_id / step_id / session_id, a path, a referrer, a
user_agent, a JSONB payload, and the actor (one of visitor, admin,
api).
Privacy
user_agent and referrer are stored raw. The visitor's IP address is
not stored — it is hashed into feedback_entry.ip_hash (HMAC-SHA256
with SYTWM_IP_SALT) for abuse-correlation purposes only. Telemetry rows
themselves do not carry the IP.