<?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: Joan</title>
    <description>The latest articles on DEV Community by Joan (@joan-bernier).</description>
    <link>https://dev.to/joan-bernier</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%2F4029827%2F4c0ce596-7447-4fe1-ba97-66d7cae68507.png</url>
      <title>DEV Community: Joan</title>
      <link>https://dev.to/joan-bernier</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joan-bernier"/>
    <language>en</language>
    <item>
      <title>Inside AnyPS5: static ELF relinking, NID symbol resolution, the 5-stage RDNA 2 shader recompiler, and what '100% shader coverage' means</title>
      <dc:creator>Joan</dc:creator>
      <pubDate>Fri, 16 Oct 2026 09:58:31 +0000</pubDate>
      <link>https://dev.to/joan-bernier/inside-anyps5-static-elf-relinking-nid-symbol-resolution-the-5-stage-rdna-2-shader-recompiler-32e9</link>
      <guid>https://dev.to/joan-bernier/inside-anyps5-static-elf-relinking-nid-symbol-resolution-the-5-stage-rdna-2-shader-recompiler-32e9</guid>
      <description>&lt;p&gt;In early October 2026, reports in &lt;a href="https://www.tomshardware.com/video-games/playstation/anyps5-reaches-critical-gpu-milestone-with-100-percent-shader-instruction-coverage-ps5-games-running-natively-on-pc-still-far-off" rel="noopener noreferrer"&gt;Tom's Hardware&lt;/a&gt;, &lt;a href="https://videocardz.com/newz/anyps5-reaches-100-gpu-shader-instruction-coverage-for-ps5-to-pc-conversion" rel="noopener noreferrer"&gt;VideoCardz&lt;/a&gt;, &lt;a href="https://www.techpowerup.com/353547/anyps5-achieves-full-ps5-gpu-shader-instruction-translation" rel="noopener noreferrer"&gt;TechPowerUp&lt;/a&gt;, and &lt;a href="https://gigazine.net/gsc_news/en/20261009-anyps5/" rel="noopener noreferrer"&gt;GIGAZINE&lt;/a&gt; covered a milestone in the open-source &lt;a href="https://github.com/boykopovar/AnyPS5" rel="noopener noreferrer"&gt;boykopovar/AnyPS5&lt;/a&gt;: the GPU shader instruction counter reached 100.0% (&lt;code&gt;1,166 / 1,166&lt;/code&gt; instructions), while system-library implementation rose from 84.76% (&lt;code&gt;2,575 / 3,038&lt;/code&gt;) on October 9 to 88.3% (&lt;code&gt;3,239 / 3,668&lt;/code&gt;) in the October 14, 2026 upstream snapshot.&lt;/p&gt;

&lt;p&gt;When those numbers appeared alongside desktop clips of commercial titles (&lt;em&gt;Animal Well&lt;/em&gt;, &lt;em&gt;PAC-MAN WORLD Re-PAC&lt;/em&gt;, &lt;em&gt;Dead Cells&lt;/em&gt;) and first-party bring-up tests (&lt;em&gt;Demon's Souls&lt;/em&gt;, &lt;em&gt;Astro Bot&lt;/em&gt;, &lt;em&gt;Gran Turismo 7&lt;/em&gt;, &lt;em&gt;Ghost of Yōtei&lt;/em&gt;), two misconceptions spread quickly in forum threads. First, many readers assumed the project boots PlayStation 5 firmware inside a virtual machine or JIT-translates CPU instructions frame by frame like a seventh-generation console emulator. Second, seeing a &lt;code&gt;1,166 / 1,166&lt;/code&gt; shader badge and an &lt;code&gt;88.3%&lt;/code&gt; library counter led players to ask why &lt;em&gt;Demon's Souls&lt;/em&gt; still freezes on &lt;em&gt;Continue Offline&lt;/em&gt; or why &lt;em&gt;Ghost of Yōtei&lt;/em&gt; stalls on its splash screen.&lt;/p&gt;

&lt;p&gt;The upstream C++23 source tree answers both questions directly. Inspecting &lt;a href="https://github.com/boykopovar/AnyPS5/blob/a48c00660eae7afd204fdb7513a52380dddf5a04/docs/dev/ARCHITECTURE.md" rel="noopener noreferrer"&gt;the &lt;code&gt;ARCHITECTURE.md&lt;/code&gt; specification&lt;/a&gt;, the static relinker pipeline under &lt;code&gt;core/relinker/&lt;/code&gt;, the replacement &lt;code&gt;.prx&lt;/code&gt; runtime in &lt;code&gt;core/libs/prx/&lt;/code&gt;, the 5-stage shader compiler in &lt;code&gt;core/gpu/Shaders/Recompiler.cpp&lt;/code&gt;, and the AST/token scanner documented in &lt;a href="https://github.com/boykopovar/AnyPS5/blob/43349d4337543eca207772b065f10ab19acc24c9/docs/dev/PROGRESS.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/dev/PROGRESS.md&lt;/code&gt;&lt;/a&gt; shows how &lt;a href="https://anyps5.tools" rel="noopener noreferrer"&gt;AnyPS5&lt;/a&gt; converts a clean PS5 ELF into a native Windows or Linux executable, how its runtime maps FreeBSD-derived Sony kernel semantics onto Win32 and POSIX primitives, and why per-commit behavior is tracked separately in the community &lt;a href="https://anyps5.tools" rel="noopener noreferrer"&gt;AnyPS5&lt;/a&gt; guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Static binary relinking vs. virtual machine emulation
&lt;/h2&gt;

&lt;p&gt;Console emulators for architectures like PowerPC or the Cell Broadband Engine (such as RPCS3) translate a foreign CPU instruction set into x86-64 or ARM64 machine code through an ahead-of-time (AOT) or just-in-time (JIT) recompiler while emulating privileged supervisor states.&lt;/p&gt;

&lt;p&gt;Because the PlayStation 5's AMD Zen 2 CPU is already an x86-64 processor executing unprivileged user-space instructions for game code, &lt;a href="https://anyps5.tools" rel="noopener noreferrer"&gt;AnyPS5&lt;/a&gt; skips CPU virtualization. Similar to Wine and Proton on Linux or user-mode translation layers like spine and shadPS4, it divides execution into offline static relinking and runtime library replacement.&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%2F8d7b9b7dgo1fjoqsagzf.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%2F8d7b9b7dgo1fjoqsagzf.png" alt="AnyPS5 Static Relinker and NID Symbol Resolution Pipeline" width="800" height="415"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: The two-phase AnyPS5 execution model: offline static binary relinking (&lt;code&gt;core/relinker/&lt;/code&gt;) paired with build-time NID export patching (&lt;code&gt;nid_patcher&lt;/code&gt;) and host OS loader resolution.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Inside &lt;code&gt;core/relinker&lt;/code&gt;: from Orbis/Prospero ELF to host PE/ELF
&lt;/h3&gt;

&lt;p&gt;When you run the relinker on a clean, decrypted PS5 executable (&lt;code&gt;eboot.bin&lt;/code&gt; or &lt;code&gt;input.elf&lt;/code&gt;; encrypted packages and &lt;code&gt;SELF&lt;/code&gt;/&lt;code&gt;fSELF&lt;/code&gt; containers are rejected during header validation), the CLI entrypoint (&lt;code&gt;core/relinker/main.cpp&lt;/code&gt;) passes the input tree to &lt;code&gt;RelinkerPipeline&lt;/code&gt; (&lt;code&gt;core/relinker/RelinkerPipeline.cpp&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RelinkerPipeline&lt;/code&gt; parses the PlayStation ELF segments, dynamic tables, and module import descriptors, and emits a native host executable without wrapping the guest binary in a custom loader stub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For the default Linux x86-64 target, the relinker rebuilds the ELF program headers, dynamic symbol tables (&lt;code&gt;.dynsym&lt;/code&gt; / &lt;code&gt;.dynstr&lt;/code&gt;), and relocation tables so the standard Linux dynamic linker (&lt;code&gt;ld-linux-x86-64.so.2&lt;/code&gt;) can map and execute the binary directly.&lt;/li&gt;
&lt;li&gt;For the Windows x86-64 target (&lt;code&gt;--windows&lt;/code&gt;), it reconstructs the binary as a Portable Executable (&lt;code&gt;.exe&lt;/code&gt;) with a standard PE32+ header, Import Address Table (IAT), and section layout compatible with the Windows NT loader (&lt;code&gt;ntdll.dll&lt;/code&gt;). It pins the image base to a 64 KiB-aligned non-ASLR address (&lt;code&gt;--windows-fixed-base &amp;lt;address&amp;gt;&lt;/code&gt;, constrained between &lt;code&gt;0x20000&lt;/code&gt; and &lt;code&gt;0x7fffffff0000&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;For companion guest modules, &lt;code&gt;GuestModuleBuilder&lt;/code&gt; (&lt;code&gt;core/relinker/GuestModuleBuilder.cpp&lt;/code&gt;) converts the engine plugins, audio middleware, and physics libraries bundled inside &lt;code&gt;sce_module/&lt;/code&gt;, &lt;code&gt;sce_modules/&lt;/code&gt;, or &lt;code&gt;prx/&lt;/code&gt; into matching host shared libraries while preserving their relative runtime paths under &lt;code&gt;app0/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Static instruction rewriting: &lt;code&gt;--to-intel&lt;/code&gt;, &lt;code&gt;--to-rosetta&lt;/code&gt;, and dead-export compaction
&lt;/h3&gt;

&lt;p&gt;Although both the PS5's Zen 2 CPU and a desktop PC use x86-64, instruction set extensions and microarchitectural behaviors differ across AMD, Intel, and Apple Silicon (Rosetta 2) hosts. During static analysis, the relinker can decode and rewrite executable code sections before emitting the final binary:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Relinker flag&lt;/th&gt;
&lt;th&gt;Target host scenario&lt;/th&gt;
&lt;th&gt;Static binary transformation performed&lt;/th&gt;
&lt;th&gt;Fundamental boundary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;(Default)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;AMD Zen 2+ (Windows / Linux)&lt;/td&gt;
&lt;td&gt;Preserves native user-mode x86-64 instruction stream; patches dynamic imports, relocations, and TLS/ABI thunks.&lt;/td&gt;
&lt;td&gt;Requires host CPU support for instructions emitted by the PS5 toolchain.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--to-intel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Intel x86-64 hosts&lt;/td&gt;
&lt;td&gt;Statically scans code sections in the main ELF and bundled modules, rewriting supported AMD-specific instructions into Intel-compatible equivalents.&lt;/td&gt;
&lt;td&gt;Cannot rewrite dynamically generated code (JIT shaders, runtime unpackers, or self-modifying code).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--to-rosetta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;macOS Apple Silicon (Rosetta 2 testing)&lt;/td&gt;
&lt;td&gt;Rewrites x86-64 instructions unsupported by Apple's Rosetta 2 translator: lowers &lt;code&gt;RDSEED&lt;/code&gt; to &lt;code&gt;RDRAND&lt;/code&gt;, turns &lt;code&gt;CLWB&lt;/code&gt; (Cache Line Write Back) into &lt;code&gt;NOP&lt;/code&gt;, and replaces &lt;code&gt;RDPID&lt;/code&gt; with a zeroed destination register.&lt;/td&gt;
&lt;td&gt;Experimental translator aid; does not bypass missing macOS Vulkan/kernel primitives.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--unused-filter=0|1|2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Import / export graph compaction&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; disables pruning; &lt;code&gt;1&lt;/code&gt; runs conservative control-flow pruning of unreachable module paths; &lt;code&gt;2&lt;/code&gt; (default) adds GOT/PLT reference checks to strip unused imported symbols.&lt;/td&gt;
&lt;td&gt;Aggressive pruning (&lt;code&gt;2&lt;/code&gt;) relies on static reachability analysis of GOT/PLT slots.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;--to-intel&lt;/code&gt; operates strictly at relink time. If a game's scripting VM or anti-tamper layer generates AMD-specific opcodes into executable heap pages at runtime, a static relinker never sees those bytes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Clean-room &lt;code&gt;.prx&lt;/code&gt; system libraries and the NID linking mechanism
&lt;/h2&gt;

&lt;p&gt;Once the relinker emits &lt;code&gt;app.exe&lt;/code&gt; (or &lt;code&gt;app.elf&lt;/code&gt;), the binary still needs to call PlayStation 5 operating system services without Sony firmware.&lt;/p&gt;

&lt;p&gt;On a physical PS5, executables rarely import system functions by human-readable C names like &lt;code&gt;sceKernelMapDirectMemory&lt;/code&gt;. Instead, the PlayStation toolchain links against NIDs (Name Identifiers), which are 11-character Base64-like cryptographic hashes derived from the symbol name and a Sony ABI obfuscation suffix stored in the import table.&lt;/p&gt;

&lt;h3&gt;
  
  
  How &lt;code&gt;nid_patcher&lt;/code&gt; turns standard C++ into NID exports
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;core/libs/prx/&lt;/code&gt; directory in the upstream repository contains more than 80 module subdirectories (&lt;code&gt;libkernel&lt;/code&gt;, &lt;code&gt;libSceAgc&lt;/code&gt;, &lt;code&gt;libSceAgcDriver&lt;/code&gt;, &lt;code&gt;libSceAudioOut&lt;/code&gt;, &lt;code&gt;libScePad&lt;/code&gt;, &lt;code&gt;libSceSaveData&lt;/code&gt;, &lt;code&gt;libSceSysmodule&lt;/code&gt;, &lt;code&gt;libSceVideoOut&lt;/code&gt;, and others). Each directory compiles into a standard host dynamic library named &lt;code&gt;&amp;lt;module&amp;gt;.prx&lt;/code&gt; inside the runtime &lt;code&gt;libs/&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;Writing C++ functions named after raw 11-character NID hashes would make the codebase unreadable and fail to compile whenever a hash contains characters outside &lt;code&gt;[A-Za-z0-9_]&lt;/code&gt; (such as &lt;code&gt;+&lt;/code&gt; or &lt;code&gt;-&lt;/code&gt;). &lt;a href="https://anyps5.tools" rel="noopener noreferrer"&gt;AnyPS5&lt;/a&gt; handles this with a two-step build process documented in &lt;a href="https://github.com/boykopovar/AnyPS5/blob/a48c00660eae7afd204fdb7513a52380dddf5a04/docs/dev/ARCHITECTURE.md" rel="noopener noreferrer"&gt;&lt;code&gt;ARCHITECTURE.md&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developers write standard C++ functions using descriptive symbol names and annotate them with &lt;code&gt;APS5_VABI&lt;/code&gt; (enforcing the System V AMD64 ABI used by PS5 guest code, even on Windows where the host ABI is Microsoft x64) and &lt;code&gt;APS5_EXPORT("&amp;lt;nid&amp;gt;", func)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;After CMake links each &lt;code&gt;.prx&lt;/code&gt; dynamic library (&lt;code&gt;cmake/PrxLibrary.cmake&lt;/code&gt;), the build runs &lt;code&gt;nid_patcher&lt;/code&gt; (&lt;code&gt;tools/nid_patcher/main.cpp&lt;/code&gt;). &lt;code&gt;nid_patcher&lt;/code&gt; parses the compiled ELF &lt;code&gt;.dynsym&lt;/code&gt;/&lt;code&gt;.dynstr&lt;/code&gt; or PE Export Address Table (EAT) and overwrites the exported symbol string in place with the 11-character NID.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because both the relinked game binary (&lt;code&gt;app.exe&lt;/code&gt; / &lt;code&gt;app.elf&lt;/code&gt;) and the host &lt;code&gt;.prx&lt;/code&gt; libraries now share identical NID symbol strings, the operating system's native loader (&lt;code&gt;ntdll.dll&lt;/code&gt; on Windows, &lt;code&gt;ld.so&lt;/code&gt; on Linux) binds thousands of PS5 system calls at process startup without runtime hash-lookup overhead.&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%2Fsirqzesauvd829v7g6qd.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%2Fsirqzesauvd829v7g6qd.png" alt="Windows Deferred Guest Initialization and APR/AMM Dual-Queue Execution" width="800" height="356"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: Inside &lt;code&gt;libkernel.prx&lt;/code&gt;: avoiding Windows &lt;code&gt;DllMain&lt;/code&gt; loader-lock deadlocks via &lt;code&gt;__aps5_guest_initialize&lt;/code&gt; (top) and servicing asynchronous file/memory batches via dual APR/AMM worker queues (bottom).&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Inside &lt;code&gt;libkernel.prx&lt;/code&gt;: bridging three OS mismatches
&lt;/h3&gt;

&lt;p&gt;Replacing high-level libraries like &lt;code&gt;libScePad&lt;/code&gt; (mapped to SDL3 gamepads and &lt;code&gt;anyps5-input.ini&lt;/code&gt; profiles) is relatively direct. The harder systems work sits inside &lt;code&gt;core/libs/prx/libkernel/&lt;/code&gt;, where FreeBSD-derived Orbis/Prospero kernel semantics meet Windows NT and Linux kernel rules.&lt;/p&gt;

&lt;h4&gt;
  
  
  A. Escaping the Windows &lt;code&gt;DllMain&lt;/code&gt; Loader Lock (&lt;code&gt;DynamicLoader.cpp&lt;/code&gt;)
&lt;/h4&gt;

&lt;p&gt;On a PS5, dynamically loaded guest &lt;code&gt;.prx&lt;/code&gt; modules execute their static constructors (&lt;code&gt;_init&lt;/code&gt; / &lt;code&gt;.init_array&lt;/code&gt;) with full freedom to spawn threads, allocate direct memory, or load additional modules. On Windows, running guest initialization inside &lt;code&gt;DllMain(DLL_PROCESS_ATTACH)&lt;/code&gt; while the NT loader holds the global Loader Lock causes immediate deadlocks if guest code spawns a thread or calls &lt;code&gt;LoadLibrary&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As implemented in &lt;code&gt;core/libs/prx/libkernel/DynamicLoader.cpp&lt;/code&gt; and documented in &lt;a href="https://github.com/boykopovar/AnyPS5/blob/a48c00660eae7afd204fdb7513a52380dddf5a04/docs/dev/ARCHITECTURE.md" rel="noopener noreferrer"&gt;&lt;code&gt;ARCHITECTURE.md&lt;/code&gt;&lt;/a&gt;, the relinker emits a metadata table named &lt;code&gt;__aps5_guest_initialize&lt;/code&gt; into converted Windows modules instead of wiring guest constructors into &lt;code&gt;DllMain&lt;/code&gt;. The header of this table holds an atomic 32-bit state word:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt;: Uninitialized.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;UINT32_MAX&lt;/code&gt; (&lt;code&gt;0xFFFFFFFF&lt;/code&gt;): Initialization completed.&lt;/li&gt;
&lt;li&gt;Any other non-zero value: The Win32 Thread ID (&lt;code&gt;GetCurrentThreadId()&lt;/code&gt;) of the thread currently initializing the module.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After &lt;code&gt;LoadLibrary&lt;/code&gt; returns and the Windows Loader Lock is released, &lt;code&gt;libkernel&lt;/code&gt; walks the module's dependency graph depth-first, uses compare-and-swap on the state word to claim ownership (allowing recursive re-entry by the same Thread ID while blocking concurrent threads until &lt;code&gt;UINT32_MAX&lt;/code&gt; is written), and executes the module's initialization pointers in normal user context.&lt;/p&gt;

&lt;h4&gt;
  
  
  B. FreeBSD &lt;code&gt;libthr&lt;/code&gt;-modeled pthread cancellation (&lt;code&gt;Thread.cpp&lt;/code&gt; &amp;amp; &lt;code&gt;Cancel.hpp&lt;/code&gt;)
&lt;/h4&gt;

&lt;p&gt;PlayStation 5 system threads use POSIX thread cancellation (&lt;code&gt;scePthreadCancel&lt;/code&gt;, deferred vs. asynchronous modes, and cleanup handler stacks). On Windows, and across different libc implementations, native thread termination does not match Sony's cancellation-point semantics.&lt;/p&gt;

&lt;p&gt;To match those rules across platforms, &lt;code&gt;core/libs/prx/libkernel/Thread.cpp&lt;/code&gt; and &lt;code&gt;Cancel.hpp&lt;/code&gt; port the cancellation state-machine design from FreeBSD's &lt;code&gt;libthr&lt;/code&gt; (&lt;a href="https://github.com/freebsd/freebsd-src/blob/5ed7eb0d97ba4436218e810f61bd059acba984c2/lib/libthr/thread/thr_cancel.c" rel="noopener noreferrer"&gt;&lt;code&gt;thr_cancel.c&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/freebsd/freebsd-src/blob/5ed7eb0d97ba4436218e810f61bd059acba984c2/lib/libthr/thread/thr_exit.c#L196-L259" rel="noopener noreferrer"&gt;&lt;code&gt;thr_exit.c&lt;/code&gt;&lt;/a&gt;). Blocking &lt;code&gt;libkernel&lt;/code&gt; calls wrap waits in &lt;code&gt;CancelPointScope&lt;/code&gt;, checking per-thread cancellation flags before and after kernel waits and unwinding registered guest cleanup handlers in LIFO order before exiting the thread.&lt;/p&gt;

&lt;h4&gt;
  
  
  C. Asynchronous I/O and memory command buffers (&lt;code&gt;Apr.cpp&lt;/code&gt;)
&lt;/h4&gt;

&lt;p&gt;PS5 games stream multi-gigabyte assets using APR (&lt;code&gt;sceKernelAprSubmitCommandBuffer*&lt;/code&gt;) and AMM (&lt;code&gt;sceKernelAmmSubmitCommandBuffer*&lt;/code&gt;). Instead of issuing individual synchronous &lt;code&gt;read()&lt;/code&gt; or &lt;code&gt;mmap()&lt;/code&gt; syscalls, the game builds a command packet stream in memory that combines file reads, priority changes, memory mappings, and completion event flags, then submits the batch.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;core/libs/prx/libkernel/Apr.cpp&lt;/code&gt;, &lt;a href="https://anyps5.tools" rel="noopener noreferrer"&gt;AnyPS5&lt;/a&gt; uses a dual-queue worker design:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A submission parser (&lt;code&gt;ParseCommands&lt;/code&gt; / &lt;code&gt;ParseAmmCommands&lt;/code&gt;) validates the guest command buffer and assigns a monotonically increasing tracking ID (&lt;code&gt;id = m_nextId++&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;File I/O batches go to the APR Worker Thread, while virtual and direct memory mapping batches go to the AMM Worker Thread, allowing disk reads and page-table updates to run concurrently.&lt;/li&gt;
&lt;li&gt;Synchronous variants (&lt;code&gt;*AndGetResult&lt;/code&gt;) block only on the specific submission's condition variable (&lt;code&gt;WaitCompletion&lt;/code&gt;), while asynchronous batches signal guest event flags or completion buffers (&lt;code&gt;WriteResult&lt;/code&gt;) in the background.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. The 5-stage RDNA 1/2 to SPIR-V shader recompiler
&lt;/h2&gt;

&lt;p&gt;The PlayStation 5 GPU is based on an AMD RDNA 2 architecture programmed through Sony's low-level AGC (&lt;code&gt;libSceAgc&lt;/code&gt; / &lt;code&gt;libSceAgcDriver&lt;/code&gt;) graphics API. Game engines pre-compile shaders into proprietary AMD GCN/RDNA machine code binaries and submit draw and compute work via Draw Command Buffers (DCB) and Asynchronous Compute Buffers (ACB) encoded with PM4 packets.&lt;/p&gt;

&lt;p&gt;Desktop PCs cannot execute raw PS5 AGC command buffers or console-specific RDNA machine code directly. The host runtime in &lt;code&gt;core/gpu/&lt;/code&gt; translates both the command stream (&lt;code&gt;core/gpu/Execution/Pm4.cpp&lt;/code&gt;) and the shader binaries (&lt;code&gt;core/gpu/Shaders/Recompiler.cpp&lt;/code&gt;) into Vulkan 1.1 and Khronos SPIR-V.&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%2F7xslwc23d9uyjbl4jjld.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%2F7xslwc23d9uyjbl4jjld.png" alt="AnyPS5 5-Stage RDNA 1/2 to SPIR-V Shader Recompiler Pipeline" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 3: The end-to-end graphics pipeline in &lt;code&gt;core/gpu/&lt;/code&gt;, from AGC PM4 packet decoding to the 5-stage shader recompiler (&lt;code&gt;Recompiler.cpp&lt;/code&gt;) and Vulkan 1.1 pipeline creation.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Walking through &lt;code&gt;core/gpu/Shaders/Recompiler.cpp&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;When the PM4 command processor encounters a draw or dispatch packet (&lt;code&gt;DrawIndexAuto&lt;/code&gt;, &lt;code&gt;DrawIndex2&lt;/code&gt;, &lt;code&gt;DispatchDirect&lt;/code&gt;), it hashes the active shader binary and execution state (stage, user SGPR layout, vertex/export attributes). On a cache miss in the Variant Cache, &lt;code&gt;Recompiler.cpp&lt;/code&gt; runs five stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stage 1 (&lt;code&gt;RdnaDecoder&lt;/code&gt;, &lt;code&gt;core/gpu/Shaders/RdnaDecoder.cpp&lt;/code&gt;):&lt;/strong&gt;
Parses the binary instruction stream across all seven RDNA 1 and RDNA 2 encoding families defined in the &lt;a href="https://www.amd.com/system/files/TechDocs/rdna2-shader-instruction-set-architecture.pdf" rel="noopener noreferrer"&gt;AMD RDNA 2 Instruction Set Architecture Reference Guide&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SOP&lt;/code&gt; (&lt;code&gt;SOP1&lt;/code&gt;, &lt;code&gt;SOP2&lt;/code&gt;, &lt;code&gt;SOPC&lt;/code&gt;, &lt;code&gt;SOPK&lt;/code&gt;, &lt;code&gt;SOPP&lt;/code&gt;): Scalar ALU operations, wave branches, and barrier/waitcnt control (&lt;code&gt;s_waitcnt&lt;/code&gt;, &lt;code&gt;s_barrier&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SMEM&lt;/code&gt;: Scalar memory loads for constant buffers, descriptor tables, and root user data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VOP&lt;/code&gt; (&lt;code&gt;VOP1&lt;/code&gt;, &lt;code&gt;VOP2&lt;/code&gt;, &lt;code&gt;VOP3&lt;/code&gt;, &lt;code&gt;VOP3P&lt;/code&gt;, &lt;code&gt;VOPC&lt;/code&gt;): Vector ALU floating-point and integer math, packed FP16 dot products, and wave-wide condition mask (&lt;code&gt;VCC&lt;/code&gt; / &lt;code&gt;EXEC&lt;/code&gt;) updates.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MIMG&lt;/code&gt;: Multi-dimensional image sampling, mipmapped fetches, and typed texture reads and writes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DS&lt;/code&gt;: Local Data Share (LDS) workgroup shared memory atomics and swizzles.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FLAT&lt;/code&gt; / &lt;code&gt;GLOBAL&lt;/code&gt; / &lt;code&gt;SCRATCH&lt;/code&gt;: Unified 64-bit Buffer Device Address (BDA) pointer loads, stores, and atomics.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 2 (&lt;code&gt;ControlFlow&lt;/code&gt;, &lt;code&gt;core/gpu/Shaders/ControlFlow.cpp&lt;/code&gt;):&lt;/strong&gt;
RDNA hardware manages divergent branches by manipulating the 32-lane or 64-lane &lt;code&gt;EXEC&lt;/code&gt; (Execute Mask) register (&lt;code&gt;s_and_saveexec_b64&lt;/code&gt;, &lt;code&gt;s_or_b64 exec&lt;/code&gt;, &lt;code&gt;s_cbranch_execz&lt;/code&gt;). SPIR-V requires structured control flow (&lt;code&gt;OpSelectionMerge&lt;/code&gt;, &lt;code&gt;OpLoopMerge&lt;/code&gt;) under the &lt;a href="https://registry.khronos.org/SPIR-V/" rel="noopener noreferrer"&gt;Khronos SPIR-V Specification&lt;/a&gt;. &lt;code&gt;ControlFlow.cpp&lt;/code&gt; reconstructs a control-flow graph (CFG) of basic blocks, recovers structured loops and conditional branches from &lt;code&gt;EXEC&lt;/code&gt; mask manipulations, and synthesizes divergence merge blocks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 3 (&lt;code&gt;Translation&lt;/code&gt;, &lt;code&gt;core/gpu/Shaders/Translation.cpp&lt;/code&gt;):&lt;/strong&gt;
Lowers decoded RDNA instructions within the structured CFG into an intermediate representation. Scalar (&lt;code&gt;s0..s105&lt;/code&gt;) and vector (&lt;code&gt;v0..v255&lt;/code&gt;) register accesses map to SSA values, and console descriptor table pointers fetched via &lt;code&gt;SMEM&lt;/code&gt; bridge to Vulkan descriptor bindings and &lt;code&gt;VK_KHR_buffer_device_address&lt;/code&gt; 64-bit pointers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 4 (&lt;code&gt;Optimization&lt;/code&gt;, &lt;code&gt;core/gpu/Shaders/Optimization.cpp&lt;/code&gt;):&lt;/strong&gt;
Runs dead-code elimination, constant folding, and flag coalescing so redundant scalar status bit calculations (&lt;code&gt;SCC&lt;/code&gt;) and unused &lt;code&gt;EXEC&lt;/code&gt; mask saves do not bloat the generated SPIR-V module.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 5 (&lt;code&gt;SpirvBackend&lt;/code&gt;, &lt;code&gt;core/gpu/Shaders/SpirvBackend.cpp&lt;/code&gt;):&lt;/strong&gt;
Emits the binary SPIR-V word stream and passes it to Khronos &lt;code&gt;SPIRV-Tools&lt;/code&gt; (&lt;code&gt;spvtools::Optimizer&lt;/code&gt;) before calling &lt;code&gt;vkCreateShaderModule&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Build-time patch for Khronos &lt;code&gt;SPIRV-Tools&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
In &lt;code&gt;cmake/PatchSpirvTools.cmake&lt;/code&gt; and &lt;a href="https://github.com/boykopovar/AnyPS5/blob/a48c00660eae7afd204fdb7513a52380dddf5a04/docs/dev/TechnicalDebt.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/dev/TechnicalDebt.md&lt;/code&gt;&lt;/a&gt;, the build applies a local patch to the &lt;code&gt;SPIRV-Tools&lt;/code&gt; submodule referencing &lt;a href="https://github.com/KhronosGroup/SPIRV-Tools/pull/6962" rel="noopener noreferrer"&gt;KhronosGroup/SPIRV-Tools PR #6962&lt;/a&gt;. Unpatched upstream &lt;code&gt;SPIRV-Tools&lt;/code&gt; showed high memory growth when optimizing large machine-translated shaders with dense control-flow graphs during runtime uber-shader compilation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Deconstructing the upstream progress metrics: why 100% shaders ≠ 100% compatibility
&lt;/h2&gt;

&lt;p&gt;The Python scanner in &lt;code&gt;tools/progress.py&lt;/code&gt; generates the repository's headline counters. Understanding its rules explains two patterns that often confuse readers following &lt;a href="https://anyps5.tools/anyps5-progress" rel="noopener noreferrer"&gt;AnyPS5 progress&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnhxhgvesraro5n14ozw.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%2Flnhxhgvesraro5n14ozw.png" alt="AnyPS5 Upstream Progress Metrics Trajectory and Scanner Rules" width="799" height="370"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 4: Historical trajectory of AnyPS5's upstream progress counters (Sept 28 to Oct 14, 2026) and the AST/token counting rules in &lt;code&gt;tools/progress.py&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 1: how &lt;code&gt;tools/progress.py&lt;/code&gt; counts system libraries (&lt;code&gt;3,239 / 3,668&lt;/code&gt;, &lt;code&gt;88.3%&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;According to &lt;a href="https://github.com/boykopovar/AnyPS5/blob/43349d4337543eca207772b065f10ab19acc24c9/docs/dev/PROGRESS.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/dev/PROGRESS.md&lt;/code&gt;&lt;/a&gt;, &lt;code&gt;tools/progress.py&lt;/code&gt; does not compare the codebase against a master list of every undocumented function in Sony's PS5 firmware. Instead, it scans the C and C++ source files listed in &lt;code&gt;core/libs/prx/*/CMakeLists.txt&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It strips comments and preprocessor directives, then locates every function definition annotated with the &lt;code&gt;APS5_VABI&lt;/code&gt; calling-convention macro.&lt;/li&gt;
&lt;li&gt;It tokenizes the function body (&lt;code&gt;{ ... }&lt;/code&gt;). If the body contains the stub marker &lt;code&gt;NotImplemented_nid_no_patch&lt;/code&gt; (or matches a recognized placeholder stub pattern), the function is counted as unimplemented. Any other non-stub &lt;code&gt;APS5_VABI&lt;/code&gt; function body is counted as implemented.&lt;/li&gt;
&lt;li&gt;If two &lt;code&gt;.prx&lt;/code&gt; targets share a common &lt;code&gt;.cpp&lt;/code&gt; file (&lt;code&gt;shared_sources&lt;/code&gt;), the script deduplicates those definitions so they are counted once in the global total.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Why the percentage dipped on October 8 while implemented functions increased
&lt;/h4&gt;

&lt;p&gt;The commit timeline in Figure 4 (tracked on the &lt;a href="https://anyps5.tools/anyps5-progress" rel="noopener noreferrer"&gt;AnyPS5 progress&lt;/a&gt; dashboard) shows how denominator changes affect the ratio:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Snapshot date (UTC)&lt;/th&gt;
&lt;th&gt;Upstream commit&lt;/th&gt;
&lt;th&gt;Implemented functions&lt;/th&gt;
&lt;th&gt;Declared denominator&lt;/th&gt;
&lt;th&gt;Reported library %&lt;/th&gt;
&lt;th&gt;Shader decoder counter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2026-09-28&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;43349d43&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;2,585&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.37%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;561 / 1,166 (48.11%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2026-10-05&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;75159a62&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,511&lt;/td&gt;
&lt;td&gt;2,919&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.02%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;864 / 1,166 (74.10%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2026-10-08&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1ff271fa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2,560 (+49)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3,026 (+107)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84.60% (-1.42%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,166 / 1,166 (100.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2026-10-09&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Press wave snapshot&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;2,575&lt;/td&gt;
&lt;td&gt;3,038&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84.76%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,166 / 1,166 (100.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2026-10-14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;e2e65d91&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3,239 (+664)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3,668 (+630)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;88.30%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,166 / 1,166 (100.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Between October 5 (&lt;code&gt;75159a62&lt;/code&gt;) and October 8 (&lt;code&gt;1ff271fa&lt;/code&gt;), contributors implemented 49 new functions (&lt;code&gt;2,511&lt;/code&gt; → &lt;code&gt;2,560&lt;/code&gt;), yet the reported percentage dropped from 86.02% to 84.60%. During those three days, developers declared 107 newly discovered imports across &lt;code&gt;.prx&lt;/code&gt; modules to test additional games, expanding the denominator from &lt;code&gt;2,919&lt;/code&gt; to &lt;code&gt;3,026&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In addition, &lt;code&gt;tools/progress.py&lt;/code&gt; marks a function as implemented as soon as it is no longer a &lt;code&gt;NotImplemented_nid_no_patch&lt;/code&gt; stub. An early function that returns &lt;code&gt;SCE_OK&lt;/code&gt; (&lt;code&gt;0&lt;/code&gt;) or populates default struct fields carries the same weight in the numerator as the full implementation of &lt;code&gt;sceKernelAprSubmitCommandBuffer&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule 2: why &lt;code&gt;1,166 / 1,166&lt;/code&gt; shader coverage only measures Stage 1 (&lt;code&gt;RdnaDecoder&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;As &lt;a href="https://www.tomshardware.com/video-games/playstation/anyps5-reaches-critical-gpu-milestone-with-100-percent-shader-instruction-coverage-ps5-games-running-natively-on-pc-still-far-off" rel="noopener noreferrer"&gt;Tom's Hardware's Zak Killian wrote&lt;/a&gt; when covering the milestone, reaching 100% shader instruction coverage is a major step forward, &lt;em&gt;"but playing all PS5 games natively on PC is still far off."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;tools/progress.py&lt;/code&gt;, the &lt;code&gt;1,166 / 1,166&lt;/code&gt; counter checks whether Stage 1 (&lt;code&gt;RdnaDecoder.cpp&lt;/code&gt;) recognizes every instruction entry in the project's enumerated RDNA 1 and RDNA 2 instruction table across &lt;code&gt;DS&lt;/code&gt;, &lt;code&gt;FLAT&lt;/code&gt;, &lt;code&gt;GLOBAL&lt;/code&gt;, &lt;code&gt;MIMG&lt;/code&gt;, &lt;code&gt;SMEM&lt;/code&gt;, &lt;code&gt;SOP&lt;/code&gt;, and &lt;code&gt;VOP&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Even when &lt;code&gt;RdnaDecoder&lt;/code&gt; decodes 100% of a game's shader opcodes without throwing an unknown-instruction abort, a frame must still pass Stages 2 through 5 and the AGC command processor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Control-flow structuring edge cases (Stage 2):&lt;/strong&gt; Complex wave-ballot loops or irreducible &lt;code&gt;EXEC&lt;/code&gt;-mask state machines can still trip SPIR-V structured merge rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource and descriptor semantics (Stage 3 and PM4):&lt;/strong&gt; If an AGC PM4 packet binds a depth-stencil surface, HTILE metadata buffer, or DCC-compressed render target using a layout mode not yet handled by &lt;code&gt;Pm4.cpp&lt;/code&gt;, the shader executes against zeroed or misaligned memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vulkan pipeline barriers and synchronization:&lt;/strong&gt; On the PS5's unified memory architecture, shaders rely on hardware L2 cache coherency and &lt;code&gt;s_waitcnt&lt;/code&gt; / &lt;code&gt;s_barrier&lt;/code&gt; semantics. On a PC discrete GPU over PCIe, missing a &lt;code&gt;vkCmdPipelineBarrier&lt;/code&gt; between an asynchronous compute pass and a graphics draw causes black screens, flickering geometry, or device-lost (&lt;code&gt;VK_ERROR_DEVICE_LOST&lt;/code&gt;) crashes without changing the &lt;code&gt;1,166 / 1,166&lt;/code&gt; shader counter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Case studies: how architecture explains per-game reports
&lt;/h2&gt;

&lt;p&gt;The test configurations cataloged in the &lt;a href="https://anyps5.tools/anyps5-games" rel="noopener noreferrer"&gt;AnyPS5 games&lt;/a&gt; database and interactive &lt;a href="https://anyps5.tools/anyps5-game-checker" rel="noopener noreferrer"&gt;AnyPS5 game checker&lt;/a&gt; show which architectural layer each game exercises:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Title &amp;amp; edition&lt;/th&gt;
&lt;th&gt;Tested branch / commit&lt;/th&gt;
&lt;th&gt;Observed runtime behavior&lt;/th&gt;
&lt;th&gt;Architectural layer involved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Animal Well&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Upstream &lt;code&gt;main&lt;/code&gt; (&lt;code&gt;61a2468&lt;/code&gt;, Oct 12, 2026) on Windows&lt;/td&gt;
&lt;td&gt;Reaches title screen, menus, and active in-game gameplay with background music and ambient audio; no immediate blocker hit during session.&lt;/td&gt;
&lt;td&gt;Custom 2D engine loop whose &lt;code&gt;.prx&lt;/code&gt; imports, APR/file reads, and shader passes fit within implemented &lt;code&gt;main&lt;/code&gt; paths.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PAC-MAN WORLD Re-PAC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Upstream &lt;code&gt;main&lt;/code&gt; (&lt;code&gt;ff92477&lt;/code&gt;, Oct 12, 2026) on Windows&lt;/td&gt;
&lt;td&gt;Reaches menus, loads an existing save, and plays a level with audio when relinked with explicit &lt;code&gt;--module-dir&lt;/code&gt; flags for Unity plugins; level-end transition remains under check.&lt;/td&gt;
&lt;td&gt;Shows why &lt;code&gt;GuestModuleBuilder&lt;/code&gt; needs extra &lt;code&gt;--module-dir&lt;/code&gt; discovery paths for engine plugin folders outside &lt;code&gt;sce_module/&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DOOM (PS5 homebrew by lowbit)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Upstream &lt;code&gt;main&lt;/code&gt; (&lt;code&gt;bf602ee&lt;/code&gt; &amp;amp; patched &lt;code&gt;4209e76&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Boots into gameplay on E1M1 with keyboard/mouse (&lt;code&gt;bf602ee&lt;/code&gt;); with a two-file runtime fix on &lt;code&gt;4209e76&lt;/code&gt;, plays through E1M3 with music, SFX, and working save/load.&lt;/td&gt;
&lt;td&gt;Shows how a small &lt;code&gt;.prx&lt;/code&gt; runtime fix unlocks audio and save persistence without altering shader counters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Demon's Souls&lt;/strong&gt; (&lt;code&gt;PPSA01341&lt;/code&gt; / &lt;code&gt;PPSA01342&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Upstream &lt;code&gt;main&lt;/code&gt; (&lt;code&gt;046b2cc&lt;/code&gt;, Linux) vs. 82-commit experimental branch (&lt;code&gt;d406b42&lt;/code&gt;, Windows)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;main&lt;/code&gt; reaches the initial title screen on Linux (&lt;code&gt;PPSA01341&lt;/code&gt;); the 82-commit experimental branch on Windows (&lt;code&gt;PPSA01342&lt;/code&gt;) advances into menus and intro movies before hanging on &lt;em&gt;Continue Offline&lt;/em&gt;.&lt;/td&gt;
&lt;td&gt;Even with 100% &lt;code&gt;RdnaDecoder&lt;/code&gt; coverage, asynchronous streaming, save/network state transitions, and branch-specific fixes separate title-screen boot from menu navigation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Astro Bot&lt;/strong&gt; (&lt;code&gt;PPSA21564&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Private integration tree (&lt;code&gt;a2ca291&lt;/code&gt;, Windows)&lt;/td&gt;
&lt;td&gt;Enters the &lt;em&gt;Crash Site&lt;/em&gt; playable area with movement, camera control, and jumping when launched via a direct level argument (&lt;code&gt;--level ...&lt;/code&gt;).&lt;/td&gt;
&lt;td&gt;Bypasses early title and cutscene state machines via direct engine CLI arguments while exercising 3D physics and AGC rendering.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gran Turismo 7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Experimental branch (&lt;code&gt;19736b1&lt;/code&gt;, Windows)&lt;/td&gt;
&lt;td&gt;Reaches menus, garage view, and &lt;em&gt;Music Rally&lt;/em&gt; / &lt;em&gt;AutoDrive&lt;/em&gt; sequences, while visual corruption and instability remain open issues.&lt;/td&gt;
&lt;td&gt;Illustrates the gap between shader opcode decoding (&lt;code&gt;1,166 / 1,166&lt;/code&gt;) and full AGC render-target and barrier handling in a custom engine.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Dead Cells&lt;/strong&gt; (&lt;code&gt;PPSA15552&lt;/code&gt;, v01.000.000)&lt;/td&gt;
&lt;td&gt;Dedicated game fork (&lt;code&gt;OverkillLabs3/DC-PS5&lt;/code&gt;, Windows 11)&lt;/td&gt;
&lt;td&gt;Playable sessions with music, SFX, and keyboard/gamepad controls; rumble, lightbar, and motion remain unimplemented.&lt;/td&gt;
&lt;td&gt;Shows why community videos must be checked for repository provenance: game-specific forks carry custom runtime changes not merged into stock &lt;code&gt;boykopovar/AnyPS5&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Because behavior shifts across commits and branches, the &lt;a href="https://anyps5.tools/anyps5-game-checker" rel="noopener noreferrer"&gt;AnyPS5 game checker&lt;/a&gt; records each report as a separate configuration card tied to its branch, commit hash, operating system, launch route, and eight verification checks (&lt;em&gt;Launch, Menu, Gameplay, Finish, Audio, Inputs, Saves, Stability&lt;/em&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Building and testing AnyPS5 locally
&lt;/h2&gt;

&lt;p&gt;To inspect the codebase or test a clean, decrypted ELF that you have the legal right to use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Match your release artifacts:&lt;/strong&gt; Pair &lt;code&gt;relinker-v0.1.2&lt;/code&gt; with the matching &lt;code&gt;prx-windows-v0.1.2.zip&lt;/code&gt; or &lt;code&gt;prx-linux-v0.1.2.tar.gz&lt;/code&gt; archive from the same tag, or build both the &lt;code&gt;relinker&lt;/code&gt; and &lt;code&gt;libs&lt;/code&gt; CMake targets from the same commit (&lt;code&gt;cmake --build build --config Release --target relinker --parallel&lt;/code&gt; and &lt;code&gt;--target libs&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify host hardware and OS limits first:&lt;/strong&gt; Check your Vulkan 1.1 driver, host RAM plus pagefile commit margin (up to 13,824 MiB of direct memory on Windows), and &lt;code&gt;/dev/udmabuf&lt;/code&gt; permissions on Linux against the &lt;a href="https://anyps5.tools/anyps5-requirements" rel="noopener noreferrer"&gt;AnyPS5 requirements&lt;/a&gt; reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep &lt;code&gt;libs/&lt;/code&gt; and &lt;code&gt;app0/&lt;/code&gt; separated:&lt;/strong&gt; Place AnyPS5's host &lt;code&gt;.prx&lt;/code&gt; libraries (plus &lt;code&gt;libgcc_s_seh-1.dll&lt;/code&gt;, &lt;code&gt;libstdc++-6.dll&lt;/code&gt;, and &lt;code&gt;libwinpthread-1.dll&lt;/code&gt; on Windows) inside &lt;code&gt;libs/&lt;/code&gt;, and place converted guest modules inside &lt;code&gt;app0/&lt;/code&gt; at the relative paths printed by &lt;code&gt;Guest module:&lt;/code&gt; during relinking. Step-by-step commands are documented in the &lt;a href="https://anyps5.tools/anyps5-setup" rel="noopener noreferrer"&gt;AnyPS5 setup&lt;/a&gt; and &lt;a href="https://anyps5.tools/anyps5-github" rel="noopener noreferrer"&gt;AnyPS5 GitHub&lt;/a&gt; guides.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  References and primary sources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Upstream architecture specification (&lt;code&gt;boykopovar/AnyPS5&lt;/code&gt;): &lt;a href="https://github.com/boykopovar/AnyPS5/blob/a48c00660eae7afd204fdb7513a52380dddf5a04/docs/dev/ARCHITECTURE.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/dev/ARCHITECTURE.md&lt;/code&gt; (commit &lt;code&gt;a48c0066&lt;/code&gt;)&lt;/a&gt;, covering the static relinker pipeline, &lt;code&gt;nid_patcher&lt;/code&gt; symbol rewriting, &lt;code&gt;__aps5_guest_initialize&lt;/code&gt; deferred Windows initialization, FreeBSD-modeled pthread cancellation, APR/AMM workers, and the 5-stage shader recompiler.&lt;/li&gt;
&lt;li&gt;Upstream progress scanner rules (&lt;code&gt;boykopovar/AnyPS5&lt;/code&gt;): &lt;a href="https://github.com/boykopovar/AnyPS5/blob/43349d4337543eca207772b065f10ab19acc24c9/docs/dev/PROGRESS.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/dev/PROGRESS.md&lt;/code&gt; (commit &lt;code&gt;43349d43&lt;/code&gt;)&lt;/a&gt;, defining how &lt;code&gt;tools/progress.py&lt;/code&gt; counts &lt;code&gt;APS5_VABI&lt;/code&gt; definitions, &lt;code&gt;NotImplemented_nid_no_patch&lt;/code&gt; stubs, &lt;code&gt;shared_sources&lt;/code&gt; deduplication, and &lt;code&gt;RdnaDecoder.cpp&lt;/code&gt; instruction recognition.&lt;/li&gt;
&lt;li&gt;Upstream technical debt and &lt;code&gt;SPIRV-Tools&lt;/code&gt; patch (&lt;code&gt;boykopovar/AnyPS5&lt;/code&gt;): &lt;a href="https://github.com/boykopovar/AnyPS5/blob/a48c00660eae7afd204fdb7513a52380dddf5a04/docs/dev/TechnicalDebt.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/dev/TechnicalDebt.md&lt;/code&gt; (commit &lt;code&gt;a48c0066&lt;/code&gt;)&lt;/a&gt; and &lt;a href="https://github.com/KhronosGroup/SPIRV-Tools/pull/6962" rel="noopener noreferrer"&gt;KhronosGroup/SPIRV-Tools Pull Request #6962&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Zak Killian, Tom's Hardware (Oct 10, 2026): &lt;a href="https://www.tomshardware.com/video-games/playstation/anyps5-reaches-critical-gpu-milestone-with-100-percent-shader-instruction-coverage-ps5-games-running-natively-on-pc-still-far-off" rel="noopener noreferrer"&gt;&lt;em&gt;AnyPS5 project reaches critical GPU milestone in race to enable running PS5 games natively on PC&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;WhyCry, VideoCardz (Oct 9, 2026): &lt;a href="https://videocardz.com/newz/anyps5-reaches-100-gpu-shader-instruction-coverage-for-ps5-to-pc-conversion" rel="noopener noreferrer"&gt;&lt;em&gt;AnyPS5 reaches 100% GPU shader instruction coverage for PS5-to-PC conversion&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;TechPowerUp (Oct 2026): &lt;a href="https://www.techpowerup.com/353547/anyps5-achieves-full-ps5-gpu-shader-instruction-translation" rel="noopener noreferrer"&gt;&lt;em&gt;AnyPS5 Achieves Full PS5 GPU Shader Instruction Translation&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;GIGAZINE (Oct 9, 2026): &lt;a href="https://gigazine.net/gsc_news/en/20261009-anyps5/" rel="noopener noreferrer"&gt;&lt;em&gt;AnyPS5 is an open-source tool that allows you to play PS5 games on Windows and Linux&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;AMD RDNA 2 Instruction Set Architecture Reference Guide: &lt;a href="https://www.amd.com/system/files/TechDocs/rdna2-shader-instruction-set-architecture.pdf" rel="noopener noreferrer"&gt;AMD GPUOpen / TechDocs (&lt;code&gt;rdna2-shader-instruction-set-architecture.pdf&lt;/code&gt;)&lt;/a&gt; and &lt;a href="https://gpuopen.com/learn/rdna2_overview/" rel="noopener noreferrer"&gt;AMD GPUOpen RDNA 2 Overview&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;FreeBSD &lt;code&gt;libthr&lt;/code&gt; pthread cancellation implementation: &lt;a href="https://github.com/freebsd/freebsd-src/blob/5ed7eb0d97ba4436218e810f61bd059acba984c2/lib/libthr/thread/thr_cancel.c" rel="noopener noreferrer"&gt;&lt;code&gt;lib/libthr/thread/thr_cancel.c&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/freebsd/freebsd-src/blob/5ed7eb0d97ba4436218e810f61bd059acba984c2/lib/libthr/thread/thr_exit.c#L196-L259" rel="noopener noreferrer"&gt;&lt;code&gt;lib/libthr/thread/thr_exit.c#L196-L259&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Khronos Vulkan and SPIR-V specifications: &lt;a href="https://registry.khronos.org/vulkan/" rel="noopener noreferrer"&gt;Khronos Vulkan Registry&lt;/a&gt; and &lt;a href="https://registry.khronos.org/SPIR-V/" rel="noopener noreferrer"&gt;Khronos SPIR-V Registry&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>gamedev</category>
      <category>vulkan</category>
      <category>c</category>
      <category>linux</category>
    </item>
    <item>
      <title>From Spoken Moments to Useful Text, Securely on Your Mac</title>
      <dc:creator>Joan</dc:creator>
      <pubDate>Wed, 15 Jul 2026 07:27:02 +0000</pubDate>
      <link>https://dev.to/joan-bernier/from-spoken-moments-to-useful-text-securely-on-your-mac-41ji</link>
      <guid>https://dev.to/joan-bernier/from-spoken-moments-to-useful-text-securely-on-your-mac-41ji</guid>
      <description>&lt;h4&gt;
  
  
  Why Local Transcription Matters
&lt;/h4&gt;

&lt;p&gt;A voice recording preserves exactly what was said, but extracting actionable information from it is often tedious. Finding a specific quote means scrubbing blindly through an audio timeline. Names, technical jargon, and locations still require manual verification. A folder filled with meeting audio is inherently difficult to search, organize, or share efficiently. &lt;/p&gt;

&lt;p&gt;While transcription software solves many of these problems, most modern solutions introduce a critical new risk: your private audio must be uploaded to a third-party server before any processing can begin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vocal Notes&lt;/strong&gt; is a premium, native macOS transcription app built entirely around a local-first philosophy. By leveraging the advanced neural engine in modern Macs, all recordings are processed directly on your Apple Silicon device. Your source audio and the resulting text are never transmitted to a cloud-based speech-recognition server. The core transcription engine works completely offline—requiring no cloud accounts, no recurring subscription plans, and no arbitrary monthly limits on transcription minutes.&lt;/p&gt;

&lt;p&gt;This rigorous privacy model is essential when handling sensitive, confidential material, but it also streamlines your everyday workflow. Without the need for a cloud connection, there are no upload queues, no concerns about internet reliability, and no hesitation about whether a quick voice memo is "worth" spending paid cloud credits on. Simply launch the app, record or import your media, and get to work instantly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Seamlessly Record or Import
&lt;/h4&gt;

&lt;p&gt;Vocal Notes provides exceptional flexibility for capturing audio. You can record conversations, interviews, lectures, or personal drafts directly from your Mac’s microphone. Alternatively, you can easily import a wide variety of existing media files, including popular audio and video formats like MP3, M4A, WAV, MP4, and MOV. Imported files are transcribed rapidly in the background, allowing you to monitor progress in your organized library without interrupting your current workflow.&lt;/p&gt;

&lt;h4&gt;
  
  
  A Feature-Rich Workspace Designed for Accuracy
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Synchronized Contextual Review:&lt;/strong&gt; Generating the initial text is only the first step. Spoken material is only truly reliable when it can be quickly cross-referenced with its original source. Vocal Notes tightly couples the transcript to the audio timeline. Select any word or sentence, and the playback jumps instantly to that exact moment. This allows you to listen to the surrounding context, confirm a questionable figure, correct the spelling of a name, and continue editing seamlessly—all without the friction of toggling between a word processor and a separate media player.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Precision Auditing:&lt;/strong&gt; This synchronized review capability is invaluable for researchers, journalists, and corporate professionals, where even a slight misinterpretation can alter the meaning of a quote. The transcript serves as an interactive, searchable index for your audio, while the original recording remains immediately accessible to verify the text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customizable Vocabulary:&lt;/strong&gt; Specialized terminology—such as brand names, local geographies, industry acronyms, and unique surnames—is notoriously difficult for generic AI transcription tools to capture accurately. Vocal Notes empowers you to train the app with custom vocabulary specific to your workflow. A legal researcher can input case-specific terminology; a project manager can add internal codenames; a journalist can preload the names of interview subjects. This proactive approach ensures a vastly higher baseline of accuracy for the specialized topics you work with daily.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Comprehensive Library System:&lt;/strong&gt; Vocal Notes isn’t just a transcription utility; it’s a fully featured organizational workspace. Built-in folders help you categorize transcripts by client, university class, project, or topic. When a project spans multiple recording sessions, you can effortlessly merge them into a single, comprehensive document. Powerful search functions mean you can instantly locate a quote from months ago without needing to remember file names or dates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Frictionless Export Options:&lt;/strong&gt; Once your transcript is perfected, you can instantly copy the text or export it formatted as clean Markdown—ready to be dropped into note-taking archives, content management systems, or publishing workflows. The original audio safely remains in Vocal Notes for future reference. The entire lifecycle is streamlined: record, transcribe, verify, edit, organize, and export.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;System-Wide Quick Dictation:&lt;/strong&gt; Not every valuable thought requires a lengthy recording session. Vocal Notes includes a powerful Quick Dictation feature for spontaneous capture. Triggered by a customizable global keyboard shortcut, a minimal dictation interface appears instantly over any active Mac application. Dictate a paragraph, review the result, and paste it directly into an email, a web browser, or your favorite text editor. It’s the perfect tool for quickly drafting responses or capturing ideas before they fade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Engineered Natively for Apple Silicon
&lt;/h4&gt;

&lt;p&gt;Vocal Notes is a meticulously crafted macOS application. It embraces Apple’s native interface guidelines, providing familiar library management, intuitive text editing, and responsive media controls. It eschews the sluggish, out-of-place feel of wrapped web apps. By utilizing local speech models optimized specifically for Apple Silicon hardware, Vocal Notes delivers desktop-class performance and responsiveness, entirely independent of internet connectivity.&lt;/p&gt;

&lt;h4&gt;
  
  
  Who Can Benefit from Vocal Notes?
&lt;/h4&gt;

&lt;p&gt;This uncompromising commitment to privacy and performance makes Vocal Notes the ideal solution for professionals who demand security. It’s perfect for journalists safeguarding sources, researchers analyzing qualitative data, students organizing lectures, authors drafting chapters aloud, and business teams creating searchable archives of internal meetings without exposing proprietary discussions to cloud providers. It’s equally valuable for personal journaling, where absolute privacy is paramount.&lt;/p&gt;

&lt;h4&gt;
  
  
  Compatibility, Pricing, and Availability
&lt;/h4&gt;

&lt;p&gt;Vocal Notes requires macOS 14 (Sonoma) or newer, and an Apple Silicon Mac (M1, M2, M3, etc.). &lt;/p&gt;

&lt;p&gt;The Direct edition is available via &lt;a href="https://tychostation.gumroad.com/l/vocal-notes" rel="noopener noreferrer"&gt;Gumroad&lt;/a&gt; for a simple, one-time payment of US$49.90. This single purchase provides a personal license key, the native Mac application, and lifetime automatic updates. There are absolutely no recurring subscriptions or hidden limits on how much audio you can transcribe.&lt;/p&gt;

&lt;h4&gt;
  
  
  Privacy Guaranteed by Architecture
&lt;/h4&gt;

&lt;p&gt;In Vocal Notes, privacy is not a toggle in the settings menu or a convoluted data-retention policy—it is a fundamental consequence of the app's architecture. All speech recognition is executed locally on your Mac. Your audio files and transcripts never leave your hard drive. &lt;/p&gt;

&lt;p&gt;Setup is incredibly straightforward. The necessary AI models are bundled within the app, requiring no terminal commands or complex API configurations. The app updates automatically, while your data remains strictly local. &lt;/p&gt;

&lt;p&gt;Vocal Notes transforms transcription from a risky cloud service into a dependable, professional Mac utility. Your recordings stay secure, your text remains perfectly synced to its source, and every tool you need to turn spoken words into polished documents is housed in one elegant workspace.&lt;/p&gt;

&lt;p&gt;Learn more and get the app at &lt;a href="https://www.tychospot.com/vocal-notes/" rel="noopener noreferrer"&gt;TychoSpot.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Learn more: &lt;a href="https://www.tychospot.com/vocal-notes/" rel="noopener noreferrer"&gt;https://www.tychospot.com/vocal-notes/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Get Vocal Notes: &lt;a href="https://tychostation.gumroad.com/l/vocal-notes" rel="noopener noreferrer"&gt;https://tychostation.gumroad.com/l/vocal-notes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>ios</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
