<?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: KYU LEE</title>
    <description>The latest articles on DEV Community by KYU LEE (@kyu_lee_5d2df49ef0688eee1).</description>
    <link>https://dev.to/kyu_lee_5d2df49ef0688eee1</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%2F1675850%2F252393bc-762d-402a-ab44-de0f4db839d6.jpg</url>
      <title>DEV Community: KYU LEE</title>
      <link>https://dev.to/kyu_lee_5d2df49ef0688eee1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kyu_lee_5d2df49ef0688eee1"/>
    <language>en</language>
    <item>
      <title>I built a CO laser game in the browser, with WebGPU and ASMR</title>
      <dc:creator>KYU LEE</dc:creator>
      <pubDate>Tue, 20 Oct 2026 00:47:00 +0000</pubDate>
      <link>https://dev.to/kyu_lee_5d2df49ef0688eee1/i-built-a-co2-laser-game-in-the-browser-with-webgpu-and-asmr-2g7i</link>
      <guid>https://dev.to/kyu_lee_5d2df49ef0688eee1/i-built-a-co2-laser-game-in-the-browser-with-webgpu-and-asmr-2g7i</guid>
      <description>&lt;p&gt;One tiny mole. A steady hand. A surprisingly difficult game.&lt;/p&gt;

&lt;p&gt;I’m building &lt;strong&gt;CO₂ Laser Practice&lt;/strong&gt;, a browser game about removing virtual moles while preserving the surrounding skin. It grew out of experience with dermatology and cosmetic laser procedures—and a fascination with the quiet concentration of working on one small spot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://co2.cording.ai/en/" rel="noopener noreferrer"&gt;Play CO₂ Laser Practice in your desktop browser →&lt;/a&gt;&lt;/strong&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr4yxame9iez3azqqhx47.jpg" 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%2Fr4yxame9iez3azqqhx47.jpg" alt="Gameplay in CO₂ Laser Practice: a laser handpiece approaches a virtual mole, with suction beside the treatment area." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Actual gameplay. Small movements make a difference.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A small task with room to get better
&lt;/h2&gt;

&lt;p&gt;The basic action is simple: aim, fire, and watch the surface change. The challenge is deciding when to stop, where to move next, and how to finish without removing too much healthy tissue.&lt;/p&gt;

&lt;p&gt;Different lesion shapes, sizes, and depths give you different problems to solve. Practice mode lets you try another approach on the same patient. Clinic mode gives that practice a longer arc: meet new patients, improve your results, and build your clinic’s standard fee.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools are also the soundtrack
&lt;/h2&gt;

&lt;p&gt;I wanted the sound to support concentration. Air suction provides a steady background, while the laser has a softer electronic trill. Gauze adds subtle fabric contact, and the adjustable lamp has moving-joint sounds.&lt;/p&gt;

&lt;p&gt;Each tool responds to what you do. The aim is an ASMR-like atmosphere where you can hear the work, rather than a loud effect repeating over every action.&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%2F32gsm2nryd9gckwhzonb.jpg" 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%2F32gsm2nryd9gckwhzonb.jpg" alt="A second gameplay scene showing virtual arm skin, moles, a laser handpiece, and a suction tool." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Another treatment area, with the same focus on careful control.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch a short clip
&lt;/h2&gt;

&lt;p&gt;Turn the sound on for a quick look at the game’s pace and atmosphere.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/uqj99l85RRI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/shorts/uqj99l85RRI" rel="noopener noreferrer"&gt;Watch the Short on YouTube →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A few things under the hood
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rust + WebAssembly:&lt;/strong&gt; the simulation runs in the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wgpu / WebGPU:&lt;/strong&gt; interactive 3D skin, lesions, and changing treatment surfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Audio:&lt;/strong&gt; separate, responsive sound layers for the four tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA:&lt;/strong&gt; play without installing, with optional installation and progress saved on the device.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the trickier parts has been balancing detailed surface feedback with a game that feels fair and responsive. Recent work has focused on clearer skin and lesion structure, smoother material boundaries, and handling GPU delays without letting a held laser keep working behind a stale frame.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it and tell me how it feels
&lt;/h2&gt;

&lt;p&gt;Use a &lt;strong&gt;desktop PC with a mouse and keyboard&lt;/strong&gt;. A current Chrome or Edge browser with graphics acceleration is recommended.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hold the &lt;strong&gt;left mouse button&lt;/strong&gt; to aim; use &lt;strong&gt;Spacebar&lt;/strong&gt; to fire.&lt;/li&gt;
&lt;li&gt;Use the &lt;strong&gt;mouse wheel&lt;/strong&gt; to zoom and the &lt;strong&gt;right mouse button&lt;/strong&gt; to move the view.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;H&lt;/strong&gt; for the full controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://co2.cording.ai/en/" rel="noopener noreferrer"&gt;Open the game →&lt;/a&gt;&lt;/strong&gt; · &lt;a href="https://co2.cording.ai/en/about/" rel="noopener noreferrer"&gt;About the game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d especially like feedback on the tool controls, sound balance, and whether each patient makes you want to try a cleaner finish. Which would you focus on first: precision, speed, or the sound?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CO₂ Laser Practice is a game inspired by clinical experience. It is not a medical device or a substitute for clinical training.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>javascript</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Put My Laptop's Idle NPU to Work with Fan-Aware Soundscapes in Rust</title>
      <dc:creator>KYU LEE</dc:creator>
      <pubDate>Tue, 20 Oct 2026 00:46:46 +0000</pubDate>
      <link>https://dev.to/kyu_lee_5d2df49ef0688eee1/i-put-my-laptops-idle-npu-to-work-with-fan-aware-soundscapes-in-rust-3mm6</link>
      <guid>https://dev.to/kyu_lee_5d2df49ef0688eee1/i-put-my-laptops-idle-npu-to-work-with-fan-aware-soundscapes-in-rust-3mm6</guid>
      <description>&lt;p&gt;My Intel Core Ultra 7 laptop has an NPU, but in my everyday work it rarely had anything to do. Leaving it idle felt wasteful, so I started looking for a useful local experiment.&lt;/p&gt;

&lt;p&gt;That became &lt;strong&gt;Fan Composer&lt;/strong&gt;: a small, open-source Windows app that listens to laptop fan noise and adds a quiet soundscape around it.&lt;/p&gt;

&lt;p&gt;The question is simple: &lt;strong&gt;could a steady fan sound feel less annoying if it became part of a musical background?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is not active noise cancellation. It adds sound; it does not remove the fan noise or lower its sound pressure.&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%2F4d9kzpqngkk1qt2krgjf.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%2F4d9kzpqngkk1qt2krgjf.png" alt="Fan Composer's native Windows interface, showing speaker selection, three sound modes, maximum volume, and a spectrum. The app is stopped." width="800" height="970"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three ways to listen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Harmonic:&lt;/strong&gt; a continuous drone and overtones guided by a stable fan pitch estimate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nature:&lt;/strong&gt; synthesized wind and wave-like textures, without recorded nature samples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generative:&lt;/strong&gt; a seeded musical motif with an ambient background and slow changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three are synthesized locally. There are no cloud music APIs or downloaded music samples.&lt;/p&gt;

&lt;h3&gt;
  
  
  A short sound preview
&lt;/h3&gt;


&lt;a href="https://github.com/zendoclab/fan-composer/releases/download/v0.3.0/fan-composer-mode-preview.mp4" rel="noopener noreferrer"&gt;Watch or download the 45-second sound preview.&lt;/a&gt;


&lt;p&gt;&lt;a href="https://github.com/zendoclab/fan-composer/releases/download/v0.3.0/fan-composer-mode-preview.mp4" rel="noopener noreferrer"&gt;Open the preview video (MP4)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;0:00 Harmonic · 0:15 Nature · 0:30 Generative. These are offline renders from the actual Rust synthesis engine, paired with a static screenshot of the stopped app. Preview gain is raised by about 12 dB for audibility. This is not a recording of live microphone analysis or NPU inference.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatic volume is the core feature
&lt;/h2&gt;

&lt;p&gt;You set a &lt;strong&gt;maximum volume&lt;/strong&gt;, and the app gradually adjusts playback as the estimated fan/background level changes. Automatic volume is always on; there is no extra switch to manage.&lt;/p&gt;

&lt;p&gt;There is a catch: the microphone can also hear the app's own sound. Simply following microphone loudness could make playback chase itself. Fan Composer uses its output signal as a spectral reference and holds or reduces amplification when the estimate is uncertain.&lt;/p&gt;

&lt;p&gt;This remains an experimental background estimate. Other steady sounds and room changes can affect it; it is not an acoustic echo canceller or a reliable fan-versus-speech classifier.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the NPU actually does
&lt;/h2&gt;

&lt;p&gt;The NPU runs a small music-policy model through &lt;strong&gt;OpenVINO&lt;/strong&gt;, once per second. It adjusts parameters such as brightness, note density, motion, and reverb. Rust on the CPU handles FFT analysis, volume control, and audio synthesis.&lt;/p&gt;

&lt;p&gt;The app tries &lt;strong&gt;NPU first&lt;/strong&gt;, then OpenVINO CPU, then CPU rules. It checks successful inference and the actual execution device, rather than assuming that an enumerated NPU is doing the work. The current backend is visible in the interface.&lt;/p&gt;

&lt;p&gt;The bundled model imitates a rule-based policy. I am not claiming that it makes better music or saves power compared with the CPU; those comparisons still need proper measurements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on Windows
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/zendoclab/fan-composer/releases/tag/v0.3.0" rel="noopener noreferrer"&gt;Download the Windows x64 release&lt;/a&gt; and extract the entire ZIP.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;fan-composer.exe&lt;/code&gt; and choose your speaker.&lt;/li&gt;
&lt;li&gt;Choose a mode, set a comfortable maximum volume, and press &lt;strong&gt;Start&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Allow the initial 3.5-second quiet measurement, then listen. &lt;strong&gt;Stop&lt;/strong&gt; is always available.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing plays automatically at launch. Microphone audio stays in memory and is not recorded or uploaded. Settings and explicit feedback stay local.&lt;/p&gt;

&lt;p&gt;For Rust developers, the stack is &lt;strong&gt;iced + CPAL/WASAPI + rustfft&lt;/strong&gt;, with the OpenVINO C API for the music policy. Build on Windows with the Rust MSVC toolchain and C++ Build Tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://github.com/zendoclab/fan-composer.git&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fan-composer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cargo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--release&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--locked&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;cargo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--release&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--locked&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://github.com/zendoclab/fan-composer/blob/main/docs/BUILDING.md" rel="noopener noreferrer"&gt;build guide&lt;/a&gt; also covers packaging the model and NPU runtime. A source build without that runtime still works through CPU rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is established so far?
&lt;/h2&gt;

&lt;p&gt;Version 0.3.0 passed &lt;strong&gt;26 automated tests&lt;/strong&gt;, including synthetic analysis, synthesis safety, and automatic-volume checks. Real NPU inference and a short, silent Windows audio I/O run were also verified. These checks do not establish long-session stability or improved listening comfort.&lt;/p&gt;

&lt;p&gt;My next question is whether adaptive sound is actually more comfortable than fan noise alone or a fixed ambient track, at comparable overall loudness. Listener feedback and controlled comparisons are welcome.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source, documentation, and downloads:&lt;/strong&gt; &lt;a href="https://github.com/zendoclab/fan-composer" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methods and engineering results:&lt;/strong&gt; &lt;a href="https://doi.org/10.5281/zenodo.23478732" rel="noopener noreferrer"&gt;Zenodo preprint&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built by &lt;strong&gt;Kyu Lee, cording.ai&lt;/strong&gt;. Source code and the locally generated policy model are MIT-licensed.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hardware</category>
      <category>opensource</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
