<?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: Bibin Antony</title>
    <description>The latest articles on DEV Community by Bibin Antony (@bibin_antony_9fce1ed9318b).</description>
    <link>https://dev.to/bibin_antony_9fce1ed9318b</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%2F3112295%2Fb3a84dbe-edd5-4763-b4d9-6c97c6271a09.jpg</url>
      <title>DEV Community: Bibin Antony</title>
      <link>https://dev.to/bibin_antony_9fce1ed9318b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bibin_antony_9fce1ed9318b"/>
    <language>en</language>
    <item>
      <title>I Built a Full-Stack Family OS — Web App + Mobile App with Video Calls, Brain Games, Expenses &amp; More</title>
      <dc:creator>Bibin Antony</dc:creator>
      <pubDate>Fri, 27 Feb 2026 16:30:51 +0000</pubDate>
      <link>https://dev.to/bibin_antony_9fce1ed9318b/i-built-a-full-stack-family-os-web-app-mobile-app-with-video-calls-brain-games-expenses-more-2g77</link>
      <guid>https://dev.to/bibin_antony_9fce1ed9318b/i-built-a-full-stack-family-os-web-app-mobile-app-with-video-calls-brain-games-expenses-more-2g77</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;Every family is a tiny community — one that shares a home, a budget, responsibilities, inside jokes, and the never-ending question: &lt;em&gt;"Who left the milk out?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But families are deeply underserved when it comes to software. You've got Slack for work teams. Notion for project groups. Discord for gaming communities. &lt;strong&gt;But what do families actually have?&lt;/strong&gt; A WhatsApp group that's 80% memes, a shared Google Calendar no one updates, and sticky notes on the fridge.&lt;/p&gt;

&lt;p&gt;And when it comes to communication — the most important function of any community — families have it worst of all. Their options are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp/iMessage&lt;/strong&gt; — mixed in with work messages, no structure, no privacy from the outside world&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facebook Messenger&lt;/strong&gt; — run by an ad company that profits from your family's data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zoom/FaceTime&lt;/strong&gt; — great for calls, but no messaging, no shared context, no family management tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no single, private, purpose-built space for families to &lt;strong&gt;communicate, organise, and connect&lt;/strong&gt; — until now.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Family Command Center&lt;/strong&gt; for exactly this community — the modern family distributed across school runs, work-from-home days, different cities, and different time zones.&lt;/p&gt;

&lt;p&gt;There are two very different users in every family:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parents&lt;/strong&gt; — who need to manage the household: chores, groceries, budget, and staying connected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kids&lt;/strong&gt; — who need structure, fun, and a reason to actually do their chores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most apps only serve one of these groups. &lt;strong&gt;Family Command Center serves both, simultaneously, in the same app.&lt;/strong&gt; Kids get a gamified world of brain games, points, and rewards they can unlock. Parents get a control panel for the home. And both get a &lt;strong&gt;shared private space&lt;/strong&gt; to communicate — with real-time chat and even face-to-face video calls.&lt;/p&gt;

&lt;p&gt;This is software for the most important community most of us belong to.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Family Command Center&lt;/strong&gt; is a full-stack &lt;strong&gt;web app + React Native mobile app&lt;/strong&gt; that serves as a unified operating system for your family. It's not just a to-do list. It's every tool your family actually needs, beautifully integrated into one place.&lt;/p&gt;

&lt;h3&gt;
  
  
  👨‍👩‍👧‍👦 Designed for Both Parents AND Kids
&lt;/h3&gt;

&lt;p&gt;Family Command Center has a unified experience but with &lt;strong&gt;role-based interaction&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parents&lt;/strong&gt; can assign chores, create reward items, set grocery lists, track expenses, and oversee the family&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kids&lt;/strong&gt; can complete chores, play 32 brain games to earn points, and redeem those points for real-world rewards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everyone&lt;/strong&gt; can use private chat, video calls, and see the shared dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This parent/child dynamic is core to how the app was designed — it's not just a feature, it's the whole philosophy.&lt;/p&gt;




&lt;h3&gt;
  
  
  🏠 Core Features
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Personalised greeting + live overview of chores, groceries &amp;amp; notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Assign, track, and complete household tasks with progress tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grocery / Shop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shared live grocery list — add items from web or mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Family bulletin board for quick messages and reminders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;💬 Private Chat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;End-to-end family messaging with group + direct messages, photo/video sharing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;📹 Video Calls&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WebRTC P2P video calling with TURN server — works worldwide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expenses / Split&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Track shared expenses and settle up balances — like Splitwise, but private&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Brain Games&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;32 cognitive games for kids to earn points&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rewards&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kids redeem points for real rewards set by parents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Family Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Create or join a family group with invite codes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  💬 Private Family Chat — A Space That Belongs Only to Your Family
&lt;/h3&gt;

&lt;p&gt;This isn't just a chat box bolted on. Family Command Center's messaging is designed from the ground up for &lt;strong&gt;family privacy and connection&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Family Board&lt;/strong&gt; — a shared group channel the whole family sees&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct Messages&lt;/strong&gt; — private 1-on-1 conversations between any family members&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photo &amp;amp; Video Sharing&lt;/strong&gt; — attachments are transferred &lt;strong&gt;peer-to-peer&lt;/strong&gt; (no server storage of your files)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HD Video Thumbnails&lt;/strong&gt; — preview videos before opening, with quality status indicators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time delivery&lt;/strong&gt; — powered by Supabase Realtime, messages land instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No ads. No algorithms. No data harvesting.&lt;/strong&gt; Your family's conversations stay in your family.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why does this matter? Because privacy in family communication is a right, not a premium feature. Kids should be able to message parents without it being monetised. Parents should be able to share family photos without an algorithm learning from them. Family Command Center gives you that.&lt;/p&gt;




&lt;h3&gt;
  
  
  📹 WebRTC Video Calls — Face-to-Face, Anywhere in the World
&lt;/h3&gt;

&lt;p&gt;This is where the technical depth really shows. Family Command Center has &lt;strong&gt;full peer-to-peer video calling&lt;/strong&gt; built in — no Zoom subscription, no third-party app, no account needed beyond your family's Google login.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How the connection works:&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;Family Member A (Web)              Family Member B (Mobile)
        │                                    │
        │◄──── Supabase Realtime ───────────►│  ← Signaling channel
        │      (SDP Offer/Answer +            │    (WebRTC handshake)
        │       ICE Candidates)               │
        │                                    │
        │◄──── WebRTC P2P (Direct) ─────────►│  ← Video/Audio stream
        │         OR                         │
        │◄──── TURN Server (Relay) ──────────►│  ← Fallback for NAT/firewalls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Technical highlights:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;STUN + TURN servers&lt;/strong&gt; — STUN for direct P2P, TURN relay as fallback. Calls work across NAT, firewalls, mobile networks, and across the world — not just on the same WiFi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase Realtime as the signalling channel&lt;/strong&gt; — instead of building and hosting a dedicated signalling server, I reused Supabase's realtime channels for WebRTC SDP offer/answer and ICE candidate exchange. Zero extra infrastructure, creative reuse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform calling&lt;/strong&gt; — web app user can call a mobile app user seamlessly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P2P file transfer in calls&lt;/strong&gt; — send photos/videos during a call, peer-to-peer, never touching a server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queue management&lt;/strong&gt; — transfer queue handles multiple attachments without blocking the call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this matters for families:&lt;/strong&gt; Your video call goes directly from your device to theirs — no middleman company recording or processing your family conversations. If a direct P2P link isn't possible (e.g., strict corporate firewall or mobile carrier NAT), the TURN server creates an encrypted relay. Either way, &lt;strong&gt;your family's video is private.&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  🧠 The Brain Games Hub — 32 Games (Kids Love This)
&lt;/h3&gt;

&lt;p&gt;Instead of screentime being passive and mindless, the games section makes it &lt;strong&gt;productive and rewarding&lt;/strong&gt;. There are &lt;strong&gt;32 brain-training games&lt;/strong&gt; across 5 cognitive categories:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Games&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Memory&lt;/td&gt;
&lt;td&gt;Memory Match, Pattern Memory, N-Back, Number Memory, Simon Says&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔢 Logic&lt;/td&gt;
&lt;td&gt;Sudoku, 2048, Tower of Hanoi, Ball Sort, Lights Out, Water Jugs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔤 Language&lt;/td&gt;
&lt;td&gt;Word Scramble, Hangman, Word Connections, Word Chain, Anagram Solver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Reflex&lt;/td&gt;
&lt;td&gt;Whack-a-Mole, Reflex Challenge, Typing Speed, Quick Math&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🗺️ Spatial&lt;/td&gt;
&lt;td&gt;Sliding Puzzle, River Crossing, Matchstick Math, Pathway Maze, Mental Rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Kids earn &lt;strong&gt;points for every game they play&lt;/strong&gt; — turning screen time into skill-building that feeds into the rewards system.&lt;/p&gt;


&lt;h3&gt;
  
  
  🏆 The Kids Rewards Loop
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; Kid completes a chore ──► Earns points
 Kid plays brain games ──► Earns more points
              ▼
  Kid browses the Rewards store
              ▼
  Kid submits a redemption request
              ▼
  Parent sees it &amp;amp; approves ✅  (or rejects)
              ▼
  Kid gets their real-world reward! 🎉
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Rewards are fully customisable by parents — e.g. &lt;em&gt;"Movie night = 200 pts"&lt;/em&gt;, &lt;em&gt;"Extra screen time = 150 pts"&lt;/em&gt;, &lt;em&gt;"Sleepover = 500 pts"&lt;/em&gt;. This creates a &lt;strong&gt;motivating, transparent system&lt;/strong&gt; that makes kids want to participate — not because they're forced to, but because there's something real at the end of it.&lt;/p&gt;


&lt;h3&gt;
  
  
  📱 Cross-Platform
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web App&lt;/strong&gt;: React + TypeScript + Vite (deployed on Vercel)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile App&lt;/strong&gt;: React Native + Expo (Android build available on Play Store)&lt;/li&gt;
&lt;li&gt;Both share the same Supabase backend — &lt;strong&gt;data syncs in real-time across all devices&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🎥 &lt;strong&gt;Website → &lt;a href="https://family-command-center-taupe.vercel.app/" rel="noopener noreferrer"&gt;family-command-center-taupe.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
📱 &lt;strong&gt;Mobile App&lt;/strong&gt; → &lt;br&gt;


&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://play.google.com/store/apps/details?id=com.familycommandcenter" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FWNPYt-xmKtILe7D2naOu-k0AmE196sghgWJBNHKab6DZexPC154lSBlI9drOfhWdJdQkU7HdNMRHUD8O9DX_wg" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://play.google.com/store/apps/details?id=com.familycommandcenter" rel="noopener noreferrer" class="c-link"&gt;
            Family Command Center - Apps on Google Play
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            The ultimate family organizer: Chores, Rewards, Groceries &amp;amp; Fun Brain Games!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gstatic.com%2Fandroid%2Fmarket_images%2Fweb%2Ffavicon_v3.ico"&gt;
          play.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;&lt;em&gt;(Sign in with any Google account to explore the full app)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key moments to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👋 Personalised dashboard — real-time family overview&lt;/li&gt;
&lt;li&gt;🎮 Brain Games hub with 32 games, categorised by cognitive type&lt;/li&gt;
&lt;li&gt;💬 Family Board + Direct Messages — private family chat&lt;/li&gt;
&lt;li&gt;📹 WebRTC Video Call between web and mobile&lt;/li&gt;
&lt;li&gt;💰 Expense tracker with settle-up calculations&lt;/li&gt;
&lt;li&gt;✅ Chore management with confetti celebration + points earned&lt;/li&gt;
&lt;li&gt;🏆 Rewards store — parent creates rewards, kid redeems, parent approves&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bibinantony1998" rel="noopener noreferrer"&gt;
        bibinantony1998
      &lt;/a&gt; / &lt;a href="https://github.com/bibinantony1998/family-command-center" rel="noopener noreferrer"&gt;
        family-command-center
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🏠 Family Command Center&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A unified operating system for the modern family&lt;/strong&gt; — private chat, WebRTC video calls, brain games, chore management, shared expenses, grocery lists, and a kids rewards system. All in one app, across web and mobile.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://family-command-center-taupe.vercel.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/72f41228e4e03df6535c47f434518391e7e92bc00290408ff0fff8fc71ade28a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c69766525323044656d6f2d56657263656c2d626c61636b3f6c6f676f3d76657263656c" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://react.dev/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f7af658362dc9a6f5eff3a475abda0083ba96eaeb3a302795a0a3738573a3fdc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31382d3631444146423f6c6f676f3d7265616374" alt="React"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dcff4370c2726b105ada0a3b8a05b83517edd4f9e79215ce2172214b26bc4a5b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d352d3331373843363f6c6f676f3d74797065736372697074" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://supabase.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e068514a1a0e464fbe71b9ade65bcb8349ec21ef8230a148e8f660104eec725d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53757061626173652d506f737467726553514c2d3345434638453f6c6f676f3d7375706162617365" alt="Supabase"&gt;&lt;/a&gt;
&lt;a href="https://expo.dev/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/419710bc9ad5061619d1a6c2f6ad4bfcb983c0d44f77c5b5bd3ee2e25dbab98e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742532304e61746976652d4578706f2d3030303032303f6c6f676f3d6578706f" alt="React Native"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📖 Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Family Command Center solves a real problem: &lt;strong&gt;families have no private, purpose-built digital space&lt;/strong&gt;. WhatsApp mixes family with work. Google Calendar nobody updates. Zoom requires a subscription. There's no single app that handles family communication, organisation, and fun together.&lt;/p&gt;
&lt;p&gt;This app is built for two types of users in every family:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User&lt;/th&gt;
&lt;th&gt;What they need&lt;/th&gt;
&lt;th&gt;What they get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manage the household&lt;/td&gt;
&lt;td&gt;Chores, groceries, expenses, family overview, reward approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kids&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structure + motivation&lt;/td&gt;
&lt;td&gt;Brain games, points, rewards store, redemptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Everyone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stay connected&lt;/td&gt;
&lt;td&gt;Private chat, direct messages, WebRTC video calls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🏠 Dashboard&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Personalised greeting with the family member's name&lt;/li&gt;
&lt;li&gt;At-a-glance overview: upcoming chores, grocery items needed, latest…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bibinantony1998/family-command-center" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;The repo contains both the &lt;strong&gt;web app&lt;/strong&gt; (&lt;code&gt;/src&lt;/code&gt;) and the &lt;strong&gt;React Native mobile app&lt;/strong&gt; (&lt;code&gt;/mobile-app&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🛠️ Tech Stack
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Frontend (Web)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React 18&lt;/strong&gt; + &lt;strong&gt;TypeScript&lt;/strong&gt; — component-based, strongly typed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite&lt;/strong&gt; — blazing-fast dev server and build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Router v6&lt;/strong&gt; — client-side routing across 40+ pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; — utility-first styling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend &amp;amp; Database&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; — PostgreSQL with Row Level Security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase Realtime&lt;/strong&gt; — live subscriptions for chat, chores, groceries, and &lt;strong&gt;WebRTC signalling&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase Auth&lt;/strong&gt; — Google OAuth + secure sessions&lt;/li&gt;
&lt;li&gt;Custom SQL schema with &lt;strong&gt;15+ tables&lt;/strong&gt; — families, members, expenses, rewards, game scores, redemptions, messages, attachments, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mobile App&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Native + Expo&lt;/strong&gt; — cross-platform iOS/Android&lt;/li&gt;
&lt;li&gt;Same Supabase backend — real-time sync with web&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expo AV&lt;/strong&gt; — video/audio handling in calls&lt;/li&gt;
&lt;li&gt;Custom bottom tab navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-Time Communication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WebRTC&lt;/strong&gt; — peer-to-peer video/audio with ICE/STUN/TURN&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase Realtime&lt;/strong&gt; repurposed as the WebRTC signalling server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TURN server&lt;/strong&gt; — relay fallback for worldwide connectivity through NAT/firewalls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P2P file transfer&lt;/strong&gt; — attachments sent directly between devices during chat/calls&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🏗️ Architecture Highlights
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Family Data Isolation with Row Level Security&lt;/strong&gt;&lt;br&gt;
Every piece of data — notes, chores, expenses, chat messages, game scores — is scoped to a &lt;code&gt;family_id&lt;/code&gt; via Supabase RLS policies. A user from Family A physically cannot read or write data from Family B. This is enforced at the &lt;strong&gt;database level&lt;/strong&gt;, not just the application level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebRTC + Supabase as Signaling (No Extra Server)&lt;/strong&gt;&lt;br&gt;
Instead of spinning up a dedicated WebRTC signalling server (the usual approach), I used Supabase Realtime channels for the SDP offer/answer and ICE candidate exchange. When a call is initiated, both clients subscribe to a shared channel, negotiate the WebRTC handshake through it, then establish a direct P2P connection. The Supabase channel is only used for ~5 messages — the actual video never touches it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TURN Server for Global Reach&lt;/strong&gt;&lt;br&gt;
Pure P2P WebRTC works great on the same network. But real families are distributed — kid at school, parent at work, grandparent in another country. The app uses TURN server configuration so that when a direct P2P connection isn't possible (strict NAT, mobile carrier, corporate firewall), the video is relayed through the TURN server. Calls work &lt;strong&gt;reliably worldwide&lt;/strong&gt;, not just on the same WiFi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invite-Code Family System&lt;/strong&gt;&lt;br&gt;
Families are created by one member who gets a unique invite code. Others join by entering the code — simple enough for kids to use, secure enough that strangers can't stumble in. Family data is isolated from the moment of joining.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rewards Economy (Parent Admin + Kid Participant)&lt;/strong&gt;&lt;br&gt;
Parents are the admins: they create chore assignments, set reward items, and approve/reject redemption requests. Kids are the participants: they complete chores, earn points from games, browse the rewards store, and submit redemption requests. The role separation is baked into the database (role field on profiles) and enforced both in RLS policies and the UI flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;32 Self-Contained Brain Games&lt;/strong&gt;&lt;br&gt;
Every game is an isolated React component with its own state machine. No external game engine. Pure React + hooks + occasional HTML Canvas. Games range from simple tap games (Whack-a-Mole) to complex working-memory tasks (N-Back, Dual Task, Trail Making) — intentionally spanning different cognitive domains so there's something for every age.&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 Why I Built It This Way
&lt;/h3&gt;

&lt;p&gt;I wanted something my own family would actually &lt;em&gt;use&lt;/em&gt; — not a portfolio demo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy first&lt;/strong&gt; — your family's chat, video calls, photos, and data belong to your family. No ad targeting, no data selling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No friction&lt;/strong&gt; — Google login, no manual sign-up, invite code to join family&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile-first&lt;/strong&gt; — works on the family iPad, the kids' Android phones, the parent's laptop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Games that earn real rewards&lt;/strong&gt; — kids are genuinely motivated, not forced&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parent oversight without micromanagement&lt;/strong&gt; — parents set the rules (chores, rewards), kids operate within them independently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video calling built-in&lt;/strong&gt; — family members in different cities stay face-to-face&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One app for everyone&lt;/strong&gt; — no separate "kids app" and "parent app"; the whole family shares one space&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The biggest technical challenge was getting &lt;strong&gt;WebRTC to work reliably cross-platform&lt;/strong&gt; (web ↔ mobile, different networks, different countries). The TURN server implementation and using Supabase Realtime as the signalling layer took the most iteration — but once solved, it meant zero additional infrastructure cost and calls that work anywhere in the world.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! I'd love to hear your thoughts — especially if you're a parent. What features would your family actually use? 🏠&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Co-built with &lt;a href="https://dev.to/sojinantony01"&gt;@sojinantony01&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Some attachments
&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.amazonaws.com%2Fuploads%2Farticles%2F5fvn10pwnqb6og4ymmv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fvn10pwnqb6og4ymmv7.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F2niz0nit2s2cdv0935ig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2niz0nit2s2cdv0935ig.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fq1t4c48yk4sx3p33asgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq1t4c48yk4sx3p33asgw.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F2okzspry496ysglda274.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2okzspry496ysglda274.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Ftmv1pxr7zdn0eao2ermu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmv1pxr7zdn0eao2ermu.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fzmv897bc5zt44ai9op8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmv897bc5zt44ai9op8r.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fpi106oz3l7e4wzep6zaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpi106oz3l7e4wzep6zaj.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fnbyyrbn7ysezqpklgb7k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbyyrbn7ysezqpklgb7k.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fnrupnf33x3stt1c41hx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrupnf33x3stt1c41hx7.png" alt=" "&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fbg4knmt2cl7wbsow5qcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbg4knmt2cl7wbsow5qcy.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Web animations - A walk through | A Story by Bibin Antony</title>
      <dc:creator>Bibin Antony</dc:creator>
      <pubDate>Fri, 14 Feb 2025 13:05:09 +0000</pubDate>
      <link>https://dev.to/bibin_antony_9fce1ed9318b/web-animations-a-walk-through-f0j</link>
      <guid>https://dev.to/bibin_antony_9fce1ed9318b/web-animations-a-walk-through-f0j</guid>
      <description>&lt;p&gt;We have to implement animations in our website over many occasion, and there are many types of animations library out there. but if we want to create one from scratch, which one we will choose. Let’s check how many type on animations are out there&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Transition and transform
&lt;/h4&gt;

&lt;p&gt;This are the basic css property for creating basic movement and visibility animations, like if we need to move an item a little bit, or increase it opacity gradually, transition is the best way to solve that. and transition runs in GPU by default so the process will be faster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.class {
  transform: scale(1.5);
  transition-duration: 1s;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above example will scale the element to 1.5 rate in a duration of 1s, we can have many animations like, scale, rotate, matrix, skew, etc…&lt;br&gt;&lt;br&gt;
Check out more transition examples on &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_transitions/Using_CSS_transitions" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_transitions/Using_CSS_transitions&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Keyframe
&lt;/h4&gt;

&lt;p&gt;This are the best CSS way to animate any complex movement, we can use all types of css property inside the keyframes which we can decide over a from and to or percentage wise steps. using this we can do much complex things than plain animations. But keyframe are always bit sluggish when there is too much movement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@keyframes show-up{
  from {
    opacity: 0
  }

  to {
    opacity: 1
  }
}

.class {
  animation: show-up 1s forwards;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above example will show an element from opacity 0 to opacity 1 in of 1s, ‘forwards’ means continue animation to keyword as final, otherwise after the duration it will access the class original property of opacity, We can also all ‘infinite’ to create infinite animation that loop between from and to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@keyframes grow {
  0% {
    width: 0
  }

  50% {
    width: 100%
  }

  100% {
    width: 0
  }
}

.class {
  animation: grow 1s infinite;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above example is the same keyframe using a % keyword to go through, rather than from and to we can add any css property in any time using keyframe, and can loop through this variables infinitely.&lt;/p&gt;

&lt;p&gt;Note: Keyframe may have some support issue on old browsers of safari or firefox, so we need web-Kit derivatives of keyframes such as,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@-webkit-keyframes grow {
  0% {
    width: 0
  }

  50% {
    width: 100%
  }

  100% {
    width: 0
  }
}

@keyframes grow {
  0% {
    width: 0
  }

  50% {
    width: 100%
  }

  100% {
    width: 0
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keyframes are basically control the duration and specific points style switch in animations, all other is just CSS, you can add any CSS property inside this keyframes to make it animate.&lt;/p&gt;

&lt;p&gt;(Please don’t use display: none; 🤣)&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Canvas
&lt;/h4&gt;

&lt;p&gt;Here, we move out from CSS and use javascript straight for complex animations, imagine we want a 1000 particles to roam around you screen that listening to your mouse movement we can’t do such user interaction animation with straight CSS, so here we can use canvas animations. But this is not like plain CSS. It need a very good knowledge over Javascript and Mathematics, all are calculation's here. Basically we can draw shapes using canvas keyword at any position inside the canvas by providing a x and y coordinates, and if we want to animate any elements, just calculate a new position and redraw the shape, for fluency we have reanimate function that provided from javascript that automatically trigger in all frame per second gaps.&lt;/p&gt;

&lt;p&gt;But plain canvas is directly running on CPU and the load on CPU on the client system can straight affect the animation performance, also the reanimate function trigger as per frame per second supported on the browser (Chrome: 120fps , safari: 60fps on 120 fps display). This could affect the fluency feel differently for different users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;canvas id="cw"
  &amp;gt;Animation creating multi-colored disappearing stream of light that follow the
  cursor as it moves over the image
&amp;lt;/canvas&amp;gt;

const canvas = document.getElementById("cw");
const context = canvas.getContext("2d");
context.globalAlpha = 0.5;

const cursor = {
  x: innerWidth / 2,
  y: innerHeight / 2,
};

let particlesArray = [];

generateParticles(101);
setSize();
anim();

addEventListener("mousemove", (e) =&amp;gt; {
  cursor.x = e.clientX;
  cursor.y = e.clientY;
});

addEventListener(
  "touchmove",
  (e) =&amp;gt; {
    e.preventDefault();
    cursor.x = e.touches[0].clientX;
    cursor.y = e.touches[0].clientY;
  },
  { passive: false },
);

addEventListener("resize", () =&amp;gt; setSize());

function generateParticles(amount) {
  for (let i = 0; i &amp;lt; amount; i++) {
    particlesArray[i] = new Particle(
      innerWidth / 2,
      innerHeight / 2,
      4,
      generateColor(),
      0.02,
    );
  }
}

function generateColor() {
  let hexSet = "0123456789ABCDEF";
  let finalHexString = "#";
  for (let i = 0; i &amp;lt; 6; i++) {
    finalHexString += hexSet[Math.ceil(Math.random() * 15)];
  }
  return finalHexString;
}

function setSize() {
  canvas.height = innerHeight;
  canvas.width = innerWidth;
}

function Particle(x, y, particleTrailWidth, strokeColor, rotateSpeed) {
  this.x = x;
  this.y = y;
  this.particleTrailWidth = particleTrailWidth;
  this.strokeColor = strokeColor;
  this.theta = Math.random() * Math.PI * 2;
  this.rotateSpeed = rotateSpeed;
  this.t = Math.random() * 150;

  this.rotate = () =&amp;gt; {
    const ls = {
      x: this.x,
      y: this.y,
    };
    this.theta += this.rotateSpeed;
    this.x = cursor.x + Math.cos(this.theta) * this.t;
    this.y = cursor.y + Math.sin(this.theta) * this.t;
    context.beginPath();
    context.lineWidth = this.particleTrailWidth;
    context.strokeStyle = this.strokeColor;
    context.moveTo(ls.x, ls.y);
    context.lineTo(this.x, this.y);
    context.stroke();
  };
}

function anim() {
  requestAnimationFrame(anim);

  context.fillStyle = "rgb(0 0 0 / 5%)";
  context.fillRect(0, 0, canvas.width, canvas.height);

  particlesArray.forEach((particle) =&amp;gt; particle.rotate());
}

#cw {
  position: fixed;
  z-index: -1;
}

body {
  margin: 0;
  padding: 0;
  background-color: rgb(0 0 0 / 5%);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above example is a mouse movement listening animations, you can check the result here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/8c5528b355dba5f4e24fc2ef14def475/href" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/8c5528b355dba5f4e24fc2ef14def475/href" rel="noopener noreferrer"&gt;https://medium.com/media/8c5528b355dba5f4e24fc2ef14def475/href&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. WebGl
&lt;/h4&gt;

&lt;p&gt;This is the modern version for canvas that use a canvas to create the animation same as mentioned above but this is running straight on GPU, so the performance will be better. But WebGl is based on a shaders code that most developers will struggle to understand, this is mostly like writing all complex logics as a string shaders. learning curve for plain shaders is very high and the logic behind drawing shapes here are complex.&lt;/p&gt;

&lt;p&gt;(Some browser system may not have GPU so we need a fallback canvas animation to prevent error pages)&lt;/p&gt;

&lt;p&gt;you can check a sample WebGl2 animation here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/61b22e8094f3c12d71d1257547cbfbf3/href" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/61b22e8094f3c12d71d1257547cbfbf3/href" rel="noopener noreferrer"&gt;https://medium.com/media/61b22e8094f3c12d71d1257547cbfbf3/href&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have some library out there for writing WebGl animations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;i. Pixi.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pixi js is a library for creating webGl 2D animations. We can use Pixi js API for drawing shapes rather than creating complex shaders, for example we can have Graphics animation for creating shapes like circle or triangle, and Sprite for creating images. Using this we can create complex animations that run in GPU and also we can control the frame per second to keep the uniq feel on all browsers&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ii. Three Js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three is a very popular and powerful 3D animation based on WebGl and WebGl 2 using three Js we can even create complex games in just a canvas with very good fluency. Three offer shapes images and complex movement logic API for creating complex animation without writing much Mathematical equations&lt;/p&gt;

&lt;p&gt;There are many more WebGl library out there for use have a look on here &lt;a href="https://en.wikipedia.org/wiki/List_of_WebGL_frameworks" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/List_of_WebGL_frameworks&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Animations are important for you website visual appearance, but overcomplicating animations on website will affect the use cases of your website and users may switch for better usability than visual appearance, so its very important to have the balance between usability and visual appearance, with above examples you can choose between animation methods for the best balanced animation in your website that align with your specific use cases. Happy coding ;)&lt;/p&gt;

&lt;p&gt;— Bibin Antony | Senior Full-Stack Developer | &lt;a href="https://bibinantony1998.github.io/my-portfolio/" rel="noopener noreferrer"&gt;https://bibinantony1998.github.io/my-portfolio/&lt;/a&gt; | &lt;a href="https://github.com/bibinantony1998" rel="noopener noreferrer"&gt;https://github.com/bibinantony1998&lt;/a&gt;&lt;/p&gt;

</description>
      <category>coding</category>
      <category>css</category>
      <category>canvas</category>
      <category>webgl</category>
    </item>
    <item>
      <title>Next Js — When to use and how to use | A Story by Bibin Antony</title>
      <dc:creator>Bibin Antony</dc:creator>
      <pubDate>Mon, 16 Dec 2024 18:23:47 +0000</pubDate>
      <link>https://dev.to/bibin_antony_9fce1ed9318b/next-js-when-to-use-and-how-to-use-4kfa</link>
      <guid>https://dev.to/bibin_antony_9fce1ed9318b/next-js-when-to-use-and-how-to-use-4kfa</guid>
      <description>&lt;h3&gt;
  
  
  Next Js — When to use and how to use
&lt;/h3&gt;

&lt;p&gt;I worked on Next JS framework an year before, and at that time, I didn’t have much idea about it. I ended up somehow completing the task rather than using it properly. But now I am trying to learn from the basics and figure out my three questions: &lt;strong&gt;What, When,&lt;/strong&gt; and ** How.**&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here, we start with Next Js. Next Js is a popular React framework introduced by Vercel for better SEO and SSR features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
As all know React is a Library of JS and when we need to build something out of React we need to create a framework out of it by installing the dependencies we need. so there are a thousand varieties of React frameworks when we move from project to project. Here Next Js is a Framework of react Js, This has its own routing and components for rendering Images and much more.&lt;/p&gt;

&lt;p&gt;But Next Js has more, Next support SSR (Server side rendering)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is SSR — Why is it needed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SSR is a technology that renders the JS from the server itself. In the case of React, there is only CSR(Client-side rendering). As you know JS needs to render using a JS engine, Browsers have a JS engine to render this. so if we share a JS bundle build file, a browser can render the JS bundle itself and display it to the DOM. But when the browser renders it, this leads to high memory usage on the client system.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why React have poor SEO&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
React renders its pages it needs JS to render the pages, But In the case of SEO, the search engine crawlers will read the XML files to access the content. but this crawler's Bots have no JS engine so from a React project all the Crawler bots see is a blank index.html without any content. It results in poor SEO on React sites. This not only limited to React but also on all CSR pages.&lt;/p&gt;

&lt;p&gt;In case of SSR, the page render from server, that is a node engine in the server render the JS andf built all to an XML file and the result page will transfer to the client through API. So when the Crawler bot acess the pages the result that this Bots get is a XML with all the contents in it, so the Serch engine crawlers can acess and store the copntents in it, this leads to a high SEO rating for SSR components&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;When&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;So we learn about what is Next js and SSR. But when you need it an important questions. This SSR components come with some drawbacks also. an SSR component has no support on client intraction, it won’t support Events, Browser API’s and also no React hook support. So when we really need to use Next js.&lt;br&gt;&lt;br&gt;
Here are my suggections  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When we want to built a public website that need a high SEO
&lt;/li&gt;
&lt;li&gt;When we have very less user intraction on the website
&lt;/li&gt;
&lt;li&gt;When we need to hide the API keys from Browser&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If i am developing an inhouse website for a coopration to use it in thier network, i don’t need SEO, in fact i need to hide this from the serch engine crawlers. In that case we can straight use CSR rendering.&lt;/p&gt;

&lt;p&gt;But is that mean i don ‘t want Next js for those cases. NO&lt;/p&gt;

&lt;p&gt;Here we want to learn about to routing options of Next and when we need to use those routing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next JS routing — Page and App&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In Next Js framework the routing is based on a folder stucture we create. its a standard of Next Js. But there is two type of routing Page and App&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Page router.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This is a routing Next introduced in its older versions, we can route from a page folder and all the files inside the pages will be accesible on the UI using it name. But the important part is &lt;strong&gt;page router is a CSR componet.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, when we create components using page route this will act same as a React component and it has poor SEO. But why we need this in 1st palce, becuse like i said abouve react is a library and when we need to create a website from it we need to create a framework, it lead to high initial setup time. But in case of Next page route, we can just create a it with CLI tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App router&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
App routing in introduced in latest version of react use the same folder stucture routing as page router, but only the files names as page will be accesible to UI. and as the main part &lt;strong&gt;App router pages is SSR as deafult.&lt;/strong&gt; If we need to write a CSR component is app router we need to mention a ‘use client’ in the componet first line.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As we see, using app router in Next JS we can create SSR components with Great SEO. But how we solve the Drabacks. Yes SSR don’t support Events Browser API’s and React hooks functions&lt;/p&gt;

&lt;p&gt;So we need to design the component as SSR and CSR in app router.&lt;/p&gt;

&lt;p&gt;When we need to show a list of data from server to UI, we don’t need any client intraction, we just need to list the data and print the page to the DOM. so we can create this using SSR component, the Data list API will call from SSR itself from server and create the XML and pass it to the browser.&lt;/p&gt;

&lt;p&gt;And in case of a create page component, we need to handle the client intaractions and State to manage the value, here we need to use CSR component using ‘use client’.&lt;/p&gt;

&lt;p&gt;But we need to remember a important thing while designing the components, A CSR component can create inside a SSR component. But all the components inside a CSR component will be a CSR component, we can’t create a SSR component inside a CSR component.&lt;/p&gt;

&lt;p&gt;So we can’t plainly create a main page with CSR component and levarage the SEO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawbacks of Next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are no Drawbacks for any languages, only the usecase we use this. But i will mention some i found during the learning process&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Next Js need a server to run&lt;/li&gt;
&lt;li&gt;If there is high trafic expect on the site, the server need to be very powerfull to handle all this rendering.&lt;/li&gt;
&lt;li&gt;Complex to design SSR and CSR components&lt;/li&gt;
&lt;li&gt;High learning curve compare to react&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Next Js is a powerfull framework to counter the poor SEO of React and also to follow a structured framework on react, but there are many cases that we don’t really want SSR and just need page route. So when ever we want to choose Next js we need to think about our usecase.&lt;/p&gt;

&lt;p&gt;All the things i mentioned in this Blog is from my learning, so please correct me if anything i mentioned is wrong, please use the comment box to communicate, or contact me on Linkdin&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/bibin-antony-773375193/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/bibin-antony-773375193/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Bibin Antony | Senior Full-Stack Developer | &lt;a href="https://bibinantony1998.github.io/my-portfolio/" rel="noopener noreferrer"&gt;https://bibinantony1998.github.io/my-portfolio/&lt;/a&gt; | &lt;a href="https://github.com/bibinantony1998" rel="noopener noreferrer"&gt;https://github.com/bibinantony1998&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nextjs13</category>
      <category>serversiderendering</category>
      <category>react</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>How we can style a web application with minimal css | A Story by Bibin Antony</title>
      <dc:creator>Bibin Antony</dc:creator>
      <pubDate>Thu, 29 Aug 2024 09:58:42 +0000</pubDate>
      <link>https://dev.to/bibin_antony_9fce1ed9318b/how-we-can-style-a-web-application-with-minimal-css-md6</link>
      <guid>https://dev.to/bibin_antony_9fce1ed9318b/how-we-can-style-a-web-application-with-minimal-css-md6</guid>
      <description>&lt;p&gt;Styling an entire website is always a big task, creating the frame for each screens could create large set of css files. and is clients request a change that affect all screens, then the things will get worse.&lt;/p&gt;

&lt;h4&gt;
  
  
  How we solve this problem that we face on each project
&lt;/h4&gt;

&lt;p&gt;Is there is a way to style all the screen frame on just one screen and apply to all. and also we can customise each screen content by individual styles.&lt;/p&gt;

&lt;h4&gt;
  
  
  How?
&lt;/h4&gt;

&lt;p&gt;Here, i am using SCSS and React for an example, But we can have this in any languages.&lt;/p&gt;

&lt;p&gt;First, We need to create some constant files. that holds the colour, font, and constants of our project&lt;/p&gt;

&lt;p&gt;So for colour here i am creating a color.scss file, and i added a :root selector, Other than any SCSS constants, this root will directly get appleid on browser and there is no need to import this constant files on each SCSS files&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:root {
 --themeColor: rgb(26, 9, 89);
 --boxShadow: rgba(0, 0, 0, 0.25);
 --black: #000000;
 --whiteInsideTheme: #ffffff;
 --invalid: rgb(246, 95, 95);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, here i added some basic colour variables that i normally use in my application, You can add or remove the variables as per the needs.&lt;/p&gt;

&lt;p&gt;For the font files, we can use font TTF or WOFF files, How?. In a font.scss file we are adding &lt;code&gt;_@font-face_&lt;/code&gt;. Also keep the TTF files in a fonts folder with the SCSS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@font-face {
 font-family: "regular";
 src: url("./fonts/noto-sans-jp-japanese-400.woff") format("woff");
 font-weight: normal;
 font-style: normal;
}

@font-face {
 font-family: "bold";
 src: url("./fonts/noto-sans-jp-japanese-900.woff") format("woff");
 font-weight: normal;
 font-style: normal;
}

@font-face {
 font-family: "black";
 src: url("./fonts/noto-sans-jp-japanese-700.woff") format("woff");
 font-weight: normal;
 font-style: normal;
}
@font-face {
 font-family: "light";
 src: url("./fonts/noto-sans-jp-japanese-300.woff") format("woff");
 font-weight: normal;
 font-style: normal;
}

@font-face {
 font-family: "medium";
 src: url("./fonts/noto-sans-jp-japanese-500.woff") format("woff");
 font-weight: normal;
 font-style: normal;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the above set of code we can define font face, and we can use this font-family like given below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
  font-family: "regular";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, then if we have some constant values, We can set in a constant.scss, like given&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:root {
 --headerHeight: 65px;
 --sidebarWidth: 250px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use as many :root in any files.&lt;/p&gt;

&lt;p&gt;So here we set all constant files, So if a request from client to change entire colour theme of a font family, We can just do this by changing 2 files. Easy right?&lt;/p&gt;

&lt;h4&gt;
  
  
  So, How we can create styles for all screen?
&lt;/h4&gt;

&lt;p&gt;For styling all screen from a common file, We need to understand how a web application look’s like. I am adding some examples here&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UI with a Header and a Sidebar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwq774esuj67mircm7eea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwq774esuj67mircm7eea.png" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UI with only Header&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48lt0jnekcs39c5vvuex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48lt0jnekcs39c5vvuex.png" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UI with only Sidebar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbxevrjejwx19lmgfjidp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbxevrjejwx19lmgfjidp.png" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this three style that we see above we can just use one set of css file and just remove the un wanted item. How?&lt;/p&gt;

&lt;p&gt;We can create a main-container.scss file and style all the main frameset there, Here given is a example to create a UI for option 1&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.main_container {
   height: 100%;
   display: -webkit-box;
   display: -ms-flexbox;
   display: flex;
   flex-direction: column;
   .custom_header {
      flex: 0 0 var(--headerHeight);
      height: var(--headerHeight);
      background-color: var(--white);
      box-shadow: 0px 0px 4px 0px var(--boxShadow);
      position: relative;
      z-index: 99;
   }
   .content_container {
      flex: 1 1 10px;
      height: 10px;
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      background-color: var(--mainBg);
      .custom_sidebar_container {
       -webkit-box-flex: 0;
       -ms-flex: 0 0 var(--sidebarWidth);
       flex: 0 0 var(--sidebarWidth);
       height: 100%;
       .custom_sidebar {
          height: 100%;
          background-color: var(--white);
          box-shadow: 0px 1px 4px 0px var(--boxShadow);
          border-radius: 0px 4px 4px 0px;
          overflow: auto;
          padding: 15px 14px;
       }
  }
  .overview_container {
     -webkit-box-flex: 1;
     -ms-flex: 1 1 10px;
     flex: 1 1 10px;
     width: 10px;
     width: 100%;
     height: 100%;
     overflow: auto;
     padding: 15px;
     display: -webkit-box;
     display: -ms-flexbox;
     display: flex;
     -webkit-box-orient: vertical;
     -webkit-box-direction: normal;
     -ms-flex-direction: column;
     flex-direction: column;
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So how we can use the same file set for option 2 and 3, We can just remove .custom_sidebar_container for option 2 and .custom_header styles for option 3. All the other frames are aligned by flex so when ever we remove the set that we don’t need, It will just auto adujust the other screens.&lt;/p&gt;

&lt;h4&gt;
  
  
  So how out HTML will look like?.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div className="main_container"&amp;gt;
   &amp;lt;div className="custom_header"&amp;gt;Header&amp;lt;/div&amp;gt;
   &amp;lt;div className="content_container"&amp;gt;
      &amp;lt;div className="custom_sidebar_container"&amp;gt;
         Sidebar
      &amp;lt;/div&amp;gt;
      &amp;lt;div className="overview_container"&amp;gt;
         Overview Area
      &amp;lt;/div&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Is this responsive?
&lt;/h4&gt;

&lt;p&gt;Yes, and it will work with any width or height for header and sidebar as well, we don’t need to modify any code for adjusting the resolutions.&lt;/p&gt;

&lt;p&gt;There is more we can do with the same some more set of css, here in overview container, we styled this to show some data. We can use the same flex box to create variable and responsive filter and tabular listing screens, here is an example&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3sc3p03bjuirb5y7uo8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3sc3p03bjuirb5y7uo8.png" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the UI given here, We can add some more layout to the Above SCSS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.main_container {
   height: 100%;
   display: -webkit-box;
   display: -ms-flexbox;
   display: flex;
   flex-direction: column;
   .custom_header {
      flex: 0 0 var(--headerHeight);
      height: var(--headerHeight);
      background-color: var(--white);
      box-shadow: 0px 0px 4px 0px var(--boxShadow);
      position: relative;
      z-index: 99;
   }
   .content_container {
      flex: 1 1 10px;
      height: 10px;
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      background-color: var(--mainBg);
      .custom_sidebar_container {
         -webkit-box-flex: 0;
         -ms-flex: 0 0 var(--sidebarWidth);
         flex: 0 0 var(--sidebarWidth);
         height: 100%;
         .custom_sidebar {
            height: 100%;
            background-color: var(--white);
            box-shadow: 0px 1px 4px 0px var(--boxShadow);
            border-radius: 0px 4px 4px 0px;
            overflow: auto;
            padding: 15px 14px;
         }
      }
      .overview_container {
         -webkit-box-flex: 1;
         -ms-flex: 1 1 10px;
         flex: 1 1 10px;
         width: 10px;
         width: 100%;
         height: 100%;
         overflow: auto;
         padding: 15px;
         display: -webkit-box;
         display: -ms-flexbox;
         display: flex;
         -webkit-box-orient: vertical;
         -webkit-box-direction: normal;
         -ms-flex-direction: column;
         flex-direction: column;
         .main_title_container {
            font-size: 16px;
            font-family: "medium";
            margin-bottom: 10px;
         }
         .main_overview_content_container {
            -webkit-box-flex: 1;
            -ms-flex: 1 1 10px;
            flex: 1 1 10px;
            height: 10px;
            overflow: auto;
            display: -webkit-box;
            display: -ms-flexbox;
            display: flex;
            -webkit-box-orient: vertical;
            -webkit-box-direction: normal;
            -ms-flex-direction: column;
            flex-direction: column;
            .main_list_container {
           -webkit-box-flex: 1;
             -ms-flex: 1 1 10px;
             flex: 1 1 10px;
             height: 10px;
            }
         }
      }
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the HTML&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div className="main_container"&amp;gt;
   &amp;lt;div className="custom_header"&amp;gt;Header&amp;lt;/div&amp;gt;
   &amp;lt;div className="content_container"&amp;gt;
    &amp;lt;div className="custom_sidebar_container"&amp;gt;Sidebar&amp;lt;/div&amp;gt;
    &amp;lt;div className="overview_container"&amp;gt;
     &amp;lt;div className="main_title_container "&amp;gt;Tittle here&amp;lt;/div&amp;gt;
     &amp;lt;div className="main_overview_content_container"&amp;gt;
      &amp;lt;div className=""&amp;gt;Some Filter Components Will Appear Here&amp;lt;/div&amp;gt;
      &amp;lt;div className="main_list_container"&amp;gt;Main list here&amp;lt;/div&amp;gt;
     &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using this, even is the height of filter or title exceed one line, still the UI will be perfectly adapt to the available height becuse of the flex layout we created here. So we can have anything inside this containers without thinking about the frame break. Only thing we need to consider is the order of HTML till this point need to be same.&lt;/p&gt;

&lt;h4&gt;
  
  
  Any Doubts?
&lt;/h4&gt;

&lt;p&gt;You can contact me through my LinkedIn,&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/bibin-antony-773375193/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/bibin-antony-773375193/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Bibin Antony | Senior Full-Stack Developer | &lt;a href="https://bibinantony1998.github.io/my-portfolio/" rel="noopener noreferrer"&gt;https://bibinantony1998.github.io/my-portfolio/&lt;/a&gt; | &lt;a href="https://github.com/bibinantony1998" rel="noopener noreferrer"&gt;https://github.com/bibinantony1998&lt;/a&gt;&lt;/p&gt;

</description>
      <category>framework</category>
      <category>cssframework</category>
      <category>scss</category>
      <category>css</category>
    </item>
    <item>
      <title>What if we need to create a HTML table with column resize? | A Story by Bibin Antony</title>
      <dc:creator>Bibin Antony</dc:creator>
      <pubDate>Wed, 14 Aug 2024 06:29:28 +0000</pubDate>
      <link>https://dev.to/bibin_antony_9fce1ed9318b/what-if-we-need-to-create-a-html-table-with-column-resize-5d4g</link>
      <guid>https://dev.to/bibin_antony_9fce1ed9318b/what-if-we-need-to-create-a-html-table-with-column-resize-5d4g</guid>
      <description>&lt;p&gt;There is many cases when we need to create a table in a website and need column resize on those tables, how we can do that?&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;NPM Grid Packages&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;There are many NPM grid packages with inbuilt resize feature in it, we can use one of those packages, But what is the problem?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any drawbacks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, This packages comes with lot more features that we don’t possibly need (&lt;em&gt;Pagination, sort, virtualise&lt;/em&gt;). So why we need to create such a large package just to have the resize, do we have any other options.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;CSS Resize&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resize: horizontal;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, we can use ‘resize’ in CSS for enabling the resize for any element, so do it can be applied for table cell to. But is that have anything missing?. Ya kind off&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is missing in CSS resize?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, CSS resize can’t be controlled much from a script, like in resize there will be a resize icon that we can’t style also a &lt;em&gt;min-width&lt;/em&gt; and &lt;em&gt;max-width&lt;/em&gt; for a cell while resize can’t be controlled from CSS resize.&lt;/p&gt;

&lt;p&gt;Is there any solution?. &lt;em&gt;Yes&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Solution&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;We can create a element in each table cell for resize and then user hold and drag this element, we need to adjust with of the table cell just prior to the element. Because this is in table style all cells will auto adjust to the the size as we adjust one cell width.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import { render } from "react-dom";

const App = () =&amp;gt; {
   return(
      &amp;lt;div&amp;gt;
        &amp;lt;table class="column_resize_table"&amp;gt;
          &amp;lt;thead&amp;gt;
            &amp;lt;tr&amp;gt;
              &amp;lt;th&amp;gt;Headding 1&amp;lt;/th&amp;gt;
              // resize element
              &amp;lt;th onMouseMove={onMouseMove} class="resize-th"/&amp;gt;
              &amp;lt;th&amp;gt;Headding 2&amp;lt;/th&amp;gt;
            &amp;lt;/tr&amp;gt;
          &amp;lt;/thead&amp;gt;
          &amp;lt;tbody&amp;gt;
            &amp;lt;tr&amp;gt;
              &amp;lt;td&amp;gt;Content 1&amp;lt;/td&amp;gt;
              &amp;lt;td /&amp;gt;
              &amp;lt;td&amp;gt;Content 2&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
          &amp;lt;/tbody&amp;gt;
        &amp;lt;/table&amp;gt;
      &amp;lt;/div&amp;gt;
  )
};

render(&amp;lt;App /&amp;gt;, document.body);

function onMouseMove(e) {
    const moveDiff = this.startPos - this.mouseX;
    let newPrev = this.startWidthPrev - moveDiff;

    ele.previousSibling.style.width = newPrev + 'px';
    ele.previousSibling.style.minWidth = newPrev + 'px';
    ele.previousSibling.style.maxWidth = newPrev + 'px';
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Okey, Now we need to control the &lt;em&gt;min-width&lt;/em&gt; and &lt;em&gt;max-width&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
function onMouseMove(e, minWidth, maxWidth) {
    const moveDiff = this.startPos - this.mouseX;
    let newPrev = this.startWidthPrev - moveDiff;

    if((!minWidth || newPrev &amp;gt;= minWidth) &amp;amp;&amp;amp; (!maxWidth || newPrev &amp;lt;= maxWidth)) {
        ele.previousSibling.style.width = newPrev + 'px';
        ele.previousSibling.style.minWidth = newPrev + 'px';
        ele.previousSibling.style.maxWidth = newPrev + 'px';
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we can set all this features in this resize element, but the TH element we created will act as a column itself, so we need to control its width, how we can do that?, Style the resize element&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.resize-th {
  cursor: ew-resize;
  width: 3px; // Change as per the UI
  min-width: 3px;
  max-width: 3px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;So we done that, we can resize a table cell without over complicating and with all the features we need. For implementing this and with some more additional features check out my NPM package.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/react-table-column-resizer" rel="noopener noreferrer"&gt;react-table-column-resizer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find a demo and sample implementation here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/media/7e2d6320ccab84673b28d7dcbcbe4a26/href" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://medium.com/media/7e2d6320ccab84673b28d7dcbcbe4a26/href" rel="noopener noreferrer"&gt;https://medium.com/media/7e2d6320ccab84673b28d7dcbcbe4a26/href&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Bibin Antony | Senior Full-Stack Developer | &lt;a href="https://bibinantony1998.github.io/my-portfolio/" rel="noopener noreferrer"&gt;https://bibinantony1998.github.io/my-portfolio/&lt;/a&gt; | &lt;a href="https://github.com/bibinantony1998" rel="noopener noreferrer"&gt;https://github.com/bibinantony1998&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reacttableresize</category>
      <category>htmltablecolumnresiz</category>
      <category>adjustcolumnmousedra</category>
      <category>resizetablecolumn</category>
    </item>
  </channel>
</rss>
