<?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: Smarteyeapps.com</title>
    <description>The latest articles on DEV Community by Smarteyeapps.com (@smarteye_apps).</description>
    <link>https://dev.to/smarteye_apps</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%2F4045891%2F350a12e2-1d92-4504-94a2-a0cd9adf683f.jpg</url>
      <title>DEV Community: Smarteyeapps.com</title>
      <link>https://dev.to/smarteye_apps</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/smarteye_apps"/>
    <language>en</language>
    <item>
      <title>I Built a Free QR Menu SaaS with Laravel 12 &amp; React — Here's What I Learned</title>
      <dc:creator>Smarteyeapps.com</dc:creator>
      <pubDate>Tue, 28 Jul 2026 16:11:32 +0000</pubDate>
      <link>https://dev.to/smarteye_apps/i-built-a-free-qr-menu-saas-with-laravel-12-react-heres-what-i-learned-1h3l</link>
      <guid>https://dev.to/smarteye_apps/i-built-a-free-qr-menu-saas-with-laravel-12-react-heres-what-i-learned-1h3l</guid>
      <description>&lt;p&gt;A few weeks ago, I challenged myself to build another micro SaaS.&lt;br&gt;
Instead of creating another AI-powered tool, I wanted to solve a simple, real-world problem.&lt;br&gt;
Restaurant owners still spend time and money printing menus every time prices change or new dishes are added.&lt;br&gt;
The solution seemed straightforward: build a QR Menu Builder that lets restaurants manage their menu online and generate a QR code for customers.&lt;br&gt;
The idea was simple.&lt;br&gt;
Building it wasn't.&lt;br&gt;
In this article, I'll share some of the architectural decisions, challenges, and lessons I learned while building it with Laravel 12, React, Inertia.js, and Tailwind CSS.&lt;br&gt;
The Tech Stack&lt;br&gt;
I wanted a stack that I already trusted.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Backend&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Laravel 12&lt;br&gt;
PHP 8.4&lt;br&gt;
MySQL&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Frontend&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;React&lt;br&gt;
Inertia.js&lt;br&gt;
Tailwind CSS&lt;br&gt;
Vite&lt;/p&gt;

&lt;p&gt;Laravel remains my first choice because it allows me to move quickly without sacrificing code organization.&lt;br&gt;
React + Inertia gives me a modern SPA experience without maintaining separate frontend and backend applications.&lt;br&gt;
For a solo developer building multiple micro SaaS products, this combination has been extremely productive.&lt;br&gt;
Designing the Database&lt;br&gt;
One mistake I've made in previous projects was coupling everything together.&lt;br&gt;
This time I kept the database simple and modular.&lt;br&gt;
restaurants&lt;br&gt;
    ├── categories&lt;br&gt;
    │      └── menu_items&lt;br&gt;
    │&lt;br&gt;
    ├── qr_codes&lt;br&gt;
    │&lt;br&gt;
    └── scans&lt;br&gt;
The relationships are straightforward.&lt;br&gt;
Restaurant&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hasMany Categories
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Category&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hasMany MenuItems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Restaurant&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hasMany Scans
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Keeping the hierarchy shallow made queries easier and reduced unnecessary joins.&lt;br&gt;
Why I Didn't Store Everything in JSON&lt;br&gt;
It can be tempting to store the entire menu in a JSON column.&lt;br&gt;
Something like this:&lt;br&gt;
{&lt;br&gt;
  "categories": [&lt;br&gt;
    {&lt;br&gt;
      "name": "Starters",&lt;br&gt;
      "items": [...]&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;br&gt;
While this works for small applications, it quickly becomes difficult when you need:&lt;br&gt;
search&lt;br&gt;
analytics&lt;br&gt;
ordering&lt;br&gt;
filtering&lt;br&gt;
reporting&lt;br&gt;
Using proper relational tables makes future features much easier to implement.&lt;br&gt;
Generating QR Codes&lt;br&gt;
QR generation turned out to be one of the easiest parts.&lt;br&gt;
Using Laravel packages, generating a QR code is surprisingly simple.&lt;br&gt;
$url = route('restaurant.menu', $restaurant-&amp;gt;slug);&lt;/p&gt;

&lt;p&gt;QrCode::format('svg')&lt;br&gt;
    -&amp;gt;size(300)&lt;br&gt;
    -&amp;gt;generate($url);&lt;br&gt;
I chose SVG instead of PNG because:&lt;br&gt;
smaller file size&lt;br&gt;
scales perfectly&lt;br&gt;
looks sharper when printed&lt;br&gt;
easier to embed&lt;br&gt;
Routing the Public Menu&lt;br&gt;
One decision I made early was separating the public menu from the dashboard.&lt;br&gt;
Instead of URLs like&lt;br&gt;
/restaurant/25/menu&lt;br&gt;
I switched to&lt;br&gt;
/menu/the-coffee-house&lt;br&gt;
Using slugs provides cleaner URLs and is much better for SEO.&lt;br&gt;
Laravel makes route model binding with slugs incredibly easy.&lt;br&gt;
Route::get('/menu/{restaurant:slug}', ...);&lt;br&gt;
Building the Dashboard&lt;br&gt;
The dashboard only has a few sections.&lt;br&gt;
Restaurant&lt;/p&gt;

&lt;p&gt;Categories&lt;/p&gt;

&lt;p&gt;Menu Items&lt;/p&gt;

&lt;p&gt;QR Code&lt;/p&gt;

&lt;p&gt;Settings&lt;/p&gt;

&lt;p&gt;Analytics&lt;br&gt;
I intentionally avoided adding dozens of menus and settings.&lt;br&gt;
Restaurant owners don't want complicated software.&lt;br&gt;
They just want to:&lt;br&gt;
update prices&lt;br&gt;
add dishes&lt;br&gt;
hide unavailable items&lt;br&gt;
print their QR code&lt;br&gt;
Sometimes fewer features create a better product.&lt;br&gt;
Mobile First&lt;br&gt;
One lesson I've learned from previous SaaS projects:&lt;br&gt;
Never treat mobile as an afterthought.&lt;br&gt;
Restaurant owners often update their menu from their phones.&lt;br&gt;
Every page was designed to work comfortably on smaller screens.&lt;br&gt;
Tailwind CSS made responsive layouts much easier than my previous Bootstrap projects.&lt;br&gt;
Performance Considerations&lt;br&gt;
Even a simple menu can contain hundreds of items.&lt;br&gt;
To keep loading fast, I:&lt;br&gt;
eager loaded relationships&lt;br&gt;
optimized database indexes&lt;br&gt;
cached public menus&lt;br&gt;
optimized images&lt;br&gt;
lazy loaded admin components&lt;br&gt;
The public menu should feel almost instant because customers scan it while sitting at a table.&lt;br&gt;
SEO Matters More Than I Expected&lt;br&gt;
Initially, I treated this like a typical SaaS landing page.&lt;br&gt;
Then I realized most restaurant owners search for phrases like:&lt;br&gt;
Free QR Menu&lt;br&gt;
QR Menu Builder&lt;br&gt;
Digital Restaurant Menu&lt;br&gt;
Restaurant QR Code Menu&lt;br&gt;
So I spent time improving:&lt;br&gt;
semantic HTML&lt;br&gt;
structured headings&lt;br&gt;
FAQs&lt;br&gt;
landing page content&lt;br&gt;
internal linking&lt;br&gt;
metadata&lt;br&gt;
Good SEO takes longer than building features—but it's worth the investment.&lt;br&gt;
What I'd Do Differently&lt;br&gt;
If I started again, I'd probably build:&lt;br&gt;
multi-language menus from day one&lt;br&gt;
menu templates earlier&lt;br&gt;
image optimization pipeline&lt;br&gt;
analytics dashboard sooner&lt;br&gt;
Building real software teaches you things that planning never will.&lt;br&gt;
What's Next?&lt;br&gt;
Some features I'm currently working on include:&lt;br&gt;
📊 Scan analytics&lt;br&gt;
📱 WhatsApp ordering&lt;br&gt;
🍽️ Multiple menu templates&lt;br&gt;
🌍 Multi-language support&lt;br&gt;
📅 Pre-order menus&lt;br&gt;
⭐ Featured dishes&lt;br&gt;
I'm trying to keep the product simple while solving genuine problems for restaurant owners.&lt;br&gt;
Final Thoughts&lt;br&gt;
Building small SaaS products has become one of my favorite ways to learn.&lt;br&gt;
Every project forces me to think about architecture, UX, SEO, performance, and deployment—not just writing code.&lt;br&gt;
This QR Menu Builder started as a weekend idea and has grown into a practical project where I can experiment with Laravel, React, and product development.&lt;br&gt;
If you're building your own micro SaaS, I'd love to hear how you structure your projects and what stack you're using.&lt;br&gt;
You can also check out the project here:&lt;br&gt;
👉 &lt;a href="https://www.smarteyeapps.com/qr-menu" rel="noopener noreferrer"&gt;https://www.smarteyeapps.com/qr-menu&lt;/a&gt;&lt;br&gt;
Tags: &lt;/p&gt;

</description>
      <category>laravel</category>
      <category>react</category>
      <category>saas</category>
    </item>
    <item>
      <title>Stop Copying Phone Numbers One by One: Build a Simple WhatsApp Contact Extractor</title>
      <dc:creator>Smarteyeapps.com</dc:creator>
      <pubDate>Fri, 24 Jul 2026 16:56:40 +0000</pubDate>
      <link>https://dev.to/smarteye_apps/stop-copying-phone-numbers-one-by-one-build-a-simple-whatsapp-contact-extractor-2h0b</link>
      <guid>https://dev.to/smarteye_apps/stop-copying-phone-numbers-one-by-one-build-a-simple-whatsapp-contact-extractor-2h0b</guid>
      <description>&lt;p&gt;As a developer, I often find myself collecting contacts from business directories, PDFs, websites, and documents.&lt;br&gt;
The workflow was always the same:&lt;br&gt;
Copy a phone number&lt;br&gt;
Save it as a contact (or copy it again)&lt;br&gt;
Open WhatsApp&lt;br&gt;
Send a message&lt;br&gt;
Repeat...&lt;/p&gt;

&lt;p&gt;After doing this hundreds of times, I decided to build a small tool to automate the repetitive part.&lt;br&gt;
The Idea&lt;br&gt;
The tool accepts any block of text and automatically extracts phone numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Once extracted, each number can be used to:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;💬 Open a WhatsApp chat&lt;br&gt;
📞 Make a phone call&lt;br&gt;
📩 Send an SMS&lt;br&gt;
📥 Export contacts to CSV&lt;/p&gt;

&lt;p&gt;No manual copy-paste for every contact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Workflow&lt;/strong&gt;&lt;br&gt;
Copy text from a business directory, website, or PDF.&lt;br&gt;
Paste it into the tool.&lt;br&gt;
Click Extract Mobile Numbers.&lt;br&gt;
Start messaging contacts immediately.&lt;br&gt;
How It Works&lt;br&gt;
The core logic is intentionally simple:&lt;br&gt;
Parse plain text&lt;/p&gt;

&lt;p&gt;Detect phone numbers using pattern matching&lt;br&gt;
Remove duplicates&lt;br&gt;
Normalize numbers&lt;br&gt;
Generate action buttons for WhatsApp, Call, SMS, and CSV export&lt;br&gt;
Everything runs directly in the browser, so there's nothing to install.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remove duplicates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn't a complex SaaS or an AI-powered application.&lt;br&gt;
It's a small utility that solves a real problem I faced almost every day.&lt;br&gt;
Sometimes the simplest tools save the most time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm planning to add:&lt;br&gt;
Name detection&lt;br&gt;
Duplicate contact merging&lt;br&gt;
Better international phone number support&lt;br&gt;
Contact grouping&lt;br&gt;
Copy-to-clipboard improvements&lt;br&gt;
I'd love to hear your feedback and ideas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 Try Contact Grabber:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.smarteyeapps.com/contact-grabber" rel="noopener noreferrer"&gt;https://www.smarteyeapps.com/contact-grabber&lt;/a&gt;&lt;br&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%2F1y83swi6y8wlaztvct0i.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%2F1y83swi6y8wlaztvct0i.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&lt;br&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%2Fokgoy0m55rgifskr0dz0.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%2Fokgoy0m55rgifskr0dz0.png" alt=" " width="631" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
