<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[How It's Made: Uju Edition]]></title><description><![CDATA[Documenting the constant experiment that is building a tech product. Nothing's ever right, some things are completely wrong, but it all eventually comes down to]]></description><link>https://howitsmade.useuju.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1685040941005/b85L89-TZ.png</url><title>How It&apos;s Made: Uju Edition</title><link>https://howitsmade.useuju.com</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 17 May 2026 15:36:49 GMT</lastBuildDate><atom:link href="https://howitsmade.useuju.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Dissecting Uju]]></title><description><![CDATA[Uju is a Ruby on Rails app that incorporates popular features of any application like payments, mailing, background processing etc. It might be useful to dissect each of the pieces that make this app work, and then in other posts go into depth about ...]]></description><link>https://howitsmade.useuju.com/dissecting-uju</link><guid isPermaLink="true">https://howitsmade.useuju.com/dissecting-uju</guid><category><![CDATA[product]]></category><dc:creator><![CDATA[Thabo Titus]]></dc:creator><pubDate>Fri, 26 May 2023 05:31:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1698490156009/14017f4d-f0ec-49af-87a7-c6d03493ba47.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a target="_blank" href="https://ujuapp.africa/">Uju</a> is a Ruby on Rails app that incorporates popular features of any application like payments, mailing, background processing etc. It might be useful to dissect each of the pieces that make this app work, and then in other posts go into depth about how I built each part. Maybe each can be a series 🤷🏾‍♂️. At this point, I'm winging this blog. I don't know how it's going to shape up, but I know I need to start. Just like starting a project just needs you to start, along the way, a shape starts to take place. This has been true for Uju as well.</p>
<p>What is Uju? It is a customer retention platform that is designed to help businesses manage whatever business processes they want digitized, like payment collection, bookings, selling stuff and the like. It started as a rewards platform, and as it has evolved, it has incorporated all these other things, with rewards baked in as well. Everything has been an experiment in learning and some of those things became the patterns used in the app. I've been the sole developer for 2 years on this project, so anything that allows me to use less cognitive power is a plus.</p>
<h3 id="heading-app-hostingdeployments"><strong>App hosting/deployments</strong></h3>
<p><a target="_blank" href="https://railway.app/">Railway.app</a></p>
<p>After Heroku made that announcement that the free tier was becoming paid, I decided I needed a change, even though I was already a paying customer in any case. I like railway because like Uju, they're figuring things out and It's been interesting to be part of their journey. I don't think I've ever been as interested in a changelog as much as this one. Most of the things they are releasing are problems I've faced, so watching and "feeling" the progress is fun.</p>
<h3 id="heading-mail-delivery"><strong>Mail delivery</strong></h3>
<p><a target="_blank" href="https://postmarkapp.com/">Postmark</a></p>
<p>Postmark is popular in the rails world from what I can gather. It's very easy to use and integrate into your app. I made the decision that I would not have any of my mail templates in the main app. All the templates I use are ones I created in Postmark, and all I do is use the API to send the necessary data to the specific template for Postmark to handle and deliver. This is good for at least 2 reasons:</p>
<ol>
<li><p>I don't have any complex mail templates in the app, because those get ugly, really fast.</p>
</li>
<li><p>Styling mailers is still a bit of a dog show and largely table-based. It's the way we used to develop websites in the early days. So passing that responsibility to a service that specializes in it lessens your load, and also ensures that all devices will receive an email that doesn't break i.e. is compatible with their device.</p>
</li>
<li><p>A bonus reason is, should I feel the need to use a new service, I could do a gradual migration. One email at a time, using both services in parallel.</p>
</li>
</ol>
<h3 id="heading-ui"><strong>UI</strong></h3>
<p><a target="_blank" href="https://wdstk.thabotitus.co.za/">Woodstock UI</a></p>
<p>Woodstock UI ( named after my cat ) is ui kit I built (not specifically for this app) as part of general learning. Another decision I made was that I wouldn't have any css in the app, and rather have a separate app. Again it works for at least 2 reasons:</p>
<ol>
<li><p>I'm not littering the main app with CSS.</p>
</li>
<li><p>A separate app for the UI kit makes it reusable across different projects.</p>
</li>
<li><p>I'm forced to make better decisions around the styles instead of having the freedom to quickly inline something.</p>
</li>
</ol>
<h3 id="heading-cicd">CI/CD</h3>
<p><strong>Git</strong>H<strong>ub Actions:</strong></p>
<p>Using <a target="_blank" href="https://docs.github.com/en/actions">GH Actions</a> allows me to keep my CI close to the code so I'm not having to switch apps to check the results of my CI.</p>
<p>GitHub Projects:</p>
<p>Using <a target="_blank" href="https://docs.github.com/en/issues/planning-and-tracking-with-projects/learning-about-projects/about-projects">GH Projects</a> is also a way to keep the issues close to the code. It's also lightweight as opposed to something like Jira. You can have your stories in iterations like sprints in Jira.</p>
<h3 id="heading-social-media">Social Media</h3>
<p><a target="_blank" href="https://buffer.com/">Buffer</a></p>
<p>Using the free tier of Buffer allows me to automate posts to 3 platforms. It's a very useful tool for a team with limited resources.</p>
<p><a target="_blank" href="https://canva.com">Canva</a></p>
<p>A super easy tool to create social media posts. I can't say more about how simple it is to create clean-looking posts for your social media.</p>
<p><a target="_blank" href="https://shots.so/">Shots</a></p>
<p>By far the best tool I've used to create presentable mockups of the app. And it's free. An app like that won't stay free for long. If it does then wow. It's an amazing tool to have by your side.</p>
<h3 id="heading-analytics"><strong>Analytics</strong></h3>
<p>Umami</p>
<p>Umami is an open-source, privacy-focused alternative to Google Analytics. It is very easy to set up on Railway and makes sure that you're the only one who has the tracked user data. So you can guarantee that the information isn't being used by third parties because you own the database. If you care about user privacy, then this is a good tool to use.</p>
<h3 id="heading-documentation"><strong>Documentation</strong></h3>
<p><a target="_blank" href="https://gitbook.io">Gitbook</a></p>
<p>Gitbook seems to be the go-to for easy-to-manage documentation. There are templates for the various types of documentation you want to do. You can also sync it with your GitHub project, which again, keeps it close to the code.</p>
<hr />
<p>At a high level, these are the pieces that make up Uju as a product and can be used by anyone to build any sort of product. You may not need all the tools, but these tools can help you build a well-rounded product for cheap.</p>
]]></content:encoded></item><item><title><![CDATA[Introduction]]></title><description><![CDATA[Hello 👋🏾 and welcome to Adventures in Product Building. This blog is intended to be a window into how I've gone about developing various tech products from start to finish. Building a product doesn't mean it's wildly successful, or even even well-k...]]></description><link>https://howitsmade.useuju.com/introduction</link><guid isPermaLink="true">https://howitsmade.useuju.com/introduction</guid><category><![CDATA[product]]></category><category><![CDATA[tech ]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Thabo Titus]]></dc:creator><pubDate>Thu, 25 May 2023 16:09:10 GMT</pubDate><content:encoded><![CDATA[<p>Hello 👋🏾 and welcome to Adventures in Product Building. This blog is intended to be a window into how I've gone about developing various tech products from start to finish. Building a product doesn't mean it's wildly successful, or even even well-known. But it's always a great accomplishment, especially for learning.</p>
<p>In today's online world, it's very easy to get caught up in all the technological advancements that happen daily. It's overwhelming and if you're not careful, you can find yourself caught in a perpetual loop of <em>imposter syndrome</em>.</p>
<blockquote>
<p>Impostor syndrome, also known as impostor phenomenon or impostorism, is a psychological occurrence in which people doubt their skills, talents, or accomplishments and have a persistent internalized fear of being exposed as frauds. - <a target="_blank" href="https://en.wikipedia.org/wiki/Impostor_syndrome">Wikipedia</a></p>
</blockquote>
<p>You tend to start telling yourself that you're not good enough because you can't keep up with all the changes. Yesterday's thing that you just learned has now been cast aside by today's thing that you know nothing about. Now I have to learn this new thing, and by the time I grasp those concepts, the next thing is out. It's a recipe for mental exhaustion and an easy way to hate this career.</p>
<p>But when you slow down and think about it for a second, all these new frameworks and tools were created by people like you and me who felt that "this" way worked better for "them". And like any niche product, you will have followers. I like Ruby and I like Rails which means for the most part I agree with how Matz and DHH think and reason. I'm by no means anywhere near their level (** imposter syndrome alert**), but that doesn't <em>actually</em> matter. Some people hate ruby and hate rails. It doesn't make them wrong. They just have a different approach to software which means they created /followed something else.</p>
<p>Anyone can build a product. It doesn't need whole teams, and it sure as hell doesn't need the backing of a corporate to be successful. All you have to do is find excitement in building your product and consistently move forward and over time, your product is built and you can share it with the world.</p>
<p>This blog is going to attempt to show you how I've built my own products over time including all the tools I've been using, and all the tools I've created to help me in building my products.</p>
<p>Everyone has an opinion, even those who don't deserve one. They will try bring you down with harsh words, and on the flip side, some will support you. What you have to do is not worry about the people who don't like your product ( or solution ). They aren't your target market, and that is <strong>okay</strong>. For the most part, your only target market is you, and that, sometimes, is the most important.</p>
]]></content:encoded></item></channel></rss>