<?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: Isaac Shosanya </title>
    <description>The latest articles on DEV Community by Isaac Shosanya  (@vaden89).</description>
    <link>https://dev.to/vaden89</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%2F3613963%2F205a4d02-13ff-4077-bd42-e208bc44398e.jpeg</url>
      <title>DEV Community: Isaac Shosanya </title>
      <link>https://dev.to/vaden89</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vaden89"/>
    <language>en</language>
    <item>
      <title>Luminary: End Of Sprint</title>
      <dc:creator>Isaac Shosanya </dc:creator>
      <pubDate>Sat, 28 Mar 2026 10:11:33 +0000</pubDate>
      <link>https://dev.to/vaden89/luminary-end-of-sprint-344a</link>
      <guid>https://dev.to/vaden89/luminary-end-of-sprint-344a</guid>
      <description>&lt;p&gt;What a month it has been, building out a product isn't as easy as it may seem, but we did it and pulled through. For those of you that haven't been following this series what we we are building &lt;a href="https://luminary-for-women.netlify.app/" rel="noopener noreferrer"&gt;Luminary&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Luminary and what problem does it solve?
&lt;/h3&gt;

&lt;p&gt;For a large part of our history women have been under represented, marginalized and have had their voice taken away from them, we've had the great works done by amazing women around us fall on deaf ears or not even come to light, so that's why we're building luminary for the women. To give a women a platform to have their accomplishments and contributions seen and heard.&lt;/p&gt;

&lt;h3&gt;
  
  
  The sprint in review
&lt;/h3&gt;

&lt;p&gt;First of all I really want to thank everyone that contributed to the project during this sprint cause in it's own way it's been brutal but fun seeing the project take shape, from an idea that was on paper to something that worked but was incomplete to now a project that's complete but breaks from time to time, It wasn’t a perfect or linear process, but we’ve learned a lot from bugs to the miscommunications we found a way to bring it all together. Now, Luminary has become a brainchild for each member of the core team, and a project we’ve all genuinely loved working on.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's next
&lt;/h3&gt;

&lt;p&gt;For Luminary, it’s only up from here. We have more features planned, such as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Allowing people to contribute additional information to a nomination&lt;/li&gt;
&lt;li&gt;Providing suggestions for users who want to nominate someone who has already been nominated, so the nominee’s data can be auto-filled&lt;/li&gt;
&lt;li&gt;Refining the consent workflow and making it more secure&lt;/li&gt;
&lt;li&gt;Migrating the website from basic HTML, CSS, and JavaScript to React, and upgrading the backend to meet better standards&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that’s just the beginning. Hopefully, we’ll have another sprint soon to bring in fresh ideas and keep improving. You can also contribute to the project by raising issues, fixing bugs, or suggesting new features. It’s open source—so feel free to go crazy.&lt;/p&gt;

&lt;p&gt;Personally, I’ll be contributing a lot to Luminary in my spare time, while also working on my many unfinished side projects and continuing my learning journey ( Still got top 1% aspirations ).&lt;/p&gt;

&lt;h3&gt;
  
  
  Shout out the team
&lt;/h3&gt;

&lt;p&gt;I want to give a big shout out to these guys cause they really carried the project like their life depended on it and I'm grateful to have worked with people as amazing as they are;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Blisyphus" rel="noopener noreferrer"&gt;Ramnan Ramyil&lt;/a&gt; ( Project Lead )&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/yourgotopyromaniac" rel="noopener noreferrer"&gt;Awoyemi Abiola&lt;/a&gt; ( Project Lead )&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/chisomdaniel" rel="noopener noreferrer"&gt;Daniel Chisom&lt;/a&gt; ( Engineering Lead )&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Rukkyoo" rel="noopener noreferrer"&gt;Micheal Omonedo&lt;/a&gt; ( Design Lead )&lt;/li&gt;
&lt;li&gt;Ui/Ux Designer ( Ariyo Taiwo ) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those interested in checking out &lt;a href="https://luminary-for-women.netlify.app/" rel="noopener noreferrer"&gt;Luminary&lt;/a&gt; for those interested to pushing the project further check out the &lt;a href="https://github.com/Tabi-Project/Luminary" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you all for listening to me these past few weeks, cheers to many more of these.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>devjournal</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Luminary: Week 3 - Bringing it to Life</title>
      <dc:creator>Isaac Shosanya </dc:creator>
      <pubDate>Sat, 21 Mar 2026 10:58:22 +0000</pubDate>
      <link>https://dev.to/vaden89/luminary-week-3-bringing-it-to-life-4f1p</link>
      <guid>https://dev.to/vaden89/luminary-week-3-bringing-it-to-life-4f1p</guid>
      <description>&lt;p&gt;So welcome back to my weekly update on the luminary project if you don't know what luminary is well, probably go read my last two articles but for those of you too lazy for that (side-eye). Luminary is an open source platform with it's main purpose to bring women and their accomplishments to the spotlight, it's a directory of the contributions and achievements of exceptional women. Now that we are up to speed into the thick of it we go ( who remembers that song from the movie )&lt;/p&gt;

&lt;h3&gt;
  
  
  My Contributions This Week
&lt;/h3&gt;

&lt;p&gt;This week was honestly a tough one for me. I had to step in and handle most of the backend work since the backend lead was dealing with some personal issues. It wasn’t something I felt fully prepared for at first, but I stepped up and made sure things kept moving regardless.&lt;/p&gt;

&lt;p&gt;Here’s what I worked on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remodeled the database schema to better support the nomination workflow and improve overall structure.&lt;/li&gt;
&lt;li&gt;Implemented authentication and authorization flows for admins, covering actions like approving, rejecting, and suspending nominations.&lt;/li&gt;
&lt;li&gt;Built out the nomination endpoints, handling the full flow from submission to admin review.&lt;/li&gt;
&lt;li&gt;Developed an upload endpoint to support image uploads as evidence for nominations.&lt;/li&gt;
&lt;li&gt;Reviewed and merged pull requests from other team members to keep development moving forward.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It was a stretch week for me, but also one where I had to take ownership and deliver beyond what I initially thought I could handle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Decisions I Made This Week
&lt;/h3&gt;

&lt;p&gt;I had a number of decisions to stew about through out this week. The main ones were around whether to stick with Supabase or move to a dedicated PostgreSQL instance, and whether to use Supabase Storage or Cloudinary for handling media uploads, along with a few smaller things along the way.&lt;/p&gt;

&lt;p&gt;For the database, I decided to stick with Supabase. The biggest factor here was speed. Using a managed service allowed us to keep things moving without getting bogged down setting up and maintaining individual pieces of infrastructure. At this stage of the project, getting things delivered matters more than finding the absolute optimal architecture. That said, the way things are structured right now still gives us the flexibility to move to a dedicated PostgreSQL instance later if and when we outgrow Supabase.&lt;/p&gt;

&lt;p&gt;For media storage, I went with Supabase Storage (buckets) over Cloudinary. This was mostly a decision driven by continuity and time constraints. Since we were already within the Supabase ecosystem, it made more sense to avoid introducing another external dependency just for uploads, especially with tight deadlines. It kept the setup simpler and reduced the overhead of managing multiple services.&lt;/p&gt;

&lt;p&gt;Overall, most of the decisions this week came down to a balance between speed, simplicity, and leaving room to scale when necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflections
&lt;/h3&gt;

&lt;p&gt;This week hasn’t really been my best, if I’m being honest. I’m proud of what I was able to get done and how far I pushed the project forward, but at the same time, I can’t shake the feeling that I could have done more and left things in a much better place.&lt;/p&gt;

&lt;p&gt;That said, getting the project into a stable, workable state was a big win for the team, especially given the circumstances. Stepping up and making sure things didn’t stall is something I don’t take lightly, and I’m proud I was able to contribute to that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shout-out to the Team
&lt;/h3&gt;

&lt;p&gt;Finally, a huge shout-out to my teammates. This project — and this article — would not be complete without their contributions.&lt;/p&gt;

&lt;p&gt;Product Lead 1: &lt;a href="https://github.com/Blisyphus" rel="noopener noreferrer"&gt;Ramnan Ramyil&lt;/a&gt;&lt;br&gt;
Product Lead 2: &lt;a href="https://github.com/Yourgotopyromaniac" rel="noopener noreferrer"&gt;Awoyemi Abiola&lt;/a&gt;&lt;br&gt;
People Manager: &lt;a href="https://github.com/MrNaturi" rel="noopener noreferrer"&gt;Emmanuel Dania&lt;/a&gt;&lt;br&gt;
Engineering Lead: &lt;a href="https://github.com/chisomdaniel" rel="noopener noreferrer"&gt;Daniel Chisom&lt;/a&gt;&lt;br&gt;
Design Lead: &lt;a href="https://github.com/Rukkyoo" rel="noopener noreferrer"&gt;Michael Omonedo&lt;/a&gt;&lt;br&gt;
Volunteer (UI/UX): Ariyo Taiwo&lt;/p&gt;

&lt;p&gt;You can follow the development progress here: &lt;a href="https://github.com/Tabi-Project/Luminary" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the live site here: &lt;a href="https://luminary-for-women.netlify.app/" rel="noopener noreferrer"&gt;luminary&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>devjournal</category>
      <category>opensource</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Luminary: Week 2 — Building the Core</title>
      <dc:creator>Isaac Shosanya </dc:creator>
      <pubDate>Fri, 13 Mar 2026 22:53:54 +0000</pubDate>
      <link>https://dev.to/vaden89/luminary-week-2-building-the-core-5fn1</link>
      <guid>https://dev.to/vaden89/luminary-week-2-building-the-core-5fn1</guid>
      <description>&lt;p&gt;Welcome back to another week of work on the luminary project, for those of us who are new here, welcome again and you might ask;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Luminary
&lt;/h3&gt;

&lt;p&gt;Luminary is an open-source platform created to celebrate and recognize women for their achievements and contributions to society. The platform aims to highlight women making an impact across different fields, giving them a place where their work can be acknowledged, discovered, and shared with a wider audience.&lt;/p&gt;

&lt;p&gt;The project is being built collaboratively by contributors across multiple roles including frontend, backend, and design, with a focus on creating a scalable and accessible recognition platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I worked on this week
&lt;/h3&gt;

&lt;p&gt;This week my work focused largely on maintaining the codebase and building core backend infrastructure. As the &lt;strong&gt;Lead Maintainer&lt;/strong&gt;, part of my responsibility is ensuring the project remains stable and contributor-friendly while also stepping in where technical gaps exist.&lt;/p&gt;

&lt;p&gt;This week I also filled in as the &lt;strong&gt;Backend Lead&lt;/strong&gt;, helping to establish the foundational backend architecture for the platform.&lt;/p&gt;

&lt;p&gt;Here’s a breakdown of the main tasks I worked on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up and configured the initial deployment for the project website
→ &lt;a href="https://luminary-for-women.netlify.app/" rel="noopener noreferrer"&gt;https://luminary-for-women.netlify.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Began building the backend service for Luminary&lt;/li&gt;
&lt;li&gt;Refactored sections of the codebase to support proper deployment and project structure&lt;/li&gt;
&lt;li&gt;Implemented API endpoints for:

&lt;ul&gt;
&lt;li&gt;Submitting a nomination for a woman&lt;/li&gt;
&lt;li&gt;Searching through the nominated women directory&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Designed and structured the database schemas required for the nomination system&lt;/li&gt;

&lt;li&gt;Coordinated repository maintenance tasks to ensure the project remained organized and contributor-friendly&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Implementation Breakdown
&lt;/h3&gt;

&lt;p&gt;The Luminary backend follows a Node.js + Express architecture, providing a RESTful API layer that communicates with a &lt;strong&gt;PostgreSQL database&lt;/strong&gt; managed through Supabase.&lt;/p&gt;

&lt;p&gt;The overall architecture currently looks like this:&lt;br&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static frontend deployed on Netlify&lt;/li&gt;
&lt;li&gt;Responsible for displaying nominee profiles and handling nomination submissions
&lt;strong&gt;Backend&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Node.js server using Express&lt;/li&gt;
&lt;li&gt;Handles API requests, nomination submissions, and directory queries&lt;/li&gt;
&lt;li&gt;Acts as the middleware between the frontend and database
&lt;strong&gt;Database&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL database managed through Supabase&lt;/li&gt;
&lt;li&gt;Stores nomination records, nominator information, and nominee profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Database Design
&lt;/h4&gt;

&lt;p&gt;To support the nomination workflow, I designed schemas for three main entities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nominee (Woman)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Represents the woman being recognized on the platform. This includes information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Field or area of contribution&lt;/li&gt;
&lt;li&gt;Biography or impact description&lt;/li&gt;
&lt;li&gt;Additional metadata related to recognition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nominator&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Represents the individual submitting the nomination. This allows the platform to track who submitted a nomination while also enabling potential moderation workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nomination&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Represents the actual contribution or recognition entry. This acts as the relationship between the &lt;strong&gt;nominator&lt;/strong&gt; and the &lt;strong&gt;nominee&lt;/strong&gt;, capturing details about the achievement or impact being recognized.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges I Encountered
&lt;/h3&gt;

&lt;p&gt;One of the main technical challenges this week involved deployment issues with Netlify.&lt;/p&gt;

&lt;p&gt;Initially, the project structure placed the &lt;code&gt;index.html&lt;/code&gt; file inside a &lt;strong&gt;pages directory&lt;/strong&gt;, which prevented Netlify from correctly detecting the entry point for the site. Since Netlify expects the entry HTML file to be at the root of the published directory, this caused the deployment to fail.&lt;/p&gt;

&lt;p&gt;To resolve this issue, I had to refactor the structure of the application, moving the &lt;code&gt;index.html&lt;/code&gt; file to the base level of the project and updating the directory structure accordingly. This ensured that Netlify could properly identify the entry point and serve the application without errors.&lt;/p&gt;

&lt;p&gt;Although this required some restructuring of the codebase, it ultimately resulted in a cleaner and more deployment-friendly project structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Learned This Week
&lt;/h3&gt;

&lt;p&gt;This week gave me deeper experience in a few areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handling &lt;strong&gt;deployment constraints when hosting static frontends&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Managing project stability while coordinating contributions as a &lt;strong&gt;Lead Maintainer&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team &amp;amp; Contributors
&lt;/h3&gt;

&lt;p&gt;Luminary is a collaborative effort, and a lot of incredible people contributed to the progress made this week. It’s been great working with a team committed to building something meaningful and impactful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributors&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Isaac Shosanya — Lead Maintainer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ramnan Ramyil — Project Lead&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Awoyemi Abiola — Project Lead&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Daniel Chisom — Engineering Lead&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Micheal Omonedo — Design Lead&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ariyo Taiwo — UI/UX Designer&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Collaboration has been key to moving the project forward, and it’s exciting to see the platform gradually take shape.&lt;/p&gt;

&lt;p&gt;You can follow the development progress here:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/Tabi-Project/Luminary" rel="noopener noreferrer"&gt;Project Repository&lt;/a&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;And you can explore the live deployment here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://luminary-for-women.netlify.app/" rel="noopener noreferrer"&gt;https://luminary-for-women.netlify.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Luminary: The Setup</title>
      <dc:creator>Isaac Shosanya </dc:creator>
      <pubDate>Sat, 07 Mar 2026 09:06:03 +0000</pubDate>
      <link>https://dev.to/vaden89/luminary-the-setup-d04</link>
      <guid>https://dev.to/vaden89/luminary-the-setup-d04</guid>
      <description>&lt;p&gt;As it's women's month, me and a group of other wonderful developers were tasked with building something for women and for the open source community and we decided on Luminary&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Luminary ?
&lt;/h2&gt;

&lt;p&gt;Or rather, what will Luminary be? — since the project is still evolving.&lt;br&gt;
Luminary will be an open-sourced, community-driven directory and news platform that spotlights impactful women who are driving change across different fields. The goal is to create a space where stories, achievements, and contributions of women can be documented, shared, and discovered by others.&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%2Fzyzhmg6qhz08cqf4fx4n.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%2Fzyzhmg6qhz08cqf4fx4n.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;This week our primary focus was laying the foundation of the project. My specific responsibilities involved maintaining the repository, setting up the open-source structure, and contributing to the landing page.&lt;/p&gt;

&lt;p&gt;During this phase we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outlined the core requirements for the Luminary project&lt;/li&gt;
&lt;li&gt;Set clear goals and responsibilities for the core members of the team&lt;/li&gt;
&lt;li&gt;Established a design system in collaboration with the design team and their requirements&lt;/li&gt;
&lt;li&gt;Built out the landing page, including a section highlighting all project contributors&lt;/li&gt;
&lt;li&gt;Chose the initial tech stack for development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the frontend, we decided to start with HTML, CSS, and JavaScript, with plans to migrate to React as the project scales.&lt;br&gt;
For the backend, we chose Node.js with Express to power the API and application logic.&lt;/p&gt;

&lt;p&gt;This approach allows us to move quickly in the early stages while still leaving room for the project to grow into a more structured architecture later on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributors
&lt;/h2&gt;

&lt;p&gt;Some other really great people worked on this too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isaac Shosanya ( Lead Maintainer ): I was tasked with the open source repository setup; including reviewing pull requests and documenting a standard every contributor will follow for the project, I also contributed to building out a section on the landing page.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Blisyphus" rel="noopener noreferrer"&gt;Ramnan Ramyil&lt;/a&gt; ( Project Lead )&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/yourgotopyromaniac" rel="noopener noreferrer"&gt;Awoyemi Abiola&lt;/a&gt; ( Project Lead )&lt;/li&gt;
&lt;li&gt;Daniel Chisom ( Engineering Lead )&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Rukkyoo" rel="noopener noreferrer"&gt;Micheal Omonedo&lt;/a&gt; ( Design Lead )&lt;/li&gt;
&lt;li&gt;Ui/Ux Designer ( Ariyo Taiwo ) &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;As the lead maintainer, one of the biggest lessons I learned was how important clear standards and structured workflows are in open-source collaboration. When contributors come from different backgrounds and experience levels, having well-defined contribution guidelines, coding standards, and a clear chain of command makes the entire development process much smoother.&lt;/p&gt;

&lt;p&gt;Establishing these structures early helps contributors understand how to contribute, where decisions are made, and what expectations exist within the project. It also makes reviewing pull requests, resolving issues, and coordinating contributions far more efficient.&lt;/p&gt;

&lt;p&gt;This experience pushed me to dive deeper into how successful open-source projects are organized and maintained—from documentation and repository structure to contributor management and review processes. Seeing how these systems enable collaboration at scale has been both fascinating and inspiring.&lt;/p&gt;

&lt;p&gt;Overall, working on Luminary has been a really eye-opening experience, and contributing to an open-source initiative like this is something I would gladly be a part of again in the future.&lt;/p&gt;

</description>
      <category>community</category>
      <category>devjournal</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Case Study of Valentines Day Project</title>
      <dc:creator>Isaac Shosanya </dc:creator>
      <pubDate>Fri, 20 Feb 2026 14:25:50 +0000</pubDate>
      <link>https://dev.to/vaden89/case-study-of-valentines-day-project-k45</link>
      <guid>https://dev.to/vaden89/case-study-of-valentines-day-project-k45</guid>
      <description>&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Over the past few weeks, I had a task to complete for rise academy and the task was to build something that "shows love or expresses love to someone" cause it was valentines season.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution Design
&lt;/h2&gt;

&lt;p&gt;The goal of this application was to lower the barrier to emotional expression for users who struggle with creativity, or intentional with romantic gestures while still delivering an experience that feels thoughtful and meaningful to the recipient.&lt;/p&gt;

&lt;h4&gt;
  
  
  Feature Logic
&lt;/h4&gt;

&lt;p&gt;The product is designed as a single-page web application to keep the experience lightweight, and emotionally focused. The feature set mirrors the natural progression of how peoples typically express affection:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Poems: This section serves as the emotional entry point. Poetry is a universally accepted medium for expressing love, even when it isn’t personally written. Including poems allows users to communicate depth of feeling without having exceptional writing skills.&lt;/li&gt;
&lt;li&gt;Reasons Why I Love You: This section adds specificity and personalization. While the poems establish emotion, the “reasons” section grounds that emotion in tangible affirmations helping the recipient feel seen and appreciated. Even when generalized, these statements are relatable enough to feel intentional.&lt;/li&gt;
&lt;li&gt;Virtual Gift: The virtual gift functions as a symbolic closer to the experience. It introduces an element of surprise and playfulness, reinforcing the idea of giving something even in a digital form rather than just saying something "No body likes people who are all talk and no substance ".&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Flow Design
&lt;/h4&gt;

&lt;p&gt;The application follows a &lt;strong&gt;linear, scroll-based flow&lt;/strong&gt;, guiding the user through an emotional narrative:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Warm emotional introduction&lt;/strong&gt; (Poems)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal reinforcement&lt;/strong&gt; (Reasons why I love you)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memorable takeaway&lt;/strong&gt; (Virtual gift)&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Why I Chose This ?
&lt;/h4&gt;

&lt;p&gt;The solution prioritizes &lt;strong&gt;accessibility over perfection&lt;/strong&gt;. It acknowledges that not every user is highly expressive or intentional, but still deserves a way to show care. By abstracting effort into a clean, emotionally structured experience, the application transforms minimal user input into maximum emotional impact.&lt;/p&gt;

&lt;p&gt;Ultimately, the design ensures that even a “lazy” act of sharing the page can still result in a genuine “aww” moment for the recipient.&lt;/p&gt;

&lt;h2&gt;
  
  
  UI Design System
&lt;/h2&gt;

&lt;p&gt;The design of the application is intentionally simple, emotional, and universally romantic. The design system focuses on using color and typography to evoke warmth, affection, and intimacy.&lt;/p&gt;

&lt;p&gt;A centralized design system was created and documented externally to ensure visual consistency across the application and to allow for easy iteration and scalability, you can have a look at it &lt;a href="https://on-the-basis-of-love.netlify.app/design-system" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Color Palette
&lt;/h4&gt;

&lt;p&gt;The color palette is anchored by a &lt;strong&gt;bold crimson red&lt;/strong&gt;, supported by neutral tones for balance and readability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary Red (&lt;code&gt;#c8102e&lt;/code&gt;)&lt;/strong&gt;
Acts as the emotional core of the application. It is used for key highlights, accents, and moments that require emotional emphasis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neutral Background (&lt;code&gt;#f5f5f5&lt;/code&gt;)&lt;/strong&gt;
Provides a soft, calm canvas that allows emotional content to breathe without visual noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Black &amp;amp; Dark Grey (&lt;code&gt;#000000&lt;/code&gt;, &lt;code&gt;#333333&lt;/code&gt;)&lt;/strong&gt;
Used for body text and structural elements to maintain clarity, contrast, and accessibility.
#### Typography
The typography system pairs expressiveness with clarity:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heartland&lt;/strong&gt;
Used for headings and key emotional phrases. Its hand-drawn, playful nature mimics handwritten love notes, adding personality and warmth to the experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oswald&lt;/strong&gt;
Used for body text and supporting content. Oswald’s clean, modern structure provides readability and contrast, grounding the emotional display font and preventing the interface from feeling overly decorative.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why I Went With This Emotional Design
&lt;/h4&gt;

&lt;p&gt;The application is designed specifically for the month of love, a time associated with romance, vulnerability, and emotional expression. The aesthetic choices reflect this.&lt;/p&gt;

&lt;p&gt;Crimson Red was chosen as the dominant color due to its strong association with love, desire, and affection. However, rather than using multiple vibrant colors, the design relies on a simple color scheme to keep the focus on the message rather than the interface.&lt;/p&gt;

&lt;p&gt;The handwritten display font reinforces intimacy and sincerity, while the structured sans-serif body font ensures the experience still feels polished when the content itself is simple.&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%2F6x4ndhli9zx5zvq7221w.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%2F6x4ndhli9zx5zvq7221w.png" alt=" " width="772" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  HTML &amp;amp; Structural Approach
&lt;/h2&gt;

&lt;p&gt;The Application was structured with semantic HTML in mind to ensure accessibility, readability and best SEO practices. Given the product is content heavy keeping to semantic HTML provides the best experiences for both the users and the developer&lt;/p&gt;

&lt;p&gt;Semantic HTML decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; elements to clearly define the page layout and content hierarchy.&lt;/li&gt;
&lt;li&gt;Structuring each major feature (Poems, Reasons Why I Love You, Virtual Gift) as its own &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; with descriptive headings.&lt;/li&gt;
&lt;li&gt;Maintaining a logical heading order (&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; → &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;) to improve screen-reader navigation and search engine understanding.&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; elements for interactive actions instead of styled &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;s to preserve keyboard accessibility.&lt;/li&gt;
&lt;li&gt;Providing meaningful &lt;code&gt;alt&lt;/code&gt; text for decorative and symbolic imagery where applicable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CSS Architecture
&lt;/h2&gt;

&lt;p&gt;The CSS architecture was built around reusablility through strong emphasis on design tokens and layout techniques.&lt;/p&gt;

&lt;h4&gt;
  
  
  CSS variables
&lt;/h4&gt;

&lt;p&gt;My css variables were defined at the root level to centralize control over the design system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="py"&gt;--background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f5f5f5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--primary-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#c8102e&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;h4&gt;
  
  
  Layout Strategy
&lt;/h4&gt;

&lt;p&gt;I used mainly flexbox for the flow of the application, mainly because the content of the website is vertically stacked&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflections
&lt;/h2&gt;

&lt;p&gt;This project was completed within a limited time-frame due to personal constraints, which influenced both the scope and depth of the final implementation. While the core idea and execution successfully communicate the intended emotional experience, there are several areas I would expand on if given more time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Future Improvements
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Added Personalization&lt;/strong&gt;: A key improvement would be the introduction of personalization features. Users would be able to access a simple dashboard to customize content, such as names, messages, and selected sections, personalizing the experience specifically to their loved one. Once configured, the users would generate a unique shareable link that leads to a personalized version of the page, increasing emotional impact and user ownership.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expanded Content&lt;/strong&gt;: The current version prioritizes structure and emotional flow, but the content on show is intentionally minimal. In a future iteration, I would expand the content by adding features such as an image gallery, a dedicated letter-writing section, or additional curated messages. This would allow users to express affection in multiple formats while keeping the experience engaging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Animations and Visual Polish&lt;/strong&gt;: While the styling is clean and functional, additional polish could elevate the experience. Subtle animations, transitions, and micro-interactions would enhance the user experience&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Link to live site: &lt;a href="https://on-the-basis-of-love.netlify.app/" rel="noopener noreferrer"&gt;https://on-the-basis-of-love.netlify.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>ux</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A Beginner’s Guide to Open Graph: Making Your Links Share Better</title>
      <dc:creator>Isaac Shosanya </dc:creator>
      <pubDate>Fri, 12 Dec 2025 13:42:09 +0000</pubDate>
      <link>https://dev.to/vaden89/a-beginners-guide-to-open-graph-making-your-links-share-better-2gpd</link>
      <guid>https://dev.to/vaden89/a-beginners-guide-to-open-graph-making-your-links-share-better-2gpd</guid>
      <description>&lt;h2&gt;
  
  
  What is Open Graph?
&lt;/h2&gt;

&lt;p&gt;Open Graph is an Internet protocol used to standardize how metadata describes the content of a web page when its URL is shared, either among individuals or across social platforms. It allows you to provide various types of information, from the page title to the images or videos displayed on the site.&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%2Fw2cnbjxrm9ounv6446s3.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%2Fw2cnbjxrm9ounv6446s3.png" alt="Image of a rich preview from a link sent by a user on slack" width="578" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we need it?
&lt;/h2&gt;

&lt;p&gt;Content needs to be shared and engaged with. Providing rich previews when a link is shared significantly improves engagement because users get more context about the page beyond a plain URL. A well-structured preview increases clicks, trust, and visibility across platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up open graph
&lt;/h2&gt;

&lt;p&gt;There are few basic meta tags that we should start with;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;og:title&lt;/code&gt; The title of the webpage shown in the preview card. This is typically the same as your &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tag.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;og:type&lt;/code&gt; Describes the type of content. &lt;code&gt;"website"&lt;/code&gt; is the general default if none of the specific types apply.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;og:image&lt;/code&gt; The image displayed in the preview card. Use a high-resolution image with a minimum size of 300×300px for better compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;og:url&lt;/code&gt; The canonical URL of the page being shared.
Now how do we use the tag in our websites well, it's metadata so we should have them in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag and the properties set in the &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags see below as reference.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  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;html&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;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Isaac Shosanya - A software developer"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/1"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:url"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://isaac.com"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:type"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"website"&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;h1&amp;gt;&lt;/span&gt;
            Hey there
        &lt;span class="nt"&gt;&amp;lt;/h1&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;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Next.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;siteMetaData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&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="nx"&gt;siteMetaData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Isaac Shosanya&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;publisher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Isaac Shosanya&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;openGraph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;siteMetaData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&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="nx"&gt;siteMetaData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;siteMetaData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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;website&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;Some social sites have their own specific meta properties they use, and you should look through their documentation for more insight into how to make certain things function on specific platforms.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Twitter: &lt;a href="https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started" rel="noopener noreferrer"&gt;https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Facebook: &lt;a href="https://developers.facebook.com/docs/sharing/webmasters/" rel="noopener noreferrer"&gt;https://developers.facebook.com/docs/sharing/webmasters/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/help/linkedin/answer/46687/making-your-website-shareable-on-linkedin?lang=en" rel="noopener noreferrer"&gt;https://www.linkedin.com/help/linkedin/answer/46687/making-your-website-shareable-on-linkedin?lang=en&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open Graph Official Docs: &lt;a href="https://opg.me" rel="noopener noreferrer"&gt;https://opg.me&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Next.js Open Graph Docs: &lt;a href="https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image" rel="noopener noreferrer"&gt;https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These examples represent just the basics of Open Graph. There’s a lot more you can do with the protocol, and it's worth experimenting with additional properties to create richer and more engaging previews.&lt;/p&gt;

&lt;p&gt;Reference article: &lt;a href="https://www.freecodecamp.org/news/what-is-open-graph-and-how-can-i-use-it-for-my-website/" rel="noopener noreferrer"&gt;https://www.freecodecamp.org/news/what-is-open-graph-and-how-can-i-use-it-for-my-website/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>nextjs</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Full-Text Search: A Practical Guide for Node.js, TypeORM &amp; PostgreSQL</title>
      <dc:creator>Isaac Shosanya </dc:creator>
      <pubDate>Sun, 16 Nov 2025 16:47:12 +0000</pubDate>
      <link>https://dev.to/vaden89/full-text-search-a-practical-guide-for-nodejs-typeorm-postgresql-1n94</link>
      <guid>https://dev.to/vaden89/full-text-search-a-practical-guide-for-nodejs-typeorm-postgresql-1n94</guid>
      <description>&lt;p&gt;Full-text search is a technique used to analyze strings, documents, or entire database columns to deliver &lt;strong&gt;flexible and intelligent search results&lt;/strong&gt;. Instead of relying on string matching, full-text search looks at &lt;strong&gt;context&lt;/strong&gt;, &lt;strong&gt;synonyms&lt;/strong&gt;, and &lt;strong&gt;word variations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So while a regular SQL query might match only &lt;code&gt;"run"&lt;/code&gt;, a full-text search can also match &lt;code&gt;"running"&lt;/code&gt;, &lt;code&gt;"ran"&lt;/code&gt;, or &lt;code&gt;"runner"&lt;/code&gt; depending on the configuration.&lt;/p&gt;

&lt;p&gt;Full-text search is supported by many databases including &lt;strong&gt;PostgreSQL&lt;/strong&gt;, &lt;strong&gt;MySQL&lt;/strong&gt;, &lt;strong&gt;MongoDB&lt;/strong&gt;, and specialized engines like &lt;strong&gt;Elastic-search&lt;/strong&gt; and &lt;strong&gt;Meilisearch&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we focus on &lt;strong&gt;PostgreSQL full-text search&lt;/strong&gt; using &lt;strong&gt;TypeORM + Node.js&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of full-text search
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Search Large Bodies of text quickly&lt;/strong&gt;:   If you have large text fields, like blog posts, recipes, product descriptions, or comments, full-text search lets you efficiently check which documents contain certain keywords.&lt;/p&gt;

&lt;p&gt;Example: Search for &lt;code&gt;"chicken"&lt;/code&gt; → return all recipes that mention chicken &lt;em&gt;anywhere&lt;/em&gt; in the text.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better and more flexible search results&lt;/strong&gt;: Full-text search handles imperfections in queries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typing &lt;code&gt;"run shoes"&lt;/code&gt; can still match &lt;code&gt;"running shoes"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Searching &lt;code&gt;"comput"&lt;/code&gt; can match &lt;code&gt;"computer"&lt;/code&gt; and &lt;code&gt;"computing"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This dramatically improves user experience on e-commerce, blogs, dashboards, and enterprise search tools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When to use full-text search?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;You want flexibility, not exact matches; Searching products, users, notes, events, or blog posts where partial matches are okay.&lt;/li&gt;
&lt;li&gt;When you want to index large bodies of text and return results based on if a certain word or keyword is contained within that body of text ( returning a list of recipes that contain chicken).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setting up full-text search in typeorm + postgres + nodejs
&lt;/h2&gt;

&lt;p&gt;Below is an example using a simple &lt;code&gt;Recipe&lt;/code&gt; entity that supports searching on both the &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; fields.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create the Recipe Entity
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Recipe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;PrimaryGeneratedColumn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;fulltext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;varchar&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;fulltext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;varchar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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;Query the database using a the typeorm query-builder to return data based on the provided search query
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;searchRecipes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchQuery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;dataSource&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Recipe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createQueryBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;recipe&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="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
      to_tsvector('english', recipe.name || ' ' || recipe.description)
      @@ plainto_tsquery('english', :query)
    `&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setParameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;searchQuery&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMany&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;In raw SQL this would look something like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;recipe&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;to_tsvector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;to_tsquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"Chicken"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will then return all the recipes with chicken in it’s description or name&lt;/p&gt;

</description>
      <category>node</category>
      <category>postgres</category>
      <category>typeorm</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
