<?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: Holger Kreuzhofen</title>
    <description>The latest articles on DEV Community by Holger Kreuzhofen (@kreuzhofen).</description>
    <link>https://dev.to/kreuzhofen</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%2F4190877%2Fe7ad8285-6ad3-426b-9c7e-b8d6e22b41e7.png</url>
      <title>DEV Community: Holger Kreuzhofen</title>
      <link>https://dev.to/kreuzhofen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kreuzhofen"/>
    <language>en</language>
    <item>
      <title>How Curiosity About the Snapdragon NPU Turned Into HK NPU STUDIO</title>
      <dc:creator>Holger Kreuzhofen</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:26:43 +0000</pubDate>
      <link>https://dev.to/kreuzhofen/how-curiosity-about-the-snapdragon-npu-turned-into-hk-npu-studio-1g12</link>
      <guid>https://dev.to/kreuzhofen/how-curiosity-about-the-snapdragon-npu-turned-into-hk-npu-studio-1g12</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Local AI for Snapdragon® PCs&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Your Hardware • Your AI • Your Control&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Developing software is rarely a straight line.&lt;/p&gt;

&lt;p&gt;Sometimes it feels like progress, sometimes like chaos, and sometimes like you're one problem away from giving up completely.&lt;/p&gt;

&lt;p&gt;That has been part of the story of &lt;strong&gt;HK NPU STUDIO&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What is HK NPU STUDIO?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HK NPU STUDIO&lt;/strong&gt; is my project to build a local AI studio for &lt;strong&gt;Snapdragon-powered Windows ARM PCs&lt;/strong&gt;, with a clear focus on the &lt;strong&gt;NPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My goal sounds simple, but in practice it is challenging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run AI locally&lt;/li&gt;
&lt;li&gt;use the Snapdragon NPU as the core accelerator&lt;/li&gt;
&lt;li&gt;avoid unnecessary cloud dependency&lt;/li&gt;
&lt;li&gt;keep control in the hands of the user&lt;/li&gt;
&lt;li&gt;build something practical, reliable, and useful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not just about making AI run.&lt;/p&gt;

&lt;p&gt;It is about building a product with a clear direction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Your Hardware • Your AI • Your Control&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 The idea behind it
&lt;/h2&gt;

&lt;p&gt;From the beginning, I had a bigger vision for HK NPU STUDIO.&lt;/p&gt;

&lt;p&gt;I did not want it to become just another interface or a generic AI wrapper.&lt;/p&gt;

&lt;p&gt;I wanted to find out what happens when &lt;strong&gt;local AI&lt;/strong&gt;, &lt;strong&gt;Snapdragon NPUs&lt;/strong&gt;, and real product development come together.&lt;/p&gt;

&lt;p&gt;My long-term vision includes things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;image generation&lt;/li&gt;
&lt;li&gt;inpainting&lt;/li&gt;
&lt;li&gt;photo restoration&lt;/li&gt;
&lt;li&gt;AI-powered enhancement&lt;/li&gt;
&lt;li&gt;local image editing&lt;/li&gt;
&lt;li&gt;more control over models and execution paths&lt;/li&gt;
&lt;li&gt;a product experience that becomes more polished over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not everything is possible yet.&lt;/p&gt;

&lt;p&gt;Some parts are already working, some are still experimental, and some are goals for the future.&lt;/p&gt;

&lt;p&gt;And that is exactly where the project stands today:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;part real, part difficult, part unfinished — but moving forward.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ What is already possible
&lt;/h2&gt;

&lt;p&gt;HK NPU STUDIO is no longer just an idea.&lt;/p&gt;

&lt;p&gt;A lot of groundwork has already been done.&lt;/p&gt;

&lt;p&gt;Today the project includes work around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;local image generation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ControlNet&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NPU-based upscaling&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phoenix Boost&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Photo Restoration&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;inpainting development&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qualcomm QNN / QAIRT runtime testing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of this work is not glamorous.&lt;/p&gt;

&lt;p&gt;It is not only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Look what I built.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;testing&lt;/li&gt;
&lt;li&gt;debugging&lt;/li&gt;
&lt;li&gt;isolating failures&lt;/li&gt;
&lt;li&gt;comparing runtime behavior&lt;/li&gt;
&lt;li&gt;validating outputs&lt;/li&gt;
&lt;li&gt;organizing model and runtime files&lt;/li&gt;
&lt;li&gt;protecting known-good states&lt;/li&gt;
&lt;li&gt;and trying not to break what already works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is real development too.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ The hard part: reality
&lt;/h2&gt;

&lt;p&gt;What makes a project like this difficult is not just writing code.&lt;/p&gt;

&lt;p&gt;The real challenge is the combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new hardware paths&lt;/li&gt;
&lt;li&gt;runtime and version compatibility&lt;/li&gt;
&lt;li&gt;Windows ARM specifics&lt;/li&gt;
&lt;li&gt;tooling limitations&lt;/li&gt;
&lt;li&gt;model packaging&lt;/li&gt;
&lt;li&gt;deployment&lt;/li&gt;
&lt;li&gt;licensing questions&lt;/li&gt;
&lt;li&gt;product quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were many moments when I thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This is getting too complicated.”&lt;/p&gt;

&lt;p&gt;“Maybe this will never work properly.”&lt;/p&gt;

&lt;p&gt;“Maybe I should stop here.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And yes, I seriously considered giving up more than once.&lt;/p&gt;

&lt;p&gt;But each time, I kept going.&lt;/p&gt;

&lt;p&gt;Not because everything was easy, but because I wanted to understand the next problem.&lt;/p&gt;

&lt;p&gt;I wanted to know &lt;strong&gt;why&lt;/strong&gt; something was failing.&lt;/p&gt;

&lt;p&gt;Then I would test another idea, compare another result, read another log, and move one step further.&lt;/p&gt;

&lt;p&gt;That mindset has shaped this project as much as any technical decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Sometimes the problem is completely different from what it looks like
&lt;/h2&gt;

&lt;p&gt;One thing this project has taught me is not to jump to conclusions too quickly.&lt;/p&gt;

&lt;p&gt;Recently, an NPU context suddenly refused to load in an isolated test environment.&lt;/p&gt;

&lt;p&gt;The errors looked like a much bigger compatibility problem between the runtime, the hardware, and the context itself.&lt;/p&gt;

&lt;p&gt;The actual cause was far less dramatic:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;one required catalog file was missing from the runtime package.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add that file, run the exact same test again, and the failure disappears.&lt;/p&gt;

&lt;p&gt;Situations like this are frustrating, but also valuable.&lt;/p&gt;

&lt;p&gt;They remind me not to say too quickly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The model does not work.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The hardware cannot do this.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes that is true.&lt;/p&gt;

&lt;p&gt;Sometimes one requirement somewhere in a long technical chain is simply missing.&lt;/p&gt;

&lt;p&gt;And this is usually the point where, instead of giving up, I want to know even more badly &lt;strong&gt;why&lt;/strong&gt; it does not work.&lt;/p&gt;

&lt;p&gt;So I keep looking.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗑️ I also learned to throw things away
&lt;/h2&gt;

&lt;p&gt;Another important lesson:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Just because something technically works somehow does not mean it belongs in the product.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At one point I was experimenting with an image-editing path where it became clear that the existing model could probably be pushed in roughly the right direction with enough tricks.&lt;/p&gt;

&lt;p&gt;But the architecture was not really designed for the job.&lt;/p&gt;

&lt;p&gt;I could have kept bending the implementation around it.&lt;/p&gt;

&lt;p&gt;I decided not to.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A proof of concept is not automatically a product feature.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the result is not reliable enough, or if the technical foundation is wrong, I would rather put an idea aside and come back later with a better approach.&lt;/p&gt;

&lt;p&gt;In the long run, I would rather have &lt;strong&gt;fewer features I can stand behind&lt;/strong&gt; than a long list of features that only work under very specific conditions.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ NPU first means NPU first
&lt;/h2&gt;

&lt;p&gt;Photo Restoration is a good example of a rule I set for myself.&lt;/p&gt;

&lt;p&gt;If I describe a feature as an NPU feature, I want the actual neural inference to run on the NPU.&lt;/p&gt;

&lt;p&gt;Of course, the CPU still has work to do.&lt;/p&gt;

&lt;p&gt;Images need to be loaded.&lt;/p&gt;

&lt;p&gt;Data needs to be prepared.&lt;/p&gt;

&lt;p&gt;Masks and intermediate results may need to be calculated.&lt;/p&gt;

&lt;p&gt;Files need to be written.&lt;/p&gt;

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

&lt;p&gt;What I do not want is to describe something as &lt;strong&gt;NPU-accelerated&lt;/strong&gt; while the actual AI inference quietly happens on the CPU or GPU.&lt;/p&gt;

&lt;p&gt;That is a line I have drawn for the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Where I want HK NPU STUDIO to go
&lt;/h2&gt;

&lt;p&gt;I have a fairly clear idea of what HK NPU STUDIO could become.&lt;/p&gt;

&lt;p&gt;My vision goes well beyond pure image generation.&lt;/p&gt;

&lt;p&gt;I want to be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create images locally&lt;/li&gt;
&lt;li&gt;restore old or damaged images&lt;/li&gt;
&lt;li&gt;upscale them&lt;/li&gt;
&lt;li&gt;edit specific image regions&lt;/li&gt;
&lt;li&gt;remove unwanted objects&lt;/li&gt;
&lt;li&gt;add new content&lt;/li&gt;
&lt;li&gt;continue working with an image locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And wherever it technically makes sense, I want the AI processing to run on the &lt;strong&gt;Snapdragon NPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That does not mean I can promise when, or even whether, every idea will become a finished feature.&lt;/p&gt;

&lt;p&gt;Some things are already surprisingly possible with current hardware and models.&lt;/p&gt;

&lt;p&gt;For others, suitable models, NPU contexts, runtime support, or simply the quality I expect from a real product feature are still missing.&lt;/p&gt;

&lt;p&gt;That boundary is exactly what I find interesting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What is truly possible today — and what may only become practical with the next hardware or runtime generation?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔬 The technology does not stand still
&lt;/h2&gt;

&lt;p&gt;That is why I do not think of HK NPU STUDIO as something that will simply be “finished” one day.&lt;/p&gt;

&lt;p&gt;Qualcomm keeps developing its AI runtimes.&lt;/p&gt;

&lt;p&gt;New Snapdragon generations appear.&lt;/p&gt;

&lt;p&gt;Models change.&lt;/p&gt;

&lt;p&gt;New possibilities emerge.&lt;/p&gt;

&lt;p&gt;Other approaches disappear again.&lt;/p&gt;

&lt;p&gt;Right now, for example, I am spending time evaluating newer QAIRT runtime versions.&lt;/p&gt;

&lt;p&gt;For me, it is not enough to see that a new runtime starts successfully.&lt;/p&gt;

&lt;p&gt;I want to know whether an existing NPU context still behaves correctly.&lt;/p&gt;

&lt;p&gt;So I test:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the same context&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;with the same input&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;on different runtime versions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and compare the actual outputs.&lt;/p&gt;

&lt;p&gt;If the result is exactly identical, that tells me much more than simply knowing that the application did not crash.&lt;/p&gt;

&lt;p&gt;My development process has changed because of experiences like this.&lt;/p&gt;

&lt;p&gt;Today I try to follow a simple rule:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prove the cause before changing code.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Change one variable.&lt;/li&gt;
&lt;li&gt;Compare before and after.&lt;/li&gt;
&lt;li&gt;If the result gets worse, revert it.&lt;/li&gt;
&lt;li&gt;Then move to the next step.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It sounds slower.&lt;/p&gt;

&lt;p&gt;Most of the time, it saves a lot of time.&lt;/p&gt;




&lt;h2&gt;
  
  
  🐛 Feedback from other users changed the project too
&lt;/h2&gt;

&lt;p&gt;Another important part of the project has been people running HK NPU STUDIO on systems other than mine.&lt;/p&gt;

&lt;p&gt;Some problems would probably never have appeared on my own development machine.&lt;/p&gt;

&lt;p&gt;Hardcoded paths are a good example.&lt;/p&gt;

&lt;p&gt;Something can work perfectly for months because all expected directories happen to exist on one system.&lt;/p&gt;

&lt;p&gt;Then someone installs the software on another PC and suddenly a hidden assumption becomes obvious.&lt;/p&gt;

&lt;p&gt;Those reports are not always fun to receive.&lt;/p&gt;

&lt;p&gt;You think something is finished, and then a new issue appears.&lt;/p&gt;

&lt;p&gt;But constructive criticism and good bug reports have made HK NPU STUDIO significantly better.&lt;/p&gt;

&lt;p&gt;So today I am grateful for both kinds of feedback:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Works for me.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Nothing works here.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the second one leads to the more interesting work.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 I am developing myself too, not just the software
&lt;/h2&gt;

&lt;p&gt;I am not a large development team.&lt;/p&gt;

&lt;p&gt;And I do not have an immediate answer for every problem.&lt;/p&gt;

&lt;p&gt;A lot of what I do, I learn while working on the project.&lt;/p&gt;

&lt;p&gt;I read documentation, analyze failures, compare versions, test hypotheses, and try different approaches.&lt;/p&gt;

&lt;p&gt;And of course I also use modern AI tools.&lt;/p&gt;

&lt;p&gt;It would be a little strange to work on a local AI project and refuse to use them.&lt;/p&gt;

&lt;p&gt;They help me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analyze problems&lt;/li&gt;
&lt;li&gt;challenge ideas&lt;/li&gt;
&lt;li&gt;write and review tests&lt;/li&gt;
&lt;li&gt;improve documentation&lt;/li&gt;
&lt;li&gt;search for possible causes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the final test is always real.&lt;/p&gt;

&lt;p&gt;A theoretically perfect suggestion is useless to me if the application works worse afterward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The code has to run.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The NPU has to actually be used.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The result has to be correct.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And if I am preparing a release, the whole thing needs to work outside my development environment too.&lt;/p&gt;

&lt;p&gt;That combination of modern tools, experimentation, and real hardware validation has become a major part of how I work on HK NPU STUDIO.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Open source also means making development visible
&lt;/h2&gt;

&lt;p&gt;HK NPU STUDIO is a public project.&lt;/p&gt;

&lt;p&gt;Of course I want to release software that is as good as I can make it.&lt;/p&gt;

&lt;p&gt;But I also think it is important not to pretend that development always follows a straight line.&lt;/p&gt;

&lt;p&gt;There are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bugs&lt;/li&gt;
&lt;li&gt;wrong decisions&lt;/li&gt;
&lt;li&gt;discarded approaches&lt;/li&gt;
&lt;li&gt;features that take longer than expected&lt;/li&gt;
&lt;li&gt;ideas that simply turn out not to be good enough&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, that is also part of an open project.&lt;/p&gt;

&lt;p&gt;The finished result is not the only interesting part.&lt;/p&gt;

&lt;p&gt;The problems, decisions, wrong turns, and sometimes the realization that an approach is simply not good enough are part of the story too.&lt;/p&gt;

&lt;p&gt;Feedback from users has already forced me to rethink assumptions and improve parts of the project more than once.&lt;/p&gt;

&lt;p&gt;I do not see that as a weakness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I think that is how an experiment slowly becomes reliable software.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔭 I still do not know where this ends
&lt;/h2&gt;

&lt;p&gt;I do not know what HK NPU STUDIO will look like in one or two years.&lt;/p&gt;

&lt;p&gt;Maybe future Snapdragon generations will make things practical that still seem unrealistic today.&lt;/p&gt;

&lt;p&gt;Maybe new models will push local image editing much further on the NPU.&lt;/p&gt;

&lt;p&gt;Maybe I will discover that some ideas simply do not make sense.&lt;/p&gt;

&lt;p&gt;What I do know is that I still have a lot of things I want to try and improve.&lt;/p&gt;

&lt;p&gt;And even though I have more than once reached the point where I thought I had no patience left for another runtime issue, another failed test, or another error that made no sense, I have always come back so far.&lt;/p&gt;

&lt;p&gt;Usually with the same thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;“There has to be a reason why this does not work.”&lt;/strong&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then I start looking again.&lt;/p&gt;

&lt;p&gt;Maybe that describes HK NPU STUDIO better than any feature list.&lt;/p&gt;

&lt;p&gt;For me, it is a project about finding out what local AI on this hardware can really do — and then pushing that boundary a little further each time.&lt;/p&gt;




&lt;p&gt;To everyone who tries the project, reports bugs, suggests improvements, challenges decisions, or simply tells me that something works:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Thank you.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You have contributed more to its development in some areas than you may realize.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’m curious to see how far local AI on Snapdragon PCs can go — and how far HK NPU STUDIO can go with it.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Your Hardware • Your AI • Your Control&lt;/strong&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;— &lt;strong&gt;Holger Kreuzhofen&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Developer of &lt;strong&gt;HK NPU STUDIO&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>machinelearning</category>
      <category>windows</category>
    </item>
  </channel>
</rss>
