<?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: Damilare Osibanjo</title>
    <description>The latest articles on Forem by Damilare Osibanjo (@devdami).</description>
    <link>https://forem.com/devdami</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%2F3426731%2Fe548f684-1e35-4648-85d2-543fd8a96a2a.jpeg</url>
      <title>Forem: Damilare Osibanjo</title>
      <link>https://forem.com/devdami</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devdami"/>
    <language>en</language>
    <item>
      <title>Why I Built dd-tinylog: A Lightweight Logging Library Made for Speed and Simplicity</title>
      <dc:creator>Damilare Osibanjo</dc:creator>
      <pubDate>Wed, 19 Nov 2025 20:44:53 +0000</pubDate>
      <link>https://forem.com/devdami/why-i-built-dd-tinylog-a-lightweight-logging-library-built-for-speed-and-simplicity-329h</link>
      <guid>https://forem.com/devdami/why-i-built-dd-tinylog-a-lightweight-logging-library-built-for-speed-and-simplicity-329h</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Core Problem: Logging Has Become Too Heavy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In many Node.js projects, logging libraries try to handle too much at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;complex configuration files&lt;/li&gt;
&lt;li&gt;confusing APIs&lt;/li&gt;
&lt;li&gt;nested options that make setup slower than writing your own wrapper&lt;/li&gt;
&lt;li&gt;blocking writes that slow down the event loop&lt;/li&gt;
&lt;li&gt;inconsistent performance between development mode and production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted to create a logger that didn’t feel like a burden. You should be able to add it to a project quickly and rely on it without thinking too much.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Dev-Dami/tini-log" rel="noopener noreferrer"&gt;https://github.com/Dev-Dami/tini-log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Philosophy Behind dd-tinylog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1 . &lt;strong&gt;It is Lightweight&lt;/strong&gt;&lt;br&gt;
    Minimal overhead. Fast defaults. Async transports avoid blocking.&lt;/p&gt;

&lt;p&gt;2 . &lt;strong&gt;It is Flexible&lt;/strong&gt;&lt;br&gt;
    Use text or JSON, choose timestamps, customize prefixes, and change log levels on the fly.&lt;/p&gt;

&lt;p&gt;3 . &lt;strong&gt;Making Simple Structures&lt;/strong&gt;&lt;br&gt;
    Child loggers offer clear separation between modules, requests, or components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real Usage Example&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Installation&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install dd-tinylog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple Use of logger&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;Logger&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;dd-tinylog&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;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;async&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="na"&gt;colorize&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="na"&gt;transports&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;console&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./logs/app.log&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="na"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[My-App]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;timestamp&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="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server started&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Low disk space&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Database error&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;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Child Loggers&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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;requestLogger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createChild&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[Request-123]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req-123&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;requestLogger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Processing request&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps logs organized without needing separate logger files or duplicated configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where Does This Library Fit&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web servers and APIs&lt;/li&gt;
&lt;li&gt;CLI tools&lt;/li&gt;
&lt;li&gt;Background workers&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;Development and testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regardless of the environment, the goal is the same: keep logs flowing without slowing everything else down.&lt;/p&gt;

</description>
      <category>npm</category>
      <category>webdev</category>
      <category>programming</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Building a Modular Search Engine: The Struggles I’m Still Facing</title>
      <dc:creator>Damilare Osibanjo</dc:creator>
      <pubDate>Sun, 14 Sep 2025 23:09:09 +0000</pubDate>
      <link>https://forem.com/devdami/building-a-modular-search-engine-the-struggles-im-still-facing-pf8</link>
      <guid>https://forem.com/devdami/building-a-modular-search-engine-the-struggles-im-still-facing-pf8</guid>
      <description>&lt;p&gt;So I had this painful idea: “Let’s build a search engine from scratch. How hard could it be?” &lt;/p&gt;

&lt;p&gt;Turns out… it’s very hard. &lt;/p&gt;

&lt;p&gt;I’m still deep in the process, but I thought I’d share the roadblocks, mistakes, and ongoing headaches of trying to piece together a crawler, parser, indexer, and frontend into something that kind of works like Google, but much worse. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture I Thought Made Sense&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I wanted the project to be modular so each part could work independently and maybe even scale on its own. Here’s the rough breakdown: &lt;/p&gt;

&lt;p&gt;Crawler (Python): scrapes web pages. &lt;/p&gt;

&lt;p&gt;Parser (Go): extracts useful HTML/text. &lt;/p&gt;

&lt;p&gt;Indexer (Go): builds the search index. &lt;/p&gt;

&lt;p&gt;The Search API (Python): Query Handling&lt;/p&gt;

&lt;p&gt;Frontend (Vue.js): where users type queries. &lt;/p&gt;

&lt;p&gt;Database (PostgreSQL): keeps it all together. &lt;/p&gt;

&lt;p&gt;Sounds clean, right? Reality check incoming: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Crawler (Python)&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Expectation: “I’ll just use requests and BeautifulSoup. Easy.” &lt;br&gt;
Reality: &lt;/p&gt;

&lt;p&gt;Handling robots.txt is more complicated than I thought. &lt;/p&gt;

&lt;p&gt;I ran into infinite loops (crawling the same site repeatedly). &lt;/p&gt;

&lt;p&gt;Some pages block crawlers unless you spoof headers. &lt;/p&gt;

&lt;p&gt;There’s also rate limiting…I once brought down my own WiFi. &lt;/p&gt;

&lt;p&gt;I realized that crawling is a deep pit of edge cases. Suddenly, I understood why companies spend millions just to maintain crawlers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parsing in Go&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why Go? Honestly, I wanted better performance and concurrency.&lt;/p&gt;

&lt;p&gt;Struggles:&lt;/p&gt;

&lt;p&gt;Parsing HTML in Go is not as simple as in Python.&lt;/p&gt;

&lt;p&gt;The libraries feel basic, which is great for speed but not for ease of use.&lt;/p&gt;

&lt;p&gt;Dealing with broken HTML is a nightmare because the web is messy.&lt;/p&gt;

&lt;p&gt;Also, constantly switching between Python and Go is tiring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indexing in Go&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I thought this part would be fun. Instead, I faced:&lt;/p&gt;

&lt;p&gt;Tokenization across different languages. Do I really want to support Japanese search right now? Nope.&lt;/p&gt;

&lt;p&gt;Efficiently storing inverted indexes.&lt;/p&gt;

&lt;p&gt;Designing queries that don’t lead to full-table scans in PostgreSQL.&lt;/p&gt;

&lt;p&gt;It turns out that writing a search engine involves reinventing many wheels that ElasticSearch solved years ago. But hey, it’s a learning experience, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Search Query Handling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where I’m currently stuck.&lt;/p&gt;

&lt;p&gt;How do I balance relevance scoring?&lt;/p&gt;

&lt;p&gt;Should I use TF-IDF, BM25, or just return whatever matches?&lt;/p&gt;

&lt;p&gt;Pagination seems straightforward until you realize that queries need to stay consistent across refreshes.&lt;/p&gt;

&lt;p&gt;On top of that, I chose to use FastAPI for the search endpoint because it’s fast and modern. The reality is:&lt;/p&gt;

&lt;p&gt;Writing routes is fine, but managing async and sync code with my Go indexer is confusing.&lt;/p&gt;

&lt;p&gt;Every small change means I have to restart everything just to check if my API still communicates with the index correctly.&lt;/p&gt;

&lt;p&gt;The documentation makes it look simple, so when I encounter real-world problems, like CORS issues, JSON serialization quirks, or blocking DB calls, I just sit there staring at the screen.&lt;/p&gt;

&lt;p&gt;Right now, search results are random at best. If you search for “Python,” you might find blog posts about cooking. I’m calling it creative search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend with Vue.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Honestly, this has been the easiest part. Vue makes building the search bar and results page feel good. The struggle is all in the backend right now.&lt;/p&gt;

&lt;p&gt;The frontend does show how poor the backend is. Nothing is more disheartening than entering a query and seeing your own project fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL Adventures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I love Postgres, but:&lt;/p&gt;

&lt;p&gt;Deciding what should go in the database versus what should stay in-memory indexes has been tricky.&lt;/p&gt;

&lt;p&gt;I’ve had to reset and rebuild my schema about ten times.&lt;/p&gt;

&lt;p&gt;Full-text search in Postgres is decent, but combining it with my custom Go indexer is confusing.&lt;/p&gt;

&lt;p&gt;What I’ve Learned So Far&lt;/p&gt;

&lt;p&gt;Search is hard. Really hard.&lt;/p&gt;

&lt;p&gt;Premature optimization kills momentum. I probably didn’t need Go for parsing and indexing yet.&lt;/p&gt;

&lt;p&gt;The web is chaotic. Crawlers reveal just how broken many websites are.&lt;/p&gt;

&lt;p&gt;It’s okay to stand on the shoulders of giants. ElasticSearch, Solr, Meilisearch, they exist for a reason.&lt;/p&gt;

&lt;p&gt;Still Struggling With…&lt;/p&gt;

&lt;p&gt;Making indexing fast enough without consuming too much memory.&lt;/p&gt;

&lt;p&gt;Relevance scoring that doesn’t feel random.&lt;/p&gt;

&lt;p&gt;Keeping modules communicating with each other smoothly (Python to Go to Postgres to Vue).&lt;/p&gt;

&lt;p&gt;Motivation, honestly. Sometimes I question if I should’ve just built a to-do app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closing Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even though it’s frustrating, I’ve learned more about how search engines actually work in the past weeks than I ever did while just using them.&lt;/p&gt;

&lt;p&gt;If you’re considering building one yourself, do it for the learning experience, not just for the final product. Or at least, don’t expect to outdo Google with just a weekend hackathon effort.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>go</category>
    </item>
    <item>
      <title>APIs 101: What They Are and Why They Matter</title>
      <dc:creator>Damilare Osibanjo</dc:creator>
      <pubDate>Sun, 07 Sep 2025 09:30:03 +0000</pubDate>
      <link>https://forem.com/devdami/apis-101-what-they-are-and-why-they-matter-9bg</link>
      <guid>https://forem.com/devdami/apis-101-what-they-are-and-why-they-matter-9bg</guid>
      <description>&lt;p&gt;If you’ve been involved in software development, you’ve likely heard the term API mentioned often. But what is an API, and why do developers depend on them so much? Let’s explain it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an API?
&lt;/h2&gt;

&lt;p&gt;An API (Application Programming Interface) is like a contract between two systems. It defines how they can communicate, what requests are allowed, what responses to expect, and what rules everyone must follow.&lt;/p&gt;

&lt;p&gt;Think of it like ordering at a restaurant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The menu is the API.&lt;/li&gt;
&lt;li&gt;You (the client) tell the waiter what you want by pointing to the items listed (making a request).&lt;/li&gt;
&lt;li&gt;The kitchen (the server) prepares the food (processing the request).&lt;/li&gt;
&lt;li&gt;The waiter brings it back to you in the agreed format (the response).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without APIs, apps would be like isolated islands, with no way to share data and no way to integrate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Examples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Weather Apps: They pull forecast data from weather APIs instead of collecting it themselves.&lt;/li&gt;
&lt;li&gt;Payment Processing: Services like Stripe, PayPal, or Square provide APIs, so you don’t need to create secure payment systems from scratch.&lt;/li&gt;
&lt;li&gt;Social Logins: The “Sign in with Google” option works because your app can communicate with Google’s authentication API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  REST, GraphQL, and Beyond
&lt;/h2&gt;

&lt;p&gt;Not all APIs are the same. Some popular types include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST APIs: The most common type. They use HTTP verbs (GET, POST, PUT, DELETE) to perform actions.&lt;/li&gt;
&lt;li&gt;GraphQL: This lets clients ask for exactly the data they need, which reduces over-fetching.&lt;/li&gt;
&lt;li&gt;gRPC: A high-performance option that uses Protocol Buffers, which is great for microservices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each has its strengths, and the right choice depends on your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Developers Love APIs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reusability: You can use existing services instead of reinventing the wheel.&lt;/li&gt;
&lt;li&gt;Scalability: APIs allow different parts of your system to communicate without being tightly linked.&lt;/li&gt;
&lt;li&gt;Innovation: APIs create new opportunities. For example, open banking APIs have enabled entire industries of fintech startups.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Get Started with APIs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pick a simple API: Try a public one, like the PokéAPI.&lt;/li&gt;
&lt;li&gt;Make a request: Use tools like curl, Postman, or even your browser.&lt;/li&gt;
&lt;li&gt;curl
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://pokeapi.co/api/v2/pokemon/pikachu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Inspect the response: You’ll usually receive JSON that you can parse in your app.&lt;/li&gt;
&lt;li&gt;Experiment and build: Add it to your project and see how it fits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;APIs are the glue of modern software. Whether you’re building a side project, integrating payments, or setting up microservices, understanding APIs will enhance your ability to build.&lt;/p&gt;

&lt;p&gt;So next time you’re coding, ask yourself: Do I need to create this from scratch, or is there an API that already solves this problem?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
