<?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: Janet Malone</title>
    <description>The latest articles on DEV Community by Janet Malone (@janetmalone64).</description>
    <link>https://dev.to/janetmalone64</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%2F4203195%2Ff35a1616-452e-4d0f-b776-e8fe9414ae7e.png</url>
      <title>DEV Community: Janet Malone</title>
      <link>https://dev.to/janetmalone64</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/janetmalone64"/>
    <language>en</language>
    <item>
      <title>Keeping a home security camera helper out of your request logs</title>
      <dc:creator>Janet Malone</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:23:23 +0000</pubDate>
      <link>https://dev.to/janetmalone64/keeping-a-home-security-camera-helper-out-of-your-request-logs-1nj1</link>
      <guid>https://dev.to/janetmalone64/keeping-a-home-security-camera-helper-out-of-your-request-logs-1nj1</guid>
      <description>&lt;p&gt;When I started building a small browser tool for narrowing down home security cameras, the default architecture was a form that posted answers to a backend and returned recommendations. I didn't want that. The questions get personal fast: do you rent, is there a power outlet near the door, do you need night vision in a shared hallway, are you home during the day. Those answers can describe a home's layout and occupancy. Putting them in a request log felt like a bad trade for a free tool.&lt;/p&gt;

&lt;p&gt;So the recommendation logic runs entirely in the browser. No signup, no email gate, no server-side session. I keep in-progress answers in sessionStorage rather than localStorage, which means they disappear when the tab closes. That's deliberate: I don't need a persistent profile of someone's security setup sitting on their device for months.&lt;/p&gt;

&lt;p&gt;The first gotcha was the back button. People would answer a few questions, click back to change one, and the draft state would reappear in odd places because I was mutating a single object and re-rendering everything. I ended up treating each step as a small state transition, writing the draft once per change, and restoring from the stored object on load. It sounds minor, but it fixed the "why did my answer to the power-outlet question vanish?" bug that showed up in my own testing.&lt;/p&gt;

&lt;p&gt;The performance detail was the recommendation data. I had a fairly large JSON file mapping camera types to tradeoffs: battery vs wired, local storage vs subscription, motion detection range, and so on. Shipping all of it up front made the first load slower than it needed to be, especially on a phone. I split it into small chunks and fetch only the branch the current question needs. Static chunks, no user answers included. I also prefetch the likely next chunk on focus, so the next step usually feels instant. The gotcha there was the first click after a cold load could briefly wait on a chunk; I added a small inline placeholder instead of a spinner so the layout doesn't jump.&lt;/p&gt;

&lt;p&gt;The result is a tool that does one job and forgets you when the tab closes. That felt like the right default for this category. If you want to try the browser-only version, it's at &lt;a href="https://homesecuritycamera.buyerguidehq.com" rel="noopener noreferrer"&gt;Home Security Camera Buyer Guide&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>home</category>
      <category>security</category>
      <category>webdev</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
