<?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>Forem: Walid Adebayo</title>
    <description>The latest articles on Forem by Walid Adebayo (@walidadebayo).</description>
    <link>https://forem.com/walidadebayo</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%2F2946877%2Fc61b0f74-2180-4ce7-8017-82a0bce8519a.jpg</url>
      <title>Forem: Walid Adebayo</title>
      <link>https://forem.com/walidadebayo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/walidadebayo"/>
    <language>en</language>
    <item>
      <title>Nexus Digital: A Stunning Intranet Homepage Built with React, Tailwind, and TypeScript</title>
      <dc:creator>Walid Adebayo</dc:creator>
      <pubDate>Sun, 20 Jul 2025 11:32:21 +0000</pubDate>
      <link>https://forem.com/walidadebayo/nexus-digital-a-stunning-intranet-homepage-built-with-react-tailwind-and-typescript-1aa3</link>
      <guid>https://forem.com/walidadebayo/nexus-digital-a-stunning-intranet-homepage-built-with-react-tailwind-and-typescript-1aa3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, Holistic Webdev: Office Space&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;For this challenge, I created &lt;strong&gt;Nexus Digital Intranet&lt;/strong&gt;, a modern interactive homepage designed to serve as a central hub for any team or organization. My goal was to build a vibrant and engaging interface that boosts productivity, celebrates team culture, and makes internal tools easily accessible.&lt;/p&gt;

&lt;p&gt;The layout includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;dynamic hero section&lt;/strong&gt; with a typewriter animation and background effects to grab attention immediately.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;Upcoming Events&lt;/strong&gt; carousel to keep everyone informed.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Team Spotlight&lt;/strong&gt; to celebrate team members and foster connection.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Quick Access&lt;/strong&gt; area for important tools/resources.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;News &amp;amp; Announcements&lt;/strong&gt; section with interactive cards.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Productivity Snapshot&lt;/strong&gt; using real-time data charts.&lt;/li&gt;
&lt;li&gt;A responsive &lt;strong&gt;Contact Form&lt;/strong&gt; with smooth animations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This intranet is fully responsive, theme-toggle ready (dark/light), and adaptable for any modern workplace.&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;strong&gt;Live Website&lt;/strong&gt;: &lt;a href="https://nexus-digital-henna.vercel.app" rel="noopener noreferrer"&gt;nexus-digital-henna.vercel.app&lt;/a&gt;&lt;br&gt;
💻 &lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/Walidadebayo/nexus-digital" rel="noopener noreferrer"&gt;github.com/Walidadebayo/nexus-digital&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hero Section
&lt;/h3&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%2Fazu2utj45g6wh29rhw1m.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%2Fazu2utj45g6wh29rhw1m.png" alt="Hero Section" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Upcoming Events
&lt;/h3&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%2F2cqujxhij2717nmjgwib.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%2F2cqujxhij2717nmjgwib.png" alt="Events" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Team Spotlight
&lt;/h3&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%2Fvsd4ghhjecj4iczacy59.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%2Fvsd4ghhjecj4iczacy59.png" alt="Team Spotlight" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Productivity Snapshot
&lt;/h3&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%2Fm988kqqt2jul2nzjb91v.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%2Fm988kqqt2jul2nzjb91v.png" alt="Charts" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;This was a solo build and an exciting chance to explore how thoughtful design and interactivity can improve internal communication and morale.&lt;/p&gt;

&lt;p&gt;Key things I learned and enjoyed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion + GSAP&lt;/strong&gt;: I used both to layer animations, making the UI feel polished and intuitive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript with React&lt;/strong&gt;: Ensured type safety and structure in managing component logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chart.js&lt;/strong&gt;: Great for the live productivity snapshot feature showing how data can be visually compelling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component Composition&lt;/strong&gt;: I leaned on modular components for scalability and easy maintenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design Thinking&lt;/strong&gt;: I considered user roles - employees, HR, team leads and what matters most to them when they log into a company intranet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m especially proud of the cohesive visual style, smooth scroll effects, and how all sections contribute to a holistic digital workplace experience.&lt;/p&gt;




&lt;p&gt;Thanks again to DEV and Axero for the opportunity.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Made with ❤️ for the Nexus Digital team and the Dev community.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;DEV Username: &lt;a href="https://dev.to/walidadebayo"&gt;@Walidadebayo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>MedRecord – Secure Medical Records with Fine-Grained Access Control</title>
      <dc:creator>Walid Adebayo</dc:creator>
      <pubDate>Sun, 04 May 2025 20:52:24 +0000</pubDate>
      <link>https://forem.com/walidadebayo/medrecord-secure-medical-records-with-fine-grained-access-control-3b6</link>
      <guid>https://forem.com/walidadebayo/medrecord-secure-medical-records-with-fine-grained-access-control-3b6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/permit_io"&gt;Permit.io Authorization Challenge&lt;/a&gt;: Permissions Redefined&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;MedRecord&lt;/strong&gt; is a modern, privacy-first medical records management system that empowers doctors and patients with secure access to health data while giving administrators full oversight. We tackled the problem of &lt;strong&gt;data access control in healthcare&lt;/strong&gt; - ensuring that only authorised users can read, update, or manage sensitive medical records.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Permit.io&lt;/strong&gt;, we implemented Attribute-Based Access Control (ABAC) and Role-Based Access Control (RBAC), allowing&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Admins&lt;/strong&gt; to manage the entire system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Doctors&lt;/strong&gt; can view all records but update only their assigned patients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patients&lt;/strong&gt; to view only their personal records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By decoupling permissions logic from our codebase, we built a scalable and maintainable system that’s easy to audit and extend.&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://medrecord.vercel.app/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;
 &lt;a href="https://medrecord.vercel.app" rel="noopener noreferrer"&gt;https://medrecord.vercel.app&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Project Repo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/Walidadebayo/medrecord" rel="noopener noreferrer"&gt;GitHub – Walidadebayo/medrecord&lt;/a&gt;&lt;br&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/Walidadebayo" rel="noopener noreferrer"&gt;
        Walidadebayo
      &lt;/a&gt; / &lt;a href="https://github.com/Walidadebayo/medrecord" rel="noopener noreferrer"&gt;
        medrecord
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A full-stack medical records management application built with Next.js, MongoDB, and Permit.io for role-based access control.
    &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;Medical Records Management Application&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A full-stack medical records management application built with Next.js, MongoDB, and Permit.io for role-based access control.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role-Based Access Control&lt;/strong&gt;: Admin, doctor, and patient roles with different permissions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Integration&lt;/strong&gt;: Persistent data storage with MongoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Uploads&lt;/strong&gt;: Upload and manage medical documents using Vercel Blob&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Search&lt;/strong&gt;: Filter records by date, doctor, patient, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt;: Works on desktop and mobile devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern UI&lt;/strong&gt;: Clean interface with gradient styling&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup Instructions&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Prerequisites&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 18+ and npm&lt;/li&gt;
&lt;li&gt;MongoDB database (local or Atlas)&lt;/li&gt;
&lt;li&gt;Vercel account (for Blob storage)&lt;/li&gt;
&lt;li&gt;Permit.io account&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Environment Variables&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Create a &lt;code&gt;.env.local&lt;/code&gt; file in the root directory with the following variables:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;# MongoDB
MONGODB_URI=your_mongodb_connection_string

# Authentication
JWT_SECRET=your_jwt_secret_key

# Permit.io
PERMIT_API_KEY=your_permit_api_key

# Vercel Blob
BLOB_READ_WRITE_TOKEN=your_vercel_blob_token
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installation&lt;/h3&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Clone the repository&lt;/li&gt;
&lt;li&gt;Install dependencies:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Run the development server:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Open &lt;a href="http://localhost:2500" rel="nofollow noopener noreferrer"&gt;http://localhost:2500&lt;/a&gt; in your browser&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Testing Different Roles&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;The…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Walidadebayo/medrecord" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;: Next.js, TailwindCSS, MongoDB (Mongoose), Permit.io, Docker, Render, Vercel Blob (for files storage)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Login&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbufxu9pbq79m82fed39k.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%2Fbufxu9pbq79m82fed39k.png" alt="Login"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Record&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fouc0pvchmfn8hkegcbol.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%2Fouc0pvchmfn8hkegcbol.png" alt="Create Record"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashbaord&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4r4fhs5x82i7122ieqy.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%2Fz4r4fhs5x82i7122ieqy.png" alt="Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Record Details&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2vfceb2j95ubjmyzbm03.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%2F2vfceb2j95ubjmyzbm03.png" alt="Record Details"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Viewing Record Attachments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubtzp9fjc7i612o4s5f7.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%2Fubtzp9fjc7i612o4s5f7.png" alt="Viewing Record Attachments"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit Record&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs48g5fmma5841j5sgil3.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%2Fs48g5fmma5841j5sgil3.png" alt="Edit Record"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Our Journey
&lt;/h2&gt;

&lt;p&gt;This project was built by a small but dedicated team of developers: &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/walidadebayo"&gt;@walidadebayo&lt;/a&gt;&lt;/strong&gt; (frontend/backend), &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/volde"&gt;@volde&lt;/a&gt;&lt;/strong&gt; (frontend/backend). Our main challenge was integrating &lt;strong&gt;Permit.io’s PDP&lt;/strong&gt; (Policy Decision Point) in a production-like environment.&lt;/p&gt;
&lt;h3&gt;
  
  
  Challenges We Faced
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PDP Hosting&lt;/strong&gt;: Initially, we ran Permit’s PDP locally, but this didn’t scale. We learned how to containerise it using Docker and deploy it to &lt;strong&gt;Render&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error 422 from Permit&lt;/strong&gt;: We encountered recurring authorization errors from Permit (especially code 422) due to missing resources and users. We resolved this by programmatically registering all users, resources, and attributes during app setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-Grained ABAC Logic&lt;/strong&gt;: We built a fallback RBAC+ABAC function in Node.js to complement Permit’s decisions when no matching usersets were found.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Key Learnings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How to &lt;strong&gt;containerise a Node-less PDP&lt;/strong&gt; using only Permit’s Docker image&lt;/li&gt;
&lt;li&gt;How to define and manage &lt;strong&gt;resource types, actions, roles&lt;/strong&gt;, and &lt;strong&gt;relations&lt;/strong&gt; in Permit&lt;/li&gt;
&lt;li&gt;How to write and test &lt;strong&gt;policies&lt;/strong&gt; for both RBAC and ABAC scenarios&lt;/li&gt;
&lt;li&gt;How to log and debug &lt;strong&gt;authorization failures&lt;/strong&gt; using Permit’s SDK and API responses&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Using Permit.io for Authorization
&lt;/h2&gt;

&lt;p&gt;Here’s how we integrated Permit.io into MedRecord:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User Provisioning&lt;/strong&gt;: Upon signup, users are registered in Permit with attributes like &lt;code&gt;role&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, and &lt;code&gt;email&lt;/code&gt;. Roles like &lt;code&gt;doctor&lt;/code&gt;, &lt;code&gt;patient&lt;/code&gt;, and &lt;code&gt;admin&lt;/code&gt; are assigned using Permit’s SDK.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;last_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;role_assignments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;resource_instance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medical_record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;tenant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Resource Registration&lt;/strong&gt;: When a new medical record is created, it is registered as a &lt;strong&gt;Permit resource instance&lt;/strong&gt; with attributes like &lt;code&gt;doctor_name&lt;/code&gt; and &lt;code&gt;patient_name&lt;/code&gt;, so ABAC policies can reference them.&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%2Fpo5e7kfl2b4qd2cpukim.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%2Fpo5e7kfl2b4qd2cpukim.png" alt="Resources"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resourceDefinition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medical_record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Medical Record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A patient’s medical record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Read&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Read the record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Update the record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Delete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Delete the record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Create a new record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;doctor_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ID of the assigned doctor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;patient_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ID of the patient&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;delete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;doctor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;patient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resourceDefinition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

 &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resourceInstances&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
          &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medical_record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;patient_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;patient_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;doctor_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;doctor_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authorization Check&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before showing or updating a record, we make a call to &lt;code&gt;permit.check(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If Permit allows, access proceeds.&lt;/li&gt;
&lt;li&gt;If no userset matches (e.g., newly created users), we fall back to a &lt;strong&gt;local RBAC+ABAC check&lt;/strong&gt; to prevent access while still showing meaningful logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Policy Hosting&lt;/strong&gt;: The PDP is containerised via Docker and deployed to &lt;strong&gt;Render&lt;/strong&gt;, exposing it via a secure endpoint that our app uses.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example Permit Check&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allowed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;currentUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medical_record&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;recordId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;doctor_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dr. Sarah Johnson&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;patient_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Emily Davis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Permit’s CLI and dashboard helped us manage roles, write policies, and test everything without needing a custom permission system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Members
&lt;/h2&gt;

&lt;p&gt;This project was built by a team of two:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Walid Adebayo&lt;/strong&gt; - &lt;a class="mentioned-user" href="https://dev.to/walidadebayo"&gt;@walidadebayo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edun Yusuf&lt;/strong&gt; - &lt;a class="mentioned-user" href="https://dev.to/volde"&gt;@volde&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We truly enjoyed building this project and learned a lot about modern access control systems. Thanks to the Permit.io team for providing powerful tools and excellent documentation!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>permitchallenge</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>RoboRush is an engaging browser-based arcade game with AI Assist and Boost Mode</title>
      <dc:creator>Walid Adebayo</dc:creator>
      <pubDate>Sun, 27 Apr 2025 16:41:08 +0000</pubDate>
      <link>https://forem.com/walidadebayo/roborush-is-an-engaging-browser-based-arcade-game-with-ai-assist-and-boost-mode-3j9j</link>
      <guid>https://forem.com/walidadebayo/roborush-is-an-engaging-browser-based-arcade-game-with-ai-assist-and-boost-mode-3j9j</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://int.alibabacloud.com/m/1000402443/" rel="noopener noreferrer"&gt;Alibaba Cloud&lt;/a&gt; Challenge: &lt;a href="https://dev.to/challenges/alibaba"&gt;Build a Web Game&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;RoboRush&lt;/strong&gt; is a fast-paced, robot-themed browser arcade game where players navigate a robot through a futuristic maze, collect energy orbs, and avoid rotating hazards - all while racing against the clock.&lt;/p&gt;

&lt;p&gt;The game features an &lt;strong&gt;AI Assist Mode&lt;/strong&gt;, &lt;strong&gt;Speed Boost&lt;/strong&gt;, &lt;strong&gt;Overdrive Combo Mode&lt;/strong&gt;, global &lt;strong&gt;Leaderboards&lt;/strong&gt;, and full &lt;strong&gt;Offline Play&lt;/strong&gt; support.&lt;/p&gt;

&lt;p&gt;Players can experience smooth gameplay across &lt;strong&gt;desktop and mobile&lt;/strong&gt;, with intuitive controls and dynamic strategy through special abilities.&lt;/p&gt;

&lt;p&gt;Built with &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Phaser.js&lt;/strong&gt;, &lt;strong&gt;TailwindCSS&lt;/strong&gt;, &lt;strong&gt;TypeScript&lt;/strong&gt;, &lt;strong&gt;MySQL&lt;/strong&gt;, and &lt;strong&gt;MappifySQL (ORM)&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Live Game&lt;/strong&gt;: &lt;a href="https://roborush-ashen.vercel.app/" rel="noopener noreferrer"&gt;Play RoboRush&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Source&lt;/strong&gt;: &lt;a href="https://github.com/Walidadebayo/RoboRush" rel="noopener noreferrer"&gt;View RoboRush Repository&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📷 Screenshots
&lt;/h3&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%2F59n4jea7atuwl48lfukf.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%2F59n4jea7atuwl48lfukf.png" alt="RoboRush Gameplay"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mbd98icbdumngypczuq.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%2F6mbd98icbdumngypczuq.png" alt="Desktop"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir236b1jifkq084zwbo8.jpg" 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%2Fir236b1jifkq084zwbo8.jpg" alt="Mobile"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ill3k6g20kodw9rrxx9.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%2F2ill3k6g20kodw9rrxx9.png" alt="Leaderboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  📽️ Gameplay Videos
&lt;/h3&gt;
&lt;h4&gt;
  
  
  🖥️ Desktop Gameplay
&lt;/h4&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ARgVq0XGkw4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  📱 Mobile Gameplay
&lt;/h4&gt;

&lt;h2&gt;
  
  
    &lt;iframe src="https://www.youtube.com/embed/do7KnCcWoq4"&gt;
  &lt;/iframe&gt;

&lt;/h2&gt;

&lt;h2&gt;
  
  
  ☁️ Alibaba Cloud Services Implementation
&lt;/h2&gt;

&lt;p&gt;While I fully planned to deploy RoboRush using Alibaba Cloud services, I encountered verification challenges and could not complete the deployment before the submission deadline.&lt;br&gt;&lt;br&gt;
Here’s a full breakdown of my planned Alibaba Cloud integration:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Elastic Compute Service (ECS)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why use it?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ECS would host the Dockerized Next.js app inside a scalable, secure containerized environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration Plan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Package RoboRush using Docker.&lt;/li&gt;
&lt;li&gt;Deploy the container to an ECS instance.&lt;/li&gt;
&lt;li&gt;Enable auto-scaling and backup scheduling for server robustness.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;ApsaraDB for RDS (MySQL)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why use it?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ApsaraDB would provide high-availability, secure, and maintenance-free management of player data (scores, names, attempts).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration Plan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store leaderboard scores, player attempts, and historical game data.&lt;/li&gt;
&lt;li&gt;Optimize query performance for leaderboard fetching.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Object Storage Service (OSS)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why use it?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OSS would serve static game assets (sprites, background music, sounds) globally with efficient delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration Plan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload assets like robot images, orbs, sounds, and icons.&lt;/li&gt;
&lt;li&gt;Reference OSS URLs inside RoboRush frontend instead of bundling heavy files.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Content Delivery Network (CDN)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why use it?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
CDN would cache and deliver static assets closer to players worldwide, improving game loading speeds and reducing latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration Plan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distribute OSS-hosted assets globally.&lt;/li&gt;
&lt;li&gt;Ensure quick loading of game assets on both mobile and desktop players.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚠️ Verification Challenges
&lt;/h3&gt;

&lt;p&gt;I am currently based in the UK. Due to recent changes, the UK has moved to fully digital immigration permits.&lt;br&gt;&lt;br&gt;
I attempted to upload PDF-based digital documentation alongside my passport during the Alibaba Cloud verification process, but my request was repeatedly rejected.&lt;br&gt;&lt;br&gt;
Despite contacting Alibaba Cloud Support for assistance, the issue was not resolved in time for deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;However, RoboRush remains fully cloud-ready, container-ready, and designed to scale on Alibaba Cloud services.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I look forward to completing full deployment once my verification is successfully completed!&lt;/p&gt;




&lt;h2&gt;
  
  
  🎮 Game Development Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🤖 AI Assist Mode&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Automatically navigate and collect orbs for 10 seconds. While active, orb collection awards 50 points instead of 100 - balancing gameplay.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;⚡Speed Boost Mode&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Temporarily increases movement speed. Boosted orb collection awards 70 points per orb.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🔥Overdrive Mode (Boost + AI Assist)&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Combining Boost and AI Assist reduces orb collection points to 35, maintaining fair challenge and strategic depth.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;📱Mobile and Desktop Responsive Controls&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Keyboard controls on desktop (WASD or Arrow Keys), virtual joystick on mobile - all tuned for a smooth, satisfying experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🎵 Dynamic Soundtrack&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
A custom soundtrack that adapts to gameplay, enhancing the immersive experience. background music and sound effects are included for every action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;📦Offline Play and PWA support&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Full PWA support lets players install RoboRush on devices and play without internet access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🚀 Docker-Ready Architecture&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
RoboRush is fully containerized for deployment across any cloud service (Alibaba ECS).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🏆 Global Leaderboards&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Players can compete for high scores and track their performance against others worldwide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🎯 Sync Across Devices&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Players can sync their progress and scores across devices with their name, ensuring a seamless experience.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If you enjoyed this project, please consider giving it a star on GitHub! and comment below with your thoughts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This project was built with ❤️ and inspired by Alibaba Cloud.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>alibabachallenge</category>
      <category>devchallenge</category>
      <category>gamedev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 Introducing React Video &amp; Audio Player: A Customisable Media Component for Modern Web Apps</title>
      <dc:creator>Walid Adebayo</dc:creator>
      <pubDate>Tue, 08 Apr 2025 16:33:09 +0000</pubDate>
      <link>https://forem.com/walidadebayo/introducing-react-video-audio-player-a-customisable-media-component-for-modern-web-apps-1dlm</link>
      <guid>https://forem.com/walidadebayo/introducing-react-video-audio-player-a-customisable-media-component-for-modern-web-apps-1dlm</guid>
      <description>&lt;p&gt;If you're building a video platform, podcast app, or just need flexible media components - meet your new favourite tool:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;React Video &amp;amp; Audio Player&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A lightweight, open-source video &amp;amp; audio player component built with &lt;strong&gt;React&lt;/strong&gt; and styled with &lt;strong&gt;TailwindCSS&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It also works in &lt;strong&gt;plain HTML&lt;/strong&gt; via &lt;strong&gt;CDN&lt;/strong&gt;, with full control over styles and functionality.&lt;/p&gt;


&lt;h3&gt;
  
  
  ✅ Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supports multiple media formats:&lt;/strong&gt; &lt;code&gt;MP4&lt;/code&gt;, &lt;code&gt;MP3&lt;/code&gt;, &lt;code&gt;OGG&lt;/code&gt;, &lt;code&gt;WEBM&lt;/code&gt;, &lt;code&gt;WAV&lt;/code&gt;, and more
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customisable controls:&lt;/strong&gt; Play, pause, skip, download, fullscreen, and volume
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcuts:&lt;/strong&gt; For accessible and intuitive playback
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual waveform rendering:&lt;/strong&gt; For audio files
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive and theme-aware:&lt;/strong&gt; Styled with TailwindCSS
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plug-and-play:&lt;/strong&gt; Works in React, Next.js, or standalone HTML/JS projects&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📦 Installation
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-video-audio-player
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;or use &lt;strong&gt;CDN&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/react-video-audio-player/dist/index.umd.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt;
  &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;
  &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/react-video-audio-player/dist/video-audio-player.min.css"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ⚡ Quick Usage (React Example)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;VideoPlayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AudioPlayer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-video-audio-player&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;VideoPlayer&lt;/span&gt;
      &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"video.mp4"&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;AudioPlayer&lt;/span&gt;
       &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"audio.mp3"&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧩 Or in plain HTML
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- UMD --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/react-video-audio-player/dist/index.umd.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt;
  &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;
  &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/react-video-audio-player/dist/video-audio-player.min.css"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"video-player-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"audio-player-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="c1"&gt;// Initialise the VideoPlayer&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;videoPlayerContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;video-player-container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;videoPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;VideoPlayer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;video.mp4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;videoPlayerContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoPlayer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Initialise the AudioPlayer&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;audioPlayerContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audio-player-container&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;audioPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AudioPlayer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audio.mp3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;audioPlayerContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audioPlayer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🌐 Useful Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://react-video-audio-player.vercel.app" rel="noopener noreferrer"&gt;react-video-audio-player.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;NPM:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/react-video-audio-player" rel="noopener noreferrer"&gt;npmjs.com/package/react-video-audio-player&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/Walidadebayo/react-video-audio-player" rel="noopener noreferrer"&gt;github.com/Walidadebayo/react-video-audio-player&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;CDN:&lt;/strong&gt; &lt;a href="https://www.jsdelivr.com/package/npm/react-video-audio-player" rel="noopener noreferrer"&gt;jsDelivr Package&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🙌 Contribution
&lt;/h3&gt;

&lt;p&gt;I’d love feedback, contributions, or suggestions!&lt;br&gt;&lt;br&gt;
If this component helps your project, a &lt;strong&gt;star on GitHub&lt;/strong&gt; would mean a lot.&lt;/p&gt;

&lt;p&gt;Thanks for reading - happy coding!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;#ReactJS #WebDev #OpenSource #JavaScript #Frontend #MediaPlayer #AudioPlayer #VideoPlayer #nextjs #react #html&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Estate Management System</title>
      <dc:creator>Walid Adebayo</dc:creator>
      <pubDate>Sun, 23 Mar 2025 01:40:35 +0000</pubDate>
      <link>https://forem.com/walidadebayo/-4omp</link>
      <guid>https://forem.com/walidadebayo/-4omp</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/walidadebayo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F2946877%2Fc61b0f74-2180-4ce7-8017-82a0bce8519a.jpg" alt="walidadebayo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/walidadebayo/smart-estate-management-platform-4350" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Smart Estate Management Platform&lt;/h2&gt;
      &lt;h3&gt;Walid Adebayo ・ Mar 23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devchallenge&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#kendoreactchallenge&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>kendoreactchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Smart Estate Management Platform</title>
      <dc:creator>Walid Adebayo</dc:creator>
      <pubDate>Sun, 23 Mar 2025 01:40:17 +0000</pubDate>
      <link>https://forem.com/walidadebayo/smart-estate-management-platform-4350</link>
      <guid>https://forem.com/walidadebayo/smart-estate-management-platform-4350</guid>
      <description>&lt;p&gt;🎯 &lt;strong&gt;Submission for the &lt;a href="https://dev.to/challenges/kendoreact"&gt;KendoReact Free Components Challenge&lt;/a&gt;.&lt;/strong&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  🏡 &lt;strong&gt;What We Built:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EstateLuxe - Smart Estate Management Platform&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EstateLuxe&lt;/strong&gt; is a modern, intuitive, and AI-powered estate management platform that streamlines property management for both users and administrators.&lt;br&gt;&lt;br&gt;
Built using &lt;strong&gt;Next.js, KendoReact&lt;/strong&gt;, and a customised &lt;strong&gt;Bootstrap theme&lt;/strong&gt; generated with &lt;strong&gt;Kendo ThemeBuilder&lt;/strong&gt;, it offers a seamless user experience with powerful features, including:  &lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;User Dashboard:&lt;/strong&gt; Quick stats, favourite properties, payments, and viewings.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;AI Assistant:&lt;/strong&gt; Uses &lt;strong&gt;Gemini API&lt;/strong&gt; to provide intelligent property recommendations, morgage calculations and assistance. 🤖&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Property Management for Admins:&lt;/strong&gt; CRUD functionality for properties, tenants, and payments, with automated reminders.&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Custom Theme Switching:&lt;/strong&gt; Dynamic theme switching between &lt;strong&gt;Default, Bootstrap, Custom Bootstrap, and Dark Mode&lt;/strong&gt; using KendoReact’s ThemeBuilder-generated CSS.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🎥 &lt;strong&gt;Demo:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://estateluxe.vercel.app/" rel="noopener noreferrer"&gt;Live Demo Link&lt;/a&gt; (&lt;a href="https://estateluxe.vercel.app/" rel="noopener noreferrer"&gt;https://estateluxe.vercel.app/&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
🔗 &lt;a href="https://github.com/Walidadebayo/EstateLuxe" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt; (&lt;a href="https://github.com/Walidadebayo/EstateLuxe" rel="noopener noreferrer"&gt;https://github.com/Walidadebayo/EstateLuxe&lt;/a&gt;)  &lt;/p&gt;

&lt;h3&gt;
  
  
  📸 &lt;strong&gt;Screenshots:&lt;/strong&gt; (Not showing all pages here)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Admin Management Screens
&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%2F3rsllvvh8jm8x3g15678.png" alt="Admin Dashbaord" width="800" height="405"&gt;
&lt;/li&gt;
&lt;/ul&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%2F9zhbm8ikloz6c591uw1t.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%2F9zhbm8ikloz6c591uw1t.png" alt="Payment Tracker" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Assistant Interface
&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%2Famluukp3h5e2i6ujqqw6.png" alt="AI Assistant Interface Popup" width="728" height="852"&gt;
&lt;/li&gt;
&lt;/ul&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%2F0qv6fk44c4qyn65x4xgd.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%2F0qv6fk44c4qyn65x4xgd.png" alt="AI Assistant Interface Page" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User 
&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%2F459vop5mbw3rrlfhb2eh.png" alt="User Dashboard" width="800" height="555"&gt;
&lt;/li&gt;
&lt;/ul&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%2F1t505afocd3he83y4p0v.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%2F1t505afocd3he83y4p0v.png" alt="Properties Search" width="800" height="401"&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%2F9w3104slgdlvdi0bh21w.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%2F9w3104slgdlvdi0bh21w.png" alt="Property Details" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Custom Theme Demonstration  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🎥 Video Demo&lt;br&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/J1bBF5paKGg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡️ &lt;strong&gt;KendoReact Experience:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We used &lt;strong&gt;KendoReact’s free components&lt;/strong&gt; extensively across different pages. Here’s a detailed breakdown:  &lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 &lt;strong&gt;Components Used:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Buttons:&lt;/strong&gt; For quick actions and form submission.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grid:&lt;/strong&gt; To display property lists, payments, and tenants with filtering and sorting.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Charts:&lt;/strong&gt; To visualise property viewings in the dashboard.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DatePicker:&lt;/strong&gt; To pick dates for tenants, payments, and other events.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DateInput:&lt;/strong&gt; For date selection in multiple forms.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DropDowns:&lt;/strong&gt; For theme toggle, filtering, and user dropdowns.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inputs:&lt;/strong&gt; For search, filtering options, and other features.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dialogs:&lt;/strong&gt; To handle confirmations and modals.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversational UI:&lt;/strong&gt; Powers the AI Assistant chat.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indicators:&lt;/strong&gt; For loading states and progress bars.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SVG Icons and Common:&lt;/strong&gt; For UI font icons.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form &amp;amp; FormField:&lt;/strong&gt; To accept inputs for login/register and CRUD operations.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ScrollView:&lt;/strong&gt; For carousels showcasing property images and customer reviews.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifications:&lt;/strong&gt; For success/error messages on login/registration and other actions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload:&lt;/strong&gt; For file uploads when adding property details.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card:&lt;/strong&gt; For displaying properties, charts, and other elements.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppBar:&lt;/strong&gt; For the navbar (top navigation) displaying different navigation for admin and user.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drawer:&lt;/strong&gt; For sidebar navigation in the admin layout.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Query:&lt;/strong&gt; For querying data in Grid (table).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map:&lt;/strong&gt; To display the location of properties and contact maps.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Popover:&lt;/strong&gt; For AI assistant popover.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TextArea:&lt;/strong&gt; For contact messages and property descriptions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slider:&lt;/strong&gt; For filtering price ranges in property search.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkbox:&lt;/strong&gt; For accepting terms and “remember me” options in login/register.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TabStrip and TabStripTab:&lt;/strong&gt; To create tabs on login pages for admin and user.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These components were leveraged across different sections, ensuring an efficient and polished user experience.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 &lt;strong&gt;AIm to Impress:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We went beyond the ordinary by integrating &lt;strong&gt;cutting-edge AI technology&lt;/strong&gt; powered by &lt;strong&gt;Gemini API&lt;/strong&gt; to elevate the user experience to a whole new level! 🚀  &lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Why It's Impressive:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;AI Assistant:&lt;/strong&gt; Provides personalised property recommendations, mortgage calculations, property advice, and real-time assistance to users.&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Contextual AI Learning:&lt;/strong&gt; Learns user preferences over time to refine search results and suggest relevant properties automatically.&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Intelligent Automation:&lt;/strong&gt; AI-assisted property management for both users and administrators, reducing workload and improving efficiency.  &lt;/p&gt;

&lt;p&gt;This integration sets EstateLuxe apart by combining &lt;strong&gt;human-like conversational abilities&lt;/strong&gt; with seamless property management. 💥  &lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 &lt;strong&gt;Delightfully Designed:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We customised the theme extensively using the &lt;strong&gt;Kendo ThemeBuilder&lt;/strong&gt; to create a visually appealing and dynamic design.  &lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 &lt;strong&gt;Custom Theme Setup:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bootstrap Theme:&lt;/strong&gt; Used ThemeBuilder to generate a custom Bootstrap theme (&lt;code&gt;custom-theme-bootstrap.css&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark Theme:&lt;/strong&gt; Created an alternative dark theme (&lt;code&gt;dark-theme-bootstrap.css&lt;/code&gt;) for a sleek night mode.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theme Switching Logic:&lt;/strong&gt; Dynamically switched themes based on user preference, supporting &lt;strong&gt;4 themes&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Default
&lt;/li&gt;
&lt;li&gt;Bootstrap
&lt;/li&gt;
&lt;li&gt;Custom Bootstrap
&lt;/li&gt;
&lt;li&gt;Dark Mode Bootstrap
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  📸 &lt;strong&gt;In-Progress Screenshots:&lt;/strong&gt;
&lt;/h3&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%2Fye6o8rhg4fx6duc3jc7e.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%2Fye6o8rhg4fx6duc3jc7e.png" alt="Custom Bootstrap green" width="800" height="569"&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%2Ffk48v4l1tng8ke73j425.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%2Ffk48v4l1tng8ke73j425.png" alt="Dark Mode Bootstrap" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎥 &lt;strong&gt;Custom Theme Demo:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A video demo showing how the custom themes and dark mode switch dynamically.
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zRfM7LFpW6g"&gt;
&lt;/iframe&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 &lt;strong&gt;Ideal For:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;🏢 &lt;strong&gt;Real Estate Agencies:&lt;/strong&gt; To manage listings, payments, and tenants efficiently.&lt;br&gt;&lt;br&gt;
🏡 &lt;strong&gt;Property Owners:&lt;/strong&gt; To track payments, viewings, and property analytics.&lt;br&gt;&lt;br&gt;
📊 &lt;strong&gt;Property Managers:&lt;/strong&gt; To automate tenant communication, reminders, and property viewings.&lt;br&gt;&lt;br&gt;
👩‍💻 &lt;strong&gt;Developers:&lt;/strong&gt; Looking to integrate AI and powerful UI components into their projects.  &lt;/p&gt;

&lt;p&gt;EstatLuxe is ideal for any organisation that wants to &lt;strong&gt;digitally transform property management&lt;/strong&gt; while enhancing user engagement with AI-driven features.  &lt;/p&gt;




&lt;h2&gt;
  
  
  📚 &lt;strong&gt;Pages &amp;amp; Features:&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  👤 &lt;strong&gt;User-Focused Pages:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; Quick stats, favourites, payments, and property viewings.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Favourite Properties:&lt;/strong&gt; List, view, and manage favourite properties.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Property Search:&lt;/strong&gt; Search by type, price, and bedrooms, with grid/list view.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Property Details:&lt;/strong&gt; Detailed property information and contact options.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upcoming Payments:&lt;/strong&gt; List payments with a &lt;strong&gt;“Pay Now”&lt;/strong&gt; functionality.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Assistant:&lt;/strong&gt; Smart assistant providing recommendations and assistance.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🔥 &lt;strong&gt;Admin-Focused Pages:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Admin Dashboard:&lt;/strong&gt; Overview of key metrics and quick actions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage Properties:&lt;/strong&gt; Add, edit, and delete properties.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage Tenants:&lt;/strong&gt; Add, edit, and delete tenant profiles.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage Payments:&lt;/strong&gt; Track payments, send reminders, and perform CRUD operations.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🔒 &lt;strong&gt;Additional Pages:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Home Page:&lt;/strong&gt; Displays featured properties and an introduction.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact Page:&lt;/strong&gt; Enables communication with property owners/admins.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy Policy Page:&lt;/strong&gt; Outlines user privacy and platform terms.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terms of Service:&lt;/strong&gt; Outlines terms and conditions for using our services.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  👥 &lt;strong&gt;Team Members:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This project was built by a team of two:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Walid Adebayo&lt;/strong&gt; - &lt;a class="mentioned-user" href="https://dev.to/walidadebayo"&gt;@walidadebayo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edun Yusuf&lt;/strong&gt; - &lt;a class="mentioned-user" href="https://dev.to/volde"&gt;@volde&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏆 &lt;strong&gt;Why This Project Stands Out:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Leverages KendoReact’s powerful components effectively.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;AI-Powered Assistant gives the project an innovative edge.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Custom Themes with ThemeBuilder showcase design flexibility.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Comprehensive features with both user and admin management.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Ideal for real-world estate management solutions with AI enhancements.&lt;/strong&gt;  &lt;/p&gt;




&lt;p&gt;🎉 &lt;strong&gt;We’re excited to share our work and look forward to showcasing the power of KendoReact!&lt;/strong&gt; 🚀&lt;br&gt;&lt;br&gt;
💬 &lt;strong&gt;We would love your feedback. Drop a comment below. Thank you!&lt;/strong&gt;  &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kendoreactchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
