<?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: Tyclone81</title>
    <description>The latest articles on DEV Community by Tyclone81 (@tyclone81).</description>
    <link>https://dev.to/tyclone81</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%2F3965982%2F8838a5e7-87e2-41a2-8ffb-f8efec600494.jpeg</url>
      <title>DEV Community: Tyclone81</title>
      <link>https://dev.to/tyclone81</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tyclone81"/>
    <language>en</language>
    <item>
      <title>ASCII-Art Experiment to Production-Grade: Building a Live Web Platform for INKA LittUp</title>
      <dc:creator>Tyclone81</dc:creator>
      <pubDate>Thu, 23 Jul 2026 09:30:59 +0000</pubDate>
      <link>https://dev.to/tyclone81/ascii-art-experiment-to-production-grade-building-a-live-web-platform-for-inka-littup-585d</link>
      <guid>https://dev.to/tyclone81/ascii-art-experiment-to-production-grade-building-a-live-web-platform-for-inka-littup-585d</guid>
      <description>&lt;p&gt;From my time at Zone01 Kisumu, one thing has become evident, "Every project builds the next". It is a gradual process which makes the learning experience worthwhile. The knowledge I built during the Ascii-art-Web assignment was the exact foundation that made building a real, working site almost effortless.&lt;/p&gt;

&lt;p&gt;Throughout the ASCII-Art project, I thought of this idea for my production-grade project at Zone01 Kisumu. Building a mobile-responsive web platform for INKA LittUp, a full-service electrical outfit, to showcase their portfolio and convert site visitors to potential clients. &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The Mindset Shift: From In-Memory String Math to Asset Delivery&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
For INKA LittUp, the engineering challenge completely shifted. I wasn't parsing characters anymore, as in Ascii-Art-Web, I needed to serve static visual assets fast, enforce strict HTTP route boundaries, and ensure zero false 200 OK responses.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Fixing Catch-All Routing in Go&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
An important lesson from the Ascii-Art project was defensive error handling. In Go, &lt;em&gt;http.HandleFunc("/", ...)&lt;/em&gt; acts as a catch-all prefix match. If a user requests &lt;em&gt;/some-random-url&lt;/em&gt;, Go’s default behavior will serve &lt;em&gt;index.html&lt;/em&gt; with a &lt;em&gt;200 OK&lt;/em&gt; status code instead of a &lt;em&gt;404 Not Found&lt;/em&gt;.&lt;br&gt;
For INKA LittUp, I had to enforce strict route checking;&lt;/p&gt;

&lt;p&gt;_package main&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "fmt"&lt;br&gt;
    "log"&lt;br&gt;
    "net/http"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;func main() {&lt;br&gt;
    fmt.Println("Server starting on &lt;a href="http://localhost:8080%22" rel="noopener noreferrer"&gt;http://localhost:8080"&lt;/a&gt;)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 1. Serve static assets cleanly (CSS, cover photos, gallery images)
// /static/styles.css maps directly and safely to ./static/styles.css
fs := http.FileServer(http.Dir("./static"))
http.Handle("/static/", http.StripPrefix("/static/", fs))

// 2. Strict root handler guard
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        http.NotFound(w, r) // Properly return 404 for bad paths
        return
    }
    http.ServeFile(w, r, "index.html")
})

// 3. Start listener with crash-logging
err := http.ListenAndServe(":8080", nil)
if err != nil {
    log.Fatal("Server failed to start:", err)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
_&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Pragmatic Architecture: Value Over Complexity&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Developing production-grade platforms showed me that great engineering is not about designing complex stack but about maximizing utility while keeping maintenance low. I customized the platform to use already existing APIs as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For the contact form, I used Formspree API Integration to ensure zero database overhead and instant email alerts.&lt;/li&gt;
&lt;li&gt;For direct messaging, WhatsApp Deep Link(wa.me) which ensures instant mobile contact on a platform clients already use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;The Mobile Reality Check&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
During testing on mobile devices, I ran into this issue where the hero image was cropping awkwardly on narrower screens. Instead of throwing heavy JavaScript at the problem, adjusting the CSS container behavior fixed it cleanly:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;/* Clean mobile background containment &lt;em&gt;/&lt;br&gt;
.hero {&lt;br&gt;
  background-size: contain;&lt;br&gt;
  background-color: #121212; /&lt;/em&gt; Dark background fill for extra space */&lt;br&gt;
}&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Shipping to Production: Continuous Delivery on Render&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
For this particular platform, I turned the deployment mindset into a continuous delivery pipeline as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Version Control: Modular layout tracked cleanly in Git &lt;em&gt;(Tyclone81/LittUp)&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automated Deployments: Connected the GitHub repository directly to Render.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zero-Touch Releases: Every &lt;em&gt;git push origin main&lt;/em&gt; automatically triggers a fresh build and redeploy.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;*&lt;em&gt;What’s Next?&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Moving from terminal utilities to production web deployments showed me how fast you can grow when you build continuously. I'm taking these learning directly into my next production implementations!&lt;/p&gt;

&lt;p&gt;Live Platform: &lt;a href="https://inkalittup.onrender.com/" rel="noopener noreferrer"&gt;https://inkalittup.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Repository: Tyclone81/LittUp&lt;/p&gt;

&lt;p&gt;How did you make the jump from your early utility projects to your first live production site? Let’s chat in the comments.&lt;/p&gt;

&lt;h1&gt;
  
  
  golang #webdev #beginners #buildfromhere #devops
&lt;/h1&gt;

</description>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>webdev</category>
    </item>
    <item>
      <title>From the Terminal to Browser: Building a Web-Based ASCII Art Generator</title>
      <dc:creator>Tyclone81</dc:creator>
      <pubDate>Thu, 23 Jul 2026 07:27:11 +0000</pubDate>
      <link>https://dev.to/tyclone81/from-the-terminal-to-browser-building-a-web-based-ascii-art-generator-3488</link>
      <guid>https://dev.to/tyclone81/from-the-terminal-to-browser-building-a-web-based-ascii-art-generator-3488</guid>
      <description>&lt;p&gt;In my last post, I pulled back the curtain on version control. Knowing how to safely track and commit files is half the test, building software that people can actually interact with is the real test. &lt;br&gt;
This project ensured I took a step up the stack. The project required me to transform a terminal-based ASCII-Art logic into a fully functional web application. This is a completely new challenge from the previous one and as usual, I was locked and ready to walk these waters.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The Core Architecture: Serving HTTP&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
First, the web application has to constantly listen for incoming user requests, process payload data and serve responses back without crashing. GO's &lt;em&gt;net/http&lt;/em&gt; package handles this.&lt;br&gt;
_package main&lt;br&gt;
import (&lt;br&gt;
"fmt"&lt;br&gt;
"net/http"&lt;br&gt;
)&lt;br&gt;
func main() {&lt;br&gt;
http.HandleFunc("/", home)&lt;br&gt;
    http.HandleFunc("/ascii-art", artHandler)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;log.Println("Server running smoothly at http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", nil))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}_&lt;/p&gt;

&lt;p&gt;I learnt the hard way that if a single request causes a runtime panic, the web server crashes for everyone. I had to be more cautious in handling error as a result.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The Rendering Engine: Processing the Font File&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
This is the heart of the application. The server accepts an input string from a web form, maps each character to a corresponding visual block in a given banner text file and structures it into a graphic ASCII typography.&lt;/p&gt;

&lt;p&gt;The logic works as follows:&lt;br&gt;
&lt;strong&gt;File I/O:&lt;/strong&gt; _os.ReadFile _ reads the chosen font file e.g standard, shadow or thinkertoy.&lt;br&gt;
&lt;strong&gt;Splitting the Font:&lt;/strong&gt; the raw banner file is then split by newline characters into a massive string slice,8 lines tall.&lt;br&gt;
&lt;strong&gt;Mathematical Mapping:&lt;/strong&gt; To find the starting line of any character block, its position is calculated based on its ASCII decimal value. &lt;br&gt;
    _startLine := int(char-32)*9 + 1&lt;br&gt;
_&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Shipping the Code: Containerization with Docker&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
The program works perfectly on my local machine. However, I have learnt that local success means nothing it it does not run identically in production or on a grading server.&lt;br&gt;
Therefore, I had to learn the Dockerization concept. The concept ensures that my application would run seamlessly in any given environment. It entailed packing the GO binary, the font banner files and HTML templates into a single lightweight image.&lt;br&gt;
_# --- Stage 1: Build &amp;amp; Test Environment ---&lt;/p&gt;

&lt;p&gt;FROM golang:1.22-alpine AS builder&lt;/p&gt;

&lt;h1&gt;
  
  
  Metadata to track build stages for garbage collection
&lt;/h1&gt;

&lt;p&gt;LABEL stage=ascii-art-web-builder&lt;/p&gt;

&lt;p&gt;WORKDIR /src&lt;/p&gt;

&lt;h1&gt;
  
  
  Copy all source files and assets needed for building and testing
&lt;/h1&gt;

&lt;p&gt;COPY main.go ascii.go main_test.go go.mod ./&lt;br&gt;
COPY banners/ ./banners/&lt;br&gt;
COPY templates/ ./templates/&lt;/p&gt;

&lt;h1&gt;
  
  
  Run the automated safety test script inside the container; If any test block fails, the Docker build stops immediately
&lt;/h1&gt;

&lt;p&gt;RUN go test -v&lt;/p&gt;

&lt;h1&gt;
  
  
  Build the optimized, statically linked Go binary
&lt;/h1&gt;

&lt;p&gt;RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o ascii-art-web-server main.go ascii.go&lt;/p&gt;

&lt;h1&gt;
  
  
  --- Stage 2: Final Runtime Environment ---
&lt;/h1&gt;

&lt;p&gt;FROM alpine:3.19&lt;/p&gt;

&lt;h1&gt;
  
  
  Apply metadata directly from your updated documentation
&lt;/h1&gt;

&lt;p&gt;LABEL app="ascii-art-generator"&lt;br&gt;
LABEL version="1.0"&lt;br&gt;
LABEL description="Dockerfike for my ASCII Art Generator Web Application with Asset Auditing and In-Memory Caching."&lt;/p&gt;

&lt;h1&gt;
  
  
  Security: Run as a non-root user
&lt;/h1&gt;

&lt;p&gt;RUN adduser -D -u 10001 appuser&lt;br&gt;
USER appuser&lt;/p&gt;

&lt;p&gt;WORKDIR /app&lt;/p&gt;

&lt;h1&gt;
  
  
  Copy binary from the builder stage
&lt;/h1&gt;

&lt;p&gt;COPY --from=builder /src/ascii-art-web-server .&lt;/p&gt;

&lt;h1&gt;
  
  
  Copy assets and layout folders exactly as specified in the directory structure
&lt;/h1&gt;

&lt;p&gt;COPY banners/ ./banners/&lt;br&gt;
COPY templates/ ./templates/&lt;/p&gt;

&lt;h1&gt;
  
  
  Document the port exposed by your Main Controller
&lt;/h1&gt;

&lt;p&gt;EXPOSE 8080&lt;/p&gt;

&lt;h1&gt;
  
  
  Execute the application
&lt;/h1&gt;

&lt;p&gt;CMD ["./ascii-art-web-server"]&lt;br&gt;
_&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Breakthrough&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building this web generator made everything I have learned the past month unfold before me. The strict formatting logic in &lt;em&gt;go-reloaded&lt;/em&gt; through to the structural progress in &lt;em&gt;Git&lt;/em&gt;. I have literally gone full circle really. From observing how tools work in the lab, to actively participating in building web platforms.&lt;/p&gt;

&lt;p&gt;Now more than ever, I am convinced I will ultimately hack it. Through this exercise, I already have an idea in mind that I would like to implement. Stay tuned for my next post where I put the web skills into a production grade implementation.&lt;/p&gt;

&lt;h1&gt;
  
  
  go #beginners #webdev #buildfromhere
&lt;/h1&gt;

</description>
      <category>backend</category>
      <category>go</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Getting into the Git: Unlocking the Version Control</title>
      <dc:creator>Tyclone81</dc:creator>
      <pubDate>Thu, 02 Jul 2026 13:44:22 +0000</pubDate>
      <link>https://dev.to/tyclone81/getting-into-the-git-unlocking-the-version-control-1nkk</link>
      <guid>https://dev.to/tyclone81/getting-into-the-git-unlocking-the-version-control-1nkk</guid>
      <description>&lt;p&gt;Just like any house requires a foundation or any chemical reaction requires individual elements, I realized coding requires an elaborate understanding of the version control system. My Git project was intentionally designed as a progressive journey into the world of version control and collaboration. Initially I could type commands in my terminal without necessarily being sure what they do, I quickly discovered this was not sustainable. I now have to unlearn, learn and relearn if I am to stand any chance in this field.&lt;/p&gt;

&lt;p&gt;The project laid down the basics of what I need, starting from &lt;em&gt;git init&lt;/em&gt;, a command to create a git repository to &lt;em&gt;git push&lt;/em&gt;, one to send my project to the repository. I moved from ground up, &lt;em&gt;git clone&lt;/em&gt;, a command to pull down project templates into my terminal, the staging cycle where my code moves between states. The three states of Git have become an integral part of my journey as everything coding is done here. The working directory comprises my active code files, the staging area, &lt;em&gt;git add . &amp;amp; git commit -m&lt;/em&gt; and the repository, _git push _.&lt;/p&gt;

&lt;p&gt;I hit this puzzle that required me to stage once but commit twice, and that's how I learnt &lt;em&gt;git add -p&lt;/em&gt; , a command that allows me to commit sections of my file separately. Moving through the project taught me this deep web of commands that would become integral in group collaboration such as &lt;em&gt;git switch -c, git log, git push origin (branch name)&lt;/em&gt;, etc.&lt;/p&gt;

&lt;p&gt;At the end of the project, my git skills progressed from frantic guesswork to deliberate, structural control. Indeed, git is not just a list of terminal prompts to memorize, it is a logical environment built to protect my work. Another week, another reason to look forward for more.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>cli</category>
      <category>git</category>
      <category>learning</category>
    </item>
    <item>
      <title>Science v Syntax: The Rude Awakening.</title>
      <dc:creator>Tyclone81</dc:creator>
      <pubDate>Sun, 28 Jun 2026 20:03:40 +0000</pubDate>
      <link>https://dev.to/tyclone81/science-v-syntax-the-rude-awakening-2309</link>
      <guid>https://dev.to/tyclone81/science-v-syntax-the-rude-awakening-2309</guid>
      <description>&lt;p&gt;Passing the selection pool at Zone01 Kisumu was just the gate. Four weeks into my official journey to software development and I have been hit by a rude awakening! The case sensitivity of Go has already signaled me not to shade my laboratory skin off yet. The attention to detail shall come in handy. Miss a comma, brace, or even an exclamation mark and the program throws in syntax errors.&lt;br&gt;
My introduction to this reality was go-reloaded, a command-line text parsing tool. The assignment sounded simple: take a raw text file, manipulate the strings, fix punctuation spacing, and convert the binary or hexadecimal strings to numbers.&lt;br&gt;
The chemist in me figured I would logic my way through it in an hour. Instead, I immediately hit a wall trying to format punctuation marks (., ,, !). They need to close up to the word before them, but maintain a space after them. My clueless loops resulted in constant runtime crashes;&lt;br&gt;
&lt;em&gt;panic: runtime error: index out of range.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With assistance from a few of my peers(I had to sample ideas from a few to establish my base), I was able to break the execution into two phases. First I split the text string into a slice of individual words and characters. I then used Go's built in standard package, &lt;em&gt;strconv&lt;/em&gt; , to look ahead and convert specific flags (like &lt;em&gt;hex _and _bin&lt;/em&gt; to decimal), while cleaning up the slice indexes.&lt;/p&gt;

&lt;p&gt;The feeling of being able to run my first program albeit with enormous help from my peers was so much fulfilling. Much like the feeling I used to get when I got a breakthrough on a particular research, never gets old really.&lt;br&gt;
The biggest lesson I learned wasn't actually about Go syntax. It was learning that error messages are not a sign of personal failure. In science, an unexpected result is just data. In coding, a red error screen is exactly the same thing, it is just an input telling you exactly where your logic diverged from reality. Each day is a learning day.&lt;/p&gt;

&lt;h1&gt;
  
  
  Beginners #Golang #Zone01Kisumu
&lt;/h1&gt;

</description>
      <category>beginners</category>
      <category>cli</category>
      <category>devjournal</category>
      <category>go</category>
    </item>
    <item>
      <title>From the lab to the loop; Starting Again!</title>
      <dc:creator>Tyclone81</dc:creator>
      <pubDate>Sun, 28 Jun 2026 13:18:45 +0000</pubDate>
      <link>https://dev.to/tyclone81/from-the-lab-to-the-loop-starting-again-4hd5</link>
      <guid>https://dev.to/tyclone81/from-the-lab-to-the-loop-starting-again-4hd5</guid>
      <description>&lt;p&gt;Start of the year this year I felt like I was completely trapped in this endless loop of self doubt. Fast forward 6 months into the year, I am completely locked in at Zone01 Kisumu as an aspiring software Developer.&lt;br&gt;
Why jump ship from science to tech? That is the question I find myself facing from almost everyone around me right now. To me, the answer is straightforward: the world is evolving, and I want to be at the center of it all. It is the oldest rule in the jungle, the rule of natural selection. Either adapt, or get eliminated.&lt;br&gt;
During my time in the science fraternity, I noticed a pattern. Most of the hiccups, bottlenecks, and major problems we faced were ultimately solved by technology, whether it was built internally or outsourced. I saw a massive opportunity right there. Instead of just relying on the tools, I wanted to learn how to build them.&lt;br&gt;
So, I took the first step into the unknown. I decided to start over. Time will surely tell whether it was the right step or not, but I had to try.&lt;br&gt;&lt;br&gt;
Getting selected into Zone01 Kisumu however, had me questioning my decision to start again. Calling the selection process intense would be an understatement. Our perseverance and mental limits were seriously tested. "Where do you go now if you fail" is the question that could not leave my head, I guess I would never know now.&lt;br&gt;
To anyone out there who is standing on the edge, wanting to make a fresh start, whether it is in your career, your family, or your employment: take that leap of faith. The unknown is terrifying, but staying stuck is worse, you got this! &lt;/p&gt;

&lt;h1&gt;
  
  
  beginners #golang #Zone01Kisumu
&lt;/h1&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>codenewbie</category>
      <category>devjournal</category>
    </item>
  </channel>
</rss>
