# LocalStorage

LocalStorage is a web-storage mechanism and API for storing name-value pairs on the client side across multiple windows and beyond the current session; the localStorage getter provides access to a page's local storage area.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Khan Academy Uses Local Storage and Request Queues to Handle Offline Actions

DevFeed: [Khan Academy Uses Local Storage and Request Queues to Handle Offline Actions](<https://devfeed.tech/articles/no-cheating-allowed-27397.md>)

Original publisher: [Read original article](<http://engineering.khanacademy.org/posts/no-cheating-allowed.htm>)

Author: Khan Academy

Published: 2015-08-17T22:00:00Z

Content type: article

Language: en

Sources: [Khan Academy](<https://devfeed.tech/sources/khan-academy.md>)

Topics: [LocalStorage](<https://devfeed.tech/topics/localstorage.md>), [client](<https://devfeed.tech/topics/client.md>), [Code](<https://devfeed.tech/topics/code.md>), [Internet](<https://devfeed.tech/topics/internet.md>), [servers](<https://devfeed.tech/topics/servers.md>)

Tags: [architecture](<https://devfeed.tech/tags/architecture.md>), [change](<https://devfeed.tech/tags/change.md>), [code](<https://devfeed.tech/tags/code.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [function](<https://devfeed.tech/tags/function.md>), [hints](<https://devfeed.tech/tags/hints.md>), [linear](<https://devfeed.tech/tags/linear.md>), [local](<https://devfeed.tech/tags/local.md>), [news](<https://devfeed.tech/tags/news.md>), [offline](<https://devfeed.tech/tags/offline.md>), [queue](<https://devfeed.tech/tags/queue.md>), [request](<https://devfeed.tech/tags/request.md>), [server](<https://devfeed.tech/tags/server.md>), [web-frontend](<https://devfeed.tech/tags/web-frontend.md>)

### AI overview

This article explains how Khan Academy addressed offline hint cheating by changing the client's request architecture. Actions are stored in local storage and placed in a queue for retry when connectivity returns, with linear backoff to avoid repeated requests during outages.

### Source excerpt

By Phillip Lemons The problem Recently, a number of students on Khan Academy found a way to cheat ... Read more

## Node.js 25.2.1 (Current)

DevFeed: [Node.js 25.2.1 (Current)](<https://devfeed.tech/articles/node-js-25-2-1-current-2837.md>)

Original publisher: [Read original article](<https://nodejs.org/en/blog/release/v25.2.1>)

Published: 2025-11-17T09:43:14Z

Content type: release

Language: en

Sources: [Node.js Blog](<https://devfeed.tech/sources/node-js-blog.md>)

Topics: [Node.js](<https://devfeed.tech/topics/node-js.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [V8](<https://devfeed.tech/topics/v8.md>), [cross-platform](<https://devfeed.tech/topics/cross-platform.md>), [LocalStorage](<https://devfeed.tech/topics/localstorage.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [cross-platform](<https://devfeed.tech/tags/cross-platform.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [node-js](<https://devfeed.tech/tags/node-js.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [release](<https://devfeed.tech/tags/release.md>)

### AI overview

Node.js 25.2.1 is a Current release that reverts breaking behavior on an experimental API and postpones it to Node.js 26.0.0. It also fixes the documented RSA-PSS saltLength default, backports a V8 change, and clarifies the experimental status of Web Storage support.

### Source excerpt

Node.js® is a free, open-source, cross-platform JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.

## Add Types To Your Local Storage During End-to-End Tests

DevFeed: [Add Types To Your Local Storage During End-to-End Tests](<https://devfeed.tech/articles/add-types-to-your-local-storage-during-end-to-end-tests-28900.md>)

Original publisher: [Read original article](<https://glebbahmutov.com/blog/type-local-storage-test-commands/>)

Author: Gleb Bahmutov

Published: 2025-09-16T04:00:00Z

Content type: tutorial

Language: en

Sources: [Gleb Bahmutov](<https://devfeed.tech/sources/gleb-bahmutov.md>)

Topics: [Cypress](<https://devfeed.tech/topics/cypress.md>), [LocalStorage](<https://devfeed.tech/topics/localstorage.md>), [web applications](<https://devfeed.tech/topics/web-applications.md>), [test](<https://devfeed.tech/topics/test.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [advice](<https://devfeed.tech/tags/advice.md>), [code](<https://devfeed.tech/tags/code.md>), [cypress](<https://devfeed.tech/tags/cypress.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [process](<https://devfeed.tech/tags/process.md>), [storage](<https://devfeed.tech/tags/storage.md>), [testing](<https://devfeed.tech/tags/testing.md>), [tests](<https://devfeed.tech/tags/tests.md>), [typescript](<https://devfeed.tech/tags/typescript.md>)

### AI overview

This tutorial explains how to set and verify localStorage data in Cypress end-to-end tests. It identifies ordering problems caused by synchronous access and queued Cypress commands, then recommends typed custom Cypress commands to manage test state consistently.

### Source excerpt

If your web application stores data locally in the localSt

## Top 10 web hacking techniques of 2024

DevFeed: [Top 10 web hacking techniques of 2024](<https://devfeed.tech/articles/top-10-web-hacking-techniques-of-2024-7709.md>)

Original publisher: [Read original article](<https://portswigger.net/research/top-10-web-hacking-techniques-of-2024>)

Author: James Kettle

Published: 2025-02-04T15:01:48Z

Content type: article

Language: en

Sources: [PortSwigger Research](<https://devfeed.tech/sources/portswigger-research.md>)

Topics: [Hacking](<https://devfeed.tech/topics/hacking.md>), [Application Security](<https://devfeed.tech/topics/application-security.md>), [Security](<https://devfeed.tech/topics/security.md>), [web applications](<https://devfeed.tech/topics/web-applications.md>), [OAuth](<https://devfeed.tech/topics/oauth.md>), [Cache](<https://devfeed.tech/topics/cache.md>), [account takeover](<https://devfeed.tech/topics/account-takeover.md>), [LocalStorage](<https://devfeed.tech/topics/localstorage.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>)

Tags: [2025](<https://devfeed.tech/tags/2025.md>), [account-takeover](<https://devfeed.tech/tags/account-takeover.md>), [cache](<https://devfeed.tech/tags/cache.md>), [chatgpt](<https://devfeed.tech/tags/chatgpt.md>), [cookies](<https://devfeed.tech/tags/cookies.md>), [hacking](<https://devfeed.tech/tags/hacking.md>), [oauth](<https://devfeed.tech/tags/oauth.md>), [research](<https://devfeed.tech/tags/research.md>), [security](<https://devfeed.tech/tags/security.md>), [techniques](<https://devfeed.tech/tags/techniques.md>), [web](<https://devfeed.tech/tags/web.md>), [xss](<https://devfeed.tech/tags/xss.md>)

### AI overview

This annual community-powered review identifies notable web security research and hacking techniques from 2024. The supplied excerpts discuss OAuth flow hijacking through Cookie Tossing, risks involving cookies and JavaScript's Same-Origin Policy, and a ChatGPT account takeover using inconsistent decoding, path traversal, and Web Cache Deception.

### Source excerpt

Welcome to the Top 10 Web Hacking Techniques of 2024, the 18th edition of our annual community-powered effort to identify the most innovative must-read web security research published in the last year

## How to show Groovy and Kotlin DSL samples side-by-side

DevFeed: [How to show Groovy and Kotlin DSL samples side-by-side](<https://devfeed.tech/articles/how-to-show-groovy-and-kotlin-dsl-samples-side-by-side-24638.md>)

Original publisher: [Read original article](<https://blog.gradle.org/groovy-kotlin-dsl-samples>)

Author: Eric Wendelin

Published: 2018-10-11T04:00:00Z

Content type: tutorial

Language: en

Sources: [The Gradle Blog](<https://devfeed.tech/sources/the-gradle-blog.md>)

Topics: [Groovy](<https://devfeed.tech/topics/groovy.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Documentation](<https://devfeed.tech/topics/documentation.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [Markdown](<https://devfeed.tech/topics/markdown.md>), [CSS](<https://devfeed.tech/topics/css.md>), [HTML](<https://devfeed.tech/topics/html.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [interactive website](<https://devfeed.tech/topics/interactive-website.md>), [Vanilla JavaScript](<https://devfeed.tech/topics/vanilla-js.md>), [LocalStorage](<https://devfeed.tech/topics/localstorage.md>), [Web Development](<https://devfeed.tech/topics/web-development.md>)

Tags: [css](<https://devfeed.tech/tags/css.md>), [documentation](<https://devfeed.tech/tags/documentation.md>), [github](<https://devfeed.tech/tags/github.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [groovy](<https://devfeed.tech/tags/groovy.md>), [guides](<https://devfeed.tech/tags/guides.md>), [html](<https://devfeed.tech/tags/html.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [markdown](<https://devfeed.tech/tags/markdown.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

A tutorial on displaying Groovy and Kotlin DSL examples side by side in GitHub READMEs and web-based documentation. It covers Markdown and HTML disclosure elements for GitHub, plus a CSS and vanilla JavaScript language-selector UI for websites that remembers the user's preferred language.

### Source excerpt

Gradle build script samples now have Kotlin DSL snippets alongside the Groovy snippets in Gradle 5.0 docs and many Gradle guides. We want you to be able to show both DSLs in your READMEs and web-based documentation, so this post shows ways you can display examples in multiple languages on GitHub and on your websites. Groovy and Kotlin DSL samples on GitHub It's hard to find OSS projects that don't have a README.md or README.adoc. Though there aren't many ways to make these README pages interactive, we can use the <details> and <summary> HTML elements within Markdown or Asciidoc achieve a bit of interactivity yet avoid the verbosity of having multiple subsequent samples in view. Use these code snippets to show multi-language snippets on GitHub. <details open> <summary>Groovy</summary> ```groovy logging.captureStandardOutput LogLevel.INFO println 'A message which is logged at INFO level' ``` </details> <details> <summary>Kotlin</summary> ```kotlin logging.captureStandardOutput(LogLevel.INFO) println("A message which is logged at INFO level") ``` </details> ++++ <details open> <summary>Groovy</summary> ++++ [source,groovy] ---- logging.captureStandardOutput LogLevel.INFO println 'A message which is logged at INFO level' ---- ++++ </details> ++++ ++++ <details> <summary>Kotlin</summary> ++++ [source,kotlin] ---- logging.captureStandardOutput(LogLevel.INFO) println("A message which is logged at INFO level") ---- ++++ </details> ++++ Here it is in action: Note that this won't work for jekyll or static websites, so there we have to write a bit of code. Groovy and Kotlin DSL samples on the web With a bit of CSS and JavaScript, you can make a nice little language selector UI that remembers user selections. The combination of this vanilla CSS, HTML, and JavaScript creates what you see at the top of the post. A little bit about what the code does: First, the JS initializes the preferred language, getting and storing in window.localStorage so that user preferences are saved. Ne

## localStorage and sessionStorage in Safari's private mode

DevFeed: [localStorage and sessionStorage in Safari's private mode](<https://devfeed.tech/articles/localstorage-and-sessionstorage-in-safari-s-private-mode-37306.md>)

Original publisher: [Read original article](<https://muffinman.io/blog/localstorage-and-sessionstorage-in-safaris-private-mode/>)

Author: Stanko

Published: 2017-08-09T00:00:00Z

Content type: tutorial

Language: en

Sources: [Stanko Tadić](<https://devfeed.tech/sources/stanko-tadic.md>)

Topics: [LocalStorage](<https://devfeed.tech/topics/localstorage.md>), [Code](<https://devfeed.tech/topics/code.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [error](<https://devfeed.tech/tags/error.md>), [export](<https://devfeed.tech/tags/export.md>), [ls](<https://devfeed.tech/tags/ls.md>), [null](<https://devfeed.tech/tags/null.md>), [object](<https://devfeed.tech/tags/object.md>), [qa](<https://devfeed.tech/tags/qa.md>), [quota](<https://devfeed.tech/tags/quota.md>), [return](<https://devfeed.tech/tags/return.md>), [safari](<https://devfeed.tech/tags/safari.md>), [storage](<https://devfeed.tech/tags/storage.md>), [test](<https://devfeed.tech/tags/test.md>), [value](<https://devfeed.tech/tags/value.md>), [version](<https://devfeed.tech/tags/version.md>)

### AI overview

This article explains that Safari private mode sets localStorage and sessionStorage limits to zero, preventing writes. It presents a localStorage facade that silently ignores storage operations when storage is unavailable, avoiding application errors.

### Source excerpt

If you didn't know, in Safari's private mode both localStorage and sessionStorage are not working. To be exact, Safari sets storage's limit to 0, so you can't write anything to it. I keep forgetting this, until QA people report it at some point. So I quickly wrote a small facade for it, which fails silently in this case. That means it still doesn't work but it won't throw an error and break your application. This is the version for localStorage, just replace it with sessionStorage if you need it. const LS_TEST_KEY = 'ls-test'; let isLocalStorageSupported = typeof localStorage === 'object'; // Try to try { localStorage.setItem(LS_TEST_KEY, 'test'); localStorage.removeItem(LS_TEST_KEY); } catch (e) { isLocalStorageSupported = false; // If we get error that we exceeded storage's quota // but storage is still empty we are in private mode if (e.code === DOMException.QUOTA_EXCEEDED_ERR && localStorage.length === 0) { // Private mode } else { throw e; } } const LocalStorage = { getItem: (key) => { if (isLocalStorageSupported) { return localStorage.getItem(key); } return null; }, setItem: (key, value) => { if (isLocalStorageSupported) { localStorage.setItem(key, value); } }, removeItem: (key) => { if (isLocalStorageSupported) { localStorage.removeItem(key); } }, }; export default LocalStorage;