<?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: Brender Adhiambo</title>
    <description>The latest articles on DEV Community by Brender Adhiambo (@breodoyo).</description>
    <link>https://dev.to/breodoyo</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3965264%2F23c1f78c-5efa-4f07-b1af-7df062a7af86.png</url>
      <title>DEV Community: Brender Adhiambo</title>
      <link>https://dev.to/breodoyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/breodoyo"/>
    <language>en</language>
    <item>
      <title>Why I Chose Chi for My Go Backend</title>
      <dc:creator>Brender Adhiambo</dc:creator>
      <pubDate>Wed, 02 Sep 2026 04:47:35 +0000</pubDate>
      <link>https://dev.to/breodoyo/why-i-chose-chi-for-my-go-backend-52d6</link>
      <guid>https://dev.to/breodoyo/why-i-chose-chi-for-my-go-backend-52d6</guid>
      <description>&lt;p&gt;When I started building my Go backend, one of the decisions I had to make was which router to use.&lt;/p&gt;

&lt;p&gt;There are quite a few options in the Go ecosystem, but I decided to go with Chi.&lt;/p&gt;

&lt;p&gt;I had used Go for smaller projects before, but building a larger backend made me realize that choosing the right tools is just as important as writing the code itself.&lt;/p&gt;

&lt;p&gt;I wasn't looking for something that would build the whole application for me. I wanted something that would handle routing and give me enough flexibility to decide how the rest of my backend should be structured.&lt;/p&gt;

&lt;p&gt;That's where Chi came in.&lt;/p&gt;

&lt;p&gt;Why Chi?&lt;/p&gt;

&lt;p&gt;The first thing I liked about Chi was its simplicity.&lt;/p&gt;

&lt;p&gt;Chi doesn't try to do everything for you. It focuses mainly on routing and middleware, while allowing you to structure the rest of your application the way you want.&lt;/p&gt;

&lt;p&gt;For my project, that was exactly what I needed.&lt;/p&gt;

&lt;p&gt;A simple route can look like this:&lt;/p&gt;

&lt;p&gt;r := chi.NewRouter()&lt;/p&gt;

&lt;p&gt;r.Get("/users", getUsers)&lt;br&gt;
r.Post("/users", createUser)&lt;/p&gt;

&lt;p&gt;There isn't much happening here, and that's actually what I liked about it.&lt;/p&gt;

&lt;p&gt;The route tells me exactly what it does. A GET request goes to one handler, while a POST request goes to another.&lt;/p&gt;

&lt;p&gt;As I worked on the backend, I started understanding these things more clearly instead of just copying patterns from examples.&lt;/p&gt;

&lt;p&gt;That was important for me because I wasn't only trying to make the application work. I was also trying to understand why it was structured that way.&lt;/p&gt;

&lt;p&gt;Working With Middleware&lt;/p&gt;

&lt;p&gt;Another part of Chi that I found useful was middleware.&lt;/p&gt;

&lt;p&gt;When I first started working with backend applications, I mostly thought about routes and handlers. As the project became bigger, I realized there was a lot of functionality that didn't belong inside individual handlers.&lt;/p&gt;

&lt;p&gt;Things like logging, authentication, recovering from panics, and checking requests are good examples.&lt;/p&gt;

&lt;p&gt;Chi made it easy to apply middleware to my routes.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;r.Use(middleware.Logger)&lt;br&gt;
r.Use(middleware.Recoverer)&lt;/p&gt;

&lt;p&gt;This helped me understand an important backend concept: not everything needs to live inside the handler.&lt;/p&gt;

&lt;p&gt;Middleware sits between the incoming request and the handler. It can perform some work before the request reaches the handler and, depending on the middleware, also work with the response afterward.&lt;/p&gt;

&lt;p&gt;That changed how I thought about structuring my backend.&lt;/p&gt;

&lt;p&gt;Instead of putting everything into one function, I could separate responsibilities and make each part easier to understand.&lt;/p&gt;

&lt;p&gt;Route Groups&lt;/p&gt;

&lt;p&gt;As I added more endpoints, I also started organizing routes into groups.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;r.Route("/api", func(r chi.Router) {&lt;br&gt;
    r.Route("/users", func(r chi.Router) {&lt;br&gt;
        r.Get("/", getUsers)&lt;br&gt;
        r.Post("/", createUser)&lt;br&gt;
    })&lt;br&gt;
})&lt;/p&gt;

&lt;p&gt;This became more useful as the application grew.&lt;/p&gt;

&lt;p&gt;Having all the routes in one large list can quickly become difficult to maintain. Grouping them allowed me to organize endpoints around different parts of the application.&lt;/p&gt;

&lt;p&gt;It also made the router easier to read.&lt;/p&gt;

&lt;p&gt;When I looked at my routes, I could get a quick idea of how the API was organized without having to search through the entire application.&lt;/p&gt;

&lt;p&gt;Chi and My Backend Structure&lt;/p&gt;

&lt;p&gt;One of the biggest things I learned while using Chi was that the router is only one part of a backend.&lt;/p&gt;

&lt;p&gt;It is easy to think that building an API is mostly about creating endpoints, but there is much more happening behind each request.&lt;/p&gt;

&lt;p&gt;A request can go through middleware, reach a handler, be validated, interact with the database, and eventually return a response.&lt;/p&gt;

&lt;p&gt;Working with Chi made me pay more attention to these boundaries.&lt;/p&gt;

&lt;p&gt;I started thinking more carefully about questions like:&lt;/p&gt;

&lt;p&gt;What should the router be responsible for?&lt;br&gt;
What belongs in the handler?&lt;br&gt;
Where should validation happen?&lt;br&gt;
Where should database logic live?&lt;br&gt;
Which functionality should be middleware?&lt;br&gt;
How should different parts of the API be organized?&lt;/p&gt;

&lt;p&gt;These questions became more important as my project grew.&lt;/p&gt;

&lt;p&gt;Instead of putting everything into one place just because it worked, I started thinking about how I could keep the code easier to maintain.&lt;/p&gt;

&lt;p&gt;What I Learned&lt;/p&gt;

&lt;p&gt;Using Chi taught me more than just how to create routes.&lt;/p&gt;

&lt;p&gt;It helped me understand how a Go backend is structured and how different parts of a request move through an application.&lt;/p&gt;

&lt;p&gt;I became more comfortable working with:&lt;/p&gt;

&lt;p&gt;HTTP methods&lt;br&gt;
Routes and handlers&lt;br&gt;
Middleware&lt;br&gt;
Route groups&lt;br&gt;
API structure&lt;br&gt;
Request handling&lt;br&gt;
Separation of responsibilities&lt;/p&gt;

&lt;p&gt;I also learned that a framework doesn't need to be complicated to be useful.&lt;/p&gt;

&lt;p&gt;Before using Chi, I sometimes assumed that a more feature-heavy framework would automatically make backend development easier.&lt;/p&gt;

&lt;p&gt;My experience was a little different.&lt;/p&gt;

&lt;p&gt;Having a lightweight router meant I had to understand more of what I was building. At first, that meant I had more questions. But those questions were actually useful because they pushed me to understand the fundamentals instead of depending on the framework to make decisions for me.&lt;/p&gt;

&lt;p&gt;Looking Back&lt;/p&gt;

&lt;p&gt;Choosing Chi was one of the decisions that made building my Go backend easier.&lt;/p&gt;

&lt;p&gt;It gave me the routing and middleware tools I needed without forcing me into a large framework structure.&lt;/p&gt;

&lt;p&gt;More importantly, working with it helped me understand something I didn't fully appreciate when I started: good backend development isn't only about making endpoints work.&lt;/p&gt;

&lt;p&gt;It's also about knowing where different responsibilities belong and keeping the code understandable as the project grows.&lt;/p&gt;

&lt;p&gt;As I continue working with Go, I'm learning that the tools you choose can influence how you think about and structure your application.&lt;/p&gt;

&lt;p&gt;For me, Chi was a good fit because it stayed out of the way and let me focus on building the backend.&lt;/p&gt;

&lt;p&gt;And honestly, that's one of the things I appreciate most about Go in general.&lt;/p&gt;

</description>
      <category>go</category>
      <category>backend</category>
      <category>webdev</category>
    </item>
    <item>
      <title># From CLI to Docker: What Three Go Projects Taught Me</title>
      <dc:creator>Brender Adhiambo</dc:creator>
      <pubDate>Tue, 07 Jul 2026 13:22:26 +0000</pubDate>
      <link>https://dev.to/breodoyo/-from-cli-to-docker-what-three-go-projects-taught-me-3c4c</link>
      <guid>https://dev.to/breodoyo/-from-cli-to-docker-what-three-go-projects-taught-me-3c4c</guid>
      <description>&lt;p&gt;When I started the ascii-art project, I thought I was just going to print text in different ASCII fonts.&lt;/p&gt;

&lt;p&gt;A few weeks later, I had built a web server, learned the basics of HTTP, worked with HTML templates and CSS, handled user input, and packaged the entire application with Docker.&lt;/p&gt;

&lt;p&gt;Looking back, ascii-art, ascii-art-web, and ascii-art-web-dockerize were more than coding exercises—they showed me how software evolves from a simple command-line tool into a deployable web application.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Building ascii-art&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first project introduced me to much more than string manipulation. I learned how to:&lt;/p&gt;

&lt;p&gt;Parse files and process user input.&lt;br&gt;
Organize code into reusable functions and packages.&lt;br&gt;
Handle errors and edge cases.&lt;br&gt;
Follow the flow of a Go application instead of putting everything inside main().&lt;/p&gt;

&lt;p&gt;One lesson that stood out was understanding program flow:&lt;/p&gt;

&lt;p&gt;main()&lt;br&gt;
   ↓&lt;br&gt;
ParseInput()&lt;br&gt;
   ↓&lt;br&gt;
LoadBanner()&lt;br&gt;
   ↓&lt;br&gt;
GenerateASCII()&lt;br&gt;
   ↓&lt;br&gt;
PrintOutput()&lt;/p&gt;

&lt;p&gt;Once I understood how functions work together, reading larger Go projects became much easier.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Building ascii-art-web&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Turning the terminal application into a web application introduced me to backend development.&lt;/p&gt;

&lt;p&gt;Along the way I learned:&lt;/p&gt;

&lt;p&gt;The difference between GET and POST requests.&lt;br&gt;
How HTTP handlers process requests and return responses.&lt;br&gt;
How to render HTML using Go templates.&lt;br&gt;
Basic CSS to improve the user experience.&lt;br&gt;
How to validate input and return meaningful error pages.&lt;/p&gt;

&lt;p&gt;For the first time, I saw how a browser communicates with a Go server and how each request flows through the application.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dockerizing the Application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The final project introduced me to Docker and deployment.&lt;/p&gt;

&lt;p&gt;I learned how to:&lt;/p&gt;

&lt;p&gt;Package an application into a container.&lt;br&gt;
Write Dockerfiles.&lt;br&gt;
Use multi-stage builds to create smaller production images.&lt;br&gt;
Take advantage of Docker layer caching for faster rebuilds.&lt;/p&gt;

&lt;p&gt;It also helped me understand why containers are so widely used: they make applications portable and consistent across environments.&lt;/p&gt;

&lt;p&gt;Beyond the Code&lt;/p&gt;

&lt;p&gt;These projects changed the way I approach software development.&lt;/p&gt;

&lt;p&gt;I became more confident in:&lt;/p&gt;

&lt;p&gt;Debugging problems instead of guessing.&lt;br&gt;
Reading documentation.&lt;br&gt;
Structuring Go projects.&lt;br&gt;
Breaking large problems into smaller tasks.&lt;br&gt;
Using Git throughout development.&lt;/p&gt;

&lt;p&gt;Most importantly, I realized that software is built step by step. A command-line application can grow into a web application, and that same application can be prepared for deployment with Docker.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;What started as a project to print ASCII characters became one of the most valuable learning experiences in my Go journey.&lt;/p&gt;

&lt;p&gt;These three projects strengthened my understanding of Go, web development, and containerization while showing me how real-world applications evolve over time.&lt;/p&gt;

&lt;p&gt;I'm looking forward to applying these lessons as I continue building larger, production-grade applications.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>go</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Learning Go: The Beauty of Simplicity</title>
      <dc:creator>Brender Adhiambo</dc:creator>
      <pubDate>Wed, 17 Jun 2026 16:40:03 +0000</pubDate>
      <link>https://dev.to/breodoyo/learning-go-the-beauty-of-simplicity-5bnn</link>
      <guid>https://dev.to/breodoyo/learning-go-the-beauty-of-simplicity-5bnn</guid>
      <description>&lt;p&gt;Diving into Go has been incredibly refreshing.&lt;/p&gt;

&lt;p&gt;Coming into it, you might expect a powerful language to come bogged down with complex syntax. Instead, Go forces you to focus on solving problems with straightforward, elegant solutions rather than leaning on over-complicated language features. Its syntax is clean, highly readable, and naturally nudges you toward writing simpler code.&lt;br&gt;
To get up to speed, I've been working through small, targeted exercises. Making mistakes along the way only accelerated the process, each error taught me more than getting it right the first time. Breaking things down into bite-sized challenges helped me truly grasp the foundational mechanics of the language:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Functions &amp;amp; Loops&lt;/strong&gt; — learning the Go way of control flow&lt;br&gt;
&lt;strong&gt;- Strings &amp;amp; Arrays&lt;/strong&gt; — manipulating data efficiently&lt;br&gt;
&lt;strong&gt;- Error Handling&lt;/strong&gt; — embracing Go's explicit, upfront approach to handling what goes wrong&lt;br&gt;
&lt;strong&gt;- Writing Clean Code&lt;/strong&gt; — realizing readability is a core feature of the language, not an afterthought.&lt;/p&gt;

&lt;p&gt;Every small victory and green test suite built a little more confidence.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>go</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
