<?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: kritarth singhal</title>
    <description>The latest articles on DEV Community by kritarth singhal (@kritarth_singhal_1c544412).</description>
    <link>https://dev.to/kritarth_singhal_1c544412</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3062306%2F54272efa-fd97-48b7-949c-4fd92eff5272.jpg</url>
      <title>DEV Community: kritarth singhal</title>
      <link>https://dev.to/kritarth_singhal_1c544412</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kritarth_singhal_1c544412"/>
    <language>en</language>
    <item>
      <title>Pocketstore – A Modern Way to Use localStorage, with TTL, Encryption &amp; SSR Support</title>
      <dc:creator>kritarth singhal</dc:creator>
      <pubDate>Fri, 18 Apr 2025 10:10:51 +0000</pubDate>
      <link>https://dev.to/kritarth_singhal_1c544412/pocketstore-a-modern-way-to-use-localstorage-with-ttl-encryption-ssr-support-3hm5</link>
      <guid>https://dev.to/kritarth_singhal_1c544412/pocketstore-a-modern-way-to-use-localstorage-with-ttl-encryption-ssr-support-3hm5</guid>
      <description>&lt;p&gt;As developers, we’ve all been there. You’re building a frontend app — maybe with React, maybe just vanilla JS — and you need to persist some data. A token here, a draft form value there, a session timer for the user’s login…&lt;/p&gt;

&lt;p&gt;You reach for localStorage or sessionStorage, right? It’s built-in, quick, and doesn’t require cookies or a server. But then reality sets in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need to expire items after a while. Whoops, there’s no TTL.&lt;/li&gt;
&lt;li&gt;You want to avoid key collisions across features. Now you’re prefixing keys manually.&lt;/li&gt;
&lt;li&gt;You suddenly realize you need to support SSR, but window is undefined on the server.&lt;/li&gt;
&lt;li&gt;You’re handling sensitive tokens, but there’s no way to encrypt them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What was supposed to be easy starts looking messy. You end up with utility functions, custom wrappers, and too many try...catch blocks.&lt;/p&gt;

&lt;p&gt;That’s the pain I wanted to solve. So I built:&lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 Pocketstore — The Session Storage Your App Deserves
&lt;/h2&gt;

&lt;p&gt;Pocketstore is a lightweight, TypeScript-first wrapper around localStorage and sessionStorage that brings modern dev experience and best practices to in-browser storage.&lt;/p&gt;

&lt;p&gt;With Pocketstore, you get:&lt;/p&gt;

&lt;p&gt;✅ TTL-based expiration (just like cookies)&lt;br&gt;
✅ Optional AES-style encryption&lt;br&gt;
✅ Key namespacing&lt;br&gt;
✅ SSR-safe fallback (auto in-memory store)&lt;br&gt;
✅ Fully typed API&lt;/p&gt;

&lt;p&gt;Install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @m4dm4x/pocketstore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚧 The Problems Developers Face
&lt;/h2&gt;

&lt;p&gt;Let’s break down the real-world frustrations this package solves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;“I need this token to auto-expire after 15 minutes”
localStorage and sessionStorage don’t have built-in TTL. You’d need to store a timestamp, compare on .get(), and manually remove if expired.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;➡️ Pocketstore handles this for you.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;“I’m using localStorage in a Next.js app and it crashes during SSR”&lt;br&gt;
window doesn’t exist on the server. You’ll get ReferenceError: window is not defined.&lt;br&gt;
_&lt;br&gt;
➡️ Pocketstore detects the environment and falls back to an in-memory map automatically._&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“I need to store a JWT, but plain localStorage is not safe.”&lt;br&gt;
You want basic encryption at the very least.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;➡️ Pocketstore lets you pass a secret to enable encryption.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;“I have multiple features using storage and my keys are colliding.”
Storing everything as "user", "draft", "token" leads to chaos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;➡️ Pocketstore scopes all keys with a namespace you define.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ How to Use Pocketstore
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a namespaced store:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@m4dm4x/pocketstore&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myapp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// or "session"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Set and get values with optional TTL:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// expires in 1 hour&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enable encryption with a secret:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secureStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;supersecret123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;secureStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abcdef123456&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use safely in SSR (Next.js or Node.js)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;server-safe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;temp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Works on both client and server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Store login tokens (session-based):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;session&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;access_token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abcd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1800&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Save form draft progress:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;signup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;step1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📦 Install &amp;amp; Try It
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm install @m4dm4x/pocketstore&lt;/code&gt;&lt;br&gt;
Or explore the GitHub repo: 👉 &lt;a href="https://github.com/kritarth1107/pocketstore" rel="noopener noreferrer"&gt;https://github.com/kritarth1107/pocketstore&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Why Not Just Use localStorage?
&lt;/h2&gt;

&lt;p&gt;Sure, &lt;code&gt;localStorage&lt;/code&gt; works… until it doesn’t. As apps grow, so do your needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expiry&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Namespacing&lt;/li&gt;
&lt;li&gt;Server safety&lt;/li&gt;
&lt;li&gt;Type safety&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You either keep reinventing the wheel or reach for a modern solution like Pocketstore.&lt;/p&gt;

&lt;p&gt;It’s small. Typed. No dependencies. Works anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Ready to Use It?
&lt;/h2&gt;

&lt;p&gt;If you’ve ever Googled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“JavaScript expire localStorage items”&lt;/li&gt;
&lt;li&gt;“How to store session data without cookies”&lt;/li&gt;
&lt;li&gt;“SSR-safe localStorage alternative”&lt;/li&gt;
&lt;li&gt;“TypeScript localStorage wrapper”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…Pocketstore is built for you.&lt;/p&gt;

&lt;p&gt;Let’s stop fighting the storage API. Let’s make it work for us.&lt;/p&gt;

&lt;p&gt;👉 Try it here: &lt;a href="https://www.npmjs.com/package/@m4dm4x/pocketstore" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@m4dm4x/pocketstore&lt;/a&gt;&lt;br&gt;
⭐ Star the repo: &lt;a href="https://github.com/kritarth1107/pocketstore" rel="noopener noreferrer"&gt;https://github.com/kritarth1107/pocketstore&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built with love, coffee, and a lot of &lt;code&gt;window is not defined&lt;/code&gt; errors ☕️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>npm</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
