<?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: VR Frequency</title>
    <description>The latest articles on DEV Community by VR Frequency (@vrfrequency).</description>
    <link>https://dev.to/vrfrequency</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%2F3818896%2F5de71acd-743e-4cc8-8c54-025a9373438a.jpg</url>
      <title>DEV Community: VR Frequency</title>
      <link>https://dev.to/vrfrequency</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vrfrequency"/>
    <language>en</language>
    <item>
      <title>I Built Hush Relay: A Self-Hosted Encrypted Messenger Using Vanilla JavaScript and One PHP File</title>
      <dc:creator>VR Frequency</dc:creator>
      <pubDate>Sun, 01 Nov 2026 09:37:26 +0000</pubDate>
      <link>https://dev.to/vrfrequency/i-built-hush-relay-a-self-hosted-encrypted-messenger-using-vanilla-javascript-and-one-php-file-4bpd</link>
      <guid>https://dev.to/vrfrequency/i-built-hush-relay-a-self-hosted-encrypted-messenger-using-vanilla-javascript-and-one-php-file-4bpd</guid>
      <description>&lt;h1&gt;
  
  
  I Built Hush Relay: A Self-Hosted Encrypted Messenger Using Vanilla JavaScript and One PHP File
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;No phone numbers. No registration. No centralized messaging provider. No frontend build pipeline. Just a browser, encryption, and a lightweight relay you can host yourself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/altrudev/Hush-Relay" rel="noopener noreferrer"&gt;https://github.com/altrudev/Hush-Relay&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; GNU AGPL-3.0-or-later&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Open source, experimental, seeking independent security review&lt;/p&gt;


&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;We have become accustomed to messaging applications requiring an entire ecosystem just to exchange a message.&lt;/p&gt;

&lt;p&gt;Accounts, phone numbers, centralized infrastructure, dedicated mobile applications, notification services, identity providers, and increasingly complicated deployment environments.&lt;/p&gt;

&lt;p&gt;Many of those components solve legitimate engineering problems. But I wanted to explore a different question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much infrastructure do two people actually need to exchange encrypted messages?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Could a messaging system work without depending on a centrally operated service?&lt;/p&gt;

&lt;p&gt;Could the server be simple enough for someone to inspect and host on inexpensive hardware?&lt;/p&gt;

&lt;p&gt;Could the client run directly in a browser without a complicated framework or build process?&lt;/p&gt;

&lt;p&gt;Those questions became &lt;strong&gt;Hush Relay&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's an experimental, self-hostable, end-to-end encrypted messaging application built primarily with vanilla JavaScript, the browser's native WebCrypto API, and a single PHP relay file.&lt;/p&gt;

&lt;p&gt;The objective wasn't to create another massive communication platform.&lt;/p&gt;

&lt;p&gt;It was to investigate how much complexity could be eliminated while retaining meaningful privacy protections.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Architecture: Keep the Server Simple
&lt;/h2&gt;

&lt;p&gt;Hush Relay separates the application into two components.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Browser Application
&lt;/h3&gt;

&lt;p&gt;The client handles identity generation, encryption, decryption, contact management, message verification, account recovery, and device migration.&lt;/p&gt;

&lt;p&gt;It's built with HTML, JavaScript, WebCrypto, and a service worker.&lt;/p&gt;

&lt;p&gt;There is no React, Angular, or Vue dependency.&lt;/p&gt;

&lt;p&gt;There is no npm-based frontend build pipeline.&lt;/p&gt;

&lt;p&gt;You can serve the application as ordinary static files alongside its PHP endpoint.&lt;/p&gt;

&lt;p&gt;It also functions as an installable Progressive Web App (PWA).&lt;/p&gt;
&lt;h3&gt;
  
  
  2. The PHP Relay
&lt;/h3&gt;

&lt;p&gt;The relay is intentionally limited in responsibility.&lt;/p&gt;

&lt;p&gt;It accepts encrypted message envelopes, stores them temporarily, delivers them to the appropriate mailbox, and removes acknowledged or expired messages.&lt;/p&gt;

&lt;p&gt;It does not receive plaintext messages or the cryptographic keys needed to decrypt them.&lt;/p&gt;

&lt;p&gt;The simplified architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       DEVICE A
   ┌──────────────────┐
   │ Browser / PWA    │
   │                  │
   │ Identity Keys    │
   │ Double Ratchet   │
   │ WebCrypto        │
   └────────┬─────────┘
            │
            │ Encrypted envelope
            ▼
   ┌──────────────────┐
   │   PHP RELAY      │
   │                  │
   │ Encrypted Mailbox│
   │ Storage &amp;amp; Routing│
   │                  │
   │ No plaintext     │
   └────────┬─────────┘
            │
            │ Encrypted envelope
            ▼
   ┌──────────────────┐
   │ Browser / PWA    │
   │                  │
   │ Local Decryption │
   │ Message Display  │
   └──────────────────┘
       DEVICE B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The relay is a mailbox, not a trusted participant in the encryption process.&lt;/p&gt;

&lt;p&gt;There is an important distinction here: the server is not designed to know message contents, but it can still observe network metadata.&lt;/p&gt;

&lt;p&gt;That limitation is discussed later.&lt;/p&gt;

&lt;h2&gt;
  
  
  No Accounts, No Phone Numbers
&lt;/h2&gt;

&lt;p&gt;Instead of creating an account through a central identity service, Hush Relay generates a cryptographic identity locally.&lt;/p&gt;

&lt;p&gt;Your identity is based on a key pair created on your device.&lt;/p&gt;

&lt;p&gt;Contacts can be exchanged using QR codes or invitation links.&lt;/p&gt;

&lt;p&gt;The invitation contains the information needed to establish communication, including the public key, mailbox identifier, and relay address.&lt;/p&gt;

&lt;p&gt;A user can verify a contact's identity by comparing safety numbers.&lt;/p&gt;

&lt;p&gt;There is no central phone-number directory or mandatory registration service.&lt;/p&gt;

&lt;p&gt;The system also supports communication between people using different relay servers.&lt;/p&gt;

&lt;p&gt;That was an important architectural objective: two users shouldn't necessarily have to depend on the same infrastructure provider to communicate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encryption Without External Cryptographic Libraries
&lt;/h2&gt;

&lt;p&gt;Hush Relay uses the browser's native WebCrypto API.&lt;/p&gt;

&lt;p&gt;The implementation uses established cryptographic primitives, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ECDH P-256 for key agreement&lt;/li&gt;
&lt;li&gt;HKDF-SHA-256 for key derivation&lt;/li&gt;
&lt;li&gt;HMAC-SHA-256 for message-key derivation&lt;/li&gt;
&lt;li&gt;AES-256-GCM for authenticated encryption&lt;/li&gt;
&lt;li&gt;PBKDF2-SHA-256 for recovery-key derivation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The messaging protocol uses a Signal-style Double Ratchet construction.&lt;/p&gt;

&lt;p&gt;Each message is encrypted, and the ratchet advances key material as the conversation progresses.&lt;/p&gt;

&lt;p&gt;The system also wraps messages in an additional encrypted envelope using a fresh ephemeral key.&lt;/p&gt;

&lt;p&gt;This outer encryption layer is intended to conceal sender-identifying information from the relay.&lt;/p&gt;

&lt;p&gt;Messages are padded into predefined size buckets to reduce the precision of message-length observations.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;using well-established cryptographic primitives does not automatically make a new protocol secure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hush Relay implements its own protocol construction rather than using the complete, independently reviewed Signal protocol implementation.&lt;/p&gt;

&lt;p&gt;Its current design also lacks a prekey mechanism, which limits the forward-secrecy guarantees of initial messages.&lt;/p&gt;

&lt;p&gt;Those differences matter, and they're documented in the repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/altrudev/Hush-Relay/blob/main/docs/PROTOCOL.md" rel="noopener noreferrer"&gt;Read the protocol specification&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Hosting Shouldn't Require a Data Center
&lt;/h2&gt;

&lt;p&gt;One of my design goals was to make deployment accessible.&lt;/p&gt;

&lt;p&gt;Hush Relay's PHP-based version can run on ordinary shared hosting, a Raspberry Pi, an inexpensive VPS, or an Android device running Termux.&lt;/p&gt;

&lt;p&gt;You can experiment with it locally using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/altrudev/Hush-Relay.git

&lt;span class="nb"&gt;cd &lt;/span&gt;Hush-Relay

./scripts/serve.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a quick test, open the application in two separate browser contexts, create identities, exchange an invitation, and try sending messages.&lt;/p&gt;

&lt;p&gt;The local development server requires PHP 7.4 or newer.&lt;/p&gt;

&lt;p&gt;For public deployment, you need HTTPS and a stable relay address.&lt;/p&gt;

&lt;p&gt;The encrypted-message storage directory should be kept outside the publicly accessible web root.&lt;/p&gt;

&lt;p&gt;The repository includes deployment instructions for shared hosting, VPS environments, Android/Termux, and IPFS-based distribution of the static client.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/altrudev/Hush-Relay/blob/main/docs/SELF-HOSTING.md" rel="noopener noreferrer"&gt;Self-hosting documentation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Account Recovery?
&lt;/h2&gt;

&lt;p&gt;One problem with decentralized identity systems is that losing a device can mean losing access to your identity.&lt;/p&gt;

&lt;p&gt;Hush Relay explores two mechanisms for addressing this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recovery words:&lt;/strong&gt; The application generates six randomly selected recovery words. They are used to derive encryption material for an account backup stored on the relay.&lt;/p&gt;

&lt;p&gt;The relay stores the encrypted backup without possessing the recovery words required to decrypt it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Device migration:&lt;/strong&gt; Users can transfer an account between devices using a QR-based process and a 12-digit comparison code.&lt;/p&gt;

&lt;p&gt;The current implementation supports one active device per account.&lt;/p&gt;

&lt;p&gt;Device migration transfers account information rather than preserving an entire synchronized conversation history.&lt;/p&gt;

&lt;p&gt;These approaches involve trade-offs, particularly around recovery-secret entropy, device compromise, and the handling of existing sessions.&lt;/p&gt;

&lt;p&gt;They're areas where independent review would be especially valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Relay Still Knows
&lt;/h2&gt;

&lt;p&gt;End-to-end encryption protects message contents when correctly implemented.&lt;/p&gt;

&lt;p&gt;It doesn't automatically eliminate metadata.&lt;/p&gt;

&lt;p&gt;A Hush Relay operator can potentially observe IP addresses, connection timing, recipient mailbox identifiers, message-size buckets, and whether messages are waiting for collection.&lt;/p&gt;

&lt;p&gt;There is also a fundamental challenge with browser-delivered cryptographic applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The server delivering the JavaScript can potentially modify the application itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A compromised or malicious application host could deliver altered code that undermines client-side encryption.&lt;/p&gt;

&lt;p&gt;Self-hosting, reviewing the served source, or using content-addressed distribution through IPFS can reduce certain aspects of this risk, but they don't make the problem disappear.&lt;/p&gt;

&lt;p&gt;Other current limitations include the absence of push notifications, local-only message history, one active device per account, and known protocol limitations involving early-session forward secrecy and key-compromise impersonation.&lt;/p&gt;

&lt;p&gt;I think it's important to document these limitations rather than hide them behind marketing claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Reviews and the Work Still Needed
&lt;/h2&gt;

&lt;p&gt;During development, Hush Relay underwent two rounds of internal adversarial review.&lt;/p&gt;

&lt;p&gt;Those reviews identified 20 security and reliability issues that were subsequently addressed with regression tests.&lt;/p&gt;

&lt;p&gt;Findings included problems involving data-directory exposure, replay handling, relay abuse limits, invitation handling, recovery behavior, and proxy-related rate limiting.&lt;/p&gt;

&lt;p&gt;The repository contains the findings, mitigation descriptions, and relevant tests.&lt;/p&gt;

&lt;p&gt;However, internal testing is not equivalent to an independent cryptographic audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hush Relay has not been independently audited and should not currently be trusted for high-risk or safety-critical communications.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anyone whose safety depends on secure messaging should use an established, independently reviewed solution rather than this experimental implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/altrudev/Hush-Relay/blob/main/SECURITY.md" rel="noopener noreferrer"&gt;Security documentation and audit log&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Source?
&lt;/h2&gt;

&lt;p&gt;I believe communication infrastructure deserves transparency.&lt;/p&gt;

&lt;p&gt;People should be able to inspect the systems carrying their messages, understand the trust assumptions, and decide where their information is stored.&lt;/p&gt;

&lt;p&gt;They should also be able to operate infrastructure themselves without relying entirely on the decisions of a commercial provider.&lt;/p&gt;

&lt;p&gt;Hush Relay is published under the &lt;strong&gt;GNU Affero General Public License v3.0 or later&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The intent is to keep the original project open and ensure that applicable source-sharing obligations extend to modified versions provided over networks.&lt;/p&gt;

&lt;p&gt;Bundled third-party components retain their respective licenses.&lt;/p&gt;

&lt;p&gt;The repository includes the source, protocol specification, deployment instructions, security documentation, and testing framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I'd Like Technical Feedback
&lt;/h2&gt;

&lt;p&gt;I'm particularly interested in feedback from developers experienced in applied cryptography, distributed systems, browser security, and self-hosted infrastructure.&lt;/p&gt;

&lt;p&gt;Some questions I'm exploring:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Protocol design:&lt;/strong&gt; What weaknesses or unnecessary complexity do you see in the current key agreement and ratchet implementation?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Relay trust:&lt;/strong&gt; How far can sender privacy and metadata minimization realistically be improved while retaining such a lightweight relay?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Recovery:&lt;/strong&gt; What would you change about the recovery-word and device-migration mechanisms?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Hosting:&lt;/strong&gt; What deployment and operational risks are most likely to be overlooked by someone running this on shared hosting or a small VPS?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Verification:&lt;/strong&gt; Which additional independent tests would provide the most meaningful evidence of correctness?&lt;/p&gt;

&lt;p&gt;I'm interested in reproducible findings, adversarial testing, and concrete architectural improvements.&lt;/p&gt;

&lt;p&gt;Security vulnerabilities should be reported privately through the repository's GitHub Security tab rather than disclosed in public comments before they can be addressed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Hush Relay started with a relatively simple engineering question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if encrypted communication didn't require a complicated infrastructure stack?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The result is a small, self-hostable messaging experiment that can operate using technologies already available on common web servers and browsers.&lt;/p&gt;

&lt;p&gt;It is not a finished answer to secure messaging.&lt;/p&gt;

&lt;p&gt;It's a working exploration of the trade-offs between simplicity, decentralization, deployment accessibility, and cryptographic assurance.&lt;/p&gt;

&lt;p&gt;There is still substantial work to do, particularly around independent security evaluation.&lt;/p&gt;

&lt;p&gt;But that's also why I decided to publish the source and invite technical scrutiny.&lt;/p&gt;

&lt;p&gt;If you're interested in privacy engineering, minimal infrastructure, cryptographic protocols, or self-hosted applications, I'd welcome your feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/altrudev/Hush-Relay" rel="noopener noreferrer"&gt;https://github.com/altrudev/Hush-Relay&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; Hush Relay&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Developer:&lt;/strong&gt; Val Rukhaylo / &lt;a href="https://altru.dev" rel="noopener noreferrer"&gt;Altru.dev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; AGPL-3.0-or-later&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Build something useful. Understand what it does. Test what it claims.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>php</category>
      <category>security</category>
    </item>
    <item>
      <title>I Built a Chrome Extension to Make JavaScript State Debugging Less Painful</title>
      <dc:creator>VR Frequency</dc:creator>
      <pubDate>Thu, 14 May 2026 03:15:34 +0000</pubDate>
      <link>https://dev.to/vrfrequency/i-built-a-chrome-extension-to-make-javascript-state-debugging-less-painful-28de</link>
      <guid>https://dev.to/vrfrequency/i-built-a-chrome-extension-to-make-javascript-state-debugging-less-painful-28de</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxn0lo089lajaszetll2c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxn0lo089lajaszetll2c.png" alt=" " width="764" height="873"&gt;&lt;/a&gt;&lt;br&gt;
I Built a Chrome Extension to Make JavaScript State Debugging Less Painful&lt;/p&gt;

&lt;p&gt;I recently published my Chrome extension, &lt;strong&gt;Dweav (Data Weave) Trace&lt;/strong&gt;, on the Chrome Web Store.&lt;/p&gt;

&lt;p&gt;It started from a simple frustration:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;console.log()&lt;/code&gt; is useful... until your app state starts changing across multiple steps, components, events, API responses, user actions, and hidden edge cases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At that point, debugging becomes less about understanding your application and more about digging through a noisy console trying to remember what changed, when it changed, and why.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Dweav Trace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chrome Web Store:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://chromewebstore.google.com/detail/dweav-trace/djibmlmofhdmijbpekpneclbpnokemne" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/dweav-trace/djibmlmofhdmijbpekpneclbpnokemne&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy policy:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://altru.dev/extensions/dweav-trace.html" rel="noopener noreferrer"&gt;https://altru.dev/extensions/dweav-trace.html&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What is Dweav Trace?
&lt;/h2&gt;

&lt;p&gt;Dweav Trace is an offline-first Chrome extension for tracing JavaScript application state inside the browser.&lt;/p&gt;

&lt;p&gt;The basic idea is simple.&lt;/p&gt;

&lt;p&gt;Instead of scattering random logs everywhere, you can send structured state snapshots to Dweav Trace and view them in a chronological timeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;dweav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cartState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cart updated&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;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;dweav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userSession&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 logged in&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;p&gt;Each trace gives you a clearer picture of what your app looked like at a specific moment.&lt;/p&gt;

&lt;p&gt;The goal is not to replace Chrome DevTools.&lt;/p&gt;

&lt;p&gt;The goal is to make state changes easier to understand when normal console logging becomes too messy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;When building complex browser-based apps, I kept running into the same problem.&lt;/p&gt;

&lt;p&gt;I would add logs like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;before&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;after&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;checkout step&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I would run the app again, trigger a flow, open the console, and try to visually compare large objects across multiple logs.&lt;/p&gt;

&lt;p&gt;That works for small things.&lt;/p&gt;

&lt;p&gt;But once the app grows, the console becomes noisy.&lt;/p&gt;

&lt;p&gt;You start asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What changed between step 1 and step 2?&lt;/li&gt;
&lt;li&gt;Was this value added, removed, changed, or moved?&lt;/li&gt;
&lt;li&gt;Did the state mutate unexpectedly?&lt;/li&gt;
&lt;li&gt;Did the problem happen before or after the API response?&lt;/li&gt;
&lt;li&gt;Which snapshot was actually the important one?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the problem Dweav Trace is trying to solve.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Dweav Trace does
&lt;/h2&gt;

&lt;p&gt;Dweav Trace gives you a browser side panel where you can inspect state snapshots over time.&lt;/p&gt;

&lt;p&gt;Some of the main features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chronological state timeline&lt;/li&gt;
&lt;li&gt;Structured object inspection&lt;/li&gt;
&lt;li&gt;Snapshot labeling&lt;/li&gt;
&lt;li&gt;Structural diffing&lt;/li&gt;
&lt;li&gt;Added, removed, changed, and moved value tracking&lt;/li&gt;
&lt;li&gt;Auto-redaction for sensitive-looking values&lt;/li&gt;
&lt;li&gt;Offline-first design&lt;/li&gt;
&lt;li&gt;No analytics&lt;/li&gt;
&lt;li&gt;No telemetry&lt;/li&gt;
&lt;li&gt;No external servers&lt;/li&gt;
&lt;li&gt;No account required for the basic workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is designed for developers who want more visibility into browser app behavior without sending their debugging data somewhere else.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example use case
&lt;/h2&gt;

&lt;p&gt;Imagine you are debugging a checkout flow.&lt;/p&gt;

&lt;p&gt;You might trace state at different points:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;dweav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Initial cart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;dweav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;After quantity update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;dweav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;checkoutState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Checkout started&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;dweav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paymentState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Payment form submitted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;dweav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;orderResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order response received&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;p&gt;Instead of manually comparing console logs, you get a timeline of meaningful checkpoints.&lt;/p&gt;

&lt;p&gt;That makes it easier to understand how the state evolved through the flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Built-in developer tools
&lt;/h2&gt;

&lt;p&gt;I also included several small utilities that I often need while debugging or building web apps.&lt;/p&gt;

&lt;p&gt;Dweav Trace includes tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON formatter&lt;/li&gt;
&lt;li&gt;JWT decoder&lt;/li&gt;
&lt;li&gt;Base64 encode/decode&lt;/li&gt;
&lt;li&gt;SHA-256 hashing&lt;/li&gt;
&lt;li&gt;UUID generator&lt;/li&gt;
&lt;li&gt;URL parser/tools&lt;/li&gt;
&lt;li&gt;Case converter&lt;/li&gt;
&lt;li&gt;CRON translator&lt;/li&gt;
&lt;li&gt;Clipboard history&lt;/li&gt;
&lt;li&gt;Local diagnostic helpers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is to keep common browser-development utilities close to the tracing workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacy-first by design
&lt;/h2&gt;

&lt;p&gt;One of the most important decisions I made was to keep Dweav Trace offline-first.&lt;/p&gt;

&lt;p&gt;Debugging data can be sensitive.&lt;/p&gt;

&lt;p&gt;Application state may contain tokens, user information, internal IDs, API responses, or other data you do not want leaving your machine.&lt;/p&gt;

&lt;p&gt;So Dweav Trace is designed around local usage.&lt;/p&gt;

&lt;p&gt;The extension does not use analytics or telemetry, and the Chrome Web Store listing declares no data collection.&lt;/p&gt;

&lt;p&gt;There is also built-in auto-redaction to help reduce accidental exposure of sensitive-looking values.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;p&gt;Dweav Trace is mainly for JavaScript developers building browser-based applications.&lt;/p&gt;

&lt;p&gt;It can be useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend developers&lt;/li&gt;
&lt;li&gt;Indie hackers&lt;/li&gt;
&lt;li&gt;Web app builders&lt;/li&gt;
&lt;li&gt;Dashboard developers&lt;/li&gt;
&lt;li&gt;Game UI developers&lt;/li&gt;
&lt;li&gt;Crypto/web3 app developers&lt;/li&gt;
&lt;li&gt;AI tool builders&lt;/li&gt;
&lt;li&gt;Anyone debugging complex browser state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is especially useful when your app has multiple moving parts and you need to understand how state changes over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;p&gt;Dweav Trace is not meant to replace the full browser DevTools experience.&lt;/p&gt;

&lt;p&gt;It is also not a full observability platform.&lt;/p&gt;

&lt;p&gt;It is focused on one specific problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Helping developers understand state changes more clearly while building and debugging browser apps.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;p&gt;Dweav Trace is now published on the Chrome Web Store.&lt;/p&gt;

&lt;p&gt;This is an early public release, and I am looking for feedback from developers who regularly work with complex frontend state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chrome Web Store:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://chromewebstore.google.com/detail/dweav-trace/djibmlmofhdmijbpekpneclbpnokemne" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/dweav-trace/djibmlmofhdmijbpekpneclbpnokemne&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy policy:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://altru.dev/extensions/dweav-trace.html" rel="noopener noreferrer"&gt;https://altru.dev/extensions/dweav-trace.html&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Feedback wanted
&lt;/h2&gt;

&lt;p&gt;I would love feedback on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tracing workflow&lt;/li&gt;
&lt;li&gt;The side panel experience&lt;/li&gt;
&lt;li&gt;The state diff format&lt;/li&gt;
&lt;li&gt;The developer utilities&lt;/li&gt;
&lt;li&gt;The onboarding flow&lt;/li&gt;
&lt;li&gt;What frameworks or debugging patterns should be supported next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, let me know what feels useful, confusing, missing, or unnecessary.&lt;/p&gt;

&lt;p&gt;I built Dweav Trace because I wanted a cleaner way to debug state-heavy browser apps.&lt;/p&gt;

&lt;p&gt;Hopefully it helps other developers too.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>debugging</category>
      <category>chromeextension</category>
    </item>
    <item>
      <title>JelloOS: Assistive Tech Without Barriers</title>
      <dc:creator>VR Frequency</dc:creator>
      <pubDate>Wed, 11 Mar 2026 20:28:31 +0000</pubDate>
      <link>https://dev.to/vrfrequency/jelloos-assistive-tech-without-barriers-2kck</link>
      <guid>https://dev.to/vrfrequency/jelloos-assistive-tech-without-barriers-2kck</guid>
      <description>&lt;p&gt;Just wanted to say hello and introduce everyone to one of my projects currently in development. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sovereign Assistive OS&lt;/li&gt;
&lt;li&gt;Digital Nervous System&lt;/li&gt;
&lt;li&gt;Human‑Centered Computing&lt;/li&gt;
&lt;li&gt;Browser‑Native Eye‑Tracking&lt;/li&gt;
&lt;li&gt;Client‑Side Telemetry&lt;/li&gt;
&lt;li&gt;Privacy‑First Assistive Tech&lt;/li&gt;
&lt;li&gt;Accessible Autonomy&lt;/li&gt;
&lt;li&gt;Open Assistive Infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JelloOS is a project built around a simple belief: everyone deserves the ability to interact with their world, no matter their physical limitations.  &lt;/p&gt;

&lt;p&gt;Most assistive technologies today are expensive, locked‑down, or require specialized hardware. JelloOS takes the opposite approach. It runs entirely in the browser, uses standard laptops or tablets, and relies on privacy‑preserving eye‑tracking to let people communicate, navigate interfaces, and control connected devices — all without sending a single frame of video to a server.&lt;/p&gt;

&lt;p&gt;The goal isn’t just accessibility; it’s dignity. JelloOS is meant to feel like a digital nervous system for people who’ve been cut off from their physical environment, giving them back agency through open, human‑centered design. It’s free, it’s lightweight, and it’s built so anyone can try it without needing a clinic, a specialist, or a five‑figure device.&lt;/p&gt;

&lt;p&gt;At its core, JelloOS is an experiment in what assistive tech could look like if we treated autonomy as a fundamental right rather than a premium feature. &lt;/p&gt;

&lt;p&gt;Project meant to be free and accessible worldwide using any standard browser and preferably tablet.&lt;br&gt;
&lt;a href="https://altrue.dev" rel="noopener noreferrer"&gt;https://altrue.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>accessibilitytech</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>assistivetechnology</category>
    </item>
  </channel>
</rss>
