<?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: QObserva Labs</title>
    <description>The latest articles on DEV Community by QObserva Labs (@qobserva).</description>
    <link>https://dev.to/qobserva</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3864209%2F9c961513-9868-4645-bb5b-66346a1a77ad.png</url>
      <title>DEV Community: QObserva Labs</title>
      <link>https://dev.to/qobserva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qobserva"/>
    <language>en</language>
    <item>
      <title>Quantum computing SDKs lack observability. We built QObserva to fix that.</title>
      <dc:creator>QObserva Labs</dc:creator>
      <pubDate>Thu, 09 Apr 2026 15:21:41 +0000</pubDate>
      <link>https://dev.to/qobserva/quantum-computing-sdks-lack-observability-we-built-qobserva-to-fix-that-3e96</link>
      <guid>https://dev.to/qobserva/quantum-computing-sdks-lack-observability-we-built-qobserva-to-fix-that-3e96</guid>
      <description>&lt;p&gt;Over the past few months, we’ve been working extensively with quantum SDKs like Qiskit, Cirq, and Amazon Braket. Building circuits and running jobs is becoming more accessible, but we kept running into the same friction point—not in execution, but in understanding what actually happened after a run.&lt;/p&gt;

&lt;p&gt;At a small scale, things feel manageable. You run a few experiments, inspect results, maybe store some outputs. But as soon as you start iterating—changing parameters, switching backends, or comparing runs over time—the workflow becomes harder to reason about. Context gets scattered across notebooks, logs, and ad-hoc scripts, and simple questions become surprisingly difficult to answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem: runs without context
&lt;/h2&gt;

&lt;p&gt;As workflows grow, we repeatedly ran into questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which backend produced this result?&lt;/li&gt;
&lt;li&gt;What changed between two runs?&lt;/li&gt;
&lt;li&gt;Why did performance drop this week?&lt;/li&gt;
&lt;li&gt;Are we comparing equivalent experiments across SDKs?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these questions are inherently complex. The issue is that the information needed to answer them isn’t captured in a structured way.&lt;/p&gt;

&lt;p&gt;Instead, context is spread across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notebooks&lt;/li&gt;
&lt;li&gt;Logs&lt;/li&gt;
&lt;li&gt;One-off scripts&lt;/li&gt;
&lt;li&gt;Memory (which doesn’t scale)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result, teams spend more time reconstructing what happened than actually improving their experiments.&lt;/p&gt;




&lt;h2&gt;
  
  
  This is a tooling gap, not a quantum problem
&lt;/h2&gt;

&lt;p&gt;In modern software systems, this problem was solved years ago through observability. Metrics, logs, and traces provide a clear picture of system behavior, and tools like Datadog or Prometheus make debugging and optimization straightforward.&lt;/p&gt;

&lt;p&gt;In quantum SDK workflows, that layer is still mostly missing.&lt;/p&gt;

&lt;p&gt;You can run experiments—but tracking, comparing, and explaining them is still largely manual.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we wanted instead
&lt;/h2&gt;

&lt;p&gt;We weren’t looking for a heavy platform or something tied to a single SDK. We wanted something practical that fits into existing workflows.&lt;/p&gt;

&lt;p&gt;The requirements were simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works across Python-based quantum SDKs&lt;/li&gt;
&lt;li&gt;Local-first (no mandatory cloud setup)&lt;/li&gt;
&lt;li&gt;Minimal friction to adopt&lt;/li&gt;
&lt;li&gt;Captures run-level metadata and metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, it needed to make experiments &lt;strong&gt;comparable and explainable over time&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing QObserva
&lt;/h2&gt;

&lt;p&gt;QObserva is a lightweight observability layer for quantum SDK workflows.&lt;/p&gt;

&lt;p&gt;It captures structured telemetry for each run—metadata, tags, and metrics—so you can understand what happened without piecing together context manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;You can set it up in a few minutes.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;qobserva
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the local stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qobserva up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instrument your run:&lt;/p&gt;

&lt;p&gt;In this example we use a &lt;strong&gt;Qiskit &lt;code&gt;StatevectorSampler&lt;/code&gt;&lt;/strong&gt; to create a Bell-state run.&lt;br&gt;&lt;br&gt;
The same &lt;code&gt;@observe_run&lt;/code&gt; pattern works across other SDKs too (Braket, Cirq, PennyLane, pyQuil, D-Wave) by changing the &lt;code&gt;sdk&lt;/code&gt; tag and your SDK-specific run code.&lt;/p&gt;

&lt;p&gt;See:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/BuildersArk/qobserva/tree/main/docs" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/BuildersArk/qobserva/tree/main/examples" rel="noopener noreferrer"&gt;Examples&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qobserva&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;observe_run&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QuantumCircuit&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qiskit.primitives&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StatevectorSampler&lt;/span&gt;

&lt;span class="nd"&gt;@observe_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;first_demo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sdk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qiskit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;algorithm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bell_state&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;benchmark_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;first_demo_bell_state&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;benchmark_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shots&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;target_bitstrings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="sh"&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_algorithm&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;QuantumCircuit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;sampler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StatevectorSampler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sampler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;qc&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;shots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open the dashboard at:&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:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll immediately see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run metadata&lt;/li&gt;
&lt;li&gt;Tags and context&lt;/li&gt;
&lt;li&gt;Metrics across experiments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Video: &lt;a href="https://github.com/BuildersArk/qobserva/blob/main/docs/video/demo_qiskit_run.gif" rel="noopener noreferrer"&gt;https://github.com/BuildersArk/qobserva/blob/main/docs/video/demo_qiskit_run.gif&lt;/a&gt;&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%2Fraw.githubusercontent.com%2FBuildersArk%2Fqobserva%2Fmain%2Fdocs%2Fvideo%2Fdemo_qiskit_run.gif" 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%2Fraw.githubusercontent.com%2FBuildersArk%2Fqobserva%2Fmain%2Fdocs%2Fvideo%2Fdemo_qiskit_run.gif" width="560" height="315"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Most quantum workflows today are still highly experimental. That makes clarity and iteration speed critical.&lt;/p&gt;

&lt;p&gt;Without observability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You lose context between runs&lt;/li&gt;
&lt;li&gt;You repeat work unintentionally&lt;/li&gt;
&lt;li&gt;You spend time debugging setup instead of improving algorithms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even a small layer of structured visibility makes a noticeable difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;QObserva is currently in &lt;strong&gt;beta&lt;/strong&gt;, and we’re shaping it based on real-world usage.&lt;/p&gt;

&lt;p&gt;If you’re working with quantum SDKs, we’d love to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What you currently track&lt;/li&gt;
&lt;li&gt;What feels hardest to debug or compare&lt;/li&gt;
&lt;li&gt;What would actually save you time&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;Learn More:&lt;br&gt;
&lt;a href="https://qobserva.com/" rel="noopener noreferrer"&gt;https://qobserva.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;a href="https://github.com/BuildersArk/qobserva" rel="noopener noreferrer"&gt;https://github.com/BuildersArk/qobserva&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback and issues:&lt;br&gt;
&lt;a href="https://github.com/BuildersArk/qobserva/issues" rel="noopener noreferrer"&gt;https://github.com/BuildersArk/qobserva/issues&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;We’re not trying to solve all of quantum computing.&lt;/p&gt;

&lt;p&gt;The goal is simpler: make it easier to understand what your code is doing when you run it.&lt;/p&gt;

&lt;p&gt;If that resonates, we’d love to hear your thoughts.&lt;/p&gt;

</description>
      <category>quantum</category>
      <category>qiskit</category>
      <category>braket</category>
      <category>python</category>
    </item>
  </channel>
</rss>
