<?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: Abiodun</title>
    <description>The latest articles on DEV Community by Abiodun (@emer).</description>
    <link>https://dev.to/emer</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%2F3569825%2Faee101b4-15ed-482a-95a3-79c060570d98.png</url>
      <title>DEV Community: Abiodun</title>
      <link>https://dev.to/emer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emer"/>
    <language>en</language>
    <item>
      <title>Building a “Say It Nicer” Laravel API with Telex A2A Integration</title>
      <dc:creator>Abiodun</dc:creator>
      <pubDate>Thu, 06 Nov 2025 23:59:13 +0000</pubDate>
      <link>https://dev.to/emer/building-a-say-it-nicer-laravel-api-with-telex-a2a-integration-3oi4</link>
      <guid>https://dev.to/emer/building-a-say-it-nicer-laravel-api-with-telex-a2a-integration-3oi4</guid>
      <description>&lt;h1&gt;
  
  
  Say It Nicer: Making Messages Polite with Laravel &amp;amp; Telex
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;#hng13 #Laravel #Telex #PHP #APIDevelopment #Gemini&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’ve all sent messages that sounded a bit… harsh. Maybe it was an email, a Slack message, or just a quick text. What if there was a way to automatically soften the tone without losing the meaning? That’s exactly what I set out to do with &lt;strong&gt;SayItNicer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;SayItNicer is a Laravel API that takes your message and gives it a kinder, more professional tone. And the cool part? It integrates with &lt;strong&gt;Telex A2A agents&lt;/strong&gt;, so it can easily plug into chat apps or other systems that support Telex.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Receiving Messages&lt;/strong&gt;&lt;br&gt;
The API is designed to accept messages in &lt;strong&gt;JSON-RPC format&lt;/strong&gt;, which is how Telex agents talk to each other. The messages can have multiple parts, but SayItNicer looks for text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Checking the Text&lt;/strong&gt;&lt;br&gt;
Before doing anything, it checks if there’s actually text to work with. If the request doesn’t contain text, it sends back an error. This ensures the API only processes valid messages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Polishing the Message&lt;/strong&gt;&lt;br&gt;
The heart of the API is a service that rewrites the message. It detects harsh or blunt wording and returns a softer version. For example, “This is too harsh!” might become “Here’s a kinder way to phrase that: …”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Responding in Telex Format&lt;/strong&gt;&lt;br&gt;
Once rewritten, the API sends the message back in JSON-RPC format, so it can be used seamlessly by other agents or applications. Metadata like message IDs and roles are included, keeping everything structured.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent Card&lt;/strong&gt;&lt;br&gt;
SayItNicer also provides an &lt;strong&gt;agent card&lt;/strong&gt;—basically a profile that describes what it can do. Other Telex agents can use this card to understand its capabilities, input/output types, and examples. It makes discovery and integration effortless.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improve Communication:&lt;/strong&gt; Sometimes tone matters more than content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to Integrate:&lt;/strong&gt; Works with Telex A2A standards out-of-the-box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensible:&lt;/strong&gt; You could add more NLP features, like sentiment detection or emoji handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning Opportunity:&lt;/strong&gt; It’s a small project but touches on API design, service interfaces, and agent-based systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project was part of my #hng-intern13 journey, and it’s a neat little tool for anyone who wants to make messaging kinder without doing the hard thinking manually.&lt;/p&gt;

&lt;p&gt;Imagine a world where your code can gently nudge your messages to be polite. That’s the vision behind Say-It-Nicer.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>ai</category>
      <category>api</category>
      <category>php</category>
    </item>
    <item>
      <title>From Boredom to Building: My First Task at HNG13</title>
      <dc:creator>Abiodun</dc:creator>
      <pubDate>Thu, 16 Oct 2025 23:17:44 +0000</pubDate>
      <link>https://dev.to/emer/from-boredom-to-building-my-first-task-at-hng13-19c8</link>
      <guid>https://dev.to/emer/from-boredom-to-building-my-first-task-at-hng13-19c8</guid>
      <description>&lt;p&gt;After being laid off, I was honestly just... bored.&lt;br&gt;
I needed something to reignite my brain and keep me learning, so I decided to join the &lt;strong&gt;HNG.tech Internship 13.&lt;/strong&gt; It’s known for its fast-paced learning environment — the kind that keeps you coding, debugging, and smiling at 2 a.m.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;# The Task&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The very first task was simple on the surface:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&amp;gt; Build an API endpoint using any (or favourite) stack that returns a JSON response.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But this wasn’t just about returning &lt;code&gt;"Hello World"&lt;/code&gt;.&lt;br&gt;
The goal was to **show structure, clarity, and logic — the kind of detail that proves you can write maintainable code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;# The Flow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s how I approached it — more like a layout of how everything connects:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Auto-create the database
The app first checks if a database exists.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;If not, it creates one automatically.&lt;/li&gt;
&lt;li&gt;This means after environment and dependencies setup no other tweaking is needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Run Migrations if Missing
Once the database is ready, it checks for tables.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;If migrations haven’t been run, it triggers them automatically.&lt;/li&gt;
&lt;li&gt;Think of it as Laravel saying, “Relax, I got this.”&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Seed Initial User Data
After migrations, it seeds one user records.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;This only happens, if the tables are newly created.&lt;/li&gt;
&lt;li&gt;This enable user data to be fetched from either the database (if it already exists) or a hardcoded array inside the service.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Service-Based Structure
Instead of mixing logic in the controller, everything was handled by a &lt;strong&gt;Service class&lt;/strong&gt; that communicates through an &lt;strong&gt;Interface&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;This keeps the controller clean and focused on HTTP flow.&lt;/li&gt;
&lt;li&gt;The service handles all the database logic, data preparation, and checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;API Response Design
I used a base &lt;code&gt;ApiResponse&lt;/code&gt; class that structures every response.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;No hardcoded keys like &lt;code&gt;meta&lt;/code&gt; or &lt;code&gt;data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Just clean, human-readable JSON output.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Rate Limiting for Safety
To avoid abuse, I added Laravel’s built-in throttle middleware directly to the route.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;By default, it allows 60 requests per minute.&lt;/li&gt;
&lt;li&gt;You can always tweak this later based on your needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;# The Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simple endpoint — &lt;code&gt;/api/me&lt;/code&gt; — that returns user info, but beneath it lies a thoughtful system that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates what’s missing,&lt;/li&gt;
&lt;li&gt;Seeds what’s needed,&lt;/li&gt;
&lt;li&gt;Responds cleanly,&lt;/li&gt;
&lt;li&gt;And protects itself automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;# My Reflection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It might sound like a small API task, but the process reminded me of why I love backend engineering — it’s like solving tiny puzzles that make systems feel alive.&lt;/p&gt;

&lt;p&gt;From being laid off to joining HNG13, this task became my way to stretch my brain again.&lt;br&gt;
I’m now even more motivated to keep going deeper with each new challenge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;# Tech Stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel 12+&lt;/li&gt;
&lt;li&gt;PHP 8+&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;RESTful API principles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;# What I Learnt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This task reminded me why I love creating solutions. I learnt more about how to structure a simple feature properly — from automating database setup and seeding to integrating an external API smoothly. It showed me how clean organization between controllers, services, and responses makes everything flow better. Most importantly, it reignited my excitement for coding after the layoff — turning a small task into something that feels alive and purposeful.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;# Link *&lt;/em&gt;&lt;br&gt;
GitHub: &lt;a href="//github.com/integral-hub/backend-api"&gt;the api repository&lt;/a&gt;&lt;br&gt;
Live Endpoint: &lt;a href="https://api.techtrovelab.com/api/me" rel="noopener noreferrer"&gt;Live Api&lt;/a&gt;&lt;/p&gt;

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