<?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: Gavin Liu</title>
    <description>The latest articles on DEV Community by Gavin Liu (@nicleychrosniakdwcr1331cell).</description>
    <link>https://dev.to/nicleychrosniakdwcr1331cell</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%2F3999756%2F61229f09-39d2-4f9b-945a-9e40b8d89129.png</url>
      <title>DEV Community: Gavin Liu</title>
      <link>https://dev.to/nicleychrosniakdwcr1331cell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nicleychrosniakdwcr1331cell"/>
    <language>en</language>
    <item>
      <title>I built a free tool to open Apple Pages/Numbers/Keynote files on Windows — 100% in-browser</title>
      <dc:creator>Gavin Liu</dc:creator>
      <pubDate>Thu, 25 Jun 2026 11:02:14 +0000</pubDate>
      <link>https://dev.to/nicleychrosniakdwcr1331cell/i-built-a-free-tool-to-open-apple-pagesnumberskeynote-files-on-windows-100-in-browser-40ib</link>
      <guid>https://dev.to/nicleychrosniakdwcr1331cell/i-built-a-free-tool-to-open-apple-pagesnumberskeynote-files-on-windows-100-in-browser-40ib</guid>
      <description>&lt;h2&gt;
  
  
  How I built a free tool to open Apple iWork files on Windows (no backend)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: I built &lt;a href="https://iworkviewer.com" rel="noopener noreferrer"&gt;iWorkViewer&lt;/a&gt; — open and convert Apple &lt;code&gt;.pages&lt;/code&gt;, &lt;code&gt;.numbers&lt;/code&gt;, and &lt;code&gt;.keynote&lt;/code&gt; files right in your browser. No Mac, no iCloud, no upload, no signup. Everything runs client-side.&lt;/p&gt;




&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;Someone sends you a &lt;code&gt;.pages&lt;/code&gt; document, a &lt;code&gt;.numbers&lt;/code&gt; spreadsheet, or a &lt;code&gt;.keynote&lt;/code&gt; deck. You're on Windows, Android, or a Chromebook. You double-click it and… nothing. Microsoft Word throws an error, Google Docs rejects it, and every online converter wants you to upload your private file to their servers first.&lt;/p&gt;

&lt;h3&gt;
  
  
  The honest trick that makes it work
&lt;/h3&gt;

&lt;p&gt;Here's what almost nobody tells you: a &lt;code&gt;.pages&lt;/code&gt; / &lt;code&gt;.numbers&lt;/code&gt; / &lt;code&gt;.keynote&lt;/code&gt; file is &lt;strong&gt;secretly a ZIP archive&lt;/strong&gt;. When Apple saves the document, it bundles a ready-made QuickLook &lt;strong&gt;Preview.pdf&lt;/strong&gt; inside so Finder and Mail can show a thumbnail.&lt;/p&gt;

&lt;p&gt;iWorkViewer just opens that ZIP in your browser with &lt;strong&gt;JSZip&lt;/strong&gt;, finds the embedded &lt;code&gt;Preview.pdf&lt;/code&gt;, and hands it to you. No rendering engine, no conversion server, no quality loss — it's the exact PDF Apple already generated.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open .pages / .numbers / .keynote&lt;/strong&gt; instantly in any browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export to PDF&lt;/strong&gt; for reading, printing, sharing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% private&lt;/strong&gt; — file is unzipped locally, never uploaded&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Mac, no Apple ID, no signup, no watermark&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The tech
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; static export on Cloudflare Pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSZip&lt;/strong&gt; to unpack the iWork ZIP package in-browser&lt;/li&gt;
&lt;li&gt;Embedded PDF rendered directly in the page&lt;/li&gt;
&lt;li&gt;Zero backend — all processing client-side&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The honest part
&lt;/h3&gt;

&lt;p&gt;The embedded preview is a faithful visual copy (great for reading + PDF). If you need a fully editable &lt;code&gt;.xlsx&lt;/code&gt;/&lt;code&gt;.docx&lt;/code&gt; with live formulas, the most accurate route is Apple's own iCloud.com export — and I say so right on the site. No overpromising.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it
&lt;/h3&gt;

&lt;p&gt;👉 &lt;a href="https://iworkviewer.com" rel="noopener noreferrer"&gt;iworkviewer.com&lt;/a&gt; — free, no signup.&lt;/p&gt;

&lt;p&gt;What other file-format headaches should I solve next?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Built a Live Photo Converter That Works Entirely in Your Browser (No Upload, No App)</title>
      <dc:creator>Gavin Liu</dc:creator>
      <pubDate>Wed, 24 Jun 2026 04:21:13 +0000</pubDate>
      <link>https://dev.to/nicleychrosniakdwcr1331cell/how-i-built-a-live-photo-converter-that-works-entirely-in-your-browser-no-upload-no-app-5ei3</link>
      <guid>https://dev.to/nicleychrosniakdwcr1331cell/how-i-built-a-live-photo-converter-that-works-entirely-in-your-browser-no-upload-no-app-5ei3</guid>
      <description>&lt;p&gt;I've been building small web tools with AI coding for the past few months. Here's one that people actually use: &lt;strong&gt;LivePhotoKit&lt;/strong&gt; — a free, browser-based converter for iPhone Live Photos, HEIC images, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;iPhone users shoot millions of Live Photos and HEIC images every day. But when they try to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send a Live Photo to an Android friend → doesn't work&lt;/li&gt;
&lt;li&gt;Upload HEIC to a web form → rejected&lt;/li&gt;
&lt;li&gt;Convert Live Photo to GIF → need a paid app&lt;/li&gt;
&lt;li&gt;Open HEIC on Windows → nothing happens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existing solutions either require you to install an app, upload your private photos to someone's server, or pay a subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  What LivePhotoKit Does
&lt;/h2&gt;

&lt;p&gt;Drop a file in. Get what you need. Done.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HEIC to JPG/PNG/WebP/PDF&lt;/strong&gt; — instant, no upload&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Photo to GIF&lt;/strong&gt; — the one thing iOS can't do natively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Photo to MP4 video&lt;/strong&gt; — extract the video part&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open HEIC files&lt;/strong&gt; — view in browser, no app needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image compressor&lt;/strong&gt; — shrink photos without losing quality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch convert&lt;/strong&gt; — process multiple files at once&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs locally in your browser. Zero server uploads. Zero sign-ups. Zero watermarks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack (Built Mostly by AI)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (static export) — hosted on Cloudflare Pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas API&lt;/strong&gt; — image encoding/decoding, GIF generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gifenc&lt;/strong&gt; — pure JS GIF encoder (no WASM, works on mobile)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;jszip&lt;/strong&gt; — unpack .livp Live Photo packages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSZip + jsPDF&lt;/strong&gt; — PDF generation from images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire conversion pipeline runs in the browser. No ffmpeg, no server-side processing. This means it works on iPhones, Androids, and any modern browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ffmpeg.wasm is too heavy for mobile&lt;/strong&gt; — 30MB+ WASM binary crashes Safari. Switched to Canvas + pure JS encoders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS file input is fragile&lt;/strong&gt; — transparent overlays, &lt;code&gt;hidden&lt;/code&gt; inputs, and programmatic &lt;code&gt;click()&lt;/code&gt; all fail on Safari. The fix: a native &lt;code&gt;&amp;lt;label htmlFor&amp;gt;&lt;/code&gt; wrapping a visible input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Photo's .livp format is just a ZIP&lt;/strong&gt; — unpack it with JSZip, grab the MOV video + HEIC still, done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GIF encoding in pure JS works&lt;/strong&gt; — gifenc does the job at ~3MB per animated GIF.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://livephotokit.com" rel="noopener noreferrer"&gt;livephotokit.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's free. No sign-up. Everything stays on your device.&lt;/p&gt;

&lt;p&gt;If you've got iPhone photos that won't open somewhere — give it a shot. Would love feedback.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with Claude Code + a lot of debugging. 18 pages, 0 dependencies on ffmpeg, 100% client-side.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
