<?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: Giovanni D'Andrea</title>
    <description>The latest articles on DEV Community by Giovanni D'Andrea (@imggion).</description>
    <link>https://dev.to/imggion</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%2F486562%2F187a0d9d-9193-4213-b11f-8af48999f6d7.jpeg</url>
      <title>DEV Community: Giovanni D'Andrea</title>
      <link>https://dev.to/imggion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/imggion"/>
    <language>en</language>
    <item>
      <title>Today I fixed PDFs on the web, introducing html2realpdf</title>
      <dc:creator>Giovanni D'Andrea</dc:creator>
      <pubDate>Wed, 15 Jul 2026 20:13:26 +0000</pubDate>
      <link>https://dev.to/imggion/today-i-fixed-pdfs-on-the-web-introducing-html2realpdf-a1j</link>
      <guid>https://dev.to/imggion/today-i-fixed-pdfs-on-the-web-introducing-html2realpdf-a1j</guid>
      <description>&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%2Fraw.githubusercontent.com%2Fimggion%2Fhtml2realpdf%2Fmain%2Fdocs%2Fassets%2Fhtml2realpdf-logo.webp" 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%2Fraw.githubusercontent.com%2Fimggion%2Fhtml2realpdf%2Fmain%2Fdocs%2Fassets%2Fhtml2realpdf-logo.webp" alt="html2realpdf logo" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    Generate selectable, searchable, vector-based PDFs from HTML.&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;Many HTML-to-PDF libraries work by taking a screenshot of the page and placing that image inside a PDF.&lt;/p&gt;

&lt;p&gt;It looks like a PDF, but the text is no longer real text. You cannot properly search, select, or copy it, and the file can become much larger than necessary.&lt;/p&gt;

&lt;p&gt;That is why I built &lt;a href="https://github.com/imggion/html2realpdf" rel="noopener noreferrer"&gt;html2realpdf&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why real text matters
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;html2realpdf&lt;/code&gt; keeps text as text, links as links, and supported graphics as vectors.&lt;/p&gt;

&lt;p&gt;The resulting PDF is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selectable&lt;/li&gt;
&lt;li&gt;Searchable&lt;/li&gt;
&lt;li&gt;Sharp at every zoom level&lt;/li&gt;
&lt;li&gt;Easier for software and AI tools to read&lt;/li&gt;
&lt;li&gt;Often smaller than a screenshot-based PDF&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Avoid unnecessary OCR costs
&lt;/h2&gt;

&lt;p&gt;If your application already has the original HTML and text, it should not need to convert everything into an image and later use OCR to recover that same information.&lt;/p&gt;

&lt;p&gt;With a real PDF, document-processing tools can extract the text directly.&lt;/p&gt;

&lt;p&gt;This can reduce OCR or vision-processing costs, improve accuracy, and make the entire process faster.&lt;/p&gt;

&lt;p&gt;OCR is still useful for scanned documents, but it should not be necessary for a PDF generated by your own application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Switching from html2pdf.js is simple
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;html2realpdf&lt;/code&gt; includes an API compatible with common &lt;code&gt;html2pdf.js&lt;/code&gt; workflows.&lt;/p&gt;

&lt;p&gt;In many projects, you only need to change the imported library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;html2pdf&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html2pdf.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;html2pdf&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@imggion/html2realpdf&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rest of the code can remain the same:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;html2pdf&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your configuration uses options specific to screenshots or &lt;code&gt;html2canvas&lt;/code&gt;, those options may need to be removed.&lt;/p&gt;

&lt;p&gt;Standard PDF generation, page settings, margins, and page breaks are supported through the compatibility API.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick benchmark
&lt;/h2&gt;

&lt;p&gt;One recorded run used the same deterministic 30-page report with both libraries:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engine&lt;/th&gt;
&lt;th&gt;First PDF&lt;/th&gt;
&lt;th&gt;Warm render&lt;/th&gt;
&lt;th&gt;File size&lt;/th&gt;
&lt;th&gt;Pages&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;html2realpdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1595.9 ms&lt;/td&gt;
&lt;td&gt;1451.2 ms&lt;/td&gt;
&lt;td&gt;441.1 kB&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;Native, selectable PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;html2pdf.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2124.6 ms&lt;/td&gt;
&lt;td&gt;1952.4 ms&lt;/td&gt;
&lt;td&gt;3.11 MB&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;Raster image PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In this test, &lt;code&gt;html2realpdf&lt;/code&gt; produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;33.1% faster&lt;/strong&gt; first PDF&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;34.5% faster&lt;/strong&gt; warm render&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;85.8% smaller&lt;/strong&gt; file&lt;/li&gt;
&lt;li&gt;Native and selectable text instead of rasterized pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Benchmarks depend on the document and the machine, but the main difference remains: &lt;code&gt;html2realpdf&lt;/code&gt; stores real text and vector graphics instead of full-page screenshots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for the browser
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;html2realpdf&lt;/code&gt; is written in Zig, compiled to WebAssembly, and packaged with a typed TypeScript API.&lt;/p&gt;

&lt;p&gt;It works directly in the browser with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plain HTML elements&lt;/li&gt;
&lt;li&gt;HTML strings&lt;/li&gt;
&lt;li&gt;React refs&lt;/li&gt;
&lt;li&gt;Vue template refs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is still growing and does not support every CSS feature yet, but the goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Generate real, machine-readable PDFs from HTML, not screenshots.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/imggion/html2realpdf" rel="noopener noreferrer"&gt;View the project on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@imggion/html2realpdf" rel="noopener noreferrer"&gt;Install it from npm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/imggion/html2realpdf/blob/main/docs/css-support.md" rel="noopener noreferrer"&gt;Read the CSS support matrix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>I built a macOS Docker app in Swift without knowing Swift</title>
      <dc:creator>Giovanni D'Andrea</dc:creator>
      <pubDate>Thu, 18 Dec 2025 11:07:32 +0000</pubDate>
      <link>https://dev.to/imggion/i-built-a-macos-docker-app-in-swift-without-knowing-swift-n71</link>
      <guid>https://dev.to/imggion/i-built-a-macos-docker-app-in-swift-without-knowing-swift-n71</guid>
      <description>&lt;p&gt;I didn't plan this project.&lt;br&gt;
And I definitely didn't know Swift when I started.&lt;/p&gt;

&lt;p&gt;I was bored, working on local projects, jumping around between windows.&lt;br&gt;
At some point I just opened &lt;strong&gt;Codex&lt;/strong&gt; and thought: let's see what happens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/imggion/dock-scan/tree/v1.0.0" rel="noopener noreferrer"&gt;Dock-scan&lt;/a&gt; came out of that moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Dockscan?
&lt;/h2&gt;

&lt;p&gt;Dockscan is a small native macOS menu bar app that lets you inspect and manage your local Docker environment.&lt;/p&gt;

&lt;p&gt;It lives in the menu bar and gives you quick access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;containers&lt;/li&gt;
&lt;li&gt;images&lt;/li&gt;
&lt;li&gt;volumes&lt;/li&gt;
&lt;li&gt;networks&lt;/li&gt;
&lt;li&gt;docker-compose/swarm stacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not meant to replace Docker Desktop.&lt;br&gt;
It's more like a lightweight companion you can glance at while working.&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.amazonaws.com%2Fuploads%2Farticles%2Famhr0wt2is4qbsv4g23i.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.amazonaws.com%2Fuploads%2Farticles%2Famhr0wt2is4qbsv4g23i.png" alt="Dockscan menubar" width="386" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The twist: I didn't know Swift
&lt;/h2&gt;

&lt;p&gt;Here’s the real part.&lt;/p&gt;

&lt;p&gt;When I started Dockscan, I didn't know Swift.&lt;br&gt;
I had &lt;strong&gt;never built a macOS app before&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This whole thing was built using a vibe coding workflow, working alongside Codex.&lt;/p&gt;

&lt;p&gt;I’d describe what I wanted, let it generate code, run the app, see what broke, tweak things, repeat.&lt;br&gt;
No big specs. No deep planning. Just momentum.&lt;/p&gt;

&lt;p&gt;Slowly, things started to make sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how the app lifecycle works&lt;/li&gt;
&lt;li&gt;how views are structured&lt;/li&gt;
&lt;li&gt;how macOS menus behave&lt;/li&gt;
&lt;li&gt;how to talk to the Docker API&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A personal thought on AI
&lt;/h2&gt;

&lt;p&gt;This project made something very clear to me.&lt;/p&gt;

&lt;p&gt;It’s incredible how far we’ve come with &lt;strong&gt;AI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sure, there are limits.&lt;br&gt;
Some things probably shouldn't go straight into production at large scale if they’re built entirely with AI.&lt;/p&gt;

&lt;p&gt;But it's impossible to deny this:&lt;br&gt;
AI is an &lt;strong&gt;incredible work companion.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It lowers the barrier to entry, helps you move faster, and lets you explore ideas that you might never start otherwise, especially in areas you don't already know.&lt;/p&gt;

&lt;p&gt;Dockscan exists because of that.&lt;/p&gt;

&lt;p&gt;If you want to check it out:&lt;br&gt;
&lt;a href="https://github.com/imggion/dock-scan/tree/v1.0.0" rel="noopener noreferrer"&gt;https://github.com/imggion/dock-scan/tree/v1.0.0&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>software</category>
      <category>docker</category>
      <category>ai</category>
    </item>
    <item>
      <title>APIVault - Your Gateway To A World Of Public APIs</title>
      <dc:creator>Giovanni D'Andrea</dc:creator>
      <pubDate>Tue, 02 May 2023 11:02:12 +0000</pubDate>
      <link>https://dev.to/imggion/apivault-your-gateway-to-a-world-of-public-apis-2f68</link>
      <guid>https://dev.to/imggion/apivault-your-gateway-to-a-world-of-public-apis-2f68</guid>
      <description>&lt;p&gt;⭐️ After spending days searching for the right API on an internal project, we noticed that many websites and blogs only provide a small, if not minimal, amount of usable resources. 🌎&lt;/p&gt;

&lt;p&gt;🚀 So, we're super excited to introduce our new project, ApiVault, created specifically for the developer community! 🌐&lt;/p&gt;

&lt;p&gt;🔍 ApiVault is a platform that provides all public APIs in one place, making the search process easier and more effective for developers around the world. 🌍&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.amazonaws.com%2Fuploads%2Farticles%2F13f03e8pmst8zwlstffx.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.amazonaws.com%2Fuploads%2Farticles%2F13f03e8pmst8zwlstffx.png" alt="screenshot" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 Whether you're looking for APIs to add to your project or seeking inspiration to create new ones, ApiVault is the site for you.&lt;/p&gt;

&lt;p&gt;🔧 Our platform enthusiastically welcomes all developers who want to participate actively by adding their APIs or working on improving the existing codebase. Collaboration is key for us and we're eager to see how the community will grow and develop together. 💼&lt;/p&gt;

&lt;p&gt;🤝 We'd be happy to receive your feedback and ideas to make our platform even better. Your opinion is extremely important to us and will allow us to constantly improve the service.&lt;/p&gt;

&lt;p&gt;Just 72 hours after the official launch, ApiVault reached:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌎 over 2.1k users from around the world&lt;/li&gt;
&lt;li&gt;👀 2,600 repository views&lt;/li&gt;
&lt;li&gt;⭐ 92 stars received&lt;/li&gt;
&lt;li&gt;👨‍💻 7 contributors to the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🖥️ Visit the website to explore the numerous APIs already available! 🎉&lt;/p&gt;

&lt;p&gt;If you want to contribute feel free to do it!&lt;br&gt;
&lt;a href="https://github.com/Exifly/ApiVault" rel="noopener noreferrer"&gt;https://github.com/Exifly/ApiVault&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dev.to community, we hope you'll join us on this journey to make the search for usable APIs more accessible and efficient for developers everywhere. Let's build something great together!&lt;/p&gt;

&lt;p&gt;And do not forget.. Happy coding to everyone! ❤️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>vue</category>
      <category>api</category>
    </item>
  </channel>
</rss>
