<?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: Hitakshi Arora</title>
    <description>The latest articles on DEV Community by Hitakshi Arora (@hitakshi_arora_4789582a4f).</description>
    <link>https://dev.to/hitakshi_arora_4789582a4f</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%2F3481760%2F2bdad738-ab4a-4a0e-b3d4-cb00219e7bf8.png</url>
      <title>DEV Community: Hitakshi Arora</title>
      <link>https://dev.to/hitakshi_arora_4789582a4f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hitakshi_arora_4789582a4f"/>
    <language>en</language>
    <item>
      <title>Why you should move your Grafana dashboards to SigNoz, and how I made it dead simple</title>
      <dc:creator>Hitakshi Arora</dc:creator>
      <pubDate>Fri, 24 Jul 2026 09:34:38 +0000</pubDate>
      <link>https://dev.to/hitakshi_arora_4789582a4f/why-you-should-move-your-grafana-dashboards-to-signoz-and-how-i-made-it-dead-simple-4p67</link>
      <guid>https://dev.to/hitakshi_arora_4789582a4f/why-you-should-move-your-grafana-dashboards-to-signoz-and-how-i-made-it-dead-simple-4p67</guid>
      <description>&lt;p&gt;If you run any real infrastructure, you've stared at a Grafana dashboard: a wall of graphs for CPU, memory, latency, and error rates. Each of those graphs is drawn by a small query you wrote in PromQL, the query language Prometheus uses, the &lt;code&gt;rate(...)&lt;/code&gt; and &lt;code&gt;sum(...)&lt;/code&gt; expressions that turn raw metrics into a line on a chart. A single dashboard can hold hundreds of them.&lt;/p&gt;

&lt;p&gt;Now suppose you want to move to a different observability tool, maybe for better tracing, maybe to run one backend instead of five. Your metrics come across. Your logs come across. Your dashboards do not, and that is the part nobody warns you about.&lt;/p&gt;

&lt;p&gt;You sit down in front of years of Grafana dashboards, hundreds of panels, and you rebuild every single one by hand. Panel by panel, PromQL query by PromQL query, retyped into the new tool and eyeballed until the graph looks about right.&lt;/p&gt;

&lt;p&gt;That manual slog is a real reason teams never switch at all. It isn't that the new tool is worse. It's that nobody wants to spend two weeks re-creating dashboards and still not be sure they got them right. So I built something that does it for you. This post is why the move is worth making, the one detail that makes it tricky, what I built, and the thing I got wrong along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why anyone wants to leave the Grafana stack
&lt;/h2&gt;

&lt;p&gt;For a decade, observability meant stitching tools together. Prometheus for metrics, Loki for logs, Tempo or Jaeger for traces, Grafana on top to draw all three. It works, but you're running four systems, each with its own storage and query language, and chasing a slow request from a trace to the metric that explains it means bouncing between tabs and hoping the timestamps line up.&lt;/p&gt;

&lt;p&gt;OpenTelemetry changed the math. It's now the standard way to instrument code for traces, metrics, and logs, vendor-neutral and supported everywhere. Once your instrumentation is standard, the backend doesn't have to be four things. It can be one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SigNoz is a good place to land
&lt;/h2&gt;

&lt;p&gt;That one thing, for me, was SigNoz. If you haven't come across it: SigNoz is an open-source, OpenTelemetry-native observability platform that keeps logs, metrics, and traces in a single ClickHouse-backed store. You go from a slow trace straight to the metric and the log line behind it, in one place, no glue. You self-host it with Docker or Kubernetes, so your data stays yours. There's no proprietary agent to install because it speaks the OpenTelemetry your code already emits. And there's an MCP server, so a coding agent can debug against the same telemetry you're looking at.&lt;/p&gt;

&lt;p&gt;The pitch is simple: collapse the Prometheus-plus-Loki-plus-Tempo-plus-Grafana stack into one tool. The pitch is also where you hit the wall, because your dashboards are still in Grafana.&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc92vtzhtcocp0q63v7tz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc92vtzhtcocp0q63v7tz.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: your dashboards are hundreds of PromQL queries
&lt;/h2&gt;

&lt;p&gt;A dashboard isn't one thing to move. Node Exporter Full, the one I tested against, is 140 panels and hundreds of PromQL queries. Moving it means translating every one of those queries into something SigNoz can run, and doing it in a way you can actually trust. The obvious approach, a converter that rewrites each PromQL string, or an LLM asked to "port this query," is a trap, and to see why you need one detail about how SigNoz asks questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Query Builder vs PromQL, the part worth understanding
&lt;/h2&gt;

&lt;p&gt;In Grafana over Prometheus, every panel is a PromQL string. You write &lt;code&gt;rate(...)&lt;/code&gt; and &lt;code&gt;histogram_quantile(...)&lt;/code&gt; by hand, as text.&lt;/p&gt;

&lt;p&gt;SigNoz gives you two ways to ask the same question. It will run raw PromQL directly, so a Grafana dashboard can come across as-is and render. But its first-class query type is the &lt;strong&gt;Query Builder&lt;/strong&gt;: instead of a string, you pick a metric, an aggregation like &lt;code&gt;avg&lt;/code&gt; or &lt;code&gt;p99&lt;/code&gt;, a group-by, filters, and &lt;code&gt;having&lt;/code&gt; and &lt;code&gt;limit&lt;/code&gt; clauses, and SigNoz assembles the query. A Builder query is the native citizen. It stays editable in that visual builder, it powers click-to-filter drilldown, and it's the form alerts and the rest of the product are built around.&lt;/p&gt;

&lt;p&gt;So every migrated panel is a fork in the road. Leave it as PromQL and it renders, but it's an opaque string you can't edit in the builder and can't drill into. Or translate the PromQL into a native Builder query and get the whole SigNoz experience back.&lt;/p&gt;

&lt;p&gt;Translating PromQL into Builder queries is the move worth making, and it's the hard one, because PromQL does not mean the same thing once SigNoz's Builder engine is in the path. Same query text, same metric, and the number that comes out can be subtly different, because the two engines bucket and label time differently. A naive conversion looks perfect and is quietly, numerically wrong. Every panel renders. Some of them are lying, and you can't tell which by looking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;So I built the tool around distrust. It's called noz-in, it's open source and written in Go, and its whole job is to turn a Grafana dashboard's PromQL into native SigNoz Builder queries without ever claiming a conversion it can't prove.&lt;/p&gt;

&lt;p&gt;The way it proves one is the important part. For each candidate, noz-in parses the PromQL with the real &lt;code&gt;prometheus/promql/parser&lt;/code&gt;, never a regex, builds a Builder query, then runs both the Builder query and the original PromQL against your live SigNoz over the same window and compares the two result series point by point. It doesn't argue a conversion is correct. It measures it, on your data.&lt;/p&gt;

&lt;p&gt;That measurement is where I learned I was doing it wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I got wrong while building it
&lt;/h2&gt;

&lt;p&gt;My first version of the comparison did the obvious thing: check that the two series match in value, within 5%, with timestamps matched loosely to absorb jitter. I ran it on Node Exporter Full, and it happily promoted a handful of queries to native, each certified within 5%. Every number was green.&lt;/p&gt;

&lt;p&gt;Then I plotted one of those "matching" panels against its PromQL source, and the SigNoz line was rendering every value one minute late. The whole way across. My own check had signed off on it.&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqskb3qvajr2u4jyu2dyc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqskb3qvajr2u4jyu2dyc.png" alt=" " width="799" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cause isn't a bug in SigNoz. Its Builder engine buckets time and labels each bucket at the bucket's start; PromQL evaluates at the step boundary. Both are internally consistent, they just disagree about which timestamp a value belongs to, so every moving series comes out shifted by exactly one step. I re-derived it through a separate code path to be sure I wasn't fooling myself twice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;builder[t] == promql[t+60s]   for 10/10 points   (0/10 match same-slot)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ten out of ten points lined up one step over. Zero lined up in place. So why did a 5% check pass it? Because on a slow-moving gauge, one step of drift is a tiny change in value, about 0.006% for available memory, three orders of magnitude under the tolerance. The two series were nearly identical in value at every point and wrong in time at every point, and a value comparison can only see the first thing.&lt;/p&gt;

&lt;p&gt;Here's the part that actually taught me something. My check hadn't been testing whether the translation was correct. It had been testing whether the data happened to be flat during my test window. Run it while the metric was steady and it passed; run it while the metric moved and it would have failed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Correctness that depends on your test data being boring is not correctness.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fix compares each point against the PromQL series at the same slot and one step on either side, and refuses to promote anything that only lines up when shifted. About forty lines, with both failure modes pinned as regression tests so I can't quietly bring them back.&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flmfhjpqw0qgmgna74e70.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flmfhjpqw0qgmgna74e70.png" alt=" " width="800" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A constant series came back &lt;code&gt;ADOPTED  fidelity=exact  maxRelErr=0.0000&lt;/code&gt;, every point identical. A moving one diverged and came back &lt;code&gt;REJECTED&lt;/code&gt;. The tool keeps what it can prove and refuses what it can't, with the receipt attached to each.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works now
&lt;/h2&gt;

&lt;p&gt;Two rules hold the whole thing together.&lt;/p&gt;

&lt;p&gt;The floor is that every query migrates, no exceptions. Nothing gets dropped because it was too hard to convert. The invariant is that nothing is called &lt;code&gt;native&lt;/code&gt; without passing that live check first. Every query lands on one of three verdicts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;native&lt;/code&gt; — a Builder query proven equivalent on your live data, fully editable in SigNoz.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;passthrough&lt;/code&gt; — the original PromQL, verified to run, that SigNoz executes as-is so the panel still renders.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;needs_review&lt;/code&gt; — noz-in isn't sure, so it flags the query with a reason code instead of guessing.&lt;/li&gt;
&lt;/ul&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvwgdk934d3zso1wnv9h2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvwgdk934d3zso1wnv9h2.png" alt=" " width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the run I'd want a skeptic to see. Fixed tool, pointed at Node Exporter Full, live:&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6btnmui4ch72u06t1i6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6btnmui4ch72u06t1i6.png" alt=" " width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All 140 panels accounted for and rendering in SigNoz. &lt;strong&gt;Zero forced to native, on purpose.&lt;/strong&gt; Every panel came across as verified passthrough, and the queries that could have been promoted but carried time-bucketing semantics I couldn't fully prove stayed at review instead. "100% native" was never the goal; some PromQL, like &lt;code&gt;topk&lt;/code&gt; and subqueries, has no Builder equivalent and stays passthrough forever, correctly. The dashboard works. That's the goal.&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxc73xvu9c5c81z9vvhuk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxc73xvu9c5c81z9vvhuk.png" alt=" " width="799" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the same Node Exporter Full dashboard from the top of this post, running in SigNoz on live data, that I did not rebuild by hand.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it on your worst dashboard
&lt;/h2&gt;

&lt;p&gt;It's one command: point noz-in at a Grafana dashboard JSON and your live SigNoz, and it writes the migrated dashboard plus a report of exactly what it proved and what it refused. There's an MCP server and an agent skill too, so an AI agent can propose a Builder query for anything stuck at review, but that proposal is adopted only if it passes the same live check as everything else. The agent proposes, the tool verifies. Nothing skips the gate.&lt;/p&gt;

&lt;p&gt;If you've been putting off leaving Grafana because of the dashboard rebuild, that's the part I automated. And the lesson underneath it holds for any migration, not just mine: a conversion that checks equivalence on values alone will certify panels that are wrong in time, and you won't find out until an alert fires a minute late during an incident. Make it prove the time too.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mansiverma897993" rel="noopener noreferrer"&gt;
        mansiverma897993
      &lt;/a&gt; / &lt;a href="https://github.com/mansiverma897993/noz-in" rel="noopener noreferrer"&gt;
        noz-in
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Migrate every Grafana dashboard to SigNoz immediately through safe PromQL passthrough then automatically promote only the queries proven equivalent to native SigNoz Builder queries.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;noz-in&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/mansiverma897993/noz-in/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/798509b4df525f56802b56f8096862487f08023e3d7561c68656f8dab10d0d6e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368652d2d322e302d626c75652e737667" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://pkg.go.dev/github.com/mansiverma897993/noz-in" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e41df92d038d171bc9f61f9e508d5ba1ff3344ced457efd45ec8cf8869d2cdf7/68747470733a2f2f706b672e676f2e6465762f62616467652f6769746875622e636f6d2f6d616e73697665726d613839373939332f6e6f7a2d696e2e737667" alt="Go Reference"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Migrate every Grafana dashboard to SigNoz immediately through safe PromQL
passthrough then automatically promote only the queries proven equivalent
to native SigNoz Builder queries.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;noz-in&lt;/strong&gt; is a deterministic query-compatibility and migration engine that
moves observability estates &lt;em&gt;into&lt;/em&gt; SigNoz. It ships as the &lt;strong&gt;&lt;code&gt;promcast&lt;/code&gt;&lt;/strong&gt; CLI
which converts Grafana dashboards and Prometheus alerting rules into SigNoz
artifacts, validates the exact target queries against live SigNoz APIs, and
explains every compatibility decision in JSON and self-contained HTML.&lt;/p&gt;
&lt;p&gt;This is an independent community project, not affiliated with or endorsed by
SigNoz, Inc. The code is organized so proven adapters or compatibility rules
can be proposed to SigNoz later without coupling its core model to Grafana
internals.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Every migration rests on one floor and one invariant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The floor:&lt;/strong&gt; every query always migrates. When a PromQL query cannot be
proven equivalent to a SigNoz Builder query, the verbatim PromQL is emitted
and…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mansiverma897993/noz-in" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>productivity</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>The Vercel of Midnight: I Automated the Most Painful Part of ZK Development</title>
      <dc:creator>Hitakshi Arora</dc:creator>
      <pubDate>Mon, 08 Sep 2025 01:48:05 +0000</pubDate>
      <link>https://dev.to/hitakshi_arora_4789582a4f/the-vercel-of-midnight-i-automated-the-most-painful-part-of-zk-development-h8g</link>
      <guid>https://dev.to/hitakshi_arora_4789582a4f/the-vercel-of-midnight-i-automated-the-most-painful-part-of-zk-development-h8g</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/midnight-2025-08-20"&gt;Midnight Network "Privacy First" Challenge&lt;/a&gt; - Enhance the Ecosystem prompt&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Building on a cutting-edge, privacy-first blockchain should be exciting. It should be about creating things that were impossible before—anonymous voting systems, private identity protocols, confidential finance.&lt;/p&gt;

&lt;p&gt;Instead, for most developers, it starts with a wall of pain.&lt;/p&gt;

&lt;p&gt;After diving deep into the Midnight ecosystem, I discovered a universal truth: the initial developer experience is a brutal gauntlet of cryptic errors, complex configurations, and undocumented APIs. I spent days wrestling with &lt;code&gt;ERR_MODULE_NOT_FOUND&lt;/code&gt;, &lt;code&gt;InvalidSeed&lt;/code&gt;, &lt;code&gt;LedgerParameters&lt;/code&gt; errors, and a dozen other issues just to get a single, simple contract onto the testnet.&lt;/p&gt;

&lt;p&gt;I realized the biggest barrier to Midnight's adoption wasn't the complexity of zero-knowledge proofs; it was the sheer, soul-crushing friction of the deployment process.&lt;/p&gt;

&lt;p&gt;So, I decided to fix it.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;code&gt;midnight-deploy&lt;/code&gt;&lt;/strong&gt;, a powerful and intuitive CLI tool that transforms the deployment experience from a multi-day debugging nightmare into a single, slick command. Think of it as &lt;strong&gt;the Vercel of Midnight deployments.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Demo: From Zero to Deployed in 60 Seconds
&lt;/h3&gt;

&lt;p&gt;First, see it in action. This is the "Quick Deploy" mode, which requires zero configuration or &lt;code&gt;.env&lt;/code&gt; files. It generates a temporary wallet, compiles, deploys, and initializes a contract—all with one command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; You can find the full source code and dive deep into the project here:&lt;br&gt;
➡️ &lt;strong&gt;&lt;a href="https://github.com/hitakshiA/midnight-deploy/tree/main" rel="noopener noreferrer"&gt;https://github.com/hitakshiA/midnight-deploy/tree/main&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Why This Changes Everything for Midnight Developers
&lt;/h3&gt;

&lt;p&gt;Before &lt;code&gt;midnight-deploy&lt;/code&gt;, getting a contract live involved a dozen manual steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Writing a 100+ line deployment script.&lt;/li&gt;
&lt;li&gt; Manually compiling the &lt;code&gt;.compact&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt; Generating and managing wallet seeds and admin keys.&lt;/li&gt;
&lt;li&gt; Wrestling with &lt;code&gt;ts-node&lt;/code&gt; and Node.js module incompatibilities.&lt;/li&gt;
&lt;li&gt; Configuring over seven different provider libraries.&lt;/li&gt;
&lt;li&gt; Orchestrating the complex, two-step "deploy-then-initialize" transaction sequence.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;midnight-deploy&lt;/code&gt; automates it all.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A developer simply creates a declarative &lt;code&gt;midnight.config.ts&lt;/code&gt; file in their project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// midnight.config.ts&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {import('midnight-deploy').DeployConfig} */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Your funded wallet's mnemonic, securely stored in .env&lt;/span&gt;
  &lt;span class="na"&gt;deployerMnemonic&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DEPLOYER_MNEMONIC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="na"&gt;contracts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PassportContract&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./contracts/Passport.compact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// Automatically call the 'initialize' circuit after deployment&lt;/span&gt;
      &lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;circuit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;initialize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;initialAdminPk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And runs one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx midnight-deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool takes over, providing beautiful, real-time feedback as it compiles the contract, builds the wallet, syncs with the testnet, and executes the deployment and initialization transactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Leverages the Full Power of the Midnight Stack
&lt;/h3&gt;

&lt;p&gt;This isn't a mock. &lt;code&gt;midnight-deploy&lt;/code&gt; is a deep integration with the entire Midnight technology stack.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Compiler Integration:&lt;/strong&gt; It directly invokes the &lt;code&gt;compactc&lt;/code&gt; compiler to build smart contracts from source.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Headless Wallet Management:&lt;/strong&gt; It uses &lt;code&gt;@midnight-ntwrk/wallet&lt;/code&gt; and &lt;code&gt;@midnight-ntwrk/wallet-sdk-hd&lt;/code&gt; to programmatically generate keys, derive hex seeds from mnemonics, and create fully functional headless wallets for sending transactions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Provider Orchestration:&lt;/strong&gt; It automatically configures and wires together the complex web of providers needed for any on-chain interaction (&lt;code&gt;PrivateStateProvider&lt;/code&gt;, &lt;code&gt;PublicDataProvider&lt;/code&gt;, &lt;code&gt;ZkConfigProvider&lt;/code&gt;, &lt;code&gt;ProofProvider&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;On-Chain Transactions:&lt;/strong&gt; It uses &lt;code&gt;@midnight-ntwrk/midnight-js-contracts&lt;/code&gt; to construct, prove, and submit real deployment and circuit-call transactions to the Midnight Testnet, interacting with a local Proof Server to generate the necessary ZK-proofs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By solving these hard problems and packaging the solution into a simple interface, &lt;code&gt;midnight-deploy&lt;/code&gt; acts as a &lt;strong&gt;force multiplier for the entire ecosystem.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A New Standard for Developer Experience
&lt;/h3&gt;

&lt;p&gt;The goal of the "Enhance the Ecosystem" challenge is to make building on Midnight easier. &lt;code&gt;midnight-deploy&lt;/code&gt; achieves this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Drastically Reducing Onboarding Time:&lt;/strong&gt; What took me days of debugging now takes minutes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Eliminating Boilerplate:&lt;/strong&gt; Developers can focus on their contract's logic, not the deployment plumbing.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Promoting Best Practices:&lt;/strong&gt; The tool enforces a secure and robust two-step deployment pattern by default.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Providing a Professional DX:&lt;/strong&gt; The slick, informative CLI output builds developer confidence and makes the process a joy, not a chore.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Get Started and Try It Yourself
&lt;/h3&gt;

&lt;p&gt;Ready to deploy a Midnight contract in under 5 minutes?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clone the Repo &amp;amp; Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/hitakshiA/midnight-deploy.git
&lt;span class="nb"&gt;cd &lt;/span&gt;midnight-deploy
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build the Tool:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Generate a Wallet (Optional):&lt;/strong&gt; If you need a new mnemonic for your &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start &lt;span class="nt"&gt;--&lt;/span&gt; generate-wallet
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy the Example:&lt;/strong&gt; Start your local Proof Server, then run the deploy command:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start &lt;span class="nt"&gt;--&lt;/span&gt; deploy &lt;span class="nt"&gt;--config&lt;/span&gt; ./example/midnight.config.ts &lt;span class="nt"&gt;--quick-deploy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;(Use &lt;code&gt;--quick-deploy&lt;/code&gt; for an instant, zero-config test run, or set up &lt;code&gt;example/.env&lt;/code&gt; to use your own funded wallet).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This project was born from a genuine struggle, and its goal is to ensure no other developer has to face that same wall of friction. By making deployment simple, fast, and even enjoyable, &lt;code&gt;midnight-deploy&lt;/code&gt; paves the way for the next wave of builders to create the future of privacy on Midnight.&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>midnightchallenge</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
