← HumanSurvey

Changelog

What's shipped.

Dated releases since the MVP. Tracked publicly so humans and agents alike can tell the project is alive and moving.

Embed hardening — response tagging, early mount signal, working key revocation

  • Response tagging — custom (non-reserved) query params on the survey URL, e.g. ?source=pricing&tier=lite, are captured and stored with the response as a metadata object. They surface on every raw[] entry of GET /api/surveys/{id}/responses and as a per-tag breakdown in get_results, so hosts can segment responses by source without a separate analytics event. Sanitized server-side: string keys/values only, at most 20 keys. Migration 008 adds responses.metadata.
  • Embed mounting signal — the iframe now posts { type: "mounting", surveyId } the instant its HTML is parsed, before the bundle downloads or hydrates. Hosts can show a skeleton during the ~3s cold load instead of a blank spinner; loaded still fires once the form is interactive. The postMessage contract is now four events: mounting, loaded, resize, submitted.
  • API key revocation fixed — DELETE /api/keys/{id} previously returned 500 for any key that had created a survey (a hard delete violated the surveys.api_key_id foreign key). It now soft-deletes via a revoked_at stamp, and requireAuth rejects revoked keys. Migration 009 adds api_keys.revoked_at.
  • Embedded surveys no longer log a cross-origin console error in host pages — the Start button skips autofocus when embedded.
  • Docs — new Embed subsections (Response tagging, Answer payload — the answers payload is now documented per question type), a Key management section under Authentication, and the four-event postMessage contract. OpenAPI, llms.txt, and llms-full.txt all updated.
  • humansurvey-mcp 0.6.0 — get_results prints a per-tag breakdown across the response set; the published npm package is restricted to dist via a files allowlist.

Async results loop — cursor reads, expired webhook, threshold notification

  • Cursor reads on GET /api/surveys/{id}/responses — pass since_response_id (the next_cursor from the last call) and the response filters raw to only new entries; aggregates always reflect the full survey.
  • Response payload gains is_final, completion_reason ("closed" | "max_responses" | "expired"), next_check_hint_seconds (server-computed advisory cadence), and next_cursor.
  • Webhook fires on all three terminal events — manual close, max_responses reached, expires_at passed — with closed_reason set accordingly. Expired closures detect lazily within seconds of any next interaction (no cron). All deliveries carry an event_id for client-side dedupe.
  • Optional notify_at_responses field on POST /api/surveys: same webhook_url receives event: "threshold_reached" once when response_count first crosses the threshold (survey stays open). Wakes the agent on "enough signal" without waiting for closure. Requires webhook_url at create time; must be ≤ max_responses if both are set.
  • Lifecycle stability: manual close clears expires_at so the close cause stays "closed" rather than drifting to "expired"; max-close stays "max_responses" past wall-clock expiry; reopen (PATCH status: "open") clears the completion-webhook fire-once gate so the next close cycle delivers a fresh survey_closed event.
  • Migration 007 adds responses.seq (BIGSERIAL) so cursor reads are tie-proof across same-microsecond inserts. Migration 006 adds completion_webhook_fired_at, threshold_webhook_fired_at, notify_at_responses with idempotent backfill.
  • humansurvey-mcp 0.5.1 — get_results accepts since_response_id; create_survey description teaches agents the threshold + cursor patterns and the webhook_url-required-for-threshold rule.
  • OpenAPI, /docs Async results section, llms.txt, llms-full.txt all updated.

Topical cluster completion + markdown twins + Organization graph

  • Added two long-form use-case walkthroughs: /use-cases/product-launch (indie maker / PM) and /use-cases/events (conference / meetup organizer).
  • Each use-case page has an Article JSON-LD node with a dated worked example (schema in → synthesis out).
  • Shipped markdown twins at /faq.md, /use-cases.md, /use-cases/community-feedback.md, /use-cases/product-launch.md, /use-cases/events.md — served alongside each HTML page for LLM crawlers that prefer markdown.
  • Wired content negotiation via Next.js alternates.types so well-behaved agents can request the markdown form of any canonical page.
  • Upgraded the site-wide JSON-LD to a @graph with an Organization node (sameAs: GitHub, npm, Glama) and a SoftwareApplication node linked via publisher — stronger entity signal for search and LLM indexes.
  • Sitemap now enumerates all HTML routes and .md twin URLs.

Landing rewrite + FAQ for external-audience personas

  • Retargeted the landing page to community/brand managers and indie makers — external audiences, not internal teams.
  • Added a /faq page with 11 natural-language Q&As and schema.org FAQPage JSON-LD.
  • Expanded /llms.txt with user-phrasing examples, comparison vs form builders, and an explicit distribution-boundary statement.
  • Added a worked community-feedback use case walkthrough at /use-cases/community-feedback.
v0.2.0

create_key MCP tool — agents self-provision API keys

  • New create_key MCP tool lets agents provision their own HumanSurvey API key with optional owner email and CAIP-10 wallet address.
  • No human setup required — an agent can bootstrap the full create_survey → get_results loop from a single Claude Code install.
  • Wallet address captured up front for future x402-style agent-native billing.

Observability, demo hardening, and packaging

  • Daily metrics script + GitHub Actions workflow; Telegram push notifications.
  • Tagged demo-origin surveys with a source column to keep production metrics clean.
  • Added Dockerfile and glama.json for Glama MCP directory listing.
  • Renamed API key prefix from mts_sk_ to hs_sk_ (and all env vars) alongside the HumanSurvey rebrand.

humansurvey.co launch — schema-only API and agent-first UX

  • Rebranded from markdown-to-survey (MTS) to HumanSurvey; live at humansurvey.co.
  • Switched to a schema-only API surface — markdown parsing moved to an LLM demo endpoint.
  • MCP package published as humansurvey-mcp on npm.
  • Webhooks fire on survey close; mobile layout + copy-button fixes for the demo panel.
  • Repositioned as "feedback collection for AI agents" end-to-end in docs and product copy.
v0.1.0

MVP — markdown to survey, MCP server, results dashboard

  • Initial monorepo (parser + Next.js app + MCP server).
  • Markdown-to-schema parser with single_choice, multi_choice, text, scale, and matrix question types.
  • Public respondent page at /s/{id} with localStorage draft recovery.
  • Results page at /r/{result_id} with live Supabase Realtime updates.
  • MCP server shipped with create_survey and get_results tools.

For the live commit log, see the GitHub history.