<?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: Nimash Mendis</title>
    <description>The latest articles on DEV Community by Nimash Mendis (@nimash_mendis_dev_02).</description>
    <link>https://dev.to/nimash_mendis_dev_02</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%2F4045018%2F3ad53066-c23c-4fa1-a6dc-d4c235acd58e.jpg</url>
      <title>DEV Community: Nimash Mendis</title>
      <link>https://dev.to/nimash_mendis_dev_02</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nimash_mendis_dev_02"/>
    <language>en</language>
    <item>
      <title>I Got Tired of Filling Out Expense Forms… So I Built an AI That Does It for Me</title>
      <dc:creator>Nimash Mendis</dc:creator>
      <pubDate>Mon, 03 Aug 2026 13:23:18 +0000</pubDate>
      <link>https://dev.to/nimash_mendis_dev_02/i-got-tired-of-filling-out-expense-forms-so-i-built-an-ai-that-does-it-for-me-1hk4</link>
      <guid>https://dev.to/nimash_mendis_dev_02/i-got-tired-of-filling-out-expense-forms-so-i-built-an-ai-that-does-it-for-me-1hk4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Building Aurefi — a privacy-first personal finance app where adding a transaction is as easy as sending a text message.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&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%2F30d08na6yfahm83s72se.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%2F30d08na6yfahm83s72se.png" alt="Dashboard" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time I downloaded a budgeting app, the story was the same.&lt;/p&gt;

&lt;p&gt;Week one?&lt;/p&gt;

&lt;p&gt;I tracked everything.&lt;/p&gt;

&lt;p&gt;Coffee.&lt;/p&gt;

&lt;p&gt;Groceries.&lt;/p&gt;

&lt;p&gt;Fuel.&lt;/p&gt;

&lt;p&gt;Subscriptions.&lt;/p&gt;

&lt;p&gt;Then life got busy.&lt;/p&gt;

&lt;p&gt;A week later, I completely stopped using it.&lt;/p&gt;

&lt;p&gt;Not because budgeting wasn't useful.&lt;/p&gt;

&lt;p&gt;Because logging every single expense felt like filling out a tiny tax form.&lt;/p&gt;

&lt;p&gt;Open the app.&lt;/p&gt;

&lt;p&gt;Tap &lt;strong&gt;Add Transaction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Choose &lt;strong&gt;Expense&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Choose a &lt;strong&gt;Category&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enter the &lt;strong&gt;Amount&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pick the &lt;strong&gt;Date&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Type a &lt;strong&gt;Description&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Save.&lt;/p&gt;

&lt;p&gt;Repeat.&lt;/p&gt;

&lt;p&gt;After doing that fifty times, budgeting becomes the chore instead of the solution.&lt;/p&gt;

&lt;p&gt;That's when I asked myself one question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why can't adding a transaction be as easy as sending a text message?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That idea eventually became &lt;strong&gt;Aurefi&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Goal
&lt;/h1&gt;

&lt;p&gt;I didn't want to build another finance app.&lt;/p&gt;

&lt;p&gt;There are already hundreds of them.&lt;/p&gt;

&lt;p&gt;Some connect directly to your bank.&lt;/p&gt;

&lt;p&gt;Some automatically categorize everything.&lt;/p&gt;

&lt;p&gt;Some are packed with features you'll probably never use.&lt;/p&gt;

&lt;p&gt;Instead, I wanted to solve one problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Make tracking money so easy that people actually keep doing it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything else was built around that idea.&lt;/p&gt;




&lt;h1&gt;
  
  
  Meet Aurefi
&lt;/h1&gt;

&lt;p&gt;Aurefi is a privacy-first personal finance application that combines AI with simple budgeting.&lt;/p&gt;

&lt;p&gt;Instead of filling out forms, you can simply type something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Paid $24.50 for groceries at Walmart this morning.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Received my monthly salary of $2,500.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI understands what you meant and prepares the transaction for you.&lt;/p&gt;

&lt;p&gt;It automatically identifies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expense or Income&lt;/li&gt;
&lt;li&gt;Amount&lt;/li&gt;
&lt;li&gt;Merchant&lt;/li&gt;
&lt;li&gt;Category&lt;/li&gt;
&lt;li&gt;Date&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Financial diary note&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing is automatically saved.&lt;/p&gt;

&lt;p&gt;The AI simply prepares everything.&lt;/p&gt;

&lt;p&gt;You review it.&lt;/p&gt;

&lt;p&gt;You stay in control.&lt;/p&gt;




&lt;h1&gt;
  
  
  My Favorite Feature: AI Quick Add
&lt;/h1&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%2Fsneqgtrlhje2af7dqzwg.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%2Fsneqgtrlhje2af7dqzwg.png" alt="AI Quick Add" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the feature I'm most proud of.&lt;/p&gt;

&lt;p&gt;I wanted adding an expense to feel as natural as sending a message to a friend.&lt;/p&gt;

&lt;p&gt;Instead of tapping through multiple screens, you simply write what happened.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dinner with friends cost $38 yesterday.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI fills the transaction form in seconds.&lt;/p&gt;

&lt;p&gt;Even better...&lt;/p&gt;

&lt;p&gt;It only suggests categories that already exist in &lt;strong&gt;your own budget&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It doesn't invent random categories.&lt;/p&gt;

&lt;p&gt;It works with your existing data.&lt;/p&gt;

&lt;p&gt;That tiny detail made the experience feel much smarter.&lt;/p&gt;




&lt;h1&gt;
  
  
  You Can Even Talk to It
&lt;/h1&gt;

&lt;p&gt;Typing is already faster than traditional finance apps.&lt;/p&gt;

&lt;p&gt;But sometimes you're walking.&lt;/p&gt;

&lt;p&gt;Driving.&lt;/p&gt;

&lt;p&gt;Shopping.&lt;/p&gt;

&lt;p&gt;Or simply don't feel like typing.&lt;/p&gt;

&lt;p&gt;So I added voice input.&lt;/p&gt;

&lt;p&gt;Tap the microphone.&lt;/p&gt;

&lt;p&gt;Say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Paid twenty dollars for lunch."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your browser converts speech into text.&lt;/p&gt;

&lt;p&gt;The AI parses it exactly the same way.&lt;/p&gt;

&lt;p&gt;The form fills automatically.&lt;/p&gt;

&lt;p&gt;On mobile, it feels surprisingly natural.&lt;/p&gt;




&lt;h1&gt;
  
  
  AI That Helps Before You Spend
&lt;/h1&gt;

&lt;p&gt;Recording expenses is useful.&lt;/p&gt;

&lt;p&gt;But I kept wondering...&lt;/p&gt;

&lt;p&gt;Wouldn't it be better if AI could help &lt;strong&gt;before&lt;/strong&gt; the purchase happens?&lt;/p&gt;

&lt;p&gt;That's how the &lt;strong&gt;AI Money Simulator&lt;/strong&gt; was born.&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%2Ffnn1f68ano5lfse0wk2t.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%2Ffnn1f68ano5lfse0wk2t.png" alt="Simulator" width="799" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine typing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm thinking about buying a laptop for $1,999.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of recording an expense, Aurefi estimates things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly financial impact&lt;/li&gt;
&lt;li&gt;Yearly financial impact&lt;/li&gt;
&lt;li&gt;How it affects your savings goals&lt;/li&gt;
&lt;li&gt;Alternative suggestions generated by AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes seeing the future cost of a purchase changes your decision entirely.&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%2Fmpbtuorkwqkkyctd22t8.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%2Fmpbtuorkwqkkyctd22t8.png" alt="Simulator AI Suggestions" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That became one of my favorite features while building the app.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building It
&lt;/h1&gt;

&lt;p&gt;Under the hood, the workflow is fairly straightforward.&lt;/p&gt;

&lt;p&gt;When the user enters natural language, the client sends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The text&lt;/li&gt;
&lt;li&gt;User currency&lt;/li&gt;
&lt;li&gt;Existing categories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to a serverless API.&lt;/p&gt;

&lt;p&gt;The API uses &lt;strong&gt;Groq's Llama 3.3 70B Versatile&lt;/strong&gt; model to convert the sentence into structured JSON.&lt;/p&gt;

&lt;p&gt;The response is validated before anything reaches the UI.&lt;/p&gt;

&lt;p&gt;Amounts are checked.&lt;/p&gt;

&lt;p&gt;Categories are matched.&lt;/p&gt;

&lt;p&gt;Dates are normalized.&lt;/p&gt;

&lt;p&gt;Only then is the transaction form populated.&lt;/p&gt;

&lt;p&gt;One lesson I learned quickly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Never trust AI output directly.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Always validate everything.&lt;/p&gt;

&lt;p&gt;AI should speed up workflows—not introduce unpredictable data.&lt;/p&gt;




&lt;h1&gt;
  
  
  Privacy Wasn't Just a Feature
&lt;/h1&gt;

&lt;p&gt;Finance apps deal with some of the most personal information people have.&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%2F46c4g9kjei4yz0m3gqe1.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%2F46c4g9kjei4yz0m3gqe1.png" alt="Privacy" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wanted privacy to be part of the architecture—not just a marketing page.&lt;/p&gt;

&lt;p&gt;Aurefi follows a privacy-first approach.&lt;/p&gt;

&lt;p&gt;Financial records are encrypted before cloud storage and synchronization using modern browser cryptography (AES-256-GCM).&lt;/p&gt;

&lt;p&gt;Anonymous users can start immediately without creating an account.&lt;/p&gt;

&lt;p&gt;There are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No advertisements&lt;/li&gt;
&lt;li&gt;No data selling&lt;/li&gt;
&lt;li&gt;No invasive third-party tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My goal wasn't just to build another budgeting tool.&lt;/p&gt;

&lt;p&gt;It was to build one people could actually trust.&lt;/p&gt;




&lt;h1&gt;
  
  
  Tech Stack
&lt;/h1&gt;

&lt;p&gt;Here's what powers Aurefi.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Next.js 16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;React 19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS v4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Neon PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ORM&lt;/td&gt;
&lt;td&gt;Drizzle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Auth.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Groq (Llama 3.3 70B Versatile)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charts&lt;/td&gt;
&lt;td&gt;Recharts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encryption&lt;/td&gt;
&lt;td&gt;Web Crypto API (AES-256-GCM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payments&lt;/td&gt;
&lt;td&gt;Lemon Squeezy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Building a Finance Dashboard That Actually Helps People Understand Money
&lt;/h1&gt;

&lt;p&gt;One of the biggest challenges wasn't building charts or displaying numbers.&lt;/p&gt;

&lt;p&gt;It was deciding &lt;strong&gt;which information actually matters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A lot of finance apps show users endless tables, transactions, and statistics. But having more data doesn't always mean having more understanding.&lt;/p&gt;

&lt;p&gt;For Aurefi, I wanted the analytics dashboard to answer simple questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where is my money going?&lt;/li&gt;
&lt;li&gt;How much am I earning compared to spending?&lt;/li&gt;
&lt;li&gt;Which categories take most of my budget?&lt;/li&gt;
&lt;li&gt;How are my financial patterns changing over time?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dashboard became a visual summary of a user's financial life.&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%2F0riv7wcztpzjjpo54kt2.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%2F0riv7wcztpzjjpo54kt2.png" alt="Analytics UI" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Income and expense summaries&lt;/strong&gt; to quickly understand the overall picture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly trends&lt;/strong&gt; to see how finances change over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spending by category&lt;/strong&gt; to identify where money is going.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Income source tracking&lt;/strong&gt; to understand earning patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category breakdowns&lt;/strong&gt; to discover spending habits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hardest part wasn't creating the charts.&lt;/p&gt;

&lt;p&gt;It was designing an experience where users can look at their finances for a few seconds and immediately understand what is happening.&lt;/p&gt;

&lt;p&gt;Every card, chart, and metric has one purpose:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Turn complicated financial data into simple decisions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building this taught me that good dashboards are not about showing more information.&lt;/p&gt;

&lt;p&gt;They're about showing the &lt;strong&gt;right information at the right time&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;Building Aurefi taught me a few lessons.&lt;/p&gt;

&lt;h3&gt;
  
  
  People don't hate budgeting.
&lt;/h3&gt;

&lt;p&gt;They hate logging transactions.&lt;/p&gt;




&lt;h3&gt;
  
  
  AI works best when it removes friction.
&lt;/h3&gt;

&lt;p&gt;It shouldn't replace the user's decisions.&lt;/p&gt;

&lt;p&gt;It should eliminate repetitive work.&lt;/p&gt;




&lt;h3&gt;
  
  
  Privacy starts with architecture.
&lt;/h3&gt;

&lt;p&gt;If your system requires reading everyone's financial history, it probably isn't privacy-first.&lt;/p&gt;




&lt;h3&gt;
  
  
  Simple experiences are incredibly difficult to build.
&lt;/h3&gt;

&lt;p&gt;The less work users have to do, the more work developers usually have to do behind the scenes.&lt;/p&gt;




&lt;h1&gt;
  
  
  What's Next?
&lt;/h1&gt;

&lt;p&gt;I'm continuing to improve Aurefi based on feedback from real users.&lt;/p&gt;

&lt;p&gt;Some of the best ideas have actually come from Reddit and developer communities.&lt;/p&gt;

&lt;p&gt;The product today is very different from what I launched because people kept suggesting improvements I hadn't considered.&lt;/p&gt;

&lt;p&gt;That's honestly one of my favorite parts of building in public.&lt;/p&gt;




&lt;h1&gt;
  
  
  I'd Love Your Feedback
&lt;/h1&gt;

&lt;p&gt;Whether you're a developer, designer, finance enthusiast, or someone who's given up on budgeting apps before, I'd genuinely love to hear what you think.&lt;/p&gt;

&lt;p&gt;You can try Aurefi here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://www.aurefi.xyz" rel="noopener noreferrer"&gt;https://www.aurefi.xyz&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No credit card.&lt;/p&gt;

&lt;p&gt;No ads.&lt;/p&gt;

&lt;p&gt;You can start immediately.&lt;/p&gt;

&lt;p&gt;If you have suggestions, feature ideas, or criticism, leave a comment below.&lt;/p&gt;

&lt;p&gt;I read every single one, and there's a good chance your feedback will shape the next update.&lt;/p&gt;

&lt;h1&gt;
  
  
  Get in Touch
&lt;/h1&gt;

&lt;p&gt;I'm always interested in hearing feedback, discussing ideas, or connecting with other developers and builders.&lt;/p&gt;

&lt;p&gt;If you try Aurefi, have suggestions for new features, or simply want to chat about AI, web development, or building SaaS products, feel free to reach out.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Aurefi:&lt;/strong&gt; &lt;a href="https://www.aurefi.xyz" rel="noopener noreferrer"&gt;https://www.aurefi.xyz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📧 &lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:nimashmendis.dev@gmail.com"&gt;nimashmendis.dev@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also leave a comment below—I read every one and often build features based on community feedback.&lt;/p&gt;

&lt;p&gt;Thanks for taking the time to read my story. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What if travel preparation was one place instead of 20 browser tabs?</title>
      <dc:creator>Nimash Mendis</dc:creator>
      <pubDate>Tue, 28 Jul 2026 11:58:00 +0000</pubDate>
      <link>https://dev.to/nimash_mendis_dev_02/what-if-travel-preparation-was-one-place-instead-of-20-browser-tabs-1cm2</link>
      <guid>https://dev.to/nimash_mendis_dev_02/what-if-travel-preparation-was-one-place-instead-of-20-browser-tabs-1cm2</guid>
      <description>&lt;p&gt;I have a bad habit when planning international travel.&lt;/p&gt;

&lt;p&gt;I open one tab.&lt;/p&gt;

&lt;p&gt;Then another.&lt;/p&gt;

&lt;p&gt;Then another.&lt;/p&gt;

&lt;p&gt;Before I know it, I'm looking at an embassy website, an airport guide, a Reddit thread, a SIM provider, a hotel site, a packing list, a currency converter, a random travel blog from 2022, and somehow a YouTube video that has nothing to do with the original question.&lt;/p&gt;

&lt;p&gt;And I'm still not sure if I've forgotten something.&lt;/p&gt;

&lt;p&gt;The funny thing is that booking a trip has become incredibly easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preparing for one is still surprisingly fragmented.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's where the idea for &lt;strong&gt;Tripora&lt;/strong&gt; came from.&lt;/p&gt;

&lt;p&gt;Not another itinerary planner.&lt;/p&gt;

&lt;p&gt;Not another "10 best places to visit" website.&lt;/p&gt;

&lt;p&gt;Something more like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I'm going to this country. What do I need to know before I go?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The first version was much smaller
&lt;/h2&gt;

&lt;p&gt;The original idea was basically a checklist.&lt;/p&gt;

&lt;p&gt;You enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;From: Sri Lanka
To: Belarus
Purpose: Study
Duration: 1 year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And instead of searching for everything separately, you get one place containing the things that actually matter.&lt;/p&gt;

&lt;p&gt;Visa.&lt;/p&gt;

&lt;p&gt;Documents.&lt;/p&gt;

&lt;p&gt;Airport.&lt;/p&gt;

&lt;p&gt;Accommodation.&lt;/p&gt;

&lt;p&gt;SIM.&lt;/p&gt;

&lt;p&gt;Transport.&lt;/p&gt;

&lt;p&gt;Packing.&lt;/p&gt;

&lt;p&gt;Money.&lt;/p&gt;

&lt;p&gt;Arrival.&lt;/p&gt;

&lt;p&gt;The more I thought about it, the more I realised that a simple checklist wasn't enough.&lt;/p&gt;

&lt;p&gt;A person going to Belarus for university needs completely different information from someone spending 10 days in Thailand.&lt;/p&gt;

&lt;p&gt;So the system needed to understand the &lt;strong&gt;trip&lt;/strong&gt;, not just the destination.&lt;/p&gt;

&lt;p&gt;That became the foundation.&lt;/p&gt;




&lt;h2&gt;
  
  
  A trip isn't just a destination
&lt;/h2&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%2Fsjdcp1cmiig1qjrymy00.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%2Fsjdcp1cmiig1qjrymy00.png" alt="Create Trip" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same country can mean completely different preparation depending on who's travelling.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sri Lanka
    ↓
Germany
    ↓
Student
    ↓
Long-term
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is completely different from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sri Lanka
    ↓
Germany
    ↓
Tourist
    ↓
10 days
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So Tripora starts by asking a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where are you travelling from?&lt;/li&gt;
&lt;li&gt;Where are you going?&lt;/li&gt;
&lt;li&gt;What's your nationality?&lt;/li&gt;
&lt;li&gt;Why are you going?&lt;/li&gt;
&lt;li&gt;When are you going?&lt;/li&gt;
&lt;li&gt;How long are you staying?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those inputs become the &lt;strong&gt;trip profile&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then the system uses that profile to decide what information is relevant.&lt;/p&gt;




&lt;h2&gt;
  
  
  197 countries later...
&lt;/h2&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%2F7s0yxlogspqfe7ubc7b6.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%2F7s0yxlogspqfe7ubc7b6.png" alt="Discovery" width="799" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where the project got slightly out of hand.&lt;/p&gt;

&lt;p&gt;The current database covers &lt;strong&gt;197 countries&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And each country isn't just a name and a description.&lt;/p&gt;

&lt;p&gt;There can be information about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visa requirements&lt;/li&gt;
&lt;li&gt;Processing times&lt;/li&gt;
&lt;li&gt;Required documents&lt;/li&gt;
&lt;li&gt;Airports&lt;/li&gt;
&lt;li&gt;Airport transfers&lt;/li&gt;
&lt;li&gt;Transport&lt;/li&gt;
&lt;li&gt;SIM/eSIM providers&lt;/li&gt;
&lt;li&gt;Accommodation&lt;/li&gt;
&lt;li&gt;Costs&lt;/li&gt;
&lt;li&gt;Safety&lt;/li&gt;
&lt;li&gt;Emergency contacts&lt;/li&gt;
&lt;li&gt;Local etiquette&lt;/li&gt;
&lt;li&gt;Language&lt;/li&gt;
&lt;li&gt;Currency&lt;/li&gt;
&lt;li&gt;Useful official links&lt;/li&gt;
&lt;li&gt;Arrival information&lt;/li&gt;
&lt;li&gt;Packing rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At some point I stopped thinking of it as a collection of country pages.&lt;/p&gt;

&lt;p&gt;It's more like a &lt;strong&gt;travel knowledge base&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  The interesting engineering problem wasn't the UI
&lt;/h1&gt;

&lt;p&gt;The UI was actually the easy part.&lt;/p&gt;

&lt;p&gt;The harder question was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you structure travel information so that it can work across thousands of different trip combinations?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn't want this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if Japan:
    show Japan stuff

if Germany:
    show Germany stuff

if Australia:
    show Australia stuff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That would become painful very quickly.&lt;/p&gt;

&lt;p&gt;Instead, the data is separated into different concepts.&lt;/p&gt;

&lt;p&gt;Something roughly like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Country
 ├── Airports
 ├── Visa Requirements
 ├── Transport
 ├── Accommodation
 ├── Internet Providers
 ├── Emergency Contacts
 ├── Arrival Information
 ├── Useful Links
 └── Packing Rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then a trip is another layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trip
 ├── Origin
 ├── Destination
 ├── Nationality
 ├── Purpose
 ├── Dates
 └── Duration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the application combines those things.&lt;/p&gt;

&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trip Profile
      ↓
Destination Data
      ↓
Relevant Rules
      ↓
Preparation Plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's what allows the same system to work for both a short holiday and a year-long move.&lt;/p&gt;




&lt;h1&gt;
  
  
  Visa information was where things got serious
&lt;/h1&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%2Fiyu2ztayi444skwwly1f.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%2Fiyu2ztayi444skwwly1f.png" alt="Visa Informations" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Travel information is one thing.&lt;/p&gt;

&lt;p&gt;Visa information is another.&lt;/p&gt;

&lt;p&gt;It's the kind of information where being "mostly correct" isn't good enough.&lt;/p&gt;

&lt;p&gt;I didn't want to create pages saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You might need a visa. Check the embassy."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's technically safe, but not particularly useful.&lt;/p&gt;

&lt;p&gt;The system can instead organise information around the traveller's nationality and destination.&lt;/p&gt;

&lt;p&gt;Where available, information can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visa type&lt;/li&gt;
&lt;li&gt;Processing time&lt;/li&gt;
&lt;li&gt;Fees&lt;/li&gt;
&lt;li&gt;Required documents&lt;/li&gt;
&lt;li&gt;Application information&lt;/li&gt;
&lt;li&gt;Official sources&lt;/li&gt;
&lt;li&gt;Verification date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And important information is associated with a source.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Visa requirement

Source:
Official government website

Last verified:
July 2026
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last field matters.&lt;/p&gt;

&lt;p&gt;Because a database entry shouldn't quietly become "truth forever".&lt;/p&gt;

&lt;p&gt;Visa rules change.&lt;/p&gt;

&lt;p&gt;Fees change.&lt;/p&gt;

&lt;p&gt;Processing times change.&lt;/p&gt;

&lt;p&gt;So one of the principles behind the project is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If information can change, it should have a source and a verification date.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And for anything involving immigration or entry requirements, the official authority remains the final source of truth.&lt;/p&gt;




&lt;h1&gt;
  
  
  Then came the Visa Timeline
&lt;/h1&gt;

&lt;p&gt;Knowing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Processing takes approximately 30 days"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;is useful.&lt;/p&gt;

&lt;p&gt;But it's still not quite the same as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What should I be doing 90 days before my flight?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the visa information became a timeline.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;T-90
Check requirements

T-75
Gather documents

T-60
Apply

T-30
Check application progress

T-14
Review travel documents

T-7
Final checks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual dates depend on the information available for the destination and nationality.&lt;/p&gt;

&lt;p&gt;The point isn't to predict the future.&lt;/p&gt;

&lt;p&gt;It's to turn a static requirement into an actionable sequence.&lt;/p&gt;




&lt;h1&gt;
  
  
  Packing turned out to be its own little system
&lt;/h1&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%2Fceq7h5yywoe3gpz8q10v.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%2Fceq7h5yywoe3gpz8q10v.png" alt="Smart Packing" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also didn't want a packing list that just says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Passport
Toothbrush
Clothes
Charger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because that's technically a packing list for literally every trip ever.&lt;/p&gt;

&lt;p&gt;Packing depends on context.&lt;/p&gt;

&lt;p&gt;A winter trip to Japan is different from a summer trip to Thailand.&lt;/p&gt;

&lt;p&gt;Moving abroad for university is different from a five-day holiday.&lt;/p&gt;

&lt;p&gt;So Tripora currently has:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;72 packing items&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;74 country-specific rules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The rules can take into account things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Destination&lt;/li&gt;
&lt;li&gt;Trip type&lt;/li&gt;
&lt;li&gt;Duration&lt;/li&gt;
&lt;li&gt;Climate&lt;/li&gt;
&lt;li&gt;Country-specific considerations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a checklist that changes with the trip.&lt;/p&gt;

&lt;p&gt;And then you can actually tick everything off.&lt;/p&gt;

&lt;p&gt;Simple feature, but surprisingly useful.&lt;/p&gt;




&lt;h1&gt;
  
  
  The T-90 problem
&lt;/h1&gt;

&lt;p&gt;There's another problem with checklists.&lt;/p&gt;

&lt;p&gt;A list of 30 things doesn't tell you &lt;strong&gt;when&lt;/strong&gt; to do them.&lt;/p&gt;

&lt;p&gt;So there is also a pre-trip timeline.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;☐ Visa
☐ Accommodation
☐ Packing
☐ SIM
☐ Documents
☐ Insurance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you get something closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;90+ days
Visa research
Important documents

60 days
Visa application
Accommodation

30 days
Travel arrangements
Insurance
SIM research

7 days
Packing
Document backup
Airport preparation

Departure day
Passport
Boarding pass
Money
Phone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The whole idea is to make the preparation feel less like a giant task dumped on you the night before.&lt;/p&gt;




&lt;h1&gt;
  
  
  The airport is part of the trip too
&lt;/h1&gt;

&lt;p&gt;A flight booking tells you how to get there.&lt;/p&gt;

&lt;p&gt;It doesn't necessarily tell you what happens when you arrive.&lt;/p&gt;

&lt;p&gt;So destination information also covers things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Airport terminals&lt;/li&gt;
&lt;li&gt;Getting into the city&lt;/li&gt;
&lt;li&gt;Public transport&lt;/li&gt;
&lt;li&gt;Taxi options&lt;/li&gt;
&lt;li&gt;Wi-Fi&lt;/li&gt;
&lt;li&gt;Currency exchange&lt;/li&gt;
&lt;li&gt;Lounge information&lt;/li&gt;
&lt;li&gt;Useful airport information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then there's the arrival guide.&lt;/p&gt;

&lt;p&gt;Because arriving somewhere you've never been before at 11 PM with no mobile data is a very different experience from looking at the same destination on Google Maps from your bedroom.&lt;/p&gt;




&lt;h1&gt;
  
  
  The SIM card problem
&lt;/h1&gt;

&lt;p&gt;This is one of those tiny things that can completely ruin the first hour of a trip.&lt;/p&gt;

&lt;p&gt;You arrive.&lt;/p&gt;

&lt;p&gt;Your normal SIM doesn't work.&lt;/p&gt;

&lt;p&gt;You don't know which local provider is good.&lt;/p&gt;

&lt;p&gt;You don't know whether the airport sells SIMs.&lt;/p&gt;

&lt;p&gt;You don't know whether you should use an eSIM.&lt;/p&gt;

&lt;p&gt;So destination guides include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local providers&lt;/li&gt;
&lt;li&gt;SIM availability&lt;/li&gt;
&lt;li&gt;eSIM availability&lt;/li&gt;
&lt;li&gt;Where to buy&lt;/li&gt;
&lt;li&gt;Data plan information&lt;/li&gt;
&lt;li&gt;Provider websites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, this is information that changes, so it needs to be maintained rather than treated as permanent.&lt;/p&gt;




&lt;h1&gt;
  
  
  What about the first few days?
&lt;/h1&gt;

&lt;p&gt;For longer trips, especially study, work and moving abroad, the journey doesn't really end when you reach the hotel.&lt;/p&gt;

&lt;p&gt;There are still things to figure out.&lt;/p&gt;

&lt;p&gt;Where's the university?&lt;/p&gt;

&lt;p&gt;Where do I get essentials?&lt;/p&gt;

&lt;p&gt;How does local transport work?&lt;/p&gt;

&lt;p&gt;What local formalities might I need to deal with?&lt;/p&gt;

&lt;p&gt;Where can I get connected?&lt;/p&gt;

&lt;p&gt;So there are also first-days and arrival guides.&lt;/p&gt;

&lt;p&gt;The goal is basically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't just help me get there. Help me know what happens next.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Comparing destinations
&lt;/h1&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%2Fpsuf3hzst4xr3r89j6o1.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%2Fpsuf3hzst4xr3r89j6o1.png" alt="Trip Comparison" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then another use case appeared.&lt;/p&gt;

&lt;p&gt;Sometimes you're not sure where you're going yet.&lt;/p&gt;

&lt;p&gt;Maybe you're comparing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Japan
South Korea
Thailand
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Germany
Netherlands
Australia
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of researching each destination separately, Tripora can compare things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visa requirements&lt;/li&gt;
&lt;li&gt;Costs&lt;/li&gt;
&lt;li&gt;Weather&lt;/li&gt;
&lt;li&gt;Safety&lt;/li&gt;
&lt;li&gt;General preparation&lt;/li&gt;
&lt;li&gt;Requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn't try to decide for you.&lt;/p&gt;

&lt;p&gt;It just makes the research less painful.&lt;/p&gt;




&lt;h1&gt;
  
  
  There is also a human side to the data
&lt;/h1&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%2Fyqa468v4ie06r4nx2x08.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%2Fyqa468v4ie06r4nx2x08.png" alt="Community" width="799" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Official websites are important.&lt;/p&gt;

&lt;p&gt;But official websites don't tell you everything.&lt;/p&gt;

&lt;p&gt;A government website can tell you the official visa process.&lt;/p&gt;

&lt;p&gt;It usually can't tell you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I applied from the US and got my passport back in five days."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's why Tripora also has &lt;strong&gt;Visa Timeline Reports&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Travellers can share their actual experiences.&lt;/p&gt;

&lt;p&gt;There are also community posts and comments for destination-specific questions and tips.&lt;/p&gt;

&lt;p&gt;The idea is to keep the two types of information separate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official information tells you the rules.&lt;/strong&gt;&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%2Fdwye25h3ownlzfwmxu08.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%2Fdwye25h3ownlzfwmxu08.png" alt="Official information of countries" width="799" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community information tells you what someone's experience was like.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One shouldn't pretend to replace the other.&lt;/p&gt;




&lt;h1&gt;
  
  
  A few features that came naturally from the same idea
&lt;/h1&gt;

&lt;p&gt;Once the core trip system existed, a few other things made sense:&lt;/p&gt;

&lt;h3&gt;
  
  
  Trip sharing
&lt;/h3&gt;

&lt;p&gt;Share a complete trip plan with someone you're travelling with.&lt;/p&gt;

&lt;h3&gt;
  
  
  PDF export
&lt;/h3&gt;

&lt;p&gt;Save the plan as a PDF for offline use.&lt;/p&gt;

&lt;h3&gt;
  
  
  PWA
&lt;/h3&gt;

&lt;p&gt;Install Tripora on your phone and keep important information accessible while travelling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Readiness score
&lt;/h3&gt;

&lt;p&gt;Instead of staring at a huge checklist, see how prepared you are.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;76% ready

3 important things remaining
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The score is based on actual completed preparation tasks rather than being a random progress number.&lt;/p&gt;




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

&lt;p&gt;The current stack is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Next.js 16
TypeScript
Tailwind CSS
shadcn/ui
Supabase
PostgreSQL
Vercel
PWA / Service Worker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application is server-rendered where it makes sense, with API routes handling data operations.&lt;/p&gt;

&lt;p&gt;Supabase handles the PostgreSQL database and authentication.&lt;/p&gt;

&lt;p&gt;Vercel handles deployment.&lt;/p&gt;

&lt;p&gt;Nothing particularly exotic.&lt;/p&gt;

&lt;p&gt;And honestly, I think that's a good thing.&lt;/p&gt;

&lt;p&gt;The interesting part isn't using 25 technologies.&lt;/p&gt;

&lt;p&gt;It's figuring out how to turn messy real-world information into something that is actually useful.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why I didn't make it an AI chatbot
&lt;/h1&gt;

&lt;p&gt;This was a deliberate decision.&lt;/p&gt;

&lt;p&gt;It would be very easy to put a big box on the homepage saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ask AI anything about your trip."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But imagine asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Do I need a visa?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and getting a confidently wrong answer.&lt;/p&gt;

&lt;p&gt;That's not something I wanted to build around.&lt;/p&gt;

&lt;p&gt;So the current system is based more on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Curated data
      +
Sources
      +
Rules
      +
Trip context
      ↓
Personalised preparation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rather than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
   ↓
LLM
   ↓
Hopefully correct answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI could still become useful later.&lt;/p&gt;

&lt;p&gt;But I'd rather have AI sit &lt;strong&gt;on top of verified information&lt;/strong&gt; than have it become the source of truth.&lt;/p&gt;




&lt;h1&gt;
  
  
  There are still a lot of things I'd like to improve
&lt;/h1&gt;

&lt;p&gt;Some of the next problems I'd like to tackle are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live flight information&lt;/li&gt;
&lt;li&gt;Weather-based preparation&lt;/li&gt;
&lt;li&gt;Better currency information&lt;/li&gt;
&lt;li&gt;eSIM comparisons&lt;/li&gt;
&lt;li&gt;More community reports&lt;/li&gt;
&lt;li&gt;Document organisation&lt;/li&gt;
&lt;li&gt;Notifications&lt;/li&gt;
&lt;li&gt;Better offline functionality&lt;/li&gt;
&lt;li&gt;More detailed country-to-country preparation&lt;/li&gt;
&lt;li&gt;Native mobile apps&lt;/li&gt;
&lt;li&gt;An AI assistant grounded in Tripora's own verified data&lt;/li&gt;
&lt;li&gt;Daily update about each country&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I don't want to turn it into a giant feature list just for the sake of it.&lt;/p&gt;

&lt;p&gt;The basic idea is still the same:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You shouldn't need to become a travel researcher just to travel somewhere.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are already plenty of websites that help you decide where to go and what to do when you get there.&lt;/p&gt;

&lt;p&gt;The less exciting — but arguably more important — part is everything you have to figure out &lt;strong&gt;before you leave.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the problem I'm interested in.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you travel, I'm curious about something
&lt;/h2&gt;

&lt;p&gt;What's the one thing you &lt;strong&gt;always&lt;/strong&gt; end up searching for before an international trip?&lt;/p&gt;

&lt;p&gt;Not necessarily something you think Tripora needs.&lt;/p&gt;

&lt;p&gt;Just the thing that makes you think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Why is this information so damn difficult to find?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the kind of problem I'm interested in solving next.&lt;/p&gt;

&lt;p&gt;🌍 &lt;strong&gt;&lt;a href="https://www.tripora.space" rel="noopener noreferrer"&gt;Tripora&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Built a Modern ERP for Startups &amp; Small Businesses Instead of Another To-Do App</title>
      <dc:creator>Nimash Mendis</dc:creator>
      <pubDate>Fri, 24 Jul 2026 08:15:44 +0000</pubDate>
      <link>https://dev.to/nimash_mendis_dev_02/i-built-a-modern-erp-for-startups-small-businesses-instead-of-another-to-do-app-4mjj</link>
      <guid>https://dev.to/nimash_mendis_dev_02/i-built-a-modern-erp-for-startups-small-businesses-instead-of-another-to-do-app-4mjj</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Modern ERP for Startups &amp;amp; Small Businesses Instead of Another To-Do App
&lt;/h1&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%2Frxqtxce7elt5dzkrk8u6.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%2Frxqtxce7elt5dzkrk8u6.png" alt=" " width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How a simple idea evolved into a customizable business management platform—and why I believe small businesses deserve software that's powerful, modern, and actually affordable.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;When developers build side projects, it's common to create another to-do app, weather app, or AI wrapper. There's nothing wrong with that—I built plenty of learning projects myself.&lt;/p&gt;

&lt;p&gt;But at some point, I wanted to build something that could solve a real business problem.&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;Opero&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A modern, cloud-based business management platform designed for startups and small businesses that need more than spreadsheets—but don't want the complexity and cost of enterprise software.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Problem I Kept Seeing
&lt;/h1&gt;

&lt;p&gt;When talking to small business owners, I noticed the same challenges over and over again.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer information stored in Excel&lt;/li&gt;
&lt;li&gt;Inventory tracked manually&lt;/li&gt;
&lt;li&gt;Sales managed through WhatsApp&lt;/li&gt;
&lt;li&gt;Purchase orders created in Word documents&lt;/li&gt;
&lt;li&gt;Invoices scattered across multiple systems&lt;/li&gt;
&lt;li&gt;No real-time visibility into the business&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As companies grow, these small problems become expensive.&lt;/p&gt;

&lt;p&gt;Employees waste time searching for information.&lt;/p&gt;

&lt;p&gt;Stock runs out unexpectedly.&lt;/p&gt;

&lt;p&gt;Reports take hours to prepare.&lt;/p&gt;

&lt;p&gt;Owners don't have a clear picture of what's happening in the business.&lt;/p&gt;

&lt;p&gt;Large ERP platforms like SAP or Microsoft Dynamics can solve many of these issues—but they're often too expensive or too complicated for smaller companies.&lt;/p&gt;

&lt;p&gt;I wanted to build something different.&lt;/p&gt;




&lt;h1&gt;
  
  
  Introducing Opero
&lt;/h1&gt;

&lt;p&gt;Opero is a modern ERP platform designed specifically for startups and growing businesses.&lt;/p&gt;

&lt;p&gt;Instead of forcing companies to use five different applications, Opero centralizes everything into one platform.&lt;/p&gt;

&lt;p&gt;Current modules include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📊 Dashboard&lt;/li&gt;
&lt;li&gt;👥 Customer Management&lt;/li&gt;
&lt;li&gt;📦 Product Management&lt;/li&gt;
&lt;li&gt;📦 Inventory Management&lt;/li&gt;
&lt;li&gt;🏢 Supplier Management&lt;/li&gt;
&lt;li&gt;🛒 Sales Orders&lt;/li&gt;
&lt;li&gt;📋 Purchase Orders&lt;/li&gt;
&lt;li&gt;💰 Invoices&lt;/li&gt;
&lt;li&gt;📈 Reports &amp;amp; Analytics&lt;/li&gt;
&lt;li&gt;🔔 Notification Center&lt;/li&gt;
&lt;li&gt;👤 User Management&lt;/li&gt;
&lt;li&gt;🔐 Role-Based Access Control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything works together as a single ecosystem.&lt;/p&gt;




&lt;h1&gt;
  
  
  My Favorite Feature: Smart Reorder Engine
&lt;/h1&gt;

&lt;p&gt;Almost every inventory system has a &lt;strong&gt;Low Stock&lt;/strong&gt; warning.&lt;/p&gt;

&lt;p&gt;But here's the problem.&lt;/p&gt;

&lt;p&gt;When you see:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Low Stock&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;it's often already too late.&lt;/p&gt;

&lt;p&gt;You should have reordered days earlier.&lt;/p&gt;

&lt;p&gt;Instead of another low-stock alert, I built something smarter.&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%2F61kxs8kc9xmfvtjbvchp.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%2F61kxs8kc9xmfvtjbvchp.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Smart Reorder Engine
&lt;/h2&gt;

&lt;p&gt;The system analyzes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Historical sales&lt;/li&gt;
&lt;li&gt;Daily sales velocity&lt;/li&gt;
&lt;li&gt;Current inventory&lt;/li&gt;
&lt;li&gt;Supplier lead times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then predicts:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"This product will run out in approximately 12 days."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even better, it automatically prepares a purchase order draft that the business owner simply reviews and approves.&lt;/p&gt;

&lt;p&gt;Instead of reacting to problems, businesses can prevent them before they happen.&lt;/p&gt;

&lt;p&gt;For small businesses without dedicated inventory managers, this feature can save hours every week while reducing both overstocking and stock shortages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Calculating Stock-Out Predictions
&lt;/h3&gt;

&lt;p&gt;One of the core ideas behind the Smart Reorder Engine is predicting &lt;strong&gt;when&lt;/strong&gt; inventory will run out instead of simply checking if it's has reached a minimum quantity.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dailySales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;salesLast90Days&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;daysUntilStockout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentStock&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dailySales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reorderNow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;daysUntilStockout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;supplierLeadTimeDays&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;daysUntilStockout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;reorderNow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of displaying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Low Stock&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Opero displays something much more useful:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Wireless Mouse will run out in approximately 12 days."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Modern Architecture
&lt;/h1&gt;

&lt;p&gt;I wanted Opero to be scalable from day one.&lt;/p&gt;

&lt;p&gt;Here's the technology stack I chose.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;React 19&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;React Router&lt;/li&gt;
&lt;li&gt;Recharts&lt;/li&gt;
&lt;li&gt;Lucide Icons&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express.js&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Zod Validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Database
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Supabase&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Frontend → Vercel&lt;/li&gt;
&lt;li&gt;Backend → Railway&lt;/li&gt;
&lt;li&gt;Database → Supabase&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Building for Scale
&lt;/h1&gt;

&lt;p&gt;Rather than placing all logic inside controllers, I followed a clean architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A[Controller] --&amp;gt; B[Service]
    B --&amp;gt; C[Repository]
    C --&amp;gt; D[(PostgreSQL)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps business logic separate from routing and database access, making the application much easier to maintain as it grows.&lt;/p&gt;

&lt;p&gt;The platform also includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-tenancy&lt;/li&gt;
&lt;li&gt;UUID-based entities&lt;/li&gt;
&lt;li&gt;Soft deletes&lt;/li&gt;
&lt;li&gt;Organization isolation&lt;/li&gt;
&lt;li&gt;Role-Based Access Control&lt;/li&gt;
&lt;li&gt;Protected frontend routes&lt;/li&gt;
&lt;li&gt;Modular API structure&lt;/li&gt;
&lt;li&gt;Comprehensive validation&lt;/li&gt;
&lt;li&gt;Secure authentication&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Repository Pattern
&lt;/h2&gt;

&lt;p&gt;Instead of writing SQL inside controllers, every module follows the Repository Pattern.&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&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;products&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation keeps controllers lightweight and makes testing significantly easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Multi-Tenant by Design
&lt;/h2&gt;

&lt;p&gt;Every query is automatically scoped to an organization.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&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;productsTable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;productsTable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;organizationId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;organizationId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows multiple companies to use the same application while ensuring every organization only sees its own data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Role-Based Access Control
&lt;/h2&gt;

&lt;p&gt;Every page and action is protected using permissions.&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hasPermission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Permission&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;hasPermission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;products.create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unauthorized&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opero currently supports five roles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Owner&lt;/li&gt;
&lt;li&gt;Admin&lt;/li&gt;
&lt;li&gt;Manager&lt;/li&gt;
&lt;li&gt;Employee&lt;/li&gt;
&lt;li&gt;Viewer&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Request Validation
&lt;/h2&gt;

&lt;p&gt;Every API request is validated before reaching the business logic.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CreateProductSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;positive&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;nonnegative&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using Zod significantly reduces invalid requests while keeping API responses predictable.&lt;/p&gt;




&lt;h1&gt;
  
  
  One Platform, Multiple Industries
&lt;/h1&gt;

&lt;p&gt;While developing Opero, I realized something interesting.&lt;/p&gt;

&lt;p&gt;The core architecture wasn't limited to inventory management.&lt;/p&gt;

&lt;p&gt;It could be adapted to completely different industries simply by changing the workflow.&lt;/p&gt;

&lt;p&gt;That's how &lt;strong&gt;Opero Agency&lt;/strong&gt; was born.&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%2Fdvw1safpbsqkfb753a3e.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%2Fdvw1safpbsqkfb753a3e.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of products and inventory, Opero Agency manages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Candidates&lt;/li&gt;
&lt;li&gt;Employers&lt;/li&gt;
&lt;li&gt;Deployments&lt;/li&gt;
&lt;li&gt;Document Tracking&lt;/li&gt;
&lt;li&gt;Visa Status&lt;/li&gt;
&lt;li&gt;Service Fees&lt;/li&gt;
&lt;li&gt;Compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although the interface is different, both platforms share the same architecture and backend philosophy.&lt;/p&gt;

&lt;p&gt;This means new industry-specific solutions can be developed much faster while sharing a proven foundation.&lt;/p&gt;




&lt;h1&gt;
  
  
  Lessons I Learned
&lt;/h1&gt;

&lt;p&gt;Building Opero taught me much more than writing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software Should Solve Business Problems
&lt;/h2&gt;

&lt;p&gt;The most valuable feature isn't always the most technically impressive.&lt;/p&gt;

&lt;p&gt;Sometimes the biggest improvement is eliminating repetitive manual work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Matters
&lt;/h2&gt;

&lt;p&gt;As projects grow, structure becomes more important than speed.&lt;/p&gt;

&lt;p&gt;Investing time in clean architecture early made adding new modules significantly easier later.&lt;/p&gt;




&lt;h2&gt;
  
  
  User Feedback Is Everything
&lt;/h2&gt;

&lt;p&gt;Many features I initially considered important changed after talking to business owners.&lt;/p&gt;

&lt;p&gt;Listening to users completely reshaped my roadmap.&lt;/p&gt;




&lt;h2&gt;
  
  
  Shipping Beats Perfection
&lt;/h2&gt;

&lt;p&gt;No software is ever finished.&lt;/p&gt;

&lt;p&gt;Instead of waiting until everything was perfect, I focused on shipping improvements continuously.&lt;/p&gt;

&lt;p&gt;That approach has helped Opero evolve much faster.&lt;/p&gt;




&lt;h1&gt;
  
  
  What's Next?
&lt;/h1&gt;

&lt;p&gt;Opero is still actively evolving.&lt;/p&gt;

&lt;p&gt;Some of the upcoming features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workflow Automation&lt;/li&gt;
&lt;li&gt;Email Notifications&lt;/li&gt;
&lt;li&gt;Better Reporting&lt;/li&gt;
&lt;li&gt;API Integrations&lt;/li&gt;
&lt;li&gt;Mobile Optimization&lt;/li&gt;
&lt;li&gt;Additional Industry Modules&lt;/li&gt;
&lt;li&gt;AI-Assisted Business Insights&lt;/li&gt;
&lt;li&gt;Customer Portals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The long-term vision isn't simply to build another ERP.&lt;/p&gt;

&lt;p&gt;It's to create a platform that businesses can customize around their own workflows.&lt;/p&gt;




&lt;h1&gt;
  
  
  Looking for Early Users
&lt;/h1&gt;

&lt;p&gt;Opero is currently available for early testing.&lt;/p&gt;

&lt;p&gt;I'm looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Startup founders&lt;/li&gt;
&lt;li&gt;Small business owners&lt;/li&gt;
&lt;li&gt;Developers&lt;/li&gt;
&lt;li&gt;Operations managers&lt;/li&gt;
&lt;li&gt;Anyone interested in modern business software&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your feedback will directly influence the future direction of the platform.&lt;/p&gt;




&lt;h1&gt;
  
  
  Live Demo
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🚀 Opero ERP
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opero-orcin.vercel.app/" rel="noopener noreferrer"&gt;https://opero-orcin.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo Credentials
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Email&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;demo2@opero.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Password&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Demo1234!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌍 Opero Agency
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opero-agency-sys.vercel.app/" rel="noopener noreferrer"&gt;https://opero-agency-sys.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo Credentials
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Email&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admin@operoagency.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Password&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Demo1234!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Let's Connect
&lt;/h1&gt;

&lt;p&gt;If you're building a startup, running a business, or simply interested in ERP systems, I'd love to hear your thoughts.&lt;/p&gt;

&lt;p&gt;I'm always open to feedback, feature suggestions, and discussions about business software.&lt;/p&gt;

&lt;p&gt;If your company needs a &lt;strong&gt;custom web-based management system&lt;/strong&gt;, &lt;strong&gt;ERP solution&lt;/strong&gt;, &lt;strong&gt;workflow automation&lt;/strong&gt;, or a completely tailored business platform, feel free to reach out. My goal is to build software around real business workflows instead of forcing businesses to adapt to generic tools.&lt;/p&gt;




&lt;h1&gt;
  
  
  About Me
&lt;/h1&gt;

&lt;p&gt;I'm &lt;strong&gt;Nimash Mendis&lt;/strong&gt;, a Full-Stack Software Engineer and a &lt;strong&gt;BSc in ICT undergraduate&lt;/strong&gt; at &lt;strong&gt;Sukhoi State Technical University (Belarus)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm passionate about building scalable SaaS products and modern business software that help companies simplify operations and grow efficiently.&lt;/p&gt;

&lt;p&gt;📧 &lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:nimashmendis.dev@gmail.com"&gt;nimashmendis.dev@gmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="https://www.nimashmendis.xyz" rel="noopener noreferrer"&gt;https://www.nimashmendis.xyz&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Thanks for Reading! 🚀
&lt;/h1&gt;

&lt;p&gt;If you have any suggestions, feature ideas, or constructive feedback, I'd genuinely love to hear them.&lt;/p&gt;

&lt;p&gt;Every conversation helps make &lt;strong&gt;Opero&lt;/strong&gt; better.&lt;/p&gt;

&lt;p&gt;⭐ If you'd like to support the project, try the live demo, share your feedback, or get in touch if you're interested in implementing Opero or building a custom business system for your company.&lt;/p&gt;

</description>
      <category>saas</category>
      <category>webdev</category>
      <category>react</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
