<?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: Sayan Mohsin</title>
    <description>The latest articles on DEV Community by Sayan Mohsin (@sayanmohsin).</description>
    <link>https://dev.to/sayanmohsin</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%2F857034%2F2e279e02-8b32-4158-99a6-d67f7931fc14.jpeg</url>
      <title>DEV Community: Sayan Mohsin</title>
      <link>https://dev.to/sayanmohsin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sayanmohsin"/>
    <language>en</language>
    <item>
      <title>When Code Looks Fine but Isn’t: Building Nice Code for Evidence-Based Review</title>
      <dc:creator>Sayan Mohsin</dc:creator>
      <pubDate>Fri, 04 Sep 2026 04:23:23 +0000</pubDate>
      <link>https://dev.to/sayanmohsin/when-code-looks-fine-but-isnt-building-nice-code-for-evidence-based-review-212b</link>
      <guid>https://dev.to/sayanmohsin/when-code-looks-fine-but-isnt-building-nice-code-for-evidence-based-review-212b</guid>
      <description>&lt;p&gt;A pull request can pass the compiler, the formatter, and the linter and still leave behind a serious engineering problem.&lt;/p&gt;

&lt;p&gt;Maybe two independent network requests are being awaited one after another. Maybe a log line includes credentials or personal data. Maybe an error is being discarded without making it clear whether that was intentional. Maybe a persistence change works for new data but does not protect existing records.&lt;/p&gt;

&lt;p&gt;None of these problems necessarily look like syntax errors.&lt;/p&gt;

&lt;p&gt;The code can be valid. The tests can be green. The change can even look reasonable during a quick review.&lt;/p&gt;

&lt;p&gt;That gap is why I built &lt;a href="https://sayanmohsin.github.io/nice-code/" rel="noopener noreferrer"&gt;Nice Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The limits of local checks
&lt;/h2&gt;

&lt;p&gt;Compilers and linters are extremely good at the rules they can prove locally.&lt;/p&gt;

&lt;p&gt;They can tell us whether a type is valid, a variable is unused, a function is formatted correctly, or a known rule has been violated.&lt;/p&gt;

&lt;p&gt;But some engineering questions are about context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this log contain enough information to debug the operation safely?&lt;/li&gt;
&lt;li&gt;Are these asynchronous operations actually independent?&lt;/li&gt;
&lt;li&gt;Is this error intentionally ignored?&lt;/li&gt;
&lt;li&gt;Does this migration preserve existing data?&lt;/li&gt;
&lt;li&gt;Is this performance claim supported by a measurement?&lt;/li&gt;
&lt;li&gt;Does this test protect real behavior or only exercise a happy path?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions involve intent, ownership, risk, and operational behavior. They are harder to reduce to a single syntax rule.&lt;/p&gt;

&lt;p&gt;AI-assisted development makes this especially visible. A generated change can be completely plausible and still carry a weak assumption about concurrency, error handling, security, or state ownership.&lt;/p&gt;

&lt;p&gt;Nice Code is designed for that layer of review.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small review layer
&lt;/h2&gt;

&lt;p&gt;Nice Code is not meant to replace a compiler, formatter, linter, or test suite.&lt;/p&gt;

&lt;p&gt;It adds a conservative, evidence-oriented review on top of the tools a project already uses. The goal is not to produce a single quality score. The goal is to make recurring engineering questions visible, with enough context for someone to decide what should happen next.&lt;/p&gt;

&lt;p&gt;The project covers patterns related to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logging and observability&lt;/li&gt;
&lt;li&gt;Async work and concurrency&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;API boundaries&lt;/li&gt;
&lt;li&gt;State and data flow&lt;/li&gt;
&lt;li&gt;Persistence and data integrity&lt;/li&gt;
&lt;li&gt;Testing and verification&lt;/li&gt;
&lt;li&gt;Security and secrets&lt;/li&gt;
&lt;li&gt;Performance measurement&lt;/li&gt;
&lt;li&gt;Reliability and operations&lt;/li&gt;
&lt;li&gt;Code review and AI-generated changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The patterns are intentionally smaller than a general-purpose static-analysis system. Each one should have a source, a recurring problem, a practical review procedure, and a clear explanation of what it can and cannot prove.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Nice Code
&lt;/h2&gt;

&lt;p&gt;The public package provides a Node-compatible launcher:&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; &lt;span class="nt"&gt;--global&lt;/span&gt; @sayanmohsin/nice-code

nice-code &lt;span class="nt"&gt;--changed&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installed command is &lt;code&gt;nice-code&lt;/code&gt;, while the npm package is scoped as &lt;code&gt;@sayanmohsin/nice-code&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For a one-off run, the package can also be invoked without a global installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;--yes&lt;/span&gt; @sayanmohsin/nice-code &lt;span class="nt"&gt;--changed&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;End users do not need Bun, Cargo, or Rust installed. The launcher downloads and verifies the matching Rust engine from the project’s GitHub Releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical workflow
&lt;/h2&gt;

&lt;p&gt;Nice Code defaults to focused work.&lt;/p&gt;

&lt;p&gt;Run a changed-file check during local development or before committing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nice-code &lt;span class="nt"&gt;--changed&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run a deliberate full scan when you want to inspect the broader repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nice-code &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction is useful. A full repository scan can be valuable, but it should be intentional rather than silently becoming part of every small edit.&lt;/p&gt;

&lt;p&gt;Nice Code can also produce machine-readable output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nice-code &lt;span class="nt"&gt;--project&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; nice-code-report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSON reports contain structured findings and scan information for automation, dashboards, or later review.&lt;/p&gt;

&lt;p&gt;For GitHub code-scanning integrations, SARIF output can be uploaded as a CI artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Nice Code&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nice-code --project . --changed --ci --format sarif &amp;gt; nice-code.sarif&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload Nice Code report&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/codeql-action/upload-sarif@v3&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sarif_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nice-code.sarif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existing projects can adopt Nice Code gradually with a baseline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nice-code &lt;span class="nt"&gt;--project&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--write-baseline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The baseline makes it possible to focus on new findings while the project works through older review items deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Nice Code claims
&lt;/h2&gt;

&lt;p&gt;Trust depends on knowing what a tool is actually saying.&lt;/p&gt;

&lt;p&gt;Nice Code classifies findings so that a contextual concern does not look identical to a proven defect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FAIL&lt;/code&gt; is a high-confidence issue that may block according to project policy.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WARN&lt;/code&gt; is an actionable concern that normally needs review.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;REVIEW&lt;/code&gt; means context or engineering judgment is required.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PASS&lt;/code&gt; means the relevant check ran without a finding.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;N/A&lt;/code&gt; means the check does not apply to the project or change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;REVIEW&lt;/code&gt; status is important. If a tool cannot prove that a behavior is wrong, it should not pretend that it can.&lt;/p&gt;

&lt;p&gt;For example, a sequential &lt;code&gt;await&lt;/code&gt; may be correct if the second operation depends on the first. A log statement may be safe if the value is already sanitized. A persistence change may be valid if the migration is protected elsewhere.&lt;/p&gt;

&lt;p&gt;The tool should identify the question and the evidence. A developer still needs to make the final decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the tool is built
&lt;/h2&gt;

&lt;p&gt;Nice Code keeps the review path small and explicit.&lt;/p&gt;

&lt;p&gt;Public guidance is recorded in a source registry and adapted into independent engineering patterns. The Rust engine owns discovery, parsing, rules, reports, and exit decisions. Node.js provides the user-facing launcher, while Bun is used for development tooling, tests, and benchmarks.&lt;/p&gt;

&lt;p&gt;When running in CI mode, Nice Code can also run available native project tools. Their status remains separate from Nice Code’s own findings, so a missing or failing native tool is not silently confused with a custom review rule.&lt;/p&gt;

&lt;p&gt;The result can be consumed in several ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Human-readable terminal output&lt;/li&gt;
&lt;li&gt;Compact output for coding agents&lt;/li&gt;
&lt;li&gt;JSON for automation&lt;/li&gt;
&lt;li&gt;SARIF for code-scanning systems&lt;/li&gt;
&lt;li&gt;Baselines for gradual adoption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same review can therefore support a developer working locally, an agent preparing a change, or a CI workflow checking a pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exceptions should be specific
&lt;/h2&gt;

&lt;p&gt;No review tool understands every project perfectly.&lt;/p&gt;

&lt;p&gt;That does not mean the answer should be to disable an entire category of checks.&lt;/p&gt;

&lt;p&gt;Nice Code supports project-specific configuration and exceptions, but exceptions should be narrow and documented. A good exception explains why a particular finding is safe in that location. It should not quietly remove an entire class of engineering questions from the project.&lt;/p&gt;

&lt;p&gt;If a rule produces a false positive because the parser or heuristic is wrong, the better fix is usually to improve Nice Code itself. The target project should not be rewritten merely to make a checker quiet.&lt;/p&gt;

&lt;p&gt;In practice, every finding should eventually fall into one of three categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A genuine defect to fix.&lt;/li&gt;
&lt;li&gt;Safe or intentional behavior to document.&lt;/li&gt;
&lt;li&gt;A Nice Code parser or rule problem to improve.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That classification is more useful than pretending every result is equally certain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Nice Code is today
&lt;/h2&gt;

&lt;p&gt;Nice Code is an evolving project.&lt;/p&gt;

&lt;p&gt;It is a review aid, not an autonomous engineering authority. It complements native tooling and human review rather than replacing either one.&lt;/p&gt;

&lt;p&gt;The project is deliberately conservative about what it claims. Some checks can be automated. Some need a developer or agent to inspect the surrounding context. Others are ultimately product or operational decisions.&lt;/p&gt;

&lt;p&gt;The useful outcome is not that every finding disappears.&lt;/p&gt;

&lt;p&gt;It is that difficult engineering questions become visible earlier, with a clearer path for deciding what to do about them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore Nice Code
&lt;/h2&gt;

&lt;p&gt;You can find the project here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sayanmohsin.com/projects/nice-code" rel="noopener noreferrer"&gt;Nice Code on my portfolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sayanmohsin/nice-code" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sayanmohsin.github.io/nice-code/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@sayanmohsin/nice-code" rel="noopener noreferrer"&gt;npm package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sayanmohsin/nice-code/releases/latest" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nice Code started from a simple observation: passing local checks is necessary, but it is not always enough to make a change trustworthy.&lt;/p&gt;

&lt;p&gt;The project is an attempt to add a small, practical review layer for the questions that live between syntax and system behavior.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ai</category>
      <category>devtool</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why I Built Arqen: Giving Backend Infrastructure a Clear Home in Rust</title>
      <dc:creator>Sayan Mohsin</dc:creator>
      <pubDate>Fri, 04 Sep 2026 04:13:22 +0000</pubDate>
      <link>https://dev.to/sayanmohsin/why-i-built-arqen-giving-backend-infrastructure-a-clear-home-in-rust-429l</link>
      <guid>https://dev.to/sayanmohsin/why-i-built-arqen-giving-backend-infrastructure-a-clear-home-in-rust-429l</guid>
      <description>&lt;p&gt;Most backend projects do not become complicated all at once.&lt;/p&gt;

&lt;p&gt;They start with a route or two. Then come configuration, authentication, storage, background work, health checks, logging, metrics, migrations, and deployment concerns.&lt;/p&gt;

&lt;p&gt;Each addition is reasonable on its own, but over time the boundaries between them become unclear.&lt;/p&gt;

&lt;p&gt;Application code starts knowing too much about storage. Background jobs depend on HTTP details. Health checks are implemented differently from service to service. Configuration is spread across constructors, environment variables, and framework-specific layers.&lt;/p&gt;

&lt;p&gt;I built Arqen to give those concerns a clearer home.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sayanmohsin.github.io/arqen/" rel="noopener noreferrer"&gt;Arqen&lt;/a&gt; is a Rust-first backend toolkit for HTTP services, agents, automation, jobs, health checks, modules, and storage adapters.&lt;/p&gt;

&lt;p&gt;It is not intended to hide the system from you. The goal is to make important boundaries explicit without forcing every application to rebuild the same foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with backend glue
&lt;/h2&gt;

&lt;p&gt;A backend often has several responsibilities that are related, but not identical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepting and validating HTTP requests&lt;/li&gt;
&lt;li&gt;Authenticating users or services&lt;/li&gt;
&lt;li&gt;Calling storage&lt;/li&gt;
&lt;li&gt;Running background work&lt;/li&gt;
&lt;li&gt;Reporting health and metrics&lt;/li&gt;
&lt;li&gt;Emitting useful logs&lt;/li&gt;
&lt;li&gt;Exposing capabilities to tools or agents&lt;/li&gt;
&lt;li&gt;Moving between local and production environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difficult part is not necessarily implementing each feature.&lt;/p&gt;

&lt;p&gt;The difficult part is keeping those features from becoming tightly coupled.&lt;/p&gt;

&lt;p&gt;A storage implementation should not dictate how an application defines its routes. A background job should not need to know whether data came from an in-memory store, a local embedded engine, or a remote service.&lt;/p&gt;

&lt;p&gt;A health endpoint should be able to report dependency state without taking ownership of the entire application lifecycle.&lt;/p&gt;

&lt;p&gt;That is where Arqen’s boundaries begin.&lt;/p&gt;

&lt;h2&gt;
  
  
  A backend foundation, not a giant runtime
&lt;/h2&gt;

&lt;p&gt;Arqen provides a structure for composing backend capabilities while keeping the application in control.&lt;/p&gt;

&lt;p&gt;The core is built around Rust, Tokio, Axum, Tower, tracing, and explicit feature flags. HTTP servers, clients, logging, jobs, storage adapters, migrations, and CLI support can be enabled according to the needs of a project.&lt;/p&gt;

&lt;p&gt;The easiest way to add Arqen to a Rust project is through Cargo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo add arqen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This adds Arqen from &lt;a href="https://crates.io/crates/arqen" rel="noopener noreferrer"&gt;crates.io&lt;/a&gt; without tying the article to a specific release number.&lt;/p&gt;

&lt;p&gt;For projects that need the CLI generator, a new application can be created with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo run &lt;span class="nt"&gt;-p&lt;/span&gt; arqen &lt;span class="nt"&gt;--features&lt;/span&gt; cli &lt;span class="nt"&gt;--bin&lt;/span&gt; arqen &lt;span class="nt"&gt;--&lt;/span&gt; new hello-api
&lt;span class="nb"&gt;cd &lt;/span&gt;hello-api
cargo run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The intention is to make the first step straightforward without deciding the entire architecture on behalf of the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping storage behind a contract
&lt;/h2&gt;

&lt;p&gt;One of the most important design decisions in Arqen is the &lt;code&gt;ThingdBackend&lt;/code&gt; boundary.&lt;/p&gt;

&lt;p&gt;Applications should be able to depend on a storage contract instead of directly coupling their business logic to one storage implementation.&lt;/p&gt;

&lt;p&gt;That makes it possible to use different modes for different situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory storage for tests and local development&lt;/li&gt;
&lt;li&gt;HTTP Thingd for separately deployed services&lt;/li&gt;
&lt;li&gt;Native Thingd for local tooling and embedded workflows&lt;/li&gt;
&lt;li&gt;Future hosted or cloud-backed paths where the contract remains useful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application-facing boundary stays the same while the deployment choice changes.&lt;/p&gt;

&lt;p&gt;This is useful when local development and production have different requirements. A local tool may benefit from an embedded engine, while a production application may be better served by a separately managed HTTP service.&lt;/p&gt;

&lt;p&gt;Arqen does not treat those modes as interchangeable without qualification. Each mode has different operational properties, compatibility requirements, and failure modes.&lt;/p&gt;

&lt;p&gt;For production applications, the HTTP adapter is the preferred boundary. Native storage is useful when the application specifically needs embedded access, local diagnostics, or migration tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Durable work belongs in the backend foundation
&lt;/h2&gt;

&lt;p&gt;Background work tends to grow quietly.&lt;/p&gt;

&lt;p&gt;A first job may just process a request later. Eventually it needs retries, leases, idempotency, failure tracking, dead letters, and a way to avoid multiple workers processing the same logical task.&lt;/p&gt;

&lt;p&gt;Arqen treats durable jobs as a backend concern rather than leaving every application to invent its own queue lifecycle.&lt;/p&gt;

&lt;p&gt;The job system is designed around explicit behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A job can be claimed by a worker&lt;/li&gt;
&lt;li&gt;Leases prevent abandoned work from remaining active forever&lt;/li&gt;
&lt;li&gt;Retries can be tracked&lt;/li&gt;
&lt;li&gt;Failures can be moved to dead-letter handling&lt;/li&gt;
&lt;li&gt;Work can be reconciled after a restart&lt;/li&gt;
&lt;li&gt;Scheduling can support interval, one-time, and cron-like execution&lt;/li&gt;
&lt;li&gt;Run identities can be deterministic and observable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not remove the need for application-specific decisions. A payment system, content pipeline, and email sender will all have different retry policies.&lt;/p&gt;

&lt;p&gt;But the underlying lifecycle should not need to be reconstructed from scratch each time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent-ready does not mean AI-only
&lt;/h2&gt;

&lt;p&gt;Arqen uses the term “agent-ready,” but that does not mean every application needs to be an AI product.&lt;/p&gt;

&lt;p&gt;For Arqen, agent-ready means that capabilities can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discovered&lt;/li&gt;
&lt;li&gt;Typed&lt;/li&gt;
&lt;li&gt;Permission-aware&lt;/li&gt;
&lt;li&gt;Validated&lt;/li&gt;
&lt;li&gt;Audited&lt;/li&gt;
&lt;li&gt;Exposed through machine-readable contracts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those properties are useful for agents, but they are also useful for ordinary clients, internal tools, automation, and operational systems.&lt;/p&gt;

&lt;p&gt;A typed tool with a clear input schema is easier for an agent to call, but it is also easier for a human developer to understand.&lt;/p&gt;

&lt;p&gt;A manifest that describes available capabilities is helpful for automation, but it is also useful for documentation and testing.&lt;/p&gt;

&lt;p&gt;The goal is not to add AI terminology to a conventional backend. The goal is to make backend capabilities more explicit and easier to integrate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explicit features instead of one large bundle
&lt;/h2&gt;

&lt;p&gt;Arqen uses feature flags to keep optional capabilities visible.&lt;/p&gt;

&lt;p&gt;An application can use the core HTTP foundation without pulling in native Thingd support. The CLI, HTTP client, logging, migration, maintenance, and connector features can be enabled when they are actually needed.&lt;/p&gt;

&lt;p&gt;That approach adds some configuration work, but it also makes dependencies and deployment assumptions easier to inspect.&lt;/p&gt;

&lt;p&gt;A project using native storage should be able to say so clearly. A project using an HTTP-only production boundary should not accidentally compile in an embedded database path just because a convenience feature enabled it.&lt;/p&gt;

&lt;p&gt;The feature list becomes part of the architecture rather than an implementation detail hidden inside the dependency graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Arqen provides
&lt;/h2&gt;

&lt;p&gt;Arqen includes building blocks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP services and clients&lt;/li&gt;
&lt;li&gt;Authentication and request context&lt;/li&gt;
&lt;li&gt;Typed tools and machine-readable manifests&lt;/li&gt;
&lt;li&gt;Application module composition&lt;/li&gt;
&lt;li&gt;Memory and Thingd-backed storage adapters&lt;/li&gt;
&lt;li&gt;Durable jobs and scheduling&lt;/li&gt;
&lt;li&gt;Health checks and operational status&lt;/li&gt;
&lt;li&gt;Structured logging and request correlation&lt;/li&gt;
&lt;li&gt;Metrics and observability&lt;/li&gt;
&lt;li&gt;Configuration and validation&lt;/li&gt;
&lt;li&gt;CLI-based project generation&lt;/li&gt;
&lt;li&gt;Migration and maintenance workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These capabilities are designed to work together, but they do not require every application to use all of them.&lt;/p&gt;

&lt;p&gt;That balance matters. A backend toolkit should provide a coherent path without making every project inherit the complexity of the most advanced project built with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tradeoffs
&lt;/h2&gt;

&lt;p&gt;Arqen is deliberately opinionated in a few places.&lt;/p&gt;

&lt;p&gt;It prefers explicit boundaries over convenience coupling. It prefers feature-gated integrations over a single universal runtime. It treats HTTP and native storage as different operational modes.&lt;/p&gt;

&lt;p&gt;It gives jobs, health, logging, and configuration a defined place in the application structure.&lt;/p&gt;

&lt;p&gt;Those choices can make the architecture slightly more visible up front.&lt;/p&gt;

&lt;p&gt;That is intentional.&lt;/p&gt;

&lt;p&gt;When a system is small, almost any structure can appear to work. As the system grows, the cost of unclear ownership becomes more noticeable.&lt;/p&gt;

&lt;p&gt;Arqen is an attempt to make that ownership clear earlier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the project is today
&lt;/h2&gt;

&lt;p&gt;Arqen is early-stage and actively maturing.&lt;/p&gt;

&lt;p&gt;It has useful building blocks and a growing set of examples and documentation, but it should not be treated as automatically production-ready for every workload.&lt;/p&gt;

&lt;p&gt;Applications still need their own security review, durability testing, recovery testing, dependency compatibility checks, and operational ownership.&lt;/p&gt;

&lt;p&gt;The toolkit can provide a foundation. It cannot make application-specific risk disappear.&lt;/p&gt;

&lt;p&gt;That distinction is important because backend infrastructure is easy to oversell. A clean abstraction is valuable, but it is not a substitute for understanding how a particular system behaves under failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore Arqen
&lt;/h2&gt;

&lt;p&gt;If the problems Arqen is trying to solve sound familiar, the project is available in a few places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sayanmohsin.com/projects/arqen" rel="noopener noreferrer"&gt;Arqen on my portfolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sayanmohsin/arqen" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sayanmohsin.github.io/arqen/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crates.io/crates/arqen" rel="noopener noreferrer"&gt;crates.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.rs/arqen" rel="noopener noreferrer"&gt;docs.rs API reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Arqen is an ongoing attempt to make backend infrastructure easier to compose, easier to inspect, and easier to move between environments.&lt;/p&gt;

&lt;p&gt;The most useful result would not be that every project uses it.&lt;/p&gt;

&lt;p&gt;It would be that the boundaries it explores help make backend systems a little easier to reason about.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>backend</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Production Leap: Scaling Agent Workflows Globally on thingd.cloud (Part 4)</title>
      <dc:creator>Sayan Mohsin</dc:creator>
      <pubDate>Mon, 13 Jul 2026 19:33:20 +0000</pubDate>
      <link>https://dev.to/sayanmohsin/the-production-leap-scaling-agent-workflows-globally-on-thingdcloud-part-4-1cai</link>
      <guid>https://dev.to/sayanmohsin/the-production-leap-scaling-agent-workflows-globally-on-thingdcloud-part-4-1cai</guid>
      <description>&lt;p&gt;Over the last three posts, we explored the concept of "Zero-UI" software, deep-dived into our high-performance Rust core engine, and wrote local agent scripts using the TypeScript SDK. &lt;/p&gt;

&lt;p&gt;But eventually, every developer hits the production wall. &lt;/p&gt;

&lt;p&gt;Running a local-first agent data engine on your MacBook is a beautiful experience. But scaling that engine to support thousands of concurrent autonomous agents—while keeping latencies near zero and ensuring total tenant isolation—requires a completely different architectural playbook.&lt;/p&gt;

&lt;p&gt;This is the story of how we built &lt;strong&gt;thingd.cloud&lt;/strong&gt;, the managed hosting layer for agent-native infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Production Challenge: Multi-Tenancy for Machines
&lt;/h2&gt;

&lt;p&gt;When humans use a SaaS cloud application, they are forgiving. If a dashboard takes 1.5 seconds to load because of a cold start or a busy database connection pool, a human might sigh, but they won't break the app.&lt;/p&gt;

&lt;p&gt;When an &lt;strong&gt;AI Agent&lt;/strong&gt; hits a database layer, it has zero patience. If your cloud API experiences latency spikes, the agent’s execution loop stalls, context windows can timeout, and inference costs skyrocket.&lt;/p&gt;

&lt;p&gt;To scale our local Rust/SQLite primitives to the cloud, we had to solve two major architectural pillars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Tenant Isolation:&lt;/strong&gt; Ensuring Agent A’s memory structures can never bleed into or affect Agent B’s data assets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-Concurrency Orchestration:&lt;/strong&gt; Handling thousands of active tool invocations per second without creating database deadlocks.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Stack: Scaling with NestJS, React, and TypeScript
&lt;/h2&gt;

&lt;p&gt;While our core execution engine (&lt;code&gt;engine.thingd.cloud&lt;/code&gt;) stays lean and fast in Rust, we built the control plane and orchestration layer of &lt;a href="https://thingd.cloud" rel="noopener noreferrer"&gt;thingd.cloud&lt;/a&gt; using a robust enterprise stack: &lt;strong&gt;NestJS&lt;/strong&gt; on the backend and &lt;strong&gt;React&lt;/strong&gt; for the developer dashboard.&lt;/p&gt;

</description>
      <category>nestjs</category>
      <category>react</category>
      <category>cloud</category>
      <category>saas</category>
    </item>
    <item>
      <title>Ditching JSON &amp; SQL Friction: Designing an Object-Shaped Memory Engine (Part 2)</title>
      <dc:creator>Sayan Mohsin</dc:creator>
      <pubDate>Mon, 13 Jul 2026 19:32:46 +0000</pubDate>
      <link>https://dev.to/sayanmohsin/ditching-json-sql-friction-designing-an-object-shaped-memory-engine-part-2-140n</link>
      <guid>https://dev.to/sayanmohsin/ditching-json-sql-friction-designing-an-object-shaped-memory-engine-part-2-140n</guid>
      <description>&lt;p&gt;For a long time, backend engineering has been divided into two camps: Relational databases (SQL) for rigid, structured tables, and Document stores (NoSQL/JSON) for flexible, unstructured data. &lt;/p&gt;

&lt;p&gt;But when you are building for AI Agents, both of these traditional approaches introduce massive architectural friction. &lt;/p&gt;

&lt;p&gt;AI agents don't think in rows, columns, or complex foreign key joins. They don't want to parse heavily nested, arbitrary JSON text blobs either. Agents think in &lt;strong&gt;state, context, and entities&lt;/strong&gt;. They operate best when data looks exactly like the object structures they manipulate in their runtime environments.&lt;/p&gt;

&lt;p&gt;When I designed the core primitives for &lt;strong&gt;thingd&lt;/strong&gt;, I wanted the absolute speed of a local relational database combined with the flexibility of an object-first paradigm. Here is how we bypassed the typical ORM bloat and built an object-shaped memory engine natively in Rust.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why typical DB abstractions break for Agents
&lt;/h2&gt;

&lt;p&gt;If you hook an autonomous agent loop up to a traditional Postgres or MySQL instance using an ORM like Prisma or TypeORM, you run into three main problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context Bloat:&lt;/strong&gt; ORMs generate heavy, verbose SQL queries and return heavily structured responses packed with metadata that the agent doesn't need, wasting valuable context tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema Inflexibility:&lt;/strong&gt; Agents are dynamic. They discover new data shapes, store arbitrary runtime memories, and alter data structures on the fly. Migrating a SQL schema mid-agent loop is an absolute nightmare.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Local I/O Bottleneck:&lt;/strong&gt; Forcing a local agent loop to constantly hit a remote cloud database for every minor micro-step adds hundreds of milliseconds of network latency, compounding until the agent feels unusable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We needed something local-first, structurally dynamic, and blazing fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Under the Hood: SQLite Performance + Rust Objects
&lt;/h2&gt;

&lt;p&gt;To solve this, &lt;code&gt;thingd&lt;/code&gt; uses &lt;strong&gt;SQLite&lt;/strong&gt; as its storage engine, but exposes it completely as a high-performance &lt;strong&gt;Object Store&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Instead of forcing developers (or agents) to write queries or handle migrations, &lt;code&gt;thingd&lt;/code&gt; abstracts the database into an entity-first system. Every data point is treated as a "thing"—an object primitive with its own identity, properties, and relationships.&lt;/p&gt;

&lt;p&gt;Because the underlying engine is written in Rust, we get to take advantage of zero-cost abstractions:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
rust
// A simplified look at how thingd handles dynamic object primitives internally
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ThingObject {
    pub id: String,
    pub entity_type: String,
    pub properties: HashMap&amp;lt;String, serde_json::Value&amp;gt;,
    pub updated_at: i64,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>rust</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Killing the Frontend: Building the Agent-Native Stack (Part 1)</title>
      <dc:creator>Sayan Mohsin</dc:creator>
      <pubDate>Mon, 13 Jul 2026 19:32:16 +0000</pubDate>
      <link>https://dev.to/sayanmohsin/killing-the-frontend-building-the-agent-native-stack-part-1-2oma</link>
      <guid>https://dev.to/sayanmohsin/killing-the-frontend-building-the-agent-native-stack-part-1-2oma</guid>
      <description>&lt;p&gt;For the last two decades, software engineering has followed a predictable formula: build a database, write an API, and build a massive, complex frontend web app (React, Vue, Next.js) so a human can interact with your data. &lt;/p&gt;

&lt;p&gt;If you are building something like an Order Management System (OMS) today, you will spend months designing dashboards, sorting data tables, managing state, and handling complex pagination hooks—all just so a human can click a button to change a status from "Pending" to "Shipped."&lt;/p&gt;

&lt;p&gt;But what happens when your user isn't a human looking at a screen, but an &lt;strong&gt;autonomous AI Agent&lt;/strong&gt; running in a background loop? &lt;/p&gt;

&lt;p&gt;The agent doesn't care about your custom Tailwind CSS components or your beautifully optimized pagination hooks. In fact, forcing an AI agent to scrape a web UI or deal with bloated, unstructured HTTP REST endpoints is slow, token-expensive, and highly unpredictable. &lt;/p&gt;

&lt;p&gt;If we are moving into a world of &lt;strong&gt;Zero-UI&lt;/strong&gt;, where software is entirely agent-driven, we need a fundamentally new backend stack. We need &lt;strong&gt;Agent-Native Infrastructure&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Paradigm Shift: From Features to "Invocable Capabilities"
&lt;/h2&gt;

&lt;p&gt;When you strip away the frontend, an application becomes a collection of raw, high-performance capabilities that an LLM can trigger deterministically. &lt;/p&gt;

&lt;p&gt;Imagine an agent-driven application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A human simply tells a chat interface, a Slack bot, or an internal AI handler: &lt;em&gt;"Cancel order #1042 and refund the user because it’s out of stock."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The Agent takes that intent, calculates the correct execution path, and triggers a direct data operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To make this reliable at scale, the agent needs a data engine that speaks its language natively—via the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;—at sub-millisecond speeds. &lt;/p&gt;

&lt;p&gt;That is exactly why I built &lt;strong&gt;thingd&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I didn't want to build another dashboard. I wanted to build an open-source, ultra-fast data engine designed specifically to give agents native access to application state and memory without the traditional web app fluff. &lt;/p&gt;

&lt;p&gt;To prove this architectural pattern worked, I didn't start with a simple todo app. I built a real-time, high-concurrency npm registry lookup engine directly native to AI agents: &lt;a href="https://engine.thingd.cloud" rel="noopener noreferrer"&gt;engine.thingd.cloud&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack: Why Rust + MCP is the Zero-UI Sweet Spot
&lt;/h2&gt;

&lt;p&gt;Building for agents requires two things that traditional web apps often compromise on: &lt;strong&gt;extreme speed&lt;/strong&gt; and &lt;strong&gt;rigid predictability&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;If an LLM takes 800ms waiting for a server response during an autonomous loop of 10 sequential tasks, the compounding latency destroys the user experience. &lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Protocol: Model Context Protocol (MCP)
&lt;/h3&gt;

&lt;p&gt;Instead of inventing a custom JSON schema or letting the LLM guess how to query an endpoint, &lt;code&gt;thingd&lt;/code&gt; utilizes the open standard Model Context Protocol. MCP acts as a secure, bidirectional bridge between LLMs (like Claude Code, Cursor, or custom frameworks) and data sources. &lt;/p&gt;

&lt;p&gt;By exposing my engine via an MCP server, any agent can inspect the tool schema natively:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
json
{
  "name": "thingd_npm_lookup",
  "description": "Query the high-speed thingd engine for real-time npm package metadata and dependency trees",
  "input_schema": {
    "type": "object",
    "properties": {
      "package_name": { "type": "string" }
    },
    "required": ["package_name"]
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>mcp</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Local-First Agents: Building with the thingd CLI &amp; TypeScript Clients (Part 3)</title>
      <dc:creator>Sayan Mohsin</dc:creator>
      <pubDate>Mon, 13 Jul 2026 17:17:39 +0000</pubDate>
      <link>https://dev.to/sayanmohsin/local-first-agents-building-with-the-thingd-cli-typescript-clients-part-3-4ia1</link>
      <guid>https://dev.to/sayanmohsin/local-first-agents-building-with-the-thingd-cli-typescript-clients-part-3-4ia1</guid>
      <description>&lt;p&gt;A great data engine is completely useless if the developer experience (DX) makes you want to tear your hair out. &lt;/p&gt;

&lt;p&gt;When building tools for AI agents, DX is twice as difficult. You aren't just designing a clean API for the human engineer writing the code; you are also designing an intuitive interface for the AI agent that will be manipulating the system autonomously.&lt;/p&gt;

&lt;p&gt;In this post, we’re looking at how to build with &lt;strong&gt;thingd&lt;/strong&gt; using the local CLI and our native TypeScript SDK to create low-latency, local-first agent loops.&lt;/p&gt;




&lt;h2&gt;
  
  
  Local-First DX: The thingd CLI
&lt;/h2&gt;

&lt;p&gt;When an agent is autonomously modifying data, updating system states, or resolving something complex like our npm lookup tool on &lt;a href="https://engine.thingd.cloud" rel="noopener noreferrer"&gt;engine.thingd.cloud&lt;/a&gt;, human developers need a window into what the hell is happening under the hood.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;thingd&lt;/code&gt; CLI acts as that bridge. It allows you to spin up the local engine, inspect the object memory pools, and view real-time logs of what your agents are querying.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
# Start the local engine instance
thingd start

# Inspect live agent-created object entities
thingd objects:list --type memory_stream
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>cli</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
