<?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: VaultyPDF</title>
    <description>The latest articles on DEV Community by VaultyPDF (@vaultypdf).</description>
    <link>https://dev.to/vaultypdf</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%2F4240702%2F9cffc424-61ae-4d95-b8fb-62f6b1504e28.jpg</url>
      <title>DEV Community: VaultyPDF</title>
      <link>https://dev.to/vaultypdf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vaultypdf"/>
    <language>en</language>
    <item>
      <title>How to structure a full-stack React + Motoko dApp on the Internet Computer</title>
      <dc:creator>VaultyPDF</dc:creator>
      <pubDate>Fri, 13 Nov 2026 04:42:20 +0000</pubDate>
      <link>https://dev.to/vaultypdf/how-to-structure-a-full-stack-react-motoko-dapp-on-the-internet-computer-m5i</link>
      <guid>https://dev.to/vaultypdf/how-to-structure-a-full-stack-react-motoko-dapp-on-the-internet-computer-m5i</guid>
      <description>&lt;p&gt;Hey builders,&lt;/p&gt;

&lt;p&gt;When you first start building on the Internet Computer Protocol (ICP), getting a basic "Hello World" canister running is pretty straightforward. The real headache starts when you try to scale that into a full-stack SaaS application with a multi-tool React frontend, user state tracking, and clean file handling.&lt;/p&gt;

&lt;p&gt;While building &lt;strong&gt;VaultyPDF&lt;/strong&gt; (a 15-tool on-chain PDF utility suite), I had to reorganize my project several times before finding a structure that didn't turn into spaghetti code. Here is the clean folder architecture I landed on for pairing React with Motoko.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Keep Backend Canisters Modular
&lt;/h3&gt;

&lt;p&gt;Instead of stuffing thousands of lines of logic into a single &lt;code&gt;main.mo&lt;/code&gt; file, separate your data types and helper functions early on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── backend/
│   ├── main.mo          # Main entry point &amp;amp; public actor methods
│   ├── types.mo         # Custom user &amp;amp; document metadata types
│   └── storage.mo       # Stable memory &amp;amp; state management helpers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using a dedicated &lt;code&gt;types.mo&lt;/code&gt; file makes it much easier to keep your Motoko records aligned with your frontend JavaScript/TypeScript interfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Isolate Frontend Canister Calls
&lt;/h3&gt;

&lt;p&gt;Never call your backend actor directly inside your UI components. Create a dedicated service or hook layer in your React folder so your UI stays focused purely on rendering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── frontend/
│   ├── src/
│   │   ├── components/  # Reusable dark-mode UI cards &amp;amp; modals
│   │   ├── hooks/       # Custom hooks for auth &amp;amp; canister queries
│   │   ├── pages/       # Individual tool views (Merge, Split, Redact)
│   │   └── App.jsx      # Main dashboard layout &amp;amp; routing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Handle Heavy Client-Side Processing Locally
&lt;/h3&gt;

&lt;p&gt;On-chain storage and compute are great for user profiles, audit logs, and document metadata. However, for heavy PDF manipulation (like merging pages or applying visual redactions), run the heavy lifting directly in the user's browser via JavaScript, and only send the verified metadata or final state hashes to your Motoko canister. This keeps your cycle burn rate low and makes the UI feel instant.&lt;/p&gt;




&lt;h3&gt;
  
  
  Want to skip the boilerplate setup?
&lt;/h3&gt;

&lt;p&gt;Setting up the React routing, dark-mode SaaS dashboard UI, and Motoko canister bindings from scratch easily eats up a couple of weeks. &lt;/p&gt;

&lt;p&gt;If you want a ready-to-deploy foundation for your own ICP project, I packaged my entire 15-tool codebase into a clean starter template:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://vaultypdf.gumroad.com/l/boilerplate" rel="noopener noreferrer"&gt;Check out the VaultyPDF React + Motoko Boilerplate on Gumroad&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How do you guys usually organize your Motoko projects when the codebase starts growing? Drop your folder tips below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I built a 15-tool PDF suite running 100% on-chain with React and Motoko</title>
      <dc:creator>VaultyPDF</dc:creator>
      <pubDate>Thu, 12 Nov 2026 12:02:54 +0000</pubDate>
      <link>https://dev.to/vaultypdf/i-built-a-15-tool-pdf-suite-running-100-on-chain-with-react-and-motoko-po7</link>
      <guid>https://dev.to/vaultypdf/i-built-a-15-tool-pdf-suite-running-100-on-chain-with-react-and-motoko-po7</guid>
      <description>&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;Most web-based PDF tools upload your private files to a random backend server just to merge a couple of pages or add a signature. I wanted to see what it would look like to build an all-in-one PDF utility suite that runs completely serverless on the Internet Computer Protocol (ICP).&lt;/p&gt;

&lt;p&gt;After a lot of trial and error configuring the UI and backend logic, I finally wrapped up &lt;strong&gt;VaultyPDF&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Instead of building just a basic file converter, I packed 15+ everyday document utilities into a single dark-mode dashboard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core file handling:&lt;/strong&gt; Merging, splitting, compressing, and page cropping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security &amp;amp; privacy:&lt;/strong&gt; Permanent document redaction and on-chain e-signatures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracking:&lt;/strong&gt; Decentralized user metadata and file state tracking handled directly through Motoko canisters (&lt;code&gt;main.mo&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React with a clean, dark-mode SaaS dashboard layout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Motoko canisters running on ICP for serverless execution without traditional cloud databases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Turning it into a boilerplate
&lt;/h3&gt;

&lt;p&gt;Setting up the frontend routing, dark-mode components, and Motoko canister connections from scratch took way longer than I expected. Since a lot of solo devs and indie hackers want to build micro-SaaS apps on ICP without spending weeks on boilerplate layout code, I cleaned up the repo and packaged it as a starter template.&lt;/p&gt;

&lt;p&gt;If you are building on ICP or just want to save yourself 100+ hours of frontend and canister setup, you can check out the full source code bundle here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://vaultypdf.gumroad.com/l/boilerplate" rel="noopener noreferrer"&gt;Grab the VaultyPDF React + Motoko Boilerplate on Gumroad&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear what you guys think about running heavy document workflows on-chain, or if anyone else here is building SaaS tools with Motoko!&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%2Fgrz08wlnlpido7f4o23k.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%2Fgrz08wlnlpido7f4o23k.png" alt=" " width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>web3</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
