<?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: yksalun</title>
    <description>The latest articles on DEV Community by yksalun (@yksalun).</description>
    <link>https://dev.to/yksalun</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%2F4199393%2F83eb4aee-8259-4ff0-ae73-43b1a6287287.png</url>
      <title>DEV Community: yksalun</title>
      <link>https://dev.to/yksalun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yksalun"/>
    <language>en</language>
    <item>
      <title>How I track PS5 emulator claims without hosting a single file</title>
      <dc:creator>yksalun</dc:creator>
      <pubDate>Thu, 22 Oct 2026 02:11:58 +0000</pubDate>
      <link>https://dev.to/yksalun/how-i-track-ps5-emulator-claims-without-hosting-a-single-file-5c6a</link>
      <guid>https://dev.to/yksalun/how-i-track-ps5-emulator-claims-without-hosting-a-single-file-5c6a</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I built and maintain &lt;a href="https://anyps5games.com" rel="noopener noreferrer"&gt;anyps5games.com&lt;/a&gt;, the fan ledger described in this post. It is not affiliated with Sony or with any of the emulator authors.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Search "PS5 emulator for PC" and you'll get two kinds of results mixed together. One kind is a handful of real, early-stage open-source projects. The other kind is a "full speed, all games" landing page with a download button that never points at GitHub. I wanted a page that kept those two apart and showed its sources on every line. It also had to work without me hosting games, firmware, keys, or even the emulator builds themselves.&lt;/p&gt;

&lt;p&gt;This post covers how I set that up: the source rules, the status labels, and the checklist I use on download pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule 1: the site hosts nothing that runs
&lt;/h2&gt;

&lt;p&gt;The ledger links out. It doesn't mirror anything. For each project it points at the upstream repository and the release page, and it names the asset file you should expect to see there. It doesn't host or describe firmware, BIOS packs, keys, or game files, and it doesn't explain how to dump a console.&lt;/p&gt;

&lt;p&gt;It's also a safety feature: if the ledger never offers a download, a copycat page that "mirrors" it and adds a download button gets caught by that one difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule 2: name the project before you name the game
&lt;/h2&gt;

&lt;p&gt;When I last reviewed it (15 Oct 2026), four public projects could start some PS5 software on a PC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;KytyPS5&lt;/strong&gt;, &lt;strong&gt;SharpEmu&lt;/strong&gt; and &lt;strong&gt;Prosperity&lt;/strong&gt; are emulators. Each boots a game folder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AnyPS5&lt;/strong&gt; is a relinker, not an emulator. It rewrites a PS5 ELF into a Windows or Linux program and loads host libraries. Converting a program doesn't mean the game plays.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They don't share a compatibility list, operating-system support or GPU requirements. Going by each README: KytyPS5 asks for Vulkan 1.3. SharpEmu asks for Vulkan and publishes no RAM floor. Prosperity asks for Vulkan 1.4, 8 GB of VRAM and 16 GB of RAM on Linux. AnyPS5 asks for specific x86-64 extensions and Vulkan 1.1, and on Windows it can commit up to 13824 MiB.&lt;/p&gt;

&lt;p&gt;So the first question a reader has to answer is "which tool?" Then they open that tool's own list. KytyPS5 and SharpEmu keep their own lists. AnyPS5 rows live in my ledger because the upstream table was removed (more on that below). A game missing from a list doesn't have some hidden playable status. It just isn't listed.&lt;/p&gt;

&lt;p&gt;Some searches belong somewhere else entirely. People look up Bloodborne all the time, but it's a PS4 game, so the ledger marks it &lt;strong&gt;Wrong console&lt;/strong&gt; and points to the PS4-emulator comparison instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule 3: labels encode evidence strength, not hope
&lt;/h2&gt;

&lt;p&gt;This was the most useful design decision. Every AnyPS5 row gets one of six labels, and each label says how strong the citation is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;What it means on the ledger&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Playable&lt;/td&gt;
&lt;td&gt;Reserved for the archived upstream table. A tester calling their session "playable" doesn't upgrade a row.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In game&lt;/td&gt;
&lt;td&gt;A cited report got past menus into gameplay on a named setup.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Menus&lt;/td&gt;
&lt;td&gt;The cited report stopped at UI, team select or a load screen.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thread only&lt;/td&gt;
&lt;td&gt;A public bring-up discussion exists. I don't promote it into a result.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;The archived table has no row. That doesn't prove the game can't run, and it doesn't prove anyone booted it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong console&lt;/td&gt;
&lt;td&gt;Not a PS5 executable AnyPS5 can relink.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each row also gets a &lt;strong&gt;source mark&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Archived official table&lt;/strong&gt;: the removed upstream &lt;code&gt;COMPATIBILITY.md&lt;/code&gt;, as quoted when someone copied it into discussion 2475 on the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community index&lt;/strong&gt;: a third-party page I read but didn't re-run myself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search answer&lt;/strong&gt;: the title came up in searches, and the honest answer is that it's absent or on the wrong console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Windows and Linux are separate cells, and &lt;strong&gt;Unknown&lt;/strong&gt; means nobody reported that cell. It isn't a quiet failure or a quiet success.&lt;/p&gt;

&lt;p&gt;That's strict on purpose. Exactly one row carries Playable: &lt;em&gt;Dreaming Sarah&lt;/em&gt; (PPSA02929) on Windows, from the archived table, with a product code, a platform, two cited PCs and a frame rate. &lt;em&gt;Hollow Knight: Silksong&lt;/em&gt; is marked In game from a community index that describes the intro, menus and opening gameplay with sound. It stays there because I haven't re-run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule 4: a row can move, but a log line isn't a promotion
&lt;/h2&gt;

&lt;p&gt;Discussion 2475 also records a 9 Oct 2026 Windows RTX 3060 run of the DOOM homebrew. It reached a launcher log after the first GPU frame failed, and the reporter didn't visually confirm gameplay. That's worth noting on the row. It doesn't replace the archived "In game" row, and it says nothing about every RTX 3060.&lt;/p&gt;

&lt;p&gt;My working rule: &lt;strong&gt;a new label needs evidence at least as strong as the label's definition.&lt;/strong&gt; A screenshot thread, a boot video or a log excerpt each get recorded at the strength they actually have.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fake-download checklist
&lt;/h2&gt;

&lt;p&gt;This is the part I'd most like people to steal. Real builds in this scene are free, live in public GPL repositories, and don't come inside a survey. Scam pages copy the look of known projects. PCSX2 is a real PS2 emulator, and &lt;strong&gt;PCSX4 and PCSX5&lt;/strong&gt; are names documented again and again as survey and malware funnels. The Emulation General Wiki keeps a scam list that covers them. My ledger describes the pattern and deliberately doesn't link the scam domains.&lt;/p&gt;

&lt;p&gt;Before downloading anything, check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Is the download behind a survey, offer wall, browser extension or phone number?&lt;/strong&gt; Official release pages don't do that. Close the tab.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the file type match the release page?&lt;/strong&gt; If the project ships a zip or a &lt;code&gt;.deb&lt;/code&gt; and the site hands you a &lt;code&gt;setup.exe&lt;/code&gt;, you're on the wrong site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does it bundle a "BIOS" or firmware pack?&lt;/strong&gt; None of the four projects ships PS5 system software, and their READMEs say so. A BIOS zip is a scam, a copyright problem, or both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the archive claim to include a game?&lt;/strong&gt; Skip it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the release tag and asset name match upstream?&lt;/strong&gt; At my last review those were:

&lt;ul&gt;
&lt;li&gt;KytyPS5: tag &lt;code&gt;KytyPS5-2026-10-13-9e41d83&lt;/code&gt;. A tag can show up before every platform archive is attached, so read the asset list.&lt;/li&gt;
&lt;li&gt;SharpEmu: &lt;code&gt;v0.0.5-nexus-release.2&lt;/code&gt; (8 Oct 2026), with win-x64, linux-x64 and osx-x64 archives.&lt;/li&gt;
&lt;li&gt;AnyPS5: &lt;code&gt;v0.1.2&lt;/code&gt; (14 Oct 2026). On Windows that's &lt;code&gt;relinker-v0.1.2.exe&lt;/code&gt; plus &lt;code&gt;prx-windows-v0.1.2.zip&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Prosperity: &lt;code&gt;v0.0.1&lt;/code&gt; (3 Oct 2026). Expect a Linux amd64 &lt;code&gt;.deb&lt;/code&gt;, not a Windows installer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does it promise full speed and the whole library?&lt;/strong&gt; Nothing in this scene is finished. Most games that start still crash, glitch or run slowly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One small positive signal: KytyPS5's official updater pulls the next package from GitHub and checks its SHA-256 against the project's own file. A real project's verification looks like that. A "locker" page looks nothing like it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the boring paths first
&lt;/h2&gt;

&lt;p&gt;The ledger's front page sends people to an emulator last. The order (taken from a 10 Oct 2026 pcgaming.io guide) is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buy the official PC port if one exists.&lt;/li&gt;
&lt;li&gt;If you own a PS5, use PS Remote Play to stream it to a Windows PC.&lt;/li&gt;
&lt;li&gt;Only then read the emulator row for the game.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's boring, but it keeps people away from the funnels that feed on "can I play X on PC?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;If you maintain a compatibility list for any emulator, I'd like to hear how you handle evidence strength. The ledger is at &lt;a href="https://anyps5games.com" rel="noopener noreferrer"&gt;anyps5games.com&lt;/a&gt; if you want to see the labels in practice.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Kangsen Ying (yksalun). I build small, source-cited guide sites. anyps5games.com is an independent fan ledger. It doesn't host games, firmware, keys or emulator builds.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>emulation</category>
      <category>security</category>
      <category>opensource</category>
      <category>gaming</category>
    </item>
    <item>
      <title>Making images wobble in the browser: masks, spring motion and local GIF/MP4/WebM export</title>
      <dc:creator>yksalun</dc:creator>
      <pubDate>Thu, 22 Oct 2026 02:06:38 +0000</pubDate>
      <link>https://dev.to/yksalun/making-images-wobble-in-the-browser-masks-spring-motion-and-local-gifmp4webm-export-567k</link>
      <guid>https://dev.to/yksalun/making-images-wobble-in-the-browser-masks-spring-motion-and-local-gifmp4webm-export-567k</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I made &lt;a href="https://purupurumaker.org" rel="noopener noreferrer"&gt;Purupuru Maker&lt;/a&gt;, the browser tool this post is based on.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"Purupuru" (ã·ã‚‹ã·ã‚‹) is the Japanese onomatopoeia for something soft and jiggly, like pudding, cheeks or a jelly cat. The tool does one thing. You paint where a still image should wobble, preview the jelly motion, and export a GIF, MP4 or WebM. All of it runs in the browser tab, with no upload and no account.&lt;/p&gt;

&lt;p&gt;Below is how the pipeline works at a conceptual level, plus the browser APIs and libraries visible in the shipped bundle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pipeline at a glance
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decode&lt;/strong&gt; a static PNG, JPEG or WebP into memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paint a mask&lt;/strong&gt; that says how much each region is allowed to move.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulate&lt;/strong&gt; a soft-body-ish response driven by a motion preset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; the deformed image every frame with WebGL2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record and encode&lt;/strong&gt; a deterministic loop locally, then hand the user a file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No step talks to an image-processing server. The privacy page is explicit that the source image, painted mask and exported media aren't uploaded.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Input: reject early, downscale locally
&lt;/h2&gt;

&lt;p&gt;The importer accepts static PNG, JPEG and WebP up to 80 MiB and 32 megapixels. Animated PNG and animated WebP are rejected on purpose. Large images are resized locally into a working canvas, because a 30-megapixel camera original won't improve a 480 px GIF but will happily use up memory on a phone.&lt;/p&gt;

&lt;p&gt;Lesson one for client-side media tools: &lt;strong&gt;your user's device is the server.&lt;/strong&gt; Cap the working resolution at what the output can actually show.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The mask is a weight map, not a selection
&lt;/h2&gt;

&lt;p&gt;A binary mask (these pixels move, those don't) creates a hard boundary between moving and still pixels, and that boundary shows up right away as a tear.&lt;/p&gt;

&lt;p&gt;So the mask is graded. You paint with a brush, and stronger paint allows a stronger response. Paint, Erase, brush size, undo/redo, Select all and Invert are the whole toolbox. The guidance I give users follows from the maths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paint the centre of the soft object strongly and feather toward the edge, so the displacement falls off smoothly.&lt;/li&gt;
&lt;li&gt;Leave a thin unpainted "anchor" where the subject meets something rigid, like a floor, a table edge or a text panel.&lt;/li&gt;
&lt;li&gt;Keep eyes, lettering and straight architecture out of the strongest area, because deformation is most visible on high-contrast straight lines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conceptually, the final displacement of a point is roughly &lt;em&gt;(simulated motion) Ã— (mask weight at that point)&lt;/em&gt;. A weight of zero means the pixel is pinned.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Motion: springs with a few personality knobs
&lt;/h2&gt;

&lt;p&gt;The motion is "soft-body-ish". The image is treated as a flexible mesh, and the painted region responds to an automatic push like a damped spring. That push has a strength, a speed (the period) and a direction.&lt;/p&gt;

&lt;p&gt;Each preset is a parameter set. In the shipped code the parameters include &lt;strong&gt;input&lt;/strong&gt;, &lt;strong&gt;stretch&lt;/strong&gt;, &lt;strong&gt;bounce&lt;/strong&gt;, &lt;strong&gt;damping&lt;/strong&gt;, &lt;strong&gt;cohesion&lt;/strong&gt;, and a &lt;strong&gt;gravity direction and amount&lt;/strong&gt;. Some contrasts show how the "feel" comes from the numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Soft wobble&lt;/em&gt; uses moderate bounce with fairly high damping and cohesion, so it settles gently.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Spring bounce&lt;/em&gt; turns bounce way up and lowers damping, so it overshoots and rebounds.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Quick shake&lt;/em&gt; uses low damping and low cohesion, so it gets jittery fast. That's also why it exposes rough mask edges first.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Side sway&lt;/em&gt; drops gravity entirely, so the motion reads as a sideways sway rather than a sag.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two practical takeaways if you build something similar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Expose presets, not physics.&lt;/strong&gt; Most people don't want to tune damping. They want "bouncy" or "floaty". Strength, speed and direction cover most of the fine-tuning on top of that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change one thing at a time.&lt;/strong&gt; Strength and damping interact. If someone raises strength to compensate for a leaky mask, the background starts to swim. The fix is nearly always the mask, not the slider.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. Rendering: WebGL2 for the live preview
&lt;/h2&gt;

&lt;p&gt;The live preview needs WebGL2. Deforming a textured mesh and redrawing it at display rate is exactly what the GPU is good at. When the preview won't start, the troubleshooting advice is plain: update the browser, enable hardware acceleration and confirm WebGL2 works on that device.&lt;/p&gt;

&lt;p&gt;Because the motion is &lt;strong&gt;deterministic&lt;/strong&gt; (the same parameters give the same frames), what you preview is what gets recorded. That matters a lot for export. You don't have to screen-capture a live animation and hope the frame timing holds. You can step the simulation frame by frame at the target frame rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Export: probe what the device can actually encode
&lt;/h2&gt;

&lt;p&gt;This is where browser support gets messy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video.&lt;/strong&gt; The editor uses the WebCodecs &lt;code&gt;VideoEncoder&lt;/code&gt; API and asks the runtime, via &lt;code&gt;VideoEncoder.isConfigSupported()&lt;/code&gt;, which configurations it can really encode. It checks in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AVC/H.264 â†’ &lt;strong&gt;MP4&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;VP9, then VP8 â†’ &lt;strong&gt;WebM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;If neither works â†’ &lt;strong&gt;GIF&lt;/strong&gt;, which always has a software path&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The browser name alone doesn't settle anything. OS codecs, hardware, browser build and settings all play a part, so the only trustworthy answer is to probe. For AVC, the dimensions get rounded to even numbers because the encoder requires it. Encoded chunks are muxed into an MP4 or WebM container with the open-source &lt;strong&gt;Mediabunny&lt;/strong&gt; library. Export work runs in a &lt;strong&gt;Web Worker&lt;/strong&gt; with &lt;strong&gt;OffscreenCanvas&lt;/strong&gt;, so the UI thread stays responsive while frames are encoded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GIF.&lt;/strong&gt; GIFs are made with the small &lt;strong&gt;gifenc&lt;/strong&gt; library, which quantizes each frame to a palette and applies it. GIF is the universal fallback, but it's indexed colour. Noisy photos, gradients and large moving areas make GIFs big fast. That's one more reason a focused mask matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits&lt;/strong&gt; (longest side, aspect ratio preserved, never upscaled):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Frame rate&lt;/th&gt;
&lt;th&gt;Max duration&lt;/th&gt;
&lt;th&gt;Max dimension&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MP4 (AVC)&lt;/td&gt;
&lt;td&gt;30 fps&lt;/td&gt;
&lt;td&gt;10 s encoder ceiling&lt;/td&gt;
&lt;td&gt;720 px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebM (VP9/VP8)&lt;/td&gt;
&lt;td&gt;30 fps&lt;/td&gt;
&lt;td&gt;10 s encoder ceiling&lt;/td&gt;
&lt;td&gt;720 px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GIF&lt;/td&gt;
&lt;td&gt;16 fps&lt;/td&gt;
&lt;td&gt;5 s&lt;/td&gt;
&lt;td&gt;480 px&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 10-second figure is an encoder validation ceiling. The current UI offers 2, 4 and 5 second buttons, so exports from the visible controls are at most 5 seconds.&lt;/p&gt;

&lt;p&gt;One user-facing detail I'd recommend to anyone: &lt;strong&gt;if MP4 is missing, say why.&lt;/strong&gt; A missing MP4 button means the browser doesn't expose a compatible local encoder. It isn't a sign that anything was uploaded or that the tool is broken. I also tell people that renaming &lt;code&gt;.webm&lt;/code&gt; to &lt;code&gt;.mp4&lt;/code&gt; changes only the filename, not the container or codec.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Storage: local, and honest about its limits
&lt;/h2&gt;

&lt;p&gt;Optional project history (source image, thumbnail, mask, motion settings) lives in &lt;strong&gt;IndexedDB&lt;/strong&gt;, up to 20 recent projects depending on available storage. There's no cloud sync. Browser storage can be evicted, private windows forget everything, and clearing site data removes projects. So the UI nudges people to keep the downloaded file and the original image.&lt;/p&gt;

&lt;p&gt;On privacy, being precise matters more than marketing. Image work never leaves the device, but the site itself has page analytics, which the privacy page discloses along with the consent handling. "No upload" is a claim about the image pipeline, and that's how I phrase it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd suggest if you build one
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Treat the mask as continuous weights from day one.&lt;/li&gt;
&lt;li&gt;Make motion deterministic so you can render export frames offline instead of capturing them live.&lt;/li&gt;
&lt;li&gt;Probe codecs with &lt;code&gt;isConfigSupported()&lt;/code&gt; and keep a GIF fallback.&lt;/li&gt;
&lt;li&gt;Cap resolution early, and run encoding in a worker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to poke at the result, the demo cat is on the &lt;a href="https://purupurumaker.org" rel="noopener noreferrer"&gt;Purupuru Maker&lt;/a&gt; home page.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Kangsen Ying (yksalun), and I build small single-purpose web tools. Purupuru Maker is free, needs no account, and processes images locally in the browser.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>webgl</category>
      <category>webcodecs</category>
    </item>
    <item>
      <title>Installing ReSkate for skate. on PC: a version-aware setup and troubleshooting guide</title>
      <dc:creator>yksalun</dc:creator>
      <pubDate>Thu, 22 Oct 2026 02:06:31 +0000</pubDate>
      <link>https://dev.to/yksalun/installing-reskate-for-skate-on-pc-a-version-aware-setup-and-troubleshooting-guide-1fh3</link>
      <guid>https://dev.to/yksalun/installing-reskate-for-skate-on-pc-a-version-aware-setup-and-troubleshooting-guide-1fh3</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I run &lt;a href="https://reskatemods.com" rel="noopener noreferrer"&gt;reskatemods.com&lt;/a&gt;, an independent index of ReSkate maps, mods and install notes. I'm not affiliated with the ReSkate authors (Dingo-Shenanigans), EA or Full Circle. Every download below goes to the official GitHub release or Thunderstore.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;ReSkate is a fan-made, GPL-3.0 mod platform for the PC version of &lt;em&gt;skate.&lt;/em&gt; (Steam app 3354750). It ships a launcher, a runtime DLL and a separate dedicated server. With it you can play offline, host lobbies of up to 32 players, join dedicated servers and load community maps and mods.&lt;/p&gt;

&lt;p&gt;The project moves fast and its install advice has already changed once, so I'm pinning this guide to &lt;strong&gt;ReSkate 2.0.7&lt;/strong&gt; (published 12 Oct 2026) and the README as I re-read it on 15 Oct 2026. If a newer tag is out by the time you read this, the release notes win over this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The free Steam version of &lt;em&gt;skate.&lt;/em&gt;, added to the account you'll sign in with. ReSkate isn't a copy of the game.&lt;/li&gt;
&lt;li&gt;About &lt;strong&gt;14 GB&lt;/strong&gt; of free space. The launcher keeps its own copy of the game files.&lt;/li&gt;
&lt;li&gt;The player archive from the official GitHub release, &lt;code&gt;Dingo-Shenanigans/ReSkate&lt;/code&gt;. For 2.0.7 that's &lt;code&gt;ReSkate-2.0.7.zip&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The README names one supported Steam build: &lt;strong&gt;25414733&lt;/strong&gt;. If your normal Steam install is on a different build, that's expected. The launcher fetches the build it was made for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: pick the folder layout (this changed)
&lt;/h2&gt;

&lt;p&gt;There are two documented layouts, and they come from different documents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;v2.0.7 tag README&lt;/strong&gt; allows either a folder next to &lt;code&gt;Skate.exe&lt;/code&gt; or a new empty folder.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;newer main-branch README&lt;/strong&gt; recommends keeping the launcher in its own empty folder, so this copy stays separate from Steam updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I follow the newer recommendation for Windows. To be clear, that doesn't mean the 2.0.7 binary rejects the same-folder layout. It's just the direction upstream is heading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Windows install
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download the zip from the project's GitHub releases page.&lt;/li&gt;
&lt;li&gt;Extract &lt;code&gt;ReSkateLauncher.exe&lt;/code&gt; and &lt;code&gt;ReSkate.dll&lt;/code&gt; into a new, empty folder such as &lt;code&gt;C:\Games\ReSkate&lt;/code&gt;. Keep it outside the Steam &lt;em&gt;skate.&lt;/em&gt; folder.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;ReSkateLauncher.exe&lt;/code&gt;. It updates ReSkate, then installs the supported game build.&lt;/li&gt;
&lt;li&gt;Sign in with the Steam account that owns &lt;em&gt;skate.&lt;/em&gt;, either by QR code from the Steam app or with username, password and Steam Guard.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;PLAY&lt;/strong&gt;. Later launches only download missing files.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you replace files during an update, take &lt;code&gt;ReSkateLauncher.exe&lt;/code&gt; and &lt;code&gt;ReSkate.dll&lt;/code&gt; from the &lt;strong&gt;same&lt;/strong&gt; archive. Mixing versions is an easy way to make your own bug report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Linux and Steam Deck (read the caveats)
&lt;/h2&gt;

&lt;p&gt;On Linux you start through &lt;em&gt;skate.&lt;/em&gt; in Steam so it keeps its app ID and Proton prefix. Both documented recipes swap EA's anti-cheat launcher (&lt;code&gt;EAAntiCheat.GameServiceLauncher.exe&lt;/code&gt;, which refuses Proton) for &lt;code&gt;ReSkateLauncher.exe&lt;/code&gt;. For the separate-folder layout, the newer README proposes a Steam launch option like this one (put your own path in):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'exec "${@/*EAAntiCheat.GameServiceLauncher.exe//home/you/Games/ReSkate/ReSkateLauncher.exe}"'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; %command%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The v2.0.7 tag instead puts the launcher next to &lt;code&gt;Skate.exe&lt;/code&gt; and replaces only the anti-cheat executable name.&lt;/p&gt;

&lt;p&gt;Be honest with yourself about test coverage. The newer README marks its separate-folder Proton layout &lt;strong&gt;untested&lt;/strong&gt;. The documented CachyOS / Proton Experimental test was on ReSkate &lt;strong&gt;1.1.3&lt;/strong&gt;. It doesn't verify 2.0.7, the Steam Deck or the new layout. If it works for you, a short note on the GitHub issues with your distro and Proton version helps everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: add a map
&lt;/h2&gt;

&lt;p&gt;Install from the launcher's &lt;strong&gt;MODS&lt;/strong&gt; page, or drag a Thunderstore zip onto the launcher window. In game, press &lt;strong&gt;Insert&lt;/strong&gt; and pick the map from the level list. The Insert menu also toggles mods, without a restart in most cases.&lt;/p&gt;

&lt;p&gt;Files worth knowing about after the first launch:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mods&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Mods\&lt;/code&gt; next to &lt;code&gt;Skate.exe&lt;/code&gt;, ordered by &lt;code&gt;Mods\mods.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;logs\ReSkate.log&lt;/code&gt; next to &lt;code&gt;Skate.exe&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Offline skater&lt;/td&gt;
&lt;td&gt;&lt;code&gt;%LOCALAPPDATA%\ReSkate\profiles\offline\&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launcher settings&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ReSkateLauncher.settings.json&lt;/code&gt; next to the launcher&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Step 5: multiplayer and offline
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version matching is mandatory.&lt;/strong&gt; 2.0.7 changed the multiplayer protocol, so players and dedicated servers all need 2.0.7.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steam lobbies&lt;/strong&gt; hold up to 32 players. They can be public or use a code, with an optional password.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;dedicated server&lt;/strong&gt; (&lt;code&gt;ReSkateServer&lt;/code&gt;) is a headless program from the same GitHub release, as a zip plus a Linux &lt;code&gt;tar.gz&lt;/code&gt;. It doesn't need the game or Steam installed.&lt;/li&gt;
&lt;li&gt;A server can offer a missing or older Thunderstore map to clients &lt;strong&gt;if the package folder keeps its identity&lt;/strong&gt;. If you renamed the folder, expect to install that map by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline:&lt;/strong&gt; once the supported game files are installed, &lt;code&gt;--offline&lt;/code&gt; lets you play without Steam running. Progress stays on your PC. Lobbies and the server browser need Steam open and signed in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's no third-party server list worth trusting. The live list is the in-game browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting: symptom â†’ what's actually known
&lt;/h2&gt;

&lt;p&gt;I only list failures I could tie to the README, the release notes or a specific GitHub issue. Statuses are as of 15 Oct 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Unknown Player" and no lobbies.&lt;/strong&gt; Steam wasn't open and signed in when you pressed PLAY. Start Steam first, then the launcher. Offline play still works without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A named mod gets skipped at PLAY.&lt;/strong&gt; Mods are checked against the game build they were made for. An outdated mod, or one that won't merge cleanly, is left out and named. Everything else still loads. Update or disable that one package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can't join a 2.0.7 server.&lt;/strong&gt; Check the client and server versions before anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Texture warning, then a freeze.&lt;/strong&gt; 2.0.7 raised the streamed texture cap from 20,480 to &lt;strong&gt;32,764&lt;/strong&gt; and warns at 90 percent. Run &lt;code&gt;textures&lt;/code&gt; in the console to see the count, then remove mods instead of adding more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A huge map never loads.&lt;/strong&gt; 2.0.7 set the object budget to &lt;strong&gt;262,144&lt;/strong&gt; (twice the game default, down from four times). Maps above that won't load. The largest map the project had seen was about 150,000 objects, so this rarely bites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crash when leaving a custom map.&lt;/strong&gt; It's listed as fixed in 2.0.7, so update before you blame the map.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux: black screen after a custom map, then a server on another map.&lt;/strong&gt; That's issue 31, still open. The README workaround is to load the server map first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intel Arc B580: Insert menu doesn't respond.&lt;/strong&gt; Issue 145 was still open after 2.0.7 shipped. Some guides say "update to 2.0.6". The tracker doesn't support that. Attach &lt;code&gt;logs/ReSkate.log&lt;/code&gt; to the issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invisible skateboard after 2.0.6 with no mods.&lt;/strong&gt; Issue 195, still open, and not mentioned in the 2.0.7 notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mac or Wine exits with status 1.&lt;/strong&gt; Issue 182 is open, and the README has no Mac path. There's no supported Mac install.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antivirus quarantines the zip.&lt;/strong&gt; Write down the exact warning and compare the repository, tag and asset name against the official release. Don't replace the file with a "fixed" copy from some other uploader.&lt;/p&gt;

&lt;p&gt;For anything else, search the GitHub issues for the exact line from &lt;code&gt;ReSkate.log&lt;/code&gt; before you open a new one, and attach the log when you do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where reskatemods.com fits
&lt;/h2&gt;

&lt;p&gt;It's a directory, not a mirror. I keep a source-checked selection of maps and mods with links back to Thunderstore, plus guides tied to specific release documentation. The upstream Thunderstore snapshot on 15 Oct 2026 had 186 non-deprecated map packages. That's the wider community total, not the size of my selection. If you want the version-specific install and fix pages from this post in one place, they're at &lt;a href="https://reskatemods.com" rel="noopener noreferrer"&gt;reskatemods.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Kangsen Ying (yksalun). reskatemods.com is an unofficial index and doesn't host the launcher, maps or mods. ReSkate is GPL-3.0 software by Dingo-Shenanigans.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gaming</category>
      <category>modding</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
