<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: billy6go</title>
    <description>The latest articles on DEV Community by billy6go (@billy6go).</description>
    <link>https://dev.to/billy6go</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4054241%2Ff4508eab-414c-4ebf-97f0-0f19e4a75059.png</url>
      <title>DEV Community: billy6go</title>
      <link>https://dev.to/billy6go</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/billy6go"/>
    <language>en</language>
    <item>
      <title>Anonymous survey design starts with a data inventory, not a checkbox</title>
      <dc:creator>billy6go</dc:creator>
      <pubDate>Thu, 30 Jul 2026 05:23:02 +0000</pubDate>
      <link>https://dev.to/billy6go/anonymous-survey-design-starts-with-a-data-inventory-not-a-checkbox-43dj</link>
      <guid>https://dev.to/billy6go/anonymous-survey-design-starts-with-a-data-inventory-not-a-checkbox-43dj</guid>
      <description>&lt;p&gt;“Anonymous” is often implemented as a missing name field.&lt;/p&gt;

&lt;p&gt;That is a start, but it is not a design method. A survey can omit a name and still connect an answer to an account, invitation token, IP address, cookie, device identifier, tiny team, or revealing free-text detail.&lt;/p&gt;

&lt;p&gt;The useful engineering question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which identity paths does this task actually need, and what happens if we remove each one?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is the checklist we used while building &lt;a href="https://candorkit.com/" rel="noopener noreferrer"&gt;CandorKit&lt;/a&gt;, a short-lived survey probe.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Inventory the data path before writing the form
&lt;/h2&gt;

&lt;p&gt;List every value that can enter, leave, or persist in the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;survey title and questions&lt;/li&gt;
&lt;li&gt;response choices and free text&lt;/li&gt;
&lt;li&gt;timestamps&lt;/li&gt;
&lt;li&gt;account or invitation identifiers&lt;/li&gt;
&lt;li&gt;network and device metadata&lt;/li&gt;
&lt;li&gt;analytics events&lt;/li&gt;
&lt;li&gt;exported files and copied summaries&lt;/li&gt;
&lt;li&gt;administrative secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then label each item as required, optional, or prohibited for the specific task. “The framework collects it by default” is not a requirement.&lt;/p&gt;

&lt;p&gt;CandorKit’s application database stores survey text, answers, timestamps, a hash of the private owner key, and an expiry timestamp. It does not attach names, account IDs, IP addresses, user agents, or cookie IDs to answers.&lt;/p&gt;

&lt;p&gt;That statement is narrower than “nobody can identify a respondent.” Network providers still process ordinary requests. Question wording, small groups, unique events, and free text can reveal a person even when the application omits identity columns.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Split respondent access from owner access
&lt;/h2&gt;

&lt;p&gt;A public response URL and a private results URL serve different trust roles. Reusing one bearer link for both makes accidental disclosure easier.&lt;/p&gt;

&lt;p&gt;CandorKit creates a private owner secret and places it in the URL fragment. Browsers do not send fragments in the normal HTTP request path. The server stores a hash rather than the raw key.&lt;/p&gt;

&lt;p&gt;This design has a cost: there is no recovery workflow. If the owner loses the private link, the service cannot reconstruct access. That trade-off should be visible before the survey is shared, not hidden in support documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Give retention an executable boundary
&lt;/h2&gt;

&lt;p&gt;“We delete data when it is no longer needed” is not an operational rule.&lt;/p&gt;

&lt;p&gt;An executable rule needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a known expiry timestamp;&lt;/li&gt;
&lt;li&gt;rejection of new reads or writes after expiry;&lt;/li&gt;
&lt;li&gt;a cleanup process;&lt;/li&gt;
&lt;li&gt;visible user wording;&lt;/li&gt;
&lt;li&gt;a statement about copies outside the system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CandorKit assigns each survey a seven-day database expiry, rejects expired access, and runs scheduled cleanup. CSV exports, screenshots, copied analysis, and other downstream files are outside that automatic deletion boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Keep analytics away from sensitive payloads
&lt;/h2&gt;

&lt;p&gt;An analytics event should describe product behavior, not survey content. Do not send titles, questions, answers, owner keys, or private links into session replay or event properties.&lt;/p&gt;

&lt;p&gt;The same rule belongs in logging and error reporting. A masked UI is not enough if a request body or exception payload copies sensitive text elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Design the questions as part of the privacy model
&lt;/h2&gt;

&lt;p&gt;Infrastructure cannot rescue a survey that asks respondents to identify themselves in prose.&lt;/p&gt;

&lt;p&gt;For sensitive feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avoid asking for names, exact locations, employee IDs, or unnecessary demographics;&lt;/li&gt;
&lt;li&gt;warn people not to name themselves or others in free text;&lt;/li&gt;
&lt;li&gt;avoid combinations that isolate one person in a small group;&lt;/li&gt;
&lt;li&gt;choose multiple-choice or ranges when exact values add no task value;&lt;/li&gt;
&lt;li&gt;do not use a lightweight anonymous survey for emergencies, regulated reporting, or protected whistleblowing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical lesson is that anonymous survey design is subtractive. Remove identity paths, shorten retention, separate privileges, and name the remaining limits.&lt;/p&gt;

&lt;p&gt;CandorKit is a working probe for that narrow pattern: &lt;a href="https://candorkit.com/" rel="noopener noreferrer"&gt;https://candorkit.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>webdev</category>
      <category>security</category>
      <category>product</category>
    </item>
  </channel>
</rss>
