<?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: Forge of Galion</title>
    <description>The latest articles on DEV Community by Forge of Galion (@forge_of_galion).</description>
    <link>https://dev.to/forge_of_galion</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%2F4185566%2F7ea0466b-e7ca-4589-aa3f-805971eceafc.jpg</url>
      <title>DEV Community: Forge of Galion</title>
      <link>https://dev.to/forge_of_galion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/forge_of_galion"/>
    <language>en</language>
    <item>
      <title>Why I made GalionToon process everything in the browser (and never upload your files)</title>
      <dc:creator>Forge of Galion</dc:creator>
      <pubDate>Wed, 14 Oct 2026 22:37:55 +0000</pubDate>
      <link>https://dev.to/forge_of_galion/why-i-made-galiontoon-process-everything-in-the-browser-and-never-upload-your-files-451i</link>
      <guid>https://dev.to/forge_of_galion/why-i-made-galiontoon-process-everything-in-the-browser-and-never-upload-your-files-451i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why I made GalionToon process everything in the browser (and never upload your files)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I still remember the moment I decided this project had to exist.&lt;/p&gt;

&lt;p&gt;A friend sent me a &lt;strong&gt;PSD file&lt;/strong&gt; to review. Nothing sensitive, just a design draft. I opened my usual tools, made a couple of adjustments, and then stopped mid-click.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Where did that file just go?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I knew the answer. It went to a &lt;strong&gt;server&lt;/strong&gt;. Somewhere. Owned by someone. Stored for an amount of time I couldn't verify. Processed by systems I couldn't audit.&lt;/p&gt;

&lt;p&gt;That bothered me more than it should have. Not because anything bad happened — it didn't. But because I realized I had been &lt;strong&gt;trusting silently for years&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every time I edited a photo, opened a PSD, generated a sprite sheet, or cleaned up a video subtitle, I was sending my work somewhere else.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;GalionToon&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 What GalionToon is
&lt;/h2&gt;

&lt;p&gt;GalionToon is a &lt;strong&gt;free creative suite&lt;/strong&gt; that runs entirely in your browser. It has &lt;strong&gt;five independent studios&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Studio&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🖼️ &lt;strong&gt;Galion Photo&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Photo and PSD editing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🦌 &lt;strong&gt;Galion Rig&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;2D animation with bones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎮 &lt;strong&gt;Pixel Galion&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Pixel art editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎬 &lt;strong&gt;Video Editor&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Video cutting and subtitles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📻 &lt;strong&gt;Radio Galion&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Music while you work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;No installs. No accounts. No uploads.&lt;/strong&gt; Everything you do stays on your machine.&lt;/p&gt;

&lt;p&gt;👉 You can try it at &lt;a href="https://galiontoon.com" rel="noopener noreferrer"&gt;&lt;strong&gt;galiontoon.com&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☁️ The problem with "the cloud"
&lt;/h2&gt;

&lt;p&gt;I'm not against servers. I use cloud services every day.&lt;/p&gt;

&lt;p&gt;But I started noticing a pattern in creative software:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Files get uploaded &lt;em&gt;"for processing"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;❌ Projects live on remote storage&lt;/li&gt;
&lt;li&gt;❌ Features get locked behind subscriptions&lt;/li&gt;
&lt;li&gt;❌ Privacy policies are pages long and written in a language no one reads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a professional workflow, this is fine. You trust your employer's IT team to vet the tools.&lt;/p&gt;

&lt;p&gt;But for &lt;strong&gt;everyone else&lt;/strong&gt; — hobbyists, students, indie artists, game developers working from home — it's a quiet trade-off they never agreed to.&lt;/p&gt;

&lt;p&gt;I wanted to offer an alternative. Not a superior one. Just a &lt;strong&gt;different one&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One where the default is: &lt;em&gt;your files never leave your device.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚙️ How it actually works
&lt;/h2&gt;

&lt;p&gt;Processing everything in the browser is harder than it sounds. Here's what I learned building GalionToon.&lt;/p&gt;

&lt;h3&gt;
  
  
  1️⃣ Modern browsers are incredibly powerful
&lt;/h3&gt;

&lt;p&gt;Ten years ago, this project would have been &lt;strong&gt;impossible&lt;/strong&gt;. Today, the browser gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎨 &lt;strong&gt;Canvas API&lt;/strong&gt; and &lt;strong&gt;WebGL&lt;/strong&gt; for rendering&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;WebAssembly&lt;/strong&gt; for near-native performance&lt;/li&gt;
&lt;li&gt;📁 &lt;strong&gt;File System Access API&lt;/strong&gt; for opening and saving files locally&lt;/li&gt;
&lt;li&gt;🎬 &lt;strong&gt;WebCodecs API&lt;/strong&gt; for video decoding without uploading&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Service Workers&lt;/strong&gt; for offline functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything GalionToon does is possible because the &lt;strong&gt;web platform matured&lt;/strong&gt;. I just had to use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ PSD parsing in pure JavaScript
&lt;/h3&gt;

&lt;p&gt;One of the biggest technical challenges was &lt;strong&gt;PSD support&lt;/strong&gt;. Adobe's format is complex:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layers&lt;/li&gt;
&lt;li&gt;Groups&lt;/li&gt;
&lt;li&gt;Masks&lt;/li&gt;
&lt;li&gt;Blend modes&lt;/li&gt;
&lt;li&gt;Editable text&lt;/li&gt;
&lt;li&gt;Effects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote a parser that reads the PSD structure &lt;strong&gt;directly in the browser&lt;/strong&gt;. It handles the common cases and gracefully degrades on advanced features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The file never leaves the user's computer. Not even for a millisecond.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3️⃣ Performance without a server
&lt;/h3&gt;

&lt;p&gt;The hardest problem was &lt;strong&gt;performance on large canvases&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you edit a 4K PSD with 50 layers, you can't just redraw everything on every brush stroke.&lt;/p&gt;

&lt;p&gt;The solution is &lt;strong&gt;spatial caching&lt;/strong&gt;: only redraw the area that actually changed.&lt;/p&gt;

&lt;p&gt;Combined with &lt;strong&gt;offscreen canvases&lt;/strong&gt; and &lt;strong&gt;WebGL acceleration&lt;/strong&gt;, this gets us to &lt;strong&gt;60 FPS on mid-range hardware&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I spent &lt;strong&gt;weeks&lt;/strong&gt; on this. It's the kind of optimization you don't notice when it works — you only notice it when it doesn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  4️⃣ Animation with bones
&lt;/h3&gt;

&lt;p&gt;Galion Rig uses &lt;strong&gt;inverse kinematics&lt;/strong&gt; to animate 2D characters.&lt;/p&gt;

&lt;p&gt;The math is straightforward (for small chains), but the &lt;strong&gt;interaction design&lt;/strong&gt; is where things get interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You drag the tip of a bone → the whole chain adjusts&lt;/li&gt;
&lt;li&gt;You paint influence weights&lt;/li&gt;
&lt;li&gt;You set keyframes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this requires a server. &lt;strong&gt;It's just math and canvas rendering.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5️⃣ Video subtitles without uploading
&lt;/h3&gt;

&lt;p&gt;The video editor generates subtitles &lt;strong&gt;locally&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This was the most surprising win: modern models can run in the browser via &lt;strong&gt;WebAssembly&lt;/strong&gt; or &lt;strong&gt;ONNX Runtime&lt;/strong&gt;. They download once, cache locally, and work offline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your footage never leaves your device.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💚 What this means for users
&lt;/h2&gt;

&lt;p&gt;When I talk to artists and developers who've tried GalionToon, the reaction is always the same: &lt;strong&gt;relief&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not because it's revolutionary. But because it removes a layer of &lt;strong&gt;anxiety&lt;/strong&gt; they didn't know they had.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ You can open a client's PSD &lt;strong&gt;without uploading it&lt;/strong&gt; to a random server&lt;/li&gt;
&lt;li&gt;✅ You can edit sensitive photos &lt;strong&gt;without them being processed&lt;/strong&gt; by a third party&lt;/li&gt;
&lt;li&gt;✅ You can work on a plane, &lt;strong&gt;offline&lt;/strong&gt;, without losing functionality&lt;/li&gt;
&lt;li&gt;✅ You can use it on a Chromebook, a locked-down work laptop, or a friend's computer&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Privacy isn't a feature. It's a default.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 What I got wrong along the way
&lt;/h2&gt;

&lt;p&gt;I want to be honest about the project's &lt;strong&gt;limitations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Performance is harder than expected.&lt;/strong&gt;&lt;br&gt;
Chromium's GPU handling can degrade silently. I've spent more hours than I want to admit chasing performance bugs on older hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Compatibility is incomplete.&lt;/strong&gt;&lt;br&gt;
PSD is a moving target. Some features work perfectly, others partially, others not at all. I document everything in &lt;code&gt;COMPATIBILITY.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Importing assets is tricky.&lt;/strong&gt;&lt;br&gt;
Brush formats like &lt;code&gt;.abr&lt;/code&gt; or &lt;code&gt;.kpp&lt;/code&gt; are proprietary. I support the basics but not everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Translations take time.&lt;/strong&gt;&lt;br&gt;
Right now GalionToon is available in &lt;strong&gt;Spanish, English, and French&lt;/strong&gt;. More languages are planned, but each one is a serious investment.&lt;/p&gt;

&lt;p&gt;None of these are dealbreakers. They're just the reality of building something ambitious &lt;strong&gt;alone&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Why I'm sharing this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DEV Community&lt;/strong&gt; has taught me a lot over the years. So I want to give back something useful: a real example of what's possible when you take &lt;strong&gt;browser capabilities seriously&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you're building something and wondering whether to keep it &lt;strong&gt;client-side&lt;/strong&gt; or move it to a &lt;strong&gt;server&lt;/strong&gt;, here's my honest take:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Keep it client-side as long as you can.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The moment you add a server, you inherit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💸 Infrastructure costs&lt;/li&gt;
&lt;li&gt;🔒 Privacy obligations&lt;/li&gt;
&lt;li&gt;🔧 Maintenance burden&lt;/li&gt;
&lt;li&gt;⚖️ Legal complexity&lt;/li&gt;
&lt;li&gt;🚨 A permanent risk surface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many projects, this is fine. For a creative tool where users upload &lt;strong&gt;personal work&lt;/strong&gt;, it's an unnecessary trade-off.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Try it and tell me what you think
&lt;/h2&gt;

&lt;p&gt;GalionToon is &lt;strong&gt;free&lt;/strong&gt; and available now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://galiontoon.com" rel="noopener noreferrer"&gt;&lt;strong&gt;galiontoon.com&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="https://forge-of-galion.itch.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;itch.io page&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build something with it, I'd love to see it.&lt;br&gt;
If you find a bug, tell me.&lt;br&gt;
If you have an idea for a feature that would make it more useful, &lt;strong&gt;I'm listening&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And if you're working on something similar — a &lt;strong&gt;browser-based tool that respects privacy&lt;/strong&gt; — reach out. I'd love to compare notes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;📝 Thanks for reading. This is the first of a series I'm writing about building GalionToon. Next: how I got PSD parsing to work in pure JavaScript, and what I learned about the format in the process.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
