<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tamás Vigh</title><description>Notes on building for the browser in Rust and WebAssembly: canvas rendering, Web Audio, offline-first storage.</description><link>https://tamasvigh.com</link><language>en</language><atom:link href="https://tamasvigh.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>A squash scorer whose share link is the whole match</title><link>https://tamasvigh.com/projects/a-squash-scorer-that-shares-the-whole-match</link><guid isPermaLink="true">https://tamasvigh.com/projects/a-squash-scorer-that-shares-the-whole-match</guid><description>Squash keeps every match on the device and still shares one. The link carries the events rather than a reference, why that makes a hostile link a denial-of-service problem, how an await can spend the user activation a share sheet needs, and the iOS split that made a paste box necessary.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><category>web</category><category>pwa</category><category>offline</category><category>typescript</category></item><item><title>A test that cannot fail is not evidence</title><link>https://tamasvigh.com/thoughts/a-test-that-cannot-fail</link><guid isPermaLink="true">https://tamasvigh.com/thoughts/a-test-that-cannot-fail</guid><description>Three ways a green suite lies. The test that never goes red, the one measuring the wrong thing, and the baseline that already contains the bug. All three cost me a day recently.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>testing</category><category>tdd</category><category>verification</category></item><item><title>The guard was on the wrong noun</title><link>https://tamasvigh.com/thoughts/the-guard-was-on-the-wrong-noun</link><guid isPermaLink="true">https://tamasvigh.com/thoughts/the-guard-was-on-the-wrong-noun</guid><description>A permission check that named one action instead of a capability, and survived four rounds of review because each round fixed the example rather than the category. What SOLID is actually for.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>design</category><category>solid</category><category>rust</category><category>security</category></item><item><title>Twelve factors when you do not own a process</title><link>https://tamasvigh.com/thoughts/twelve-factors-without-a-process</link><guid isPermaLink="true">https://tamasvigh.com/thoughts/twelve-factors-without-a-process</guid><description>The twelve-factor app was written for long-running processes on a platform that no longer describes how most things ship. Which factors survive a static front end and an edge function, which invert, and which quietly still bite.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><category>architecture</category><category>deployment</category><category>twelve-factor</category></item><item><title>A music player at an old address</title><link>https://tamasvigh.com/projects/a-music-player-at-an-old-address</link><guid isPermaLink="true">https://tamasvigh.com/projects/a-music-player-at-an-old-address</guid><description>Player took over player.tamasvigh.com from Rustamp, and with it the songs Rustamp had stored there. Why a library belongs to an address, an id that had to stay Rustamp&apos;s and became five times faster, an update that is really a takeover, two Hungarian letters, and what is untested.</description><pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate><category>web</category><category>audio</category><category>storage</category><category>pwa</category></item><item><title>Handing a file to the device next to you, with no server in between</title><link>https://tamasvigh.com/projects/handing-a-file-to-the-device-next-to-you</link><guid isPermaLink="true">https://tamasvigh.com/projects/handing-a-file-to-the-device-next-to-you</guid><description>Rustamp&apos;s phone-to-phone sharing as a page for any file up to 10 MB. A handshake that travels as a link, a phone that cannot show a code and read one at once, a reply the receiver must not answer, and what is untested.</description><pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate><category>webrtc</category><category>rust</category><category>webassembly</category><category>web</category></item><item><title>Estimating a pulse from a webcam in Rust and WebAssembly</title><link>https://tamasvigh.com/projects/heart-rate-from-a-webcam</link><guid isPermaLink="true">https://tamasvigh.com/projects/heart-rate-from-a-webcam</guid><description>A browser page that estimates a pulse from the colour of a face. How a signal smaller than one 8-bit level is recovered, why a uniform brightness change cancels exactly, and what does not work.</description><pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate><category>rust</category><category>webassembly</category><category>web</category><category>signal-processing</category></item><item><title>Building a Winamp in Rust and WebAssembly</title><link>https://tamasvigh.com/projects/building-a-winamp-in-rust</link><guid isPermaLink="true">https://tamasvigh.com/projects/building-a-winamp-in-rust</guid><description>A Winamp 2.x player in Rust and WebAssembly. Why the skin is drawn at runtime, how the peer-to-peer handshake fits in 102 bytes, and what does not work.</description><pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate><category>rust</category><category>webassembly</category><category>audio</category><category>web</category></item></channel></rss>