<?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: Filip Frincu</title>
    <description>The latest articles on DEV Community by Filip Frincu (@filipf).</description>
    <link>https://dev.to/filipf</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1329185%2F0337bab1-da48-48c7-8aea-9f6d0c2c0dd2.jpg</url>
      <title>DEV Community: Filip Frincu</title>
      <link>https://dev.to/filipf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/filipf"/>
    <language>en</language>
    <item>
      <title>The tech stack behind InkRows</title>
      <dc:creator>Filip Frincu</dc:creator>
      <pubDate>Tue, 06 Jan 2026 08:01:32 +0000</pubDate>
      <link>https://dev.to/filipf/the-tech-stack-behind-inkrows-ne</link>
      <guid>https://dev.to/filipf/the-tech-stack-behind-inkrows-ne</guid>
      <description>&lt;p&gt;&lt;a href="https://www.inkrows.com/" rel="noopener noreferrer"&gt;InkRows&lt;/a&gt; is a modern note-taking app designed to work seamlessly across web and mobile platforms. Behind its clean, intuitive interface lies technology stack that prioritizes developer experience, performance, and user engagement. Let’s explore the technical architecture that powers InkRows.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚛️ Frontend: React 19 with TypeScript
&lt;/h2&gt;

&lt;p&gt;At the core of InkRows is &lt;a href="https://react.dev" rel="noopener noreferrer"&gt;React&lt;/a&gt;, paired with &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;. I find typescript really usefull when the project grows or when a refactoring is taking place or a package gets updated. Regarding react, well, I think you already know what it does.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏗️ Build System: Vite 7 with SWC
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;Vite&lt;/a&gt; made a huge difference in development speed. The instant server startup and hot module replacement are snappy, and build times are fast. For transpilation, I use &lt;a href="https://swc.rs/" rel="noopener noreferrer"&gt;SWC&lt;/a&gt; instead of Babel, which keeps things even faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  📱 Cross-Platform Mobile: Capacitor 8
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://capacitorjs.com/" rel="noopener noreferrer"&gt;Capacitor&lt;/a&gt; handles the cross-platform piece. I write the app once in React/TypeScript and deploy to web, iOS, and Android without maintaining separate codebases. It bridges web and native APIs through plugins, so I can access native features like the camera and system functionality when needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 Styling: Tailwind CSS 4 with PostCSS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; keeps styling consistent and fast. The utility-first approach means I don't waste time naming classes or managing CSS organization. With the &lt;a href="https://tailwindcss.com/docs/vite" rel="noopener noreferrer"&gt;Vite integration&lt;/a&gt; and &lt;a href="https://postcss.org/" rel="noopener noreferrer"&gt;PostCSS&lt;/a&gt; transformations, the build stays lean.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 State Management: Zustand
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/pmndrs/zustand" rel="noopener noreferrer"&gt;Zustand&lt;/a&gt; handles state management without the Redux boilerplate. The store is organized into slices (userSlice, todosSlice, tagsSlice, settingsSlice) which keeps state mutations predictable and testable.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✍️ Rich Text Editing: Lexical
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://lexical.dev/" rel="noopener noreferrer"&gt;Lexical&lt;/a&gt; powers the note editor. It's built by Meta and performs well compared to older ContentEditable-based editors. The plugin system makes it easy to extend with custom formatting and table support and actually anything you have in mind. The guys at Meta did a really great job.&lt;/p&gt;

&lt;h2&gt;
  
  
  💾 Data Persistence: Multiple Layers
&lt;/h2&gt;

&lt;p&gt;InkRows has a mores complex persistence strategy:&lt;/p&gt;

&lt;h3&gt;
  
  
  ☁️ Backend: Supabase
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; handles the backend with PostgreSQL, authentication, Edge Functions, and S3 file storage. Real-time subscriptions keep data synced across clients.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏠 Local Storage: Dexie
&lt;/h3&gt;

&lt;p&gt;For offline support, I use &lt;a href="https://dexie.org/" rel="noopener noreferrer"&gt;Dexie&lt;/a&gt;, an IndexedDB wrapper that persists data locally and syncs with Supabase when online. This enables optimistic UI updates and a snappy experience even without a connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 Data Querying: TanStack Query
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tanstack.com/query" rel="noopener noreferrer"&gt;TanStack Query&lt;/a&gt; handles server state caching and synchronization. Background refetching keeps data fresh, and optimistic updates make the UI feel responsive.&lt;/p&gt;

&lt;h2&gt;
  
  
  💰 Monetization: Stripe Integration
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt; powers the payments. Supabase Edge Functions handle webhook validation and subscription management.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 UI Component Library: HeroUI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://heroui.com/" rel="noopener noreferrer"&gt;HeroUI&lt;/a&gt; provides accessible, pre-built components that work well with Tailwind CSS. So far, I think this is one of the best UI libraries so make sure you check it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Animation &amp;amp; Interaction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.framer.com/motion/" rel="noopener noreferrer"&gt;Framer Motion&lt;/a&gt; handles animations and gestures smoothly. &lt;a href="https://docs.dndkit.com/" rel="noopener noreferrer"&gt;dnd-kit&lt;/a&gt; provides accessible drag-and-drop for list sorting and other interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Analytics &amp;amp; Feedback
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://posthog.com/" rel="noopener noreferrer"&gt;PostHog&lt;/a&gt; tracks product analytics, and a Supabase function handle custom feedback collection.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Progressive Web App (PWA)
&lt;/h2&gt;

&lt;p&gt;InkRows works offline as a PWA with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service Worker&lt;/strong&gt; for offline functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App manifest&lt;/strong&gt; for installable experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workbox&lt;/strong&gt; for advanced caching strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏛️ Architecture Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📦 Modular Organization
&lt;/h3&gt;

&lt;p&gt;The codebase is organized by feature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;src/
├── features/        &lt;span class="c"&gt;# Feature-specific modules&lt;/span&gt;
├── shared/          &lt;span class="c"&gt;# Reusable components, hooks, utils&lt;/span&gt;
├── services/        &lt;span class="c"&gt;# API and external service integrations&lt;/span&gt;
├── app/             &lt;span class="c"&gt;# Application state and handlers&lt;/span&gt;
└── config/          &lt;span class="c"&gt;# Centralized configuration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🛡️ Type Safety
&lt;/h3&gt;

&lt;p&gt;With TypeScript and &lt;code&gt;skipLibCheck: false&lt;/code&gt;, I ensure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;End-to-end type safety&lt;/li&gt;
&lt;li&gt;Auto-generated Supabase types&lt;/li&gt;
&lt;li&gt;Props validation and better IDE support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Development Experience
&lt;/h2&gt;

&lt;p&gt;The development setup includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast HMR with Vite's native ES modules&lt;/li&gt;
&lt;li&gt;Multiple build configurations for web, iOS, and Android&lt;/li&gt;
&lt;li&gt;Live reload support for mobile development&lt;/li&gt;
&lt;li&gt;Environment variable management via Vite's loadEnv
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev                 &lt;span class="c"&gt;# Web development&lt;/span&gt;
npm run ionic:dev:ios       &lt;span class="c"&gt;# iOS development with live reload&lt;/span&gt;
npm run ionic:dev:android   &lt;span class="c"&gt;# Android development with live reload&lt;/span&gt;
npm run build               &lt;span class="c"&gt;# Production build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;InkRows deploys as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web&lt;/strong&gt;: Static site hosting (Netlify)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS&lt;/strong&gt;: TestFlight and App Store via Xcode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android&lt;/strong&gt;: Google Play Store via gradle builds&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏁 Conclusion
&lt;/h2&gt;

&lt;p&gt;The tech stack reflects practical choices made during development. React handles the UI, Capacitor manages cross-platform deployment, and Supabase provides the backend. Each library was chosen to balance developer productivity, user experience, code quality, and the ability to ship across multiple platforms without maintaining separate codebases.&lt;/p&gt;

&lt;p&gt;If you're building a cross-platform app or curious about modern web architecture, this stack shows one approach to balancing performance, maintainability, and shipping to multiple platforms.&lt;/p&gt;

&lt;p&gt;If you want to use a notes app which stands out from the crowd, &lt;a href="https://www.inkrows.com/" rel="noopener noreferrer"&gt;check InkRows&lt;/a&gt;!&lt;/p&gt;




&lt;p&gt;⭐ As always, if you enjoyed this content, feel free to follow me on X and LinkedIn for more updates, insights, and discussions!&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>development</category>
    </item>
    <item>
      <title>The need to create my own productivity app</title>
      <dc:creator>Filip Frincu</dc:creator>
      <pubDate>Fri, 02 Jan 2026 22:07:15 +0000</pubDate>
      <link>https://dev.to/filipf/the-need-to-create-my-own-productivity-app-3mme</link>
      <guid>https://dev.to/filipf/the-need-to-create-my-own-productivity-app-3mme</guid>
      <description>&lt;p&gt;&lt;em&gt;For years, I've been on a quest to find the ultimate tool to organize my life. My journey led me through a landscape of productivity apps, with Notion and Google Keep being my most frequent companions.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 The best of both worlds, but not quite
&lt;/h2&gt;

&lt;p&gt;I relied on Google Keep for quick notes and simple to-do lists, while Notion handled my more complex, large scale projects. However, both had their limitations. Keep's basic toolbar and lack of text formatting options eventually made it feel incomplete. I found myself sticking with Notion, but it wasn't ideal for rapid note-taking. The loading times could be frustratingly slow, making the entire experience feel sluggish.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔒 Security concerns and the desire for more
&lt;/h2&gt;

&lt;p&gt;A significant concern for me was the lack of encryption in both Keep and Notion. This meant I was hesitant to jot down any sensitive or personal information, which is a crucial part of a truly comprehensive personal organizer.&lt;/p&gt;

&lt;p&gt;What I truly craved was an app that was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast and responsive:&lt;/strong&gt; No waiting around for notes to load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure:&lt;/strong&gt; End-to-end encryption for peace of mind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synchronized:&lt;/strong&gt; Seamless access across all my devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern and intuitive:&lt;/strong&gt; An easy-to-use interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powerful editor:&lt;/strong&gt; A customizable note editor that supports features like Markdown, text highlighting, and underlining.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither Notion nor Keep could tick all these boxes, and that's precisely why I decided to create my own app: &lt;a href="https://www.inkrows.com" rel="noopener noreferrer"&gt;InkRows&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Building InkRows: a blend of simplicity and power
&lt;/h2&gt;

&lt;p&gt;My extensive use of Google Keep provided a strong foundation for InkRows. I loved the instant note creation, the central location for all my thoughts, and the organizational power of tags.&lt;/p&gt;

&lt;p&gt;I began enhancing InkRows by incorporating the features I missed in Keep. This included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Robust encryption:&lt;/strong&gt; Ensuring your notes are private and secure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced organization:&lt;/strong&gt; Adding folder structures for more detailed organization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A powerful editor:&lt;/strong&gt; Supporting Markdown, as well as the ability to underline and color text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every element of InkRows is customizable, including the toolbar, ensuring a clean and uncluttered user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Making your to-dos easier and getting more done
&lt;/h2&gt;

&lt;p&gt;I also developed a dedicated section for to-dos, allowing users to filter them by due date and priority. To tie everything together, a home screen provides a quick overview of your tasks and shortcuts for immediate note or to-do creation.&lt;/p&gt;

&lt;p&gt;In essence, this is InkRows. Over the next few days, I'll be diving deeper into specific features and demonstrating how InkRows can help you achieve peak productivity.&lt;/p&gt;

&lt;p&gt;If you're looking for a faster, more secure, and more feature-rich note-taking experience, I encourage you to give &lt;a href="https://www.inkrows.com" rel="noopener noreferrer"&gt;InkRows&lt;/a&gt; a try today! 🚀&lt;/p&gt;




&lt;p&gt;⭐ As always, if you enjoyed this content, feel free to follow me on &lt;a href="https://x.com/filiphfr" rel="noopener noreferrer"&gt;X&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/filip-frincu-653a04178/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more updates, insights, and discussions!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>NextUI Theme Generator</title>
      <dc:creator>Filip Frincu</dc:creator>
      <pubDate>Wed, 05 Jun 2024 11:44:41 +0000</pubDate>
      <link>https://dev.to/filipf/nextui-theme-generator-4lm5</link>
      <guid>https://dev.to/filipf/nextui-theme-generator-4lm5</guid>
      <description>&lt;p&gt;I've been using &lt;a href="https://nextui.org/" rel="noopener noreferrer"&gt;NextUI&lt;/a&gt; for quite some time, but I missed having a theme generator like other component libraries have.&lt;/p&gt;

&lt;p&gt;So, I decided to create my own: &lt;a href="https://nextui-themegen.netlify.app/" rel="noopener noreferrer"&gt;NextUI Theme Gen&lt;/a&gt;. Feel free to give it a try.&lt;/p&gt;

&lt;p&gt;If you like it, don't forget to leave a star on &lt;a href="https://github.com/xylish7/nextui-theme-generator" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Thanks!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ui</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>GroupUp Unveiled: Supabase as Backend</title>
      <dc:creator>Filip Frincu</dc:creator>
      <pubDate>Fri, 29 Mar 2024 08:01:37 +0000</pubDate>
      <link>https://dev.to/filipf/groupup-unveiled-supabase-as-backend-3d12</link>
      <guid>https://dev.to/filipf/groupup-unveiled-supabase-as-backend-3d12</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This post is part of a series explaining how I built &lt;a href="https://groupup.live" rel="noopener noreferrer"&gt;GroupUp&lt;/a&gt;, an app that helps organize events, trips, gatherings, and more. Check out my first blog post to see the motivation behind this series &lt;a href="https://dev.to/filipf/developing-groupup-journey-38b3"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;p&gt;├─ ❓ What is Supabase?&lt;br&gt;
├─ 📃 Why Supabase?&lt;br&gt;
├     ├─ 🔶 Documentation&lt;br&gt;
├     ├─ 🔶 Authentication&lt;br&gt;
├     ├─ 🔶 Authorization via Row-Level Security&lt;br&gt;
├     ├─ 🔶 Realtime Updates&lt;br&gt;
├     ├─ 🔶 Storage&lt;br&gt;
├     ├─ 🔶 Edge Functions&lt;br&gt;
├     ├─ 🔶 Pricing&lt;br&gt;
├     ├─ 🔶 Other&lt;br&gt;
├─ 💬 Conclusion&lt;br&gt;
└─ ⏭️ What's Next&lt;/p&gt;




&lt;p&gt;This entire post will be dedicated to &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;, the backend behind &lt;a href="https://groupup.live/" rel="noopener noreferrer"&gt;GroupUp&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id="what-is-supabase"&gt;❓ What is Supabase?&lt;/h3&gt;

&lt;p&gt;The Supabase website describes it perfectly: "An open-source &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt; alternative. Start your project with a &lt;a href="https://www.postgresql.org/" rel="noopener noreferrer"&gt;Postgres&lt;/a&gt; database, Authentication, instant APIs, Edge Functions, Realtime subscriptions, Storage, and Vector embeddings."&lt;/p&gt;

&lt;p&gt;Supabase offers a Postgres database, user authentication, serverless functions, real-time functionality, storage, and even AI capabilities (vector embeddings) – all with the freedom of open source.&lt;/p&gt;

&lt;h3 id="why-supabase"&gt;📃 Why Supabase?&lt;/h3&gt;

&lt;p&gt;When I started building GroupUp, Firebase was my first pick. It was familiar, easy to set up, backed by Google, and widely used. But then came vendor lock-in. With Supabase, you can host your own instance, escaping the clutches of any cloud provider.&lt;/p&gt;

&lt;p&gt;Another key factor was the database. Firebase uses Firestore, a NoSQL database, while Supabase utilizes the powerful and popular open-source SQL database, Postgres.&lt;/p&gt;

&lt;p&gt;Supabase might have been the "new kid on the block" back then, but I saw its potential. While some features were missing (or in alpha) during my initial use, like real-time, edge functions, and AI, it provided what I needed: seamless authentication, a database for data storage, storage for images, and an automatic API for data fetching.&lt;/p&gt;

&lt;p&gt;Migrating from Firebase in the early stages was easy. Just a few code changes and table creations, and I was good to go.&lt;/p&gt;

&lt;h4 id="documentation"&gt;🔶 Documentation&lt;/h4&gt;

&lt;p&gt;Great documentation is a must-have, and Supabase delivers. It's easy to find what you need, and some resources even come with video tutorials. You can find the Supabase docs &lt;a href="https://supabase.com/docs/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="authentication"&gt;🔶 Authentication&lt;/h4&gt;

&lt;p&gt;Most apps require authentication, and GroupUp is no exception. Supabase's authentication is straight forward. I opted for email/password (captcha protection is available if you need it) and Google Sign In.&lt;/p&gt;

&lt;p&gt;Setting up email/password logic on Supabase was smooth, but the frontend took more time to solidify. Implementing signup, login, forgot password, password change, and email change took a significant chunk of time. Looking back, I might have over-engineered it. Remember, &lt;strong&gt;it's okay to start simple and improve later based on actual usage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Today, provider-based logins like Google Sign In are incredibly popular and easy to set up with Supabase. Their docs are fantastic, and they support a &lt;a href="https://supabase.com/docs/guides/auth/social-login" rel="noopener noreferrer"&gt;wide range of providers&lt;/a&gt;. Authentication docs &lt;a href="https://supabase.com/docs/guides/auth" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;h4 id="authorization-via-row-level-security"&gt;🔶 Authorization via Row-Level Security&lt;/h4&gt;

&lt;p&gt;Keeping user data safe requires control over read, write, update, and delete operations. Supabase leverages Postgres's Row Level Security (RLS) for authorization. You can write simple or complex SQL rules to manage user access to data. &lt;a href="https://supabase.com/docs/guides/auth/row-level-security" rel="noopener noreferrer"&gt;Read more here&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="realtime-updates"&gt;🔶 Realtime Updates&lt;/h4&gt;

&lt;p&gt;Initially, I relied solely on API requests to fetch groups, events, users, votes, car availability, and so on. This led to frequent requests on every route change and potentially stale data. Supabase's real-time capabilities came to the rescue. While it added some frontend complexity, it provided a much better user experience with instant feedback. Realtime docs &lt;a href="https://supabase.com/docs/guides/realtime" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="storage"&gt;🔶 Storage&lt;/h4&gt;

&lt;p&gt;Since users can add profile images for groups and themselves, I needed storage. Supabase provides this with built-in RLS for user access control. It even offers image optimization and transformation on the fly to save storage space, but this is a Pro plan feature.&lt;/p&gt;

&lt;p&gt;For the free plan, you can build your own logic or use external packages to resize images on the client-side or with an edge function. Storage docs &lt;a href="https://supabase.com/docs/guides/storage" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="edge-functions"&gt;🔶 Edge Functions&lt;/h4&gt;

&lt;p&gt;Edge functions are essential for operations like fetching weather data for an event or sending push notifications to users. You can access the database from the function using the permissions of the invoking user, or bypass all permissions with &lt;a href="https://supabase.com/docs/guides/api/api-keys#the-servicerole-key" rel="noopener noreferrer"&gt;service_role key&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To invoke the functions, you can directly call them from the client-side, or they can be triggered by database events like insert, update, or delete. Edge functions docs &lt;a href="https://supabase.com/docs/guides/functions" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="pricing"&gt;🔶 Pricing&lt;/h4&gt;

&lt;p&gt;You get 2 free projects with generous limits, perfect for getting started. Free projects are paused after 1 week of inactivity, but this shouldn't be an issue for development or even low-traffic production use. Pricing details &lt;a href="https://supabase.com/pricing" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id="other"&gt;🔶 Other&lt;/h4&gt;

&lt;p&gt;Supabase offers a rich developer experience: SQL editor, logs, reports, data viewer, database view, and a tables editor (with user impersonation). These features are invaluable for development, debugging, and performance analysis.&lt;/p&gt;

&lt;p&gt;Another cool feature is the ability to use PostgreSQL extensions like &lt;strong&gt;pg_jsonschema&lt;/strong&gt; for validating JSON data in table columns, or &lt;strong&gt;uuid-ossp&lt;/strong&gt; for generating unique identifiers.&lt;/p&gt;

&lt;h3 id="conclusion"&gt;💬 Conclusion&lt;/h3&gt;

&lt;p&gt;I'm happy with my choice. Supabase is now my go-to backend solution. It has saved me significant time with features like Authentication, Realtime, and Edge Functions, allowing me to focus on core app functionality.&lt;/p&gt;

&lt;h3 id="whats-next"&gt;⏭️ What's Next&lt;/h3&gt;

&lt;p&gt;In the next blog, I'll be diving into the folder structure of my React client app. Stay tuned!&lt;/p&gt;




&lt;p&gt;⭐ As always, if you enjoyed this content, feel free to follow me on &lt;a href="https://twitter.com/filipfrincu" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/filip-frincu-653a04178/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more updates, insights, and discussions!&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>backend</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>GroupUp Unveiled: Frontend Tech Stack</title>
      <dc:creator>Filip Frincu</dc:creator>
      <pubDate>Sat, 23 Mar 2024 08:12:10 +0000</pubDate>
      <link>https://dev.to/filipf/groupup-unveiled-frontend-tech-stack-2dho</link>
      <guid>https://dev.to/filipf/groupup-unveiled-frontend-tech-stack-2dho</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This post is part of a series explaining how I built &lt;a href="https://groupup.live" rel="noopener noreferrer"&gt;GroupUp&lt;/a&gt;, an app that helps organize events, trips, gatherings, and more. Check out my first blog post to see the motivation behind this series &lt;a href="https://dev.to/filipf/developing-groupup-journey-38b3"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;p&gt;├─ 🎨 Frontend&lt;br&gt;
├       ├─ 🔶 React&lt;br&gt;
├       ├─ 🔶 Typescript&lt;br&gt;
├       ├─ 🔶 Eslint&lt;br&gt;
├       ├─ 🔶 Prettier&lt;br&gt;
├       ├─ 🔶 Vite&lt;br&gt;
├       └─ 🔶 Jest&lt;br&gt;
├─ ➕ Other&lt;br&gt;
└─ ⏭️ What's next&lt;/p&gt;




&lt;p&gt;Since choosing a tech stack can be tricky, I've split this topic into two parts: frontend and backend technologies used in GroupUp. There are tons of options (almost endless in web development), and while migration is possible later, it's usually time-consuming and not always fun.&lt;/p&gt;

&lt;h3 id="frontend"&gt;🎨 Frontend&lt;/h3&gt;

&lt;p&gt;For now I will just mention the technologies used in the frontend development process. I may go into more detail about each technology in future posts.&lt;/p&gt;

&lt;h4 id="react"&gt;🔶 &lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;React&lt;/a&gt; - The Library for Web and Native User Interfaces&lt;/h4&gt;

&lt;p&gt;I started GroupUp nearly three years ago. Back then, the three major web frameworks were &lt;a href="https://angular.io/" rel="noopener noreferrer"&gt;Angular&lt;/a&gt;, React, and &lt;a href="https://vuejs.org/" rel="noopener noreferrer"&gt;Vue&lt;/a&gt;. They're likely still the most popular, but there are many more options today (as you may know, a new day means a new frontend framework 😅).&lt;/p&gt;

&lt;p&gt;Initially, I learned Angular, but as a web development newbie, I found it quite challenging. A friend suggested React, and it felt more natural for me at that time (it wasn't as reliant on complex framework magic like hooks are now). This freedom allowed me more control, but as an inexperienced developer, it also led to some chaotic code.&lt;/p&gt;

&lt;p&gt;Today, I appreciate Angular's structured approach. I might use it someday, but for now, I'm sticking with React.&lt;/p&gt;

&lt;p&gt;While migrating frameworks can be a lot of work, the good news is that well-maintained and widely adopted frameworks like these shouldn't cause major roadblocks down the line.&lt;/p&gt;

&lt;h4 id="typescript"&gt;🔶 &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt; - JavaScript with Syntax for Types&lt;/h4&gt;

&lt;p&gt;Using TypeScript involves learning some extra JavaScript, but for larger projects (like GroupUp!), it's a lifesaver. Complex logic without clear data types can quickly become a nightmare. TypeScript also helps prevent bugs that might otherwise take time to debug.&lt;/p&gt;

&lt;p&gt;However, avoid overcomplicating things. I've gotten frustrated wasting time on overly complex types instead of writing actual application code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jsdoc.app/" rel="noopener noreferrer"&gt;JSDoc&lt;/a&gt; is another option. It requires more writing, but doesn't need a compiler like TypeScript. Recently, some developers have questioned TypeScript's necessity, but it works well for me, and I'll stick with it for now. For smaller projects, I'd recommend trying JSDoc.&lt;/p&gt;

&lt;h4 id="eslint"&gt;🔶 &lt;a href="https://eslint.org/" rel="noopener noreferrer"&gt;Eslint&lt;/a&gt; - Find and Fix Problems in Your JavaScript Code&lt;/h4&gt;

&lt;p&gt;I highly recommend Eslint for finding and fixing code issues. If you use an editor like &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;, you can install the &lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" rel="noopener noreferrer"&gt;Eslint extension&lt;/a&gt; to highlight issues in real time.&lt;/p&gt;

&lt;p&gt;Many Eslint plugins are available, so you don't need to configure everything from scratch. Using Eslint also promotes consistent coding style.&lt;/p&gt;

&lt;p&gt;I've set up a pre-commit hook that runs Eslint before every Git commit, ensuring the code pushed to the repository adheres to the rules defined in my Eslint configuration file.&lt;/p&gt;

&lt;h4 id="prettier"&gt;🔶 &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt; - Opinionated Code Formatter&lt;/h4&gt;

&lt;p&gt;Prettier ensures your code is well-formatted, saving you time on adding/removing spaces, maintaining consistent line widths, and so on.&lt;/p&gt;

&lt;p&gt;Similar to Eslint, you can install Prettier as a &lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode/" rel="noopener noreferrer"&gt;VS Code extension&lt;/a&gt; for live formatting. You can also run it through a pre-commit hook to guarantee well-formatted code before pushing to the remote repository.&lt;/p&gt;

&lt;h4 id="vite"&gt;🔶 &lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;Vite&lt;/a&gt; - Next Generation Frontend Tooling &lt;/h4&gt;

&lt;p&gt;Vite stole my heart from the start. Before Vite, the standard way to create a React app was with &lt;a href="https://create-react-app.dev/" rel="noopener noreferrer"&gt;Create React App (CRA)&lt;/a&gt; , which is no longer recommended or supported. While I generally dislike changing things that work, CRA's slow development server was a constant source of frustration.&lt;/p&gt;

&lt;p&gt;When Vite came out, I knew I had to try it. Migrating from CRA to Vite wasn't too painful (there are many tutorials available), and the benefits were huge. My development server now starts in under two seconds, and there are many plugins to support various functionalities (like setting up a Progressive Web App quickly).&lt;/p&gt;

&lt;p&gt;Here's the fixed and improved text, keeping the casual tone:&lt;/p&gt;

&lt;h4 id="jest"&gt;🔶 &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt; - Delightful JavaScript Testing Framework&lt;/h4&gt;

&lt;p&gt;I started using Jest with React Testing Library for my components. It came bundled with Create React App (CRA), so I didn't explore other options. While Jest works, I've come across Vitest, which seems like a strong contender.&lt;/p&gt;

&lt;p&gt;Vitest integrates seamlessly with Vite, requires less configuration, and  supports the modern standard, ECMAScript Modules (ESM) (more on Module Types &lt;a href="(https://dev.to/iggredible/what-the-heck-are-cjs-amd-umd-and-esm-ikm)"&gt;here&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;When I switched from CRA to Vite, I attempted a Jest-to-Vitest migration. However, I ran into errors due to my existing Jest test base covering various scenarios. So, I decided to hold off for now.&lt;/p&gt;

&lt;p&gt;Migrating to Vitest remains on my radar, but Jest is handling things for now.&lt;/p&gt;

&lt;h3 id="other"&gt; ➕ Other &lt;/h3&gt;

&lt;p&gt;To achieve different functionalities, I've also used various libraries and tools, such as: &lt;a href="https://onesignal.com/" rel="noopener noreferrer"&gt;OneSignal&lt;/a&gt; for push notifications, &lt;a href="https://capacitorjs.com/" rel="noopener noreferrer"&gt;Capacitor&lt;/a&gt; for mobile app development, &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt; for error tracking, but I'll delve into these in future posts.&lt;/p&gt;

&lt;h3 id="whats-next"&gt; ⏭️ What's Next?&lt;/h3&gt;

&lt;p&gt;In the next post, I'll goe into the backend of GroupUp, which is built with &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;, an open source Firebase alternative. I'll also discuss the reasons behind choosing Supabase and how it's been working out so far. Stay tuned!&lt;/p&gt;




&lt;p&gt;⭐ As always, if you enjoyed this content, feel free to follow me on &lt;a href="https://twitter.com/filipfrincu" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/filip-frincu-653a04178/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more updates, insights, and discussions!&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Developing GroupUp Journey</title>
      <dc:creator>Filip Frincu</dc:creator>
      <pubDate>Sat, 16 Mar 2024 16:17:32 +0000</pubDate>
      <link>https://dev.to/filipf/developing-groupup-journey-38b3</link>
      <guid>https://dev.to/filipf/developing-groupup-journey-38b3</guid>
      <description>&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;p&gt;👦🏻 Some info about me&lt;br&gt;
⏳ How GroupUp started&lt;br&gt;
🗺️ What will this series be about&lt;br&gt;
⏭️ What's next&lt;/p&gt;




&lt;p&gt;In &lt;strong&gt;my first ever blog post&lt;/strong&gt;, I've decided to share my journey developing &lt;a href="https://groupup.live/" rel="noopener noreferrer"&gt;GroupUp&lt;/a&gt;, an app that aims to make organizing gatherings easier and more fun. I'll be diving into the technical aspects and explaining the logic behind them.&lt;/p&gt;

&lt;p&gt;On a side note, I've also embarked on a journey to improve my typing skills, so hopefully, writing these blogs will be a good practice exercise.&lt;/p&gt;

&lt;h3 id="some-info-about-me"&gt;👦🏻 Some info about me&lt;/h3&gt;

&lt;p&gt;I started my career as a migration engineer about six years ago. Then, I migrated (pun intended 😅) to web development, and ever since, I've focused on creating things that (I hope) bring value.&lt;/p&gt;

&lt;p&gt;Being a father of two definitely throws some curveballs my way sometimes, but there's nothing quite like the joy of fatherhood.&lt;/p&gt;

&lt;h3 id="how-groupup-started"&gt;⏳ How GroupUp started&lt;/h3&gt;

&lt;p&gt;A few years back, my friends and I used to have regular movie nights. Deciding on a movie was always a struggle, so I created my first React app, MoviePoll, to help us pick the next one.&lt;/p&gt;

&lt;p&gt;While movie nights eventually faded away, we kept exploring other activities like hiking and camping. We used WhatsApp to coordinate, but you probably know the struggle with spam in WhatsApp groups – it wasn't ideal for planning anything.&lt;/p&gt;

&lt;p&gt;That's what sparked the development of GroupUp. Integrating features like transportation coordination, location sharing, weather forecasts, and a simple RSVP system made organizing our get-togethers so much smoother.&lt;/p&gt;

&lt;p&gt;You can find more info on the &lt;a href="https://groupup.live/about" rel="noopener noreferrer"&gt;About&lt;/a&gt; page.&lt;/p&gt;

&lt;h3 id="what-will-this-series-be-about"&gt;🗺️ What will this series be about&lt;/h3&gt;

&lt;p&gt;I'd love to share how I achieved different functionalities in the app. I'm no web development guru, and I'm always open to learning and improving, so feel free to leave your feedback in the comments!&lt;/p&gt;

&lt;p&gt;Here's the tech stack I used to build the app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://reactjs.org" rel="noopener noreferrer"&gt;React&lt;/a&gt;&lt;/strong&gt;: JavaScript library for the frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://capacitorjs.com" rel="noopener noreferrer"&gt;CapacitorJS&lt;/a&gt;&lt;/strong&gt;: Enables building for both Android and iOS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://onesignal.com" rel="noopener noreferrer"&gt;OneSignal&lt;/a&gt;&lt;/strong&gt;: Handles notifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://supabase.com" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;&lt;/strong&gt;: Powers authentication, storage and the database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://vitejs.dev" rel="noopener noreferrer"&gt;Vite&lt;/a&gt;&lt;/strong&gt;: Frontend tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to check out the app, and if there's a specific feature you'd like me to cover in a future post, let me know!&lt;/p&gt;

&lt;h3 id="whats-next"&gt;⏭️ What's next&lt;/h3&gt;

&lt;p&gt;In the next blog post, I'll be diving deeper into the &lt;strong&gt;reasons behind my choice of tech stack&lt;/strong&gt; – stay tuned!&lt;/p&gt;




&lt;p&gt;⭐ If you enjoyed this content, feel free to follow me on &lt;a href="https://twitter.com/filipfrincu" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/filip-frincu-653a04178/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; for more updates, insights, and discussions! &lt;/p&gt;

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