<?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[Bruno says this, Bruno says that]]></title><description><![CDATA[Bruno says this, Bruno says that]]></description><link>https://brunosays.com</link><generator>RSS for Node</generator><lastBuildDate>Sun, 07 Jun 2026 08:05:14 GMT</lastBuildDate><atom:link href="https://brunosays.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to bulk edit expenses in Toshl?]]></title><description><![CDATA[Toshl doesn't have bulk edits. Chances are you probably already know this, especially if you're coming here from a Google Search.
I've recently switched personal finance tracker and imported my all-time data. I also got all the categories from the ol...]]></description><link>https://brunosays.com/how-to-bulk-edit-expenses-in-toshl</link><guid isPermaLink="true">https://brunosays.com/how-to-bulk-edit-expenses-in-toshl</guid><category><![CDATA[toshl]]></category><category><![CDATA[expense tracker software]]></category><category><![CDATA[personal]]></category><category><![CDATA[finance]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Thu, 05 Jan 2023 15:53:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1672934222508/81e6d3f9-361c-4506-9ae6-0f0e24a91cb6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Toshl doesn't have bulk edits. Chances are you probably already know this, especially if you're coming here from a Google Search.</p>
<p>I've recently switched personal finance tracker and imported my all-time data. I also got all the categories from the old app, which is ok. However, in the old app, I haven't used tags. Only categories. Here in Toshl, I see I could start using tags as well. Another thing, now my pool of categories was a mix of old and new ones, so I wanted to tidy it up.</p>
<p>So I start looking for a bulk update option on my phone. Couldn't find it. It has to be available in the web app, I thought. Nope. There isn't a bulk update feature. And as you can see, it's been on their feature to-do list for quite a while 😅</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/Toshl/status/780334642574585856">https://twitter.com/Toshl/status/780334642574585856</a></div>
<p> </p>
<h2 id="heading-scenario">Scenario</h2>
<p>I have entries for over quite a period that belongs to three categories:</p>
<ul>
<li><p>Property insurance,</p>
</li>
<li><p>Vehicle insurance and</p>
</li>
<li><p>Travel insurance.</p>
</li>
</ul>
<p>In the old app, there was a category hierarchy system, so I used them directly without tags. Now I would like to put them all into one category, "Insurance" and to have three tags attached to them respectfully. Tags would be:</p>
<ul>
<li><p>Property,</p>
</li>
<li><p>Vehicle and</p>
</li>
<li><p>Travel.</p>
</li>
</ul>
<p>But, I want to keep the metadata. After I finish, an expense that was in the "Property insurance" category, will be in the category "Insurance", having the tag "Property" attached to it.</p>
<h2 id="heading-manual-way-to-the-rescue">Manual way to the rescue</h2>
<p>I found a way how to do a bulk edit but it requires additional steps, so I wanted to write it down here for future reference, but also to give you an idea of how you can do it too. I'll put as many details as possible so you can follow.</p>
<p>Also, bear in mind that you can mess things up along the way, so be careful. This isn't Toshl's official guideline nor I would like to feel responsible for your data loss. As they say, this is for information purposes. Read all the steps before you start doing anything. You might get a better understanding of the process and maybe something else will come to your mind.</p>
<h2 id="heading-tldr-version">TLDR; version</h2>
<ul>
<li><p>export entries you want to edit as a CSV</p>
</li>
<li><p>edit CSV and put whatever you like</p>
</li>
<li><p>delete exported entries in Toshl</p>
</li>
<li><p>import edited entries</p>
</li>
<li><p>check if you screwed up something</p>
</li>
</ul>
<h2 id="heading-complete-step-by-step-list">Complete step by step list</h2>
<h3 id="heading-1-take-a-snapshot-of-your-current-balance">1. Take a snapshot of your current balance</h3>
<p>As we're doing a mass edit, something might go wrong. Don't worry, it can also go just fine. But how can we prove that? Well, simply by comparing before and after numbers. That's why it's important to write down your balance. You could also take a screenshot, whatever works for you.</p>
<h3 id="heading-2-create-a-new-category">2. Create a new category</h3>
<p>A fresh category will be useful, so we can make a clean merge. In my case, I've created the "Insurance" category. I'll explain in the end why it's better to have a new category, instead of reusing one of the three existing categories (i.e. merge the first two categories into a third one).</p>
<h3 id="heading-3-check-the-sum-of-all-records-in-a-category">3. Check the sum of all records in a category</h3>
<p>This step will also help with further validation. As you can see, we're paying attention and putting a lot of checks along the way. When you go to "Edit categories" and open one, you can see the "List of expenses in the category" link. This will give you an overview of all entries within and you can check the total sum by switching to the "By Category" tab. Write down this number as well, since we will compare it in one of the next steps</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672926294440/77177a82-64f8-43a3-b8f8-dcdc0b6bbd27.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-4-export-the-expenses-you-want-to-bulk-edit">4. Export the expenses you want to bulk edit</h3>
<p>In the export menu, select the proper category and proceed with exporting. A CSV file will be enough. Make sure that you</p>
<ul>
<li><p>export from all accounts (if it is relevant);</p>
</li>
<li><p>set a period to "all time" to get all of the entries and</p>
</li>
<li><p>uncheck "Incomes", so it doesn't include them in the file.</p>
</li>
</ul>
<p>Anything done wrong from the list above may cause some kind of data mismatch. E.g., data not exported from XY account is later deleted in the app; exported only for last month, but deleted all; you reimport the incomes unnecessarily and thus having your data doubled.</p>
<h3 id="heading-5-open-the-csv-with-your-favorite-editor-and-start-editing">5. Open the CSV with your favorite editor and start editing</h3>
<p>Be it Google Sheets, raw text edit or something else, open the file and do all the changes you want. In my case, I went with Google Sheets, as I wanted a tabular view. That way I could apply my changes by dragging the values in the cell. <em>There was one extra step to convert the CSV data into a tabular view, but I'll skip that here.</em></p>
<p>My only change was to write the name of the tag next to the category name. I didn't mess up with anything else, especially with the categories. This will come in the next steps.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672926860288/7ac3a073-947d-4e48-ba67-6485208e8416.png" alt class="image--center mx-auto" /></p>
<p>Another reason why I did it in Google Sheets is to quickly sum up the expenses. This is something you can't do automatically if you're editing a raw CSV file. I compared that sum with the one from step #3, to make sure I'm on a good path.</p>
<p>After that, export your CSV file. If you're a freak like me, you'd like to check if anything was messed up, e.g. date format and similar things. Those can go nasty when converting from one file format to another.</p>
<h3 id="heading-6-delete-the-category-youve-exported-and-the-records-within">6. Delete the category you've exported (and the records within)</h3>
<p>Yes, you'll need to delete the category completely and all the expenses you have within. I know, scary. Toshl will even warn you, and ask you to confirm it by typing the password again. And pay attention here, as this is a step where you can't go back if you haven't properly done steps before.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672927667967/1587c30a-5e0f-47d7-808a-4412821e7f80.png" alt class="image--center mx-auto" /></p>
<p>We're deleting this, because we'll import the same entries, slightly modified, in the next step.</p>
<p><em>In case you want to see if the process is working well, you could proceed to the import without deleting the entries. That way you'll see double entries once imported but it will help you verify that the dates are correct (grouped by day), and also see if the changes are what you expected them to be. You'll see both entries next to each other, easy to compare. But, after all the checks, you'll still have to delete the entries from that category and do the import one more time, to have only updated entries.</em></p>
<h3 id="heading-7-import-the-csv-file">7. Import the CSV file.</h3>
<p>In Toshl import documentation, and when I talked to their support, they advise people to create a new account where they can import things. The logic is simple, if you screw up something, you can delete that account while keeping your main accounts intact. So, I've created an account "import-tags" and proceed with the import process.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672928246608/fa2f678a-c74c-4ec5-bab9-5c3667631567.png" alt class="image--center mx-auto" /></p>
<p>Did I need a new account for this? Well, yes and no. Turns out, the freshly imported file will match your existing account, and the entries will go directly there, not in the "import-tags" account. If you exported data from a "Bank" account, it will re-appear in the "Bank" account after import. However, you do need to select a destination account for your import. So I stuck to it, in case something would have gone wrong.</p>
<h3 id="heading-8-verify-the-category-youve-just-imported">8. Verify the category you've just imported</h3>
<p>Open the category and check all the records in it, same as in step #3. Yes, it is the category you deleted, but this import recreated it for you.</p>
<p>Take a brief look if the entries are on the proper dates, and most important (the reason why we did this) if they have the proper tags attached.</p>
<p>At this point, your entries will still have the old category, don't worry, we'll come to that in a minute.</p>
<p>While you're here, it's a good idea to double-check the total sum of selected entries and compare it to the one in #3.</p>
<h3 id="heading-9-merge-the-old-category-with-the-one-created-in-2">9. Merge the old category with the one created in #2</h3>
<p>Go to "Edit categories" in your expense view to have all of your categories. You'll notice a new tag dangling without a category. That's also one of the signs that our import went fine. Toshl lets you do the merging and moving with drag and drop, so the next thing we are going to do is</p>
<ul>
<li><p>Drag "Property insurance" on the freshly created "Insurance" category</p>
</li>
<li><p>Also, assign the "Property" tag to the "Insurance" category.</p>
</li>
</ul>
<p>With the category merging, all the previous entries that had the "Property insurance" now have the "Insurance" category.</p>
<p>The reason why we moved the tag into the "Insurance" category is only to bind that tag and prioritize it the next time we create an "Insurance" expense.</p>
<p><em>I owe you an explanation of why it's better to create a fresh new category, as mentioned in step #2. If you have categories A, B and C, create a new parent category P and do this process so you can have tags A\</em>, B* and C* in category P. In case you transform category A (and later B) and merge it to C afterward (with the final step of renaming C -&gt; P), you'll have a P category with tags A* and B*, but the remaining entries won't have any tags. This is ok if your C category is already kind of a catch-it-all category and its entries don't have to be tagged.*</p>
<h3 id="heading-10-check-if-your-account-balance-is-the-same-as-before">10. Check if your account balance is the same as before</h3>
<p>Now to do a final check. Your account balance, in total and separated, should remain the same. During the process of deleting and importing the amounts will change, as there are removing and restoring data steps in place, but once you finish, the numbers should be the same. If not, then you haven't done all the steps properly. <em>If this is the case, sorry, you're on your own to figure out what went wrong.</em></p>
<h3 id="heading-11-rinse-repeat">11. Rinse, repeat</h3>
<p>I did this a few times. First when I tested it, then I changed my real entries and it works. However, there are some repeating steps that I think I will try to minimize.</p>
<p>Doing things one by one can give you more control, as you can stop and check the changes. Also, the changes are coming in smaller batches so they should be easier to roll back.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>It's doable, but still requires a lot of steps and a sharp mind. Don't do this when you're tired and can't see numbers properly.</p>
<p>But, it's ok if it's a one-time action (setting up an account, doing major changes).</p>
<p>Editing CSV files can open endless possibilities when it comes to bulk editing Toshl records. You just need to put everything back properly once you finished playing.</p>
<p>I still have to re-organize my bills category, and I have plenty of them. I will think about reducing the steps so I don't have to do them one by one. Haven't tested it, but it should be possible to export multiple categories, edit them all at once and import them in the same way as above.</p>
<p>That would be it for now.</p>
<p><strong>Drop a comment if this article helped you set up your Toshl account.</strong></p>
]]></content:encoded></item><item><title><![CDATA[How to monetize your Notion page?]]></title><description><![CDATA[Notion is more and more popular these days. Also, the number of people who are collecting and organizing resources is rising. So, if you have something valuable that people want, why not selling it?
https://twitter.com/brunoraljic/status/138277860789...]]></description><link>https://brunosays.com/how-to-monetize-your-notion-page</link><guid isPermaLink="true">https://brunosays.com/how-to-monetize-your-notion-page</guid><category><![CDATA[Monetization]]></category><category><![CDATA[resources]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Sat, 08 May 2021 11:41:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1620474044013/SHHtGuhit.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Notion is more and more popular these days. Also, the number of people who are collecting and organizing resources is rising. So, if you have something valuable that people want, why not selling it?</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/brunoraljic/status/1382778607890804737">https://twitter.com/brunoraljic/status/1382778607890804737</a></div>
<p>I was asking this simple question. How can you monetize a Notion page? A lot of people engaged with that tweet, so I'm summarizing suggestions I got.</p>
<h2 id="starting-points">Starting points</h2>
<h3 id="1-sell-access-to-it-on-gumroad">1. Sell access to it on Gumroad</h3>
<p>I got this suggestion the most. Let's see how you can do this. The first step is to create a Gumroad product and instead of putting actual content, you provide a redirect URL to your Notion page</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1620421885612/aRqcBOu_s.png" alt="image.png" /></p>
<p>And how to get the link to your notion page? Well, in the upper right corner of the Notion page you have a Share button</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1620422447819/BkrWOv3Q1.png" alt="image.png" /></p>
<p>Don't forget to enable <strong>Allow duplicate as template</strong>. That way people who get it will be able to insert the page into their Notion. </p>
<h3 id="2-protect-it-with-memberspace">2. Protect it with MemberSpace</h3>
<blockquote>
<p>Turn any part of your website into members-only with just a few clicks</p>
</blockquote>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/Leandro8209/status/1382780657550688257?s=20">https://twitter.com/Leandro8209/status/1382780657550688257?s=20</a></div>
<p>I saw some people on Twitter used  <a target="_blank" href="https://twitter.com/memberspace">MemberSpace</a> to put their Notion resources under membership. So you need to log in and become a member to access the Notion page.  Memberspace works well also with other platforms, it's not related only to Notion. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1620422790640/cYerIOXQp.png" alt="image.png" /></p>
<p>Keep in mind that you need to pay for using MemberSpace. There is a 14-day trial. </p>
<p>A similar tool is <a target="_blank" href="https://twitter.com/MemberstackApp">Memberstack</a> </p>
<h3 id="3-use-potion-to-monetize-notion">3. Use potion to monetize Notion</h3>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/noahwbragg/status/1382788701969731585?s=20">https://twitter.com/noahwbragg/status/1382788701969731585?s=20</a></div>
<p>Well, not directly, but still you get the point. Potion is also a paid tool that will turn your Notion page into a custom website. Then you can connect it with Gumroad or Flurly the same way. </p>
<h2 id="caveats">Caveats</h2>
<p>Like any other digital product, Notion page is (very) easy to duplicate. Keep that in mind. The same goes with selling e.g. PDFs. nothing can stop the buyer to forward a PDF to someone. You could actually additionally password protect the resource and send it directly to those who made a purchase, but still, if somebody wants to re-share it, it's just one additional step for them.</p>
<h2 id="thanks-for-reading">Thanks for reading</h2>
<p>Alright, I started the post with Gumroad, so I'll finish it in the same manner. I have two resources that you might find interesting:</p>
<ul>
<li><a target="_blank" href="https://brunosays.com/gumroad-makes-it-really-easy-to-earn-a-buck-or-two">Gumroad makes it really easy to earn a buck or two</a> Blogpost with practical steps on setting up a product on Gumroad.</li>
<li><a target="_blank" href="https://gumroad.com/l/hello-gumroad">Hello Gumroad</a> Info product (29 pages) on what's possible to do on the platform, with some ideas and pros/cons overview</li>
</ul>
<p><a target="_blank" href="https://twitter.com/brunoraljic">Follow me on Twitter @brunoraljic</a> for more things like this.</p>
]]></content:encoded></item><item><title><![CDATA[Can writing a blog posts make you a better colleague?]]></title><description><![CDATA[You might ask yourself how writing blog posts can help you become a better colleague? Well, writing can help you with several things. First of all, it makes you think more about the topic. Upfront. Before communicating. It also helps you articulate y...]]></description><link>https://brunosays.com/can-writing-a-blog-posts-make-you-a-better-colleague</link><guid isPermaLink="true">https://brunosays.com/can-writing-a-blog-posts-make-you-a-better-colleague</guid><category><![CDATA[writing]]></category><category><![CDATA[Self Improvement ]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Sun, 21 Mar 2021 15:28:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1616340858264/UoVEFP0fZ.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You might ask yourself how writing blog posts can help you become a better colleague? Well, writing can help you with several things. First of all, it makes you think more about the topic. Upfront. Before communicating. It also helps you articulate your thoughts more efficiently. It can  help you realize which areas need improvement, without involving any other person. And so on.</p>
<p>There's one thing I want to emphasize. It's not about writing one blog post, it's about creating a habit to write about things you're doing. One blog post alone can't do a miracle. But if you stick to the plan and keep writing every now and then, you'll develop a sense of how to explain things to somebody else. It doesn't have to be public at all, it could be a Google Doc, although I would recommend publishing it. </p>
<p>Writing about things you are learning or dealing with as a developer can help you in many ways. To begin with, it can help you to structure your narrative. How to make sure that things you're talking about are easy to swallow. Even if you're talking about technical parts to non-technical people. </p>
<p>On the other hand, writing on a specific topic can help you address things that you still don't understand. If you can't explain it, chances are you didn't get it at first. And you just got yourself a topic for further exploration. Isn't it nice? To catch this early on and not in a meeting where you are supposed to know it. </p>
<p>As I said, writing blog posts can help you grow in many directions. Communicating your ideas is one of them. By writing a lot you'll learn how to delete a lot. And that's equally important to the writing part. Removing unnecessary words, phrases, verbs, while still keeping the same value in your sentences is a skill. And the good thing is you can practice it. You can get better. </p>
<p>This leads me slowly to the point. Communication is part of our everyday business, in so many shapes. You talk with your team, with a person in charge of the project, with your clients. You write emails and you write descriptions in the tickets. You write comments in the requirements, you write feedback forms and you write reviews on your colleague's pull requests. You are expressing your thoughts.</p>
<p>Can you think of a colleague who spends a lot of time trying to explain their problem? Those people usually unwrap the whole story and start with some unnecessary points that others find irrelevant. We all have limited time and attention span. If you don't deliver your point, you're risking that the other side won't understand you. Which is bad. That's why it's important to practice delivering the message as effectively as you can. </p>
<p>You don't want to be that colleague. We tend to skip listening to such people in meetings. It's exhausting to listen to everything they are saying and to connect the dots. Those dots may have a perfect sense in their heads, but not all of them are relevant to the topic we're talking about  in the meeting. </p>
<p>It doesn't have to be only in verbal communication. Written forms also take time to read. Nobody has time for a wall of text in their email. Ticket descriptions with a bunch of text that doesn't bring  value can also confuse the other side. </p>
<p>So, which colleague you'd like to be more? The one that starts explaining something since the dawn of time or the one that delivers the information in the shortest form possible? I believe it's a skill that can be trained. It's not something you're born with or without. Writing regularly can help you sharpen that tool. You don't have to write a diary. Start a tech blog. At least, we developers have plenty of topics to write on.</p>
]]></content:encoded></item><item><title><![CDATA[How developers can improve communication with a client?]]></title><description><![CDATA[Junior developers will often tell you they are afraid of talking to a customer. They are aware of that and their personal development plan will often include this:

🗯 "I want to improve my communication with clients"

But how can one "improve commun...]]></description><link>https://brunosays.com/communication-with-client</link><guid isPermaLink="true">https://brunosays.com/communication-with-client</guid><category><![CDATA[communication]]></category><category><![CDATA[personal]]></category><category><![CDATA[tips]]></category><category><![CDATA[Experience ]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Sat, 27 Feb 2021 13:23:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1616341002605/by729MkKi.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Junior developers will often tell you they are afraid of talking to a customer. They are aware of that and their personal development plan will often include this:</p>
<blockquote>
<p>🗯 "I want to improve my communication with clients"</p>
</blockquote>
<p>But how can one <strong>"improve communication"</strong>? </p>
<h2 id="going-back-to-the-root-cause">Going back to the root cause</h2>
<p>We need to dissect the problem here. Why? Well, it's a bit generic question that often comes with a generic, 0 energy wasted, answer. Majority of those answers could be categorized as "it will come with an experience". Well, the experience is one thing, but it doesn't answer the question. More experience doesn't always mean more improvement.</p>
<p>In this case it doesn't address the root cause for that stage fright you get when you have to talk about latest features in front of the client. You have to identify what's causing this stage fright and work on it. And, the sooner you tackle it, the sooner you'll "improve communication".</p>
<h2 id="facing-the-facts">Facing the facts</h2>
<p>I'll help you figuring out, and it won't be pleasant to hear. We have fears of communicating with clients because they might find out we're not competent! Full stop. That's it.</p>
<p>Our whole meeting would pass in a fear that somebody might ask a question we don't know how to answer. In that moment you're not focused on communication with the client. </p>
<ul>
<li>You're focused on your ego. </li>
<li>You're focused on your position in the company. 
-You are asking yourself are you representing your company well enough etc.</li>
</ul>
<p>You're focusing on all other things instead of one that you were brought for. For example, to explain some freshly developed feature. The sooner we face this, the sooner we can make progress.</p>
<blockquote>
<p>So, working on "improving communications" has nothing to do with improving communication. </p>
</blockquote>
<p>It has a lot to do with improving your other skills that you're lacking. And this is where you can take action. Because they are identifyable. </p>
<h2 id="once-you-address-it-you-can-start-working-on-it">Once you address it, you can start working on it</h2>
<p>You can identify, for example, </p>
<ul>
<li>that you don't know workflows in your project, </li>
<li>or maybe you don't know how something is configurable or </li>
<li>how something is supposed to work.</li>
</ul>
<p>Take these things and work on them. You'll see how few things can make you comfortable next time when you need to talk to the client.</p>
<p>Hopefully, after realizing this, your personal development plan will have some actionable points that you can actually use to make progress.</p>
<p>For example</p>
<p>❌ "I want to improve my communication with clients"</p>
<p>✅ I want to be familiar with the project I'm working on
✅ I want to know processes within the project
✅ I want to know the business use case of this project better etc.</p>
<h2 id="epilogue">Epilogue</h2>
<p>Of course, this will all come with time, and after a year or two you'll see a drastic changes in a way you communicate with a client. But if you don't take actions to fix the root cause, you can be years in industry and still making the same mistakes, without any progress. </p>
]]></content:encoded></item><item><title><![CDATA[2020 was not that bad for me]]></title><description><![CDATA[2020 was not that bad for me. This is one of those "years in recap" posts. 
Let's rewind and go back to Oct 2019. This is how the story starts... It's also a post for those who want to get to know me better.
(very long wall of text ahead, be warned)
...]]></description><link>https://brunosays.com/2020</link><guid isPermaLink="true">https://brunosays.com/2020</guid><category><![CDATA[personal]]></category><category><![CDATA[Experience ]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Wed, 09 Dec 2020 22:36:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1607553711612/ulIKMkKQh.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>2020 was not that bad for me. This is one of those "years in recap" posts. </p>
<p>Let's rewind and go back to Oct 2019. This is how the story starts... It's also a post for those who want to get to know me better.
(very long wall of text ahead, be warned)</p>
<p>Feel free to bookmark it 😅 😂</p>
<p>My colleagues and I were attending the "How To Web" conference, late October 2019. Perfect conference for growth, entrepreneurs, and innovations. Little did I know that the year 2020 will go in that direction for me.</p>
<p>At that time, I was attending as a software developer. Nothing else.</p>
<p>But, let's go even before that. Bear with me, this is all to set up the scene for the 2020 story.</p>
<p>In 2019, the company I work for established internal innovation platform where you can submit your crazy ideas and win a budget and resources if you get picked.</p>
<p>Back to the Bucharest and Oct 2019. Middle of the busy conference day. My innovation mentor is sending me a message. He wants to have a call. </p>
<p>"I have some important news for you"</p>
<p>I was expecting the results of the internal innovation competition, but somehow I totally forgot about it, since we were traveling, visiting conferences and everything. </p>
<p>Then it hit me -&gt; Did I just won the budget for my idea???</p>
<p>It turned out it was true. The journey started with the official training in Jan 2020 and afterward, I'm in charge of making that idea into the product.</p>
<p>Me. A developer. Regular guy. No experience. Boom.</p>
<p>Jan 2020 I attended the innovation training in Germany, at our company codecentric HQ town Solingen. 5 days of intensive workshops. Still, no idea about the world I'm going in.</p>
<p>Feb-Mar 2020 First users of the app, first tests. First assumptions. Heck, first conflicts in the team. Less development, more product managing. Phone calls. Yeah, I'm not really a phone guy. But for this product, I started calling people.</p>
<p>Then COVID-19 happened. My whole product was based on events and now more and more countries are banning social gatherings. </p>
<p>A lot of tough periods. Thinking about how to grow product in such conditions. Finding out new use cases and probably even pivoting?</p>
<p>I was working from home. Daycare stopped with their services so my 2yr old daughter was "working together with me". The wife was going to her job. </p>
<p>A lot of mental balancing in that period. You know how they say "flexible working hours". Well, it was. </p>
<p>At some point, I've started putting my laptop into the backpack at the end of the day, to increase the friction so I don't end up doing "just this tiny little thing"</p>
<p>In that period I've joined the #indiehackers community and I met a lot of wonderful people there. My mindset was slowly changing. My questions were different. My actions too. I've seen things people were building, and the journeys they're taking.</p>
<p>May 2020 is the period when I focused on my Twitter growth. I have an account since 2012, but only this year I changed the way I'm using it. Switch from consuming values to producing values mindset.</p>
<p>My goal for the end of the year is to grow my Twitter account to 1000 followers</p>
<p>Jun 2020 I made my first $$ on Gumroad by selling a course. Text version of the workshop material I held in the company. Wanted to feel how it looks like to sell info products online. Although I didn't achieve big numbers, the feeling was great. Someone is buying things from me.</p>
<p>I started a personal newsletter, so people can follow what I'm doing, in some structured way. It was crazy to see that ~50 people want to hear my updates. </p>
<p>May - Jun was also a period when I put my product into hibernate mode. Maybe some other times will be better. It was a hard thing to decide but it's very important to know when to stop doing something.</p>
<p>I learn from my processes. From the good parts, from the bad parts. Everything. Even the failure of that product brought me so much experience and connections. So many appointments were made on IH with people interested to help with my stuff. Wonderful</p>
<p>Jul - I had a shower thought. "Let's do a podcast. A video podcast where people will see all those indie hackers and hear their voice. They are not their avatars and profile pictures on LinkedIn and Twitter, they are humans.</p>
<p>I often have this "Why not" approach. That's how I managed to get Arvid Kahl as a guest on my first podcast episode of Bruno Talks With... I simply sent a DM to Arvid and he said yes, let's do it.</p>
<p>Jul was also a month where I had an emotional breakdown. Not happy times. Not because of these things making too much stress. It was something else. And these mini-projects helped me a bit to escape that</p>
<p>Aug - Sep I've been recording and airing episodes of Bruno Talks With. 8 in total. I met cool people and when we recorded it was often like we know each other for a long time. Then I made a break. I needed something different.</p>
<p>In Oct I had a timeboxed challenge to create an info product in 2 weeks and to make $500 in two months. It was the first time people pre-ordered things from me and giving me their money in advance. Awesome feeling.</p>
<p>I was still having a regular job. Thank god. Making money online is really hard. Full respect to everyone who is making it. These were my tiny little playground projects where I covered different areas in my life that I lack skill or confidence</p>
<p>I was constantly kicking myself out of my comfort zone!</p>
<p>Nov 2020 - Based on the video podcast and the style of the conversation I had with my guests, I got a chance to host a virtual remote event. Hashnode bootcamp on writing technical blogposts</p>
<p>The same environment, this time it goes live. YT and recording is one thing, this is another.</p>
<p>The goal of 1000 Twitter followers was reached in November</p>
<p>Dec 2020 I'm starting my tw500 newsletter that will help small-sized Twitter accounts to focus their energy and get their voice heard. A few days later, I have like ~60 ppl subscribed and the open rate keeps above 90%. Great</p>
<p>Also, in December I got <strong>promoted</strong>. I won't be working as a developer in a team on a project, instead, I'll lead several of those teams and several other projects. </p>
<p>A big step in my career. Still under impressions.</p>
<p>So, all in all, this year was not so bad. Sure, I miss gatherings, people, and interactions on a level we had in B.C. See what I did there. I'm still on a dad jokes level. </p>
<p>Luckily, I haven't lost anyone due to COVID, and that's one of the main reasons why I said "not the bad year" in the beginning.</p>
<p>All in all, it was quite a nice journey for me. All the transformation and changes in the mindset. Definitely can't say for any year that had so much impact on me.</p>
<p>For those who made it to the end of this thread, hats off. Ping me, I want to know who you are. Really. Obviously, you wanted to know who am I.</p>
<p>And, I see a lot of people here living times of their lives despite the year being this shitty and awful. I guess it's just how it goes with life. And I'm happy for all of them. All of those success stories in tough times. </p>
]]></content:encoded></item><item><title><![CDATA[New Twitter accounts often tweet in void. Let me help you change that]]></title><description><![CDATA[Problem you face when you have small Twitter audience is that your tweets end up in void. Very few people actually see them. And, like with everything, beginnings are hard. 
There are real gems out there in the small-sized Twitter accounts. I simply ...]]></description><link>https://brunosays.com/tw500</link><guid isPermaLink="true">https://brunosays.com/tw500</guid><category><![CDATA[Twitter]]></category><category><![CDATA[#growth]]></category><category><![CDATA[course]]></category><category><![CDATA[newsletter]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Sun, 06 Dec 2020 14:27:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1607264195369/xmkwP6fuR.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Problem you face when you have small Twitter audience is that your tweets end up in void. Very few people actually see them. And, like with everything, beginnings are hard. </p>
<p>There are real gems out there in the small-sized Twitter accounts. I simply know this. But it's heard to hear their voices. Or to read their tweets in this context. </p>
<p>And is mostly because of approach many takes, which might be wrong.</p>
<h2 id="changing-the-mindset">Changing the mindset</h2>
<p>Without goals we are just wandering around. Like with everything in our lives, that's how it goes on Twitter too. Whatever we do, there should be a purpose behind it. And that purpose can help us manage our expectations.</p>
<p>What is your purpose on Twitter? What do you want to become? What would your ideal profile and ideal audience look like? What do you want to achieve with Twitter? </p>
<p>If you take a look at popular Twitter accounts, they are known for one thing. Ok, not strictly one, but few of them that are related to each other.</p>
<p>I don't know any popular Twitter account that is producing content related to digital photography, politics, stock trades, soccer, and botanics, all in one. That simply doesn't work. We need to focus</p>
<h2 id="how-things-work-on-twitter">How things work on Twitter</h2>
<p>A bit catchy subheading, but I want to point out few things that are simply the facts. If you have 15 followers, and you tweet directly, your tweet will be shown to some of your followers. Not everyone is online in that specific moment, plus we have TW algorithms. Your followers may like your tweet and this will give it a bit more impulse (since it may appear in the timeline of people who follow your follower). And that's it. Your tweet is gone. Drown in the sea. </p>
<p>If you keep repeating this, you'll get similar results. Unless you're betting on some viral tweet, which won't come easily. But the point is, not many new people will see your tweets.</p>
<blockquote>
<p>Insanity is doing the same thing over and over again and expecting different results.</p>
<p>— Albert Einstein</p>
</blockquote>
<p>What you need to focus on, in the early Twitter days, is the replies. But it comes with the previous section. Where you want to push your Twitter account, in which direction? Identify that and identify who are the key players in that area. Then hit reply to their tweets. Bring value. And repeat that thing. This way your words (of wisdom) will appear in front of new people every time. And when you get higher amount of eyeballs from new people, you get higher chance to get followed.</p>
<h2 id="tw500-can-help-you-grow-your-small-sized-account">tw500 can help you grow your small-sized account</h2>
<p>My recent tw500 newsletter course is focusing on accounts that have small audience and helps them grow to 500. After that you'll have good foundation.</p>
<p>This is not overnight twitter hack or something similar, it will require your commitment too. Issues are coming weekly, with tasks that you can start doing. You'll have plenty of time to think and act. </p>
<p>Check it out here for more details. </p>
<p>https://www.subscribepage.com/tw500</p>
<p>In case you're already hooked, you can use the form below. </p>
<div class="hn-embed-widget" id="tw500-sub"></div>]]></content:encoded></item><item><title><![CDATA[Automate SonarQube analysis with Bitbucket Pipelines and Maven]]></title><description><![CDATA[Intro
In this article we'll see how to set up automated SonarQube analysis, that will be executed every time we push to the remote. For the simplicity of the article, let's say we have a pipeline job with two steps, build and analyze. 
If you followe...]]></description><link>https://brunosays.com/automate-sonarqube-analysis-with-bitbucket-pipelines-and-maven</link><guid isPermaLink="true">https://brunosays.com/automate-sonarqube-analysis-with-bitbucket-pipelines-and-maven</guid><category><![CDATA[Bitbucket]]></category><category><![CDATA[ci-cd]]></category><category><![CDATA[maven]]></category><category><![CDATA[Java]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Wed, 25 Nov 2020 21:04:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1606301645878/F70Xjb5Zy.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="intro">Intro</h2>
<p>In this article we'll see how to set up automated SonarQube analysis, that will be executed every time we push to the remote. For the simplicity of the article, let's say we have a pipeline job with two steps, <code>build</code> and <code>analyze</code>. </p>
<p>If you followed previous two blog posts (links at the bottom) in this series, you'll see we are working with maven project, so the pipeline here will be to:</p>
<ul>
<li>build project with <code>clean install</code> and</li>
<li>analyze code so that we don't end up with bugs or security vulnerabilities on the master branch. </li>
</ul>
<p>We will make sure to apply some caching, but also to save some time by passing artifacts from one pipeline step to another. </p>
<h2 id="why-do-we-need-code-analysis-automation">Why do we need code analysis automation?</h2>
<p>We can do analysis manually on our machines. But it's better to set it up automatically. There are several reasons and I'll name only a few. The first one is -&gt; Machine won't forget to do it. And if we agree on some level of quality, it will prevent us submitting bad code to the production.</p>
<p>Of course, it will free our machine from doing it, and in the end, we can centralize the output reports so everyone in the team can have easy access.</p>
<h2 id="bitbucket-pipeline-setup">Bitbucket pipeline setup</h2>
<p>As stated above, we will be using a pipeline with two steps, <code>build</code> and <code>analyze</code>. </p>
<h3 id="build-step">Build step</h3>
<pre><code><span class="hljs-attr">definitions:</span>
  <span class="hljs-attr">steps:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">step:</span> <span class="hljs-meta">&amp;build</span>
        <span class="hljs-attr">name:</span> <span class="hljs-string">Maven</span> <span class="hljs-string">Build</span>
        <span class="hljs-attr">caches:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-string">maven</span>
        <span class="hljs-attr">script:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-string">mvn</span> <span class="hljs-string">clean</span> <span class="hljs-string">install</span>
        <span class="hljs-attr">artifacts:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-string">target/site/**</span>
          <span class="hljs-bullet">-</span> <span class="hljs-string">target/classes/**</span>
</code></pre><p>Few things to mention here</p>
<ul>
<li>With <code>&amp;build</code>, we can name a step and reference it on several places in your yml file. Build step is nice example, since it usually appears in both staging and production pipelines. Please note, this is under <code>definitions-&gt;steps</code>. This is where it's possible to define a step, give it a name and reuse it later. We'll see the pipeline part at the bottom of the article</li>
<li><code>artifacts -&gt; target/site/**</code> Artifacts can be stored and reused in another steps within the same pipeline. We put everything below <code>target/site</code> for one reason: this is the location of our line coverage report that Sonar will use in the next step.</li>
<li><code>target/classes/**</code> Sonar will use this directory to execute analysis based on the classes we have here. They will be created after our <code>mvn clean install</code>. Consider this and previous artifact as something that we will reuse in the next step.</li>
</ul>
<h3 id="analyze-step">Analyze step</h3>
<pre><code>  <span class="hljs-bullet">-</span> <span class="hljs-attr">step:</span> <span class="hljs-meta">&amp;sonar</span>
        <span class="hljs-attr">name:</span> <span class="hljs-string">Analyze</span> <span class="hljs-string">code</span> <span class="hljs-string">with</span> <span class="hljs-string">Sonarqube</span>
        <span class="hljs-attr">caches:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-string">maven</span>
        <span class="hljs-attr">script:</span>
          <span class="hljs-bullet">-</span> <span class="hljs-string">mvn</span> <span class="hljs-string">sonar:sonar</span> <span class="hljs-string">-Dsonar.host.url=$SONAR_HOST_URL</span> <span class="hljs-string">-Dsonar.login=$SONAR_API_TOKEN</span>
</code></pre><ul>
<li>We're using here <code>caches -&gt; maven</code>, Bitbucket implementation to speed up consequent maven builds. Same like in the previous step. </li>
<li>Second thing we're using here are Bitbucket repository variables, so you can save your token (encrypted) on a repository level, and use it in the pipeline. In our case it's <code>$SONAR_HOST_URL</code> and <code>$SONAR_API_TOKEN</code></li>
</ul>
<p>I want to show here something from a pipeline log that might not be obvious from this step alone.</p>
<pre><code><span class="hljs-attribute">Artifact</span> <span class="hljs-string">"target/site/**"</span>: Downloading
<span class="hljs-attribute">Artifact</span> <span class="hljs-string">"target/site/**"</span>: Downloaded <span class="hljs-number">132</span>.<span class="hljs-number">9</span> KiB in <span class="hljs-number">0</span> seconds
<span class="hljs-attribute">Artifact</span> <span class="hljs-string">"target/site/**"</span>: Extracting
<span class="hljs-attribute">Artifact</span> <span class="hljs-string">"target/site/**"</span>: Extracted in <span class="hljs-number">0</span> seconds
<span class="hljs-attribute">Artifact</span> <span class="hljs-string">"target/classes/**"</span>: Downloading
<span class="hljs-attribute">Artifact</span> <span class="hljs-string">"target/classes/**"</span>: Downloaded <span class="hljs-number">9</span>.<span class="hljs-number">4</span> KiB in <span class="hljs-number">0</span> seconds
<span class="hljs-attribute">Artifact</span> <span class="hljs-string">"target/classes/**"</span>: Extracting
<span class="hljs-attribute">Artifact</span> <span class="hljs-string">"target/classes/**"</span>: Extracted in <span class="hljs-number">0</span> seconds
<span class="hljs-attribute">Cache</span> <span class="hljs-string">"maven"</span>: Downloading
<span class="hljs-attribute">Cache</span> <span class="hljs-string">"maven"</span>: Downloaded <span class="hljs-number">207</span>.<span class="hljs-number">8</span> MiB in <span class="hljs-number">3</span> seconds
<span class="hljs-attribute">Cache</span> <span class="hljs-string">"maven"</span>: Extracting
<span class="hljs-attribute">Cache</span> <span class="hljs-string">"maven"</span>: Extracted in <span class="hljs-number">1</span> seconds
</code></pre><p>Artifact and cache are downloaded during the step setup phase at the very beginning. What does this mean for our <code>mvn sonar:sonar</code>? Well, we don't have to run <code>mvn install</code> or <code>mvn test</code> one more time for our sonar step. We already have files that are generated in the first step, and we saved ourselves some time on the Bitbucket pipeline execution.</p>
<h3 id="additional-sonar-setting-in-pomxml">Additional sonar setting in pom.xml</h3>
<pre><code><span class="hljs-tag">&lt;<span class="hljs-name">properties</span>&gt;</span>
  ...
  <span class="hljs-tag">&lt;<span class="hljs-name">sonar.projectKey</span>&gt;</span>hashnode-blog-showcase<span class="hljs-tag">&lt;/<span class="hljs-name">sonar.projectKey</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">sonar.java.binaries</span>&gt;</span>target/classes<span class="hljs-tag">&lt;/<span class="hljs-name">sonar.java.binaries</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">properties</span>&gt;</span>
</code></pre><p>We can define sonar properties in the <code>pom.xml</code> file. Here we provided project key which is optional. In case it's missing, maven will use <code>groupId</code> or <code>artifactId</code>.</p>
<p>But the other one is important, <code>sonar.java.binaries</code>. Remember we didn't have <code>maven install</code> in our second step. This property will tell Sonar where to look for Java binaries to execute analysis against. Without this, your Sonar step will fail. It will complain it don't know what to analyze.</p>
<p>So, this works together with the artifact from the step one, <code>target/classes</code>. </p>
<h2 id="conclusion">Conclusion</h2>
<p>Setting SonarQube to work with Bitbucket is easy, since we already have Maven. Sonar plugin will execute analysis with one line command. However, we need to setup things like where the binaries are, and we also set up few things that will reduce the amount of time the pipeline is running. Communication to the Sonar server is configured via Bitbucket repository variables. </p>
<p>This configuration will execute sonar analysis on every push to remote branch, which can then give you incremental reports on your code. I won't go into too much details about setting up the Bitbucket Pipeline, as it can be the topic for itself.</p>
<p>Also, the pipeline part of the yml file, as promised above:</p>
<pre><code><span class="hljs-attr">pipelines:</span>
  <span class="hljs-attr">default:</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">step:</span> <span class="hljs-meta">*build</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">step:</span> <span class="hljs-meta">*sonar</span>
</code></pre><p>We can see how it's clear and simple, as we only need to reference the steps.</p>
<hr />
<p>Alright, thanks for reading!</p>
<p><a target="_blank" href="https://twitter.com/brunoraljic">@brunoraljic</a></p>
]]></content:encoded></item><item><title><![CDATA[Setup code coverage overview in SonarQube with JaCoCo]]></title><description><![CDATA[In the previous article of this series, I've described how to setup a SonarQube to begin with the static code analysis for your project. It was enough for the start, but it was missing something. It was missing code coverage reports and stats. Of cou...]]></description><link>https://brunosays.com/setup-code-coverage-overview-in-sonarqube-with-jacoco</link><guid isPermaLink="true">https://brunosays.com/setup-code-coverage-overview-in-sonarqube-with-jacoco</guid><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Wed, 18 Nov 2020 20:06:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1605729988504/_C0hpLsUo.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the <a target="_blank" href="https://brunosays.com/getting-started-with-sonarqube-java-maven-and-docker">previous article of this series</a>, I've described how to setup a SonarQube to begin with the static code analysis for your project. It was enough for the start, but it was missing something. It was missing code coverage reports and stats. Of course, I'm talking when you are starting a new maven project like it was in my case. </p>
<p>Sonar will recognize tests, but it won't show them without proper report files. It will detect that you have test but it will be blind about test coverage</p>
<blockquote>
<p>"I do have 3 unit tests, and SonarQube detects them, which is nice. However, I remember there has to be some SonarQube plugins activated (or configured) so it can detect line coverage. As you can see it's 0.0% at the moment, which I know it's not correct."</p>
<p> from previous blogpost</p>
</blockquote>
<h2 id="jacoco-to-the-rescue">JaCoCo to the rescue</h2>
<p>SonarQube works with JaCoCo reports. It searches for the <code>jacocoTestReport.xml</code> file. You don't have to do anything regarding that, it will search at the default location.</p>
<pre><code>[<span class="hljs-keyword">INFO</span>] <span class="hljs-string">'sonar.coverage.jacoco.xmlReportPaths'</span> <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> defined. 
<span class="hljs-keyword">Using</span> <span class="hljs-keyword">default</span> locations: target/site/jacoco/jacoco.xml,target/site/jacoco-it/jacoco.xml,build/reports/jacoco/test/jacocoTestReport.xml
</code></pre><p><em>In case that you do need to use different jacoco report file, you can set it up on the SonarQube project.</em>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605709698206/1YZRyyHYm.png" alt="image.png" /></p>
<p>So, the next step is to add JaCoCo plugin to our pom file. But, there's a "catch". SonarQube need to report files to read the data from, but <code>mvn install</code> won't create it. You could spin up dedicated JaCoCo <code>mvn</code> command to create coverage report but that's boring and you don't want to do that every time. Instead, you can attach the <code>report</code> goal of the JaCoCo plugin to the maven <code>test</code> phase. Next time when you execute <code>mvn install</code>, which will also do a <code>test</code> phase, this plugin will be triggered and you'll get your reports generated. The plugin in pom file looks like this.</p>
<pre><code>    <span class="hljs-tag">&lt;<span class="hljs-name">plugins</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">plugin</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.jacoco<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jacoco-maven-plugin<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>0.8.6<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">executions</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">execution</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">goals</span>&gt;</span>
                            <span class="hljs-tag">&lt;<span class="hljs-name">goal</span>&gt;</span>prepare-agent<span class="hljs-tag">&lt;/<span class="hljs-name">goal</span>&gt;</span>
                        <span class="hljs-tag">&lt;/<span class="hljs-name">goals</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">execution</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">execution</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">id</span>&gt;</span>report<span class="hljs-tag">&lt;/<span class="hljs-name">id</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">phase</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">phase</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">goals</span>&gt;</span>
                            <span class="hljs-tag">&lt;<span class="hljs-name">goal</span>&gt;</span>report<span class="hljs-tag">&lt;/<span class="hljs-name">goal</span>&gt;</span>
                        <span class="hljs-tag">&lt;/<span class="hljs-name">goals</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">execution</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">executions</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">plugin</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">plugins</span>&gt;</span>
</code></pre><p>To confirm that you have coverage reports generated, run <code>mvn install</code> and check out your <code>target</code> directory. You should have <code>target/sites/jacoco/*</code> there. </p>
<h2 id="its-available-as-html-too">It's available as HTML too</h2>
<p>Before we check how it looks like in the SonarQube, let me tell you this data is already available as HTML. Check out <code>target/sites/jacoco/index.html</code>. Open it in your browser and you should have something like this.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605710815945/nRzAeyed1.png" alt="image.png" /></p>
<p>Actually, this is part of the table, in the first column you even have names of java packages and even classes if you go deeper. Check it out. You can even go so deep that you actually open a method in a class and see the coverage. </p>
<p>But, I won't be focusing on HTML view, let's move to the SonarQube, since there you will have historical data, after every scan, so you can track if your total coverage is rising, falling etc.</p>
<h2 id="sonarqube-coverage-overview">SonarQube coverage overview</h2>
<p>First thing we noticed now is that quality gate marked our project as <code>FAILED</code>. By default, you need to have 80% covered code. Our example have slightly above 12%. Pay attention that this refers to the <strong>new code</strong> you submitted for the scan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605711256651/_yshxjq0a.png" alt="image.png" /></p>
<blockquote>
<p>A Quality Gate is a set of measure-based Boolean conditions. It helps you know immediately whether your project is production-ready. If your current status is not Passed, you'll see which measures caused the problem and the values required to pass.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605728419946/aKoS_wpsl.png" alt="Screenshot 2020-11-18 at 20.38.50.png" /></p>
<p>The HTML table we saw before is available in SonarQube as well. What we have here is the so called historical data. What you see above is the report <strong>from the last time</strong> we performed the scan. So it gives us the overview which new classes we pushed (if you're running the analysis in some CI/CD environment) that don't have test coverage. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605728846740/oRLgjDpnX.png" alt="image.png" /></p>
<p>There is this visual indication that lines of code are missing test coverage. This can come in handy especially if you have some <code>if</code> statement. These tools can visually indicate if you forgot to test some of the conditions. </p>
<h2 id="new-vs-overall-code-report">New vs Overall code report</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605728993488/q-g4Gkzo-.png" alt="image.png" /></p>
<p>This is a percentage of new code that is submitted for the analysis. 12.71% and no test submitted. Guilty as charged. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605729005782/5zqdYBXYI.png" alt="image.png" /></p>
<p>Here's the overall code coverage. 31.2% and 4 unit tests. Not great, not terrible. What I want to point here is that only the <strong>new code percentage</strong> will be checked against this 80% quality gate.</p>
<p>This means whatever new you commit, you should cover it with more than 80%. It won't keep punishing you (make your project FAILED) if your overall coverage is below 80%. Only the new code. But, with new code coverage, you'll raise overall one eventually.</p>
<h2 id="summary">Summary</h2>
<p>To enable code coverage and make it visible in SonarQube, you need to setup a maven plugin JaCoCo. You also need to attach it to <code>mvn test</code> phase. Quality gate is checking if your freshly scanned code meeds the quality standards.</p>
<p>Now, this is line coverage, I have some thoughts on whether a line coverage is good indicator or not, but that's a topic for another blogpost.</p>
<p><a target="_blank" href="https://twitter.com/brunoraljic">@brunoraljic</a></p>
]]></content:encoded></item><item><title><![CDATA[Meet Bruno, your Hashnode Bootcamp host]]></title><description><![CDATA[Hey there, everyone. Bruno here. You may have seen me around if you are participating in the second Hashnode Bootcamp. I've hosted first three sessions so far and will be the host for the the remaining five.
But, you may ask Who is this guy, where di...]]></description><link>https://brunosays.com/meet-bruno-your-hashnode-bootcamp-host</link><guid isPermaLink="true">https://brunosays.com/meet-bruno-your-hashnode-bootcamp-host</guid><category><![CDATA[introduction]]></category><category><![CDATA[HashnodeCommunity]]></category><category><![CDATA[bootcampii]]></category><category><![CDATA[hashnodebootcamp2]]></category><category><![CDATA[hashnodebootcamp]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Sun, 15 Nov 2020 15:02:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1605389093913/CzfjO7Cse.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey there, everyone. Bruno here. You may have seen me around if you are participating in the second <a target="_blank" href="https://hashnode.com/bootcamp/batch-2">Hashnode Bootcamp</a>. I've hosted first three sessions so far and will be the host for the the remaining five.</p>
<p>But, you may ask <em>Who is this guy, where did he come from?</em> Some of you may know me <a target="_blank" href="https://twitter.com/brunoraljic">from Twitter @brunoraljic</a>, few of you may watched <a target="_blank" href="https://www.youtube.com/channel/UCMgspYM8ZN0FGtF8Kd7TwLQ">my video podcast Bruno Talks With</a>, but for most of you, I'm somebody new. That's the reason I wrote this blog post. I'll put a bunch of links that can give more context about me. Feel free to check all of them. Let's meet and connect.</p>
<h2 id="a-software-developer">A software developer</h2>
<p>I'm Bruno Raljić, working as a software developer since 2011 at codecentric. Occasional blogger. One of those bloggers who <a target="_blank" href="https://brunosays.com/write-that-junior-dev-blog-post-who-knows-where-it-can-end-up-heres-my-story">write mostly for themselves</a>. Married, 32 years old, father of one. </p>
<p>Worked quite some time with Java. Did some Python, JS. Touched the mobile app waters with React Native. I like to talk about testing, TDD, CI/CD, Clean Code. I'm one of those people who understands that code is written to be read by humans, not executed by machines.</p>
<p>So, I know a thing or two about code, developers, teamwork, escalations, projects, organisation, delivery. </p>
<p>I was part of the Feelgood Management team for quite some time in our company. We have this dedicated team that operates "from the shadows" and takes care about employees so that we can predict and prevent some unwanted situations. That helped me understand a bit motivation behind different types of people.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605393667164/H_tqGjY1g.jpeg" alt="EcuXi9rXoAAKt9e.jpeg" />
<em>This is an old picture, and old certificate of mine. Damn, that's way too far.</em></p>
<h2 id="hashnode-community-member">Hashnode community member</h2>
<p>Of course, I'm part of a Hashnode community, and I like the platform and everything. Moved my blog here, and one of the reasons was that I want to focus only on writing. Wordpress, for example, gave me opportunity to tweak every bit of my blog and that eventually led me to losing too much time on configuration instead of actual writing. I need a change, and I need something fresh, something "opinionated". And I like how Hashnode is "opinionated" about some things. I simply like them. Ever since, I'm advising people to get on the Hashnode train.</p>
<p>Also I became a Hashnode Ambassador because I kept talking about it on Twitter, and also I kept giving feedback and suggestion to the Hashnode team. So I'm quite familiar how Hashnode operates and what it has to offer.</p>
<h2 id="indiehacker-and-wannapreneur">Indiehacker and wannapreneur</h2>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/brunoraljic/status/1211959803884556288">https://twitter.com/brunoraljic/status/1211959803884556288</a></div>
<p>I had a chance to participate in our company's innovation platform where the winners would get a budget and time to work on their own product (while still working for the company). In January 2020 this officially started. And this is where my journey of changing mindset from developer to maker started. </p>
<p>I worked on the product called <a target="_blank" href="https://www.producthunt.com/posts/bee-informed">Bee Informed</a>. During this period I learned a lot. I had to be a developer, sales, marketing,  everything. This whole journey could take several blog posts alone, so I'll try to make it short. TL;DR - Bee Informed project never took off. However, I learned a lot in that period. </p>
<p>Became part of <a target="_blank" href="https://www.indiehackers.com/brunor">IndieHackers community</a>. One of the best communities if you're making things. </p>
<p>I call myself a wannapreneur. I also keep talking about things that follows product making and approaches, at least on a smaller scale. </p>
<blockquote>
<p>A wannapreneur is an aspiring entrepreneur – an entrepreneur-in-waiting or in-training. They have not yet taken the plunge, though they may be dancing all around it. This term is in no way meant to be negative or derogatory.</p>
</blockquote>
<p>If you check my other blogposts, you may find it's more oriented towards that topic instead of general software development.</p>
<h2 id="podcast-bruno-talks-with">Podcast Bruno Talks With</h2>
<p>In Aug 2020 I had the idea to start a video podcast. My first guest was <a target="_blank" href="https://brunosays.com/first-episode-of-bruno-talks-with-is-out">Arvid Kahl</a>. If you're making something, chances are that you know who this guy is. </p>
<p>I put <a target="_blank" href="https://brunosays.com/podcast">more details on Bruno Talks With here</a>. Check it out, I have 8 video episodes with other indie hackers where we talk about their journeys. At the moment I'm having a break, this is considered as Season 1. Will continue with Season 2, along with some changes in format.</p>
<p>Because of this video podcast and a way I talk with my guests, people from Hashnode offered me to host the Hashnode Bootcamp for technical writing. It's all there, I'm a developer, I know Hashnode, I did something similar with <strong>Bruno Talks With</strong>.  So I said yes, let's try it. Even the video podcast was kicking myself out of the comfort zone, now this is one step further. It's my first time doing things like this. So far I like</p>
<h2 id="info-product-maker">Info product maker</h2>
<p>In May 2020 I wanted to check something else. I wanted to try selling info products on Gumroad. I had some material already prepared for the internal workshop I was organising on Docker so I adapted it a little bit and now I can say I've earned some cache this way too. Feels nice. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1605450379768/_2UPWdBW3.png" alt="Screenshot 2020-11-15 at 15.23.39.png" /></p>
<p>If you're interested in getting <a target="_blank" href="https://gumroad.com/l/befriend-docker">Befriend Docker</a>, I can offer you a 35% discount. Use the code <code>hashnode-friends</code> at the checkout.</p>
<p>In case you want to start your own journey with Gumroad, I can suggest checking out <a target="_blank" href="https://gumroad.com/l/gdtnI">my another info product</a>.</p>
<h2 id="overview-after-3-sessions">Overview after 3 sessions</h2>
<p>So far we have 3 sessions behind us. I wanted to say I have a tight schedule between my working time and the sessions so I don't have too much time to prepare. No time for rehearsals. Thanks for understanding, sometimes my brains just stops and I feel like an idiot in front of camera. But I don't care too much. </p>
<p>I prepare each session with some guidelines in Google Docs, print them to have it in front of me, and the rest is improvisation. Of course, I need to know a bit about my guests, so I prepare some links that are important to them. Getting in touch is also part of the job. Some of them I know, some of them I don't. </p>
<p>Each session is live. Which is a bit different from Bruno Talks With. Those episodes were recorded and then edited before the upload. Although my idea was to edit as less as possible, I still had a chance to take a look at it before airing. Here's a bit different.</p>
<p>All in all, I got a lot of positive feedback for doing this. So in the end it's not that bad. Definitely it's something new in my life. Who knows what it will bring next.</p>
<h2 id="mini-ama-in-comments">Mini AMA in comments</h2>
<p>In case you have some questions, write them down in the comments, I'll be happy to answer. You can also ping me <a target="_blank" href="https://twitter.com/brunoraljic">on Twitter @brunoraljic</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Getting started with SonarQube (java, maven and docker)]]></title><description><![CDATA[How do we know if the code we write is good enough? Error free? Not vulnerable? Not smelly?
There are some tools that can show you that, and today I'm writing about SonarQube. 
But, since I like the approach with minimum steps required, I'll write ju...]]></description><link>https://brunosays.com/getting-started-with-sonarqube-java-maven-and-docker</link><guid isPermaLink="true">https://brunosays.com/getting-started-with-sonarqube-java-maven-and-docker</guid><category><![CDATA[maven]]></category><category><![CDATA[Java]]></category><category><![CDATA[Docker]]></category><category><![CDATA[#howtos]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Tue, 03 Nov 2020 13:41:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1604411174608/PubajNk3y.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>How do we know if the code we write is good enough? Error free? Not vulnerable? Not smelly?</p>
<p>There are some tools that can show you that, and today I'm writing about <a target="_blank" href="https://www.sonarqube.org/">SonarQube</a>. </p>
<p>But, since I like the approach with minimum steps required, I'll write just as much as I think it's necessary for the beginning. </p>
<p>I'll even set it up with Docker image. In case you're not familiar with it, you may want to check <a target="_blank" href="https://brunosays.com/docker-images-intro-for-beginners">Docker Images - Intro for beginners</a> that I wrote. </p>
<h2 id="sonarqube-as-a-docker-image">SonarQube as a Docker image</h2>
<p>Let's keep it simple, we'll run a SonarQube container and after we are done playing with that, we can wipe it off from our system like it never existed. No external installations or things like that</p>
<pre><code><span class="hljs-attribute">docker</span> pull sonarqube:<span class="hljs-number">8</span>.<span class="hljs-number">5</span>.<span class="hljs-number">1</span>-community
</code></pre><p>Where did I get this? There's a docker pull command on the <a target="_blank" href="https://www.sonarqube.org/downloads/">SonarQube download</a> page, ready to be copied. Check it out, newer versions may be available.</p>
<p>OK, image is there, now what? Like with every docker image, check the documentation on Docker Hub, <a target="_blank" href="https://hub.docker.com/_/sonarqube">here</a> in our case.</p>
<p>You might want to read everything there but I already did that for you. There will be a link that points to this piece of documentation</p>
<p>Step 1. Find the Community Edition Docker image on Docker Hub <em>(we did this already)</em></p>
<p>Step 2. Start the server by running:</p>
<pre><code>$ docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=<span class="hljs-literal">true</span> -p <span class="hljs-number">9000</span><span class="hljs-symbol">:</span><span class="hljs-number">9000</span> <span class="hljs-symbol">sonarqube:</span><span class="hljs-number">8.5</span>.<span class="hljs-number">1</span>-community
</code></pre><p>For now I don't know what this <code>SONAR_ES_BOOTSTRAP_CHECKS_DISABLE</code> flag is, but it's not important to understand for now. Obviously you have to put it, since it's in bare minimum quick start documentation. And, you always can use a Google to check it on your own. I did a brief check and saw that SonarQube use ElasticSearch underneath and this flag prevents some checks that we don't care about at the moment. We wan't to see SonarQube up and running.</p>
<h2 id="setting-up-sonarqube-project">Setting up SonarQube project</h2>
<p>Log in to http://localhost:9000 with System Administrator credentials (login=admin, password=admin). If you can't open the page immediately, wait a bit, don't panic. If you keep refreshing like I did, you'll see this at some point</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604401149579/v1bLHQ3v6.png" alt="Screenshot 2020-11-03 at 11.56.52.png" /></p>
<p>While logging in, you may notice this warning:</p>
<blockquote>
<p>Embedded database should be used for evaluation purposes only</p>
<p>The embedded database will not scale, it will not support upgrading to newer versions of SonarQube, and there is no support for migrating your data out of it into a different database engine.</p>
</blockquote>
<p>That's totally fine for now. We could set up external DB or map the storage volume, but for the purpose of quick start we'll stick with the embedded DB. Definitely not recommended for production projects.</p>
<p>Click on that <code>Create new project</code> and put some names there</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604401489148/csi7QIvp6.png" alt="Screenshot 2020-11-03 at 12.04.36.png" /></p>
<p>Next step is to generate a project token, which will be used for identification. Bear in mind that SonarQube will have access to your code (and have a copy for analysis purposes), so it's important that you protect it. Again, important in production. This is a quick showcase, so you don't have to worry too much about keeping those tokens, let's just make it work. </p>
<p>Continue setting up the project, select <code>Java</code> and then select <code>Maven</code> as a build tool. This will generate for you the command that you need to execute in your project directory.</p>
<pre><code><span class="hljs-attribute">mvn</span> sonar:sonar \
  -Dsonar.projectKey=hashnode-blog-showcase \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=YOUR-TOKEN-HERE
</code></pre><p>Wait for the <code>BUILD SUCCESS</code> message from Maven and go to http://localhost:9000 again. Even better, you can click on the link in the maven log.</p>
<pre><code><span class="hljs-selector-tag">ANALYSIS</span> <span class="hljs-selector-tag">SUCCESSFUL</span>, <span class="hljs-selector-tag">you</span> <span class="hljs-selector-tag">can</span> <span class="hljs-selector-tag">browse</span> <span class="hljs-selector-tag">http</span>:<span class="hljs-comment">//localhost:9000/dashboard?id=hashnode-blog-showcase</span>
</code></pre><h2 id="project-overview">Project overview</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604402295836/cn4HKYosYM.png" alt="Screenshot 2020-11-03 at 12.16.16.png" /></p>
<p>You should see something like this. So let's just take a brief overview what you can see here:</p>
<ul>
<li><strong>Quality gate status</strong>: Passed. You can set certain rules for quality gate and based on them you'll get a boolean, passed or not. Rule can be for example <em>Test coverage 80%</em></li>
<li><strong>New Code / Overall Code</strong>: In the Overall, you can get all the reports within the project code base. In New Code you can see the diff after running a second analysis of the same branch. So you can see only the analysis of your latest changes. </li>
<li><strong>Main reporting</strong>: Bugs, Vulnerabilities, Security issues, Code smells and technical debts. All with links included so you can dive in. Technical debt is measured by some average assumptions made by SonarQube and it can give you the feeling how much time will you spent on solving these things.</li>
<li><strong>Coverage</strong>: I do have 3 unit tests, and SonarQube detects them, which is nice. However, I remember there has to be some SonarQube plugins activated (or configured) so it can detect line coverage. As you can see it's 0.0% at the moment, which I know it's not correct. </li>
<li><strong>Duplication</strong>: This section can find and show how much duplicated code do you have in terms of line and percentage of your total code base.</li>
</ul>
<h2 id="diving-in-how-can-sonarqube-help-us">Diving in, how can SonarQube help us?</h2>
<p>OK, we see that there is one bug and 11 code smells on this project. How can we proceed? Well, the general rule of thumb is to start with Bugs, Vulnerabilities and Security issues. </p>
<p>What I like about SonarQube is that they report on <strong>what</strong>, <strong>where</strong> and <strong>how</strong> parts. Let's chase that bug. If I click on the link in the Bugs part, it will show me the details.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604406205567/sq5VB-E5O.png" alt="Screenshot 2020-11-03 at 13.21.08.png" /></p>
<p>I can even navigate to the code and it will show me exactly where it is.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604406250745/3l6TZWxnv.png" alt="Screenshot 2020-11-03 at 13.21.35.png" /></p>
<p>What I also like, is that SonarQube is giving you Severity overview, and you can see it's <code>Major</code> severity. There are two levels above <code>Critical</code> and <code>Blocker</code>. Pay attention to these.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604406361053/yS7MektOA.png" alt="Screenshot 2020-11-03 at 13.24.44.png" /></p>
<p>The next cool thing I like about it is that you have all the description why you should change something. You probably saw that <code>Why is this an issue?</code> link. <strong>You'll often learn a thing or two from there</strong>. They also provide both compliant and non-compliant solutions. I'll show it in the next screenshot.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604406618746/-cuu0-7BG.png" alt="Screenshot 2020-11-03 at 13.29.49.png" /></p>
<p>See? A very detailed overview. And you know what to do after reading it. Let's check the other issues we have so you can have a better picture how it looks like.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1604406857882/JgYstBZmM.png" alt="Screenshot 2020-11-03 at 13.32.06.png" /></p>
<p>Your mileage may vary. If you have bigger project, you'll have more diverse issues. But, you get a nice foundation to continue from here.</p>
<h2 id="conclusion">Conclusion</h2>
<p>SonarQube is static code analysis tool. It will check your code against certain rules to see if there are some bugs, security issues, pitfalls etc. </p>
<p>You should use it since it gives you a lot of explanation why and how you can improve your code. Of course, you don't have to obey 100%, but at least consider making changes to your code.</p>
<p>You can set it up really simple with Maven, and especially if you install it as a Docker image. </p>
<p>The scope for this blog post is to show you the basics of SonarQube analysis. I plan to write a bit more on this topic later. </p>
<p><a target="_blank" href="https://twitter.com/brunoraljic">@brunoraljic</a></p>
]]></content:encoded></item><item><title><![CDATA[Nervous about the Product Hunt launch? Do it with a mini side project first!]]></title><description><![CDATA[You’re an indie hacker who would like to launch on Product Hunt for the first time and you’ve heard a lot of stories about the launch. A lot of advice on how to do it properly. A lot of people telling you don’t screw it, you have one chance. This thi...]]></description><link>https://brunosays.com/nervous-about-the-product-hunt-launch-do-it-with-a-mini-side-project-first</link><guid isPermaLink="true">https://brunosays.com/nervous-about-the-product-hunt-launch-do-it-with-a-mini-side-project-first</guid><category><![CDATA[Indie Maker]]></category><category><![CDATA[General Advice]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Tue, 03 Nov 2020 07:30:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1604388775045/ukNxjq8Zo.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You’re an indie hacker who would like to launch on Product Hunt for the first time and you’ve heard a lot of stories about <strong>the</strong> launch. A lot of advice on how to do it properly. A lot of people telling you don’t screw it, you have one chance. This thing is important, that thing is important. And all you do is waiting. Waiting till your launch has perfect pictures, perfect copy, perfect logo. Guess what. It doesn’t really matter.</p>
<h2 id="action-over-advice">Action over advice</h2>
<p>Let me be clear in the beginning. I don’t value generic advice. Things like <em>You need to learn how to tell a story</em>. Really? Or, for example, book recommendations. What works for you doesn’t necessarily work for me. What else we have in this category? You know those moments when you have a group of people and some special guest among them (e.g. some successful businessman) and there’s a rule that one of those smarty-pants would ask a question <em>What advice would you give to yourself at the beginning of the career</em>? Guest would politely answer, but the person who asked that already knows the answer and nodding like all the knowledge is being transferred in those two and a half minutes. I just don’t see value in that. We all have different scenarios.</p>
<p>But what I do like, and prefer, are those actionable pieces of advice. Or just doing something, experiencing it for yourself, seeing it in action. I’ll search the internet for the books I would enjoy reading. Actionable advices are doable. Measurable. You can do it and see if it works for you or not. This post should be actionable advice.</p>
<h2 id="execution-vs-optimization">Execution vs Optimization</h2>
<p>One thing is how people are executing things (e.g. launching on product hunt), and the other thing is how they optimize it. Like how to drive additional traffic.</p>
<p>I’ll give you one example. You often heard that for a successful launch you need to launch at midnight PST. And you’ve heard it so much time that you also know now that you should launch at midnight. But then you fell in a trap. You know it, you strongly believe in it, but you havent executed that even once.</p>
<p>Then, when your launch is about to happen you are not sure what that “launch at midnight” actually means. What it means in technical details. From the execution point of view. Yeah, you did timezone research but what does it mean. Can you start one hour earlier preparing and when the clock is 00:01 to hit publish or you need to start the whole process after the midnight? Those things you won’t find in all of those “how to launch on product hunt” tutorials. Those things you need to do by yourself.</p>
<h2 id="launch-something-irrelevant-on-product-hunt-first-as-i-did">Launch something irrelevant on Product Hunt first – as I did</h2>
<p>You’re preparing the launch for your main project, and you are all into that. Building relations that would help you on the launch day etc. You might think you’ll ruin your “reputation” by launching some funny side project. Let me tell you something. Nobody knows you’re about to launch something else.</p>
<p>Of course, to do that, you need to have a mini product that is doing one thing that might get people using it. No big deal, something that you wouldn’t put too much work in promoting. In my case, it was <a target="_blank" href="https://commit-art.netlify.app/">Commit Art</a></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/brunoraljic/status/1271009290598273024">https://twitter.com/brunoraljic/status/1271009290598273024</a></div>
<h2 id="what-can-you-get">What can you get?</h2>
<p>You’ll get 100% genuine experience. Delivered right to you in person. No blogposts, tutorials, reading material where you will read how it looks like.</p>
<p>Luckily, launch time is here like at 9 AM. I got up in the morning, made myself a tea, and started submitting a product around 8 AM. No pressure. I also took screenshots for each step. Just to have it when I’m about to prepare my next launch. “Big one”. In one moment I was thinking like – maybe some sessions would be invalid, so I need to start over, because I finished up my product description and everything so I’ve just waited. That wasn’t the case.</p>
<p>At the end of the day, I got some followers on twitter, I got around 20-25 upvotes on Product Hunt. Except a few tweets in the morning, I didn’t promote it heavily. <strong>I got Product Hunt followers</strong>. This is important, they will get a notification once I’m launching again. There’s a dashboard where you can track your upvotes and your position. I didn’t know about that. At the end of the day, I got some traffic, ended up in the very bottom list of the products. Of course, it’s nothing surprising. The product itself doesn’t bring too much value.</p>
<h2 id="one-thing-i-would-do-differently">One thing I would do differently</h2>
<p>Only one thing. I would launch this product over the weekend. I’ve launched it on Thursday, and it’s a working day where all the big launches are happening. Maybe it would be a bit different.</p>
<h2 id="the-story-about-the-bouldering-training-for-the-end">The story about the bouldering training for the end</h2>
<p>I’ll tell you a story for the end. Disclaimer, I don’t remember where I’ve heard it so I might not tell it 100%. But you’ll get a message.</p>
<p>There was this bouldering camp where you could pay for professional training. Price was high but you get full professional support. And, since it may be a risky activity, people would pay more to hear from professionals. Security, equipment, tricky situations, everything.</p>
<p>After trainees got their equipment, they were all standing in line, waiting for a trainer to give them an introduction, because many of them never climbed before. Instead of an intro, the trainer just said Start climbing and refused to give any additional inputs.</p>
<p>Many of them were couldn’t believe what they got for the price they’ve paid. They could do the same in some other places for a way less money. Many were commenting they were tricked.</p>
<p>Upon their return to the ground, the trainer lined them up again and then he started talking.</p>
<blockquote>
<p>Many of you are doing for the first time. I could start the training by introduction talk but that would be a waste of time. You wouldn’t recognize what I’m talking about. You wouldn’t pay attention. You wouldn’t listen. I let you experience it first and now we’ll start…</p>
</blockquote>
<p>That's it. If you like what you've read, consider <a target="_blank" href="https://twitter.com/brunoraljic">following me on twitter</a>. </p>
]]></content:encoded></item><item><title><![CDATA[Let them support you! First $15 on Ko-Fi]]></title><description><![CDATA[I’ll share a story how I get my first “coffees” on Ko-Fi, a place where you can get few bucks from people who would like to support you.
Or to use existing tweet:
https://twitter.com/brunoraljic/status/1263785269087608832
It feels nice. I would sugge...]]></description><link>https://brunosays.com/let-them-support-you-first-dollar15-on-ko-fi</link><guid isPermaLink="true">https://brunosays.com/let-them-support-you-first-dollar15-on-ko-fi</guid><category><![CDATA[General Advice]]></category><category><![CDATA[Monetization]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Wed, 28 Oct 2020 21:59:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1603922297928/uZWmT7qsh.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I’ll share a story how I get my first “coffees” on Ko-Fi, a place where you can get few bucks from people who would like to support you.</p>
<p>Or to use existing tweet:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/brunoraljic/status/1263785269087608832">https://twitter.com/brunoraljic/status/1263785269087608832</a></div>
<p>It feels nice. I would suggest everyone to try new things every day. Switch yourself from “nobody will do that” to “let’s try this” mode.</p>
<p>I’ve put the <a target="_blank" href="https://brunosays.com/ko-fi">ko-fi link on my blog</a> without expectations. No big plans. More like to have it ready if someone would like to support what I’m doing. The text below is my attempt to warm up a visitor.</p>
<blockquote>
<p>Imagine we met at a conference and I talked about things from this blog. You found it very useful and offered to buy me a coffee, so we could continue our talk at a booth, waiting for that next session we agreed to go together. I wouldn’t have anything against it. Next time it’s on me!</p>
</blockquote>
<p>It happened that a person I’ve helped recently with something completely unrelated to the blog spotted it here and wanted to “buy me a coffee”. Nice feeling. Although I didn’t expect it to come like that, other way around. I was thinking more like – one day there will be a killer article, and I don’t want to miss a chance to “be supported”. After I’ve shared a <a target="_blank" href="https://twitter.com/brunoraljic/status/1267060458995007490">generic tweet</a> about it, I get one more coffee. The power of Twitter.</p>
<h2 id="why-to-put-ko-fi-button-on-technical-blog-or-even-git-repo">Why to put Ko-Fi button on technical blog or even git repo?</h2>
<p>I'm a developer. And I write code. Sometimes I stuck. I stuck a lot. And I search for the solutions online. Google, StackOverflow, Github, you name it. And I know that I just described you, my dear reader. But don't worry, we're not alone. There are millions of us out there. And you know that feeling when you're stuck for the whole day, and you finally <strong>find a solution that works</strong> at the end of the day? What a relief. </p>
<p>Well, if you happen to write that solution (blogpost, SO answer, comment on github issue) that solved someone's problem, <strong>there is a high chance that somebody would like to thank you</strong>. And sometimes more than writing a simple "Thank you" comment.</p>
<p>The more specific field you cover, the better the chances. And if your solution is saving someone's time (and time is money), there's a chance someone will pay you. Don't expect wonders, we still don't have a habit to give money online to others as a thank you note. </p>
<p>So, think for a moment if you </p>
<ul>
<li>maintain a library</li>
<li>have a technical blog with HOW-TO articles</li>
<li>providing reusable code snippets</li>
<li>share templates</li>
<li>share development productivity "hacks"</li>
</ul>
<p>maybe you can plug the button somewhere. </p>
<h2 id="ko-fi-goals">Ko-Fi Goals</h2>
<p>Kofi platform offers you to create goals. But instead of creating some generic “I want a new computer” goal, I’m having a set of small goals that would help me improve myself. So it’s more like a general goal, split into smaller ones. I’ve started with the books. It felt natural choice. So, each of my Ko-Fi goals would be some book. I would buy it then for Kindle (that’s the price I’m putting on the goal). But this is actually setting up a <a target="_blank" href="https://ko-fi.com/bra">ko-fi page</a>. I don't believe too much into optimizing these pages, because nobody is exploring these platforms to find who to support next. If anyone will give you the money, they will come for another reason. Once they open the page, they will look for the action button. Where do I need to click to pay you. But, it doesn't do harm to set up that page as well.</p>
<h2 id="conclusion">Conclusion</h2>
<p>The moral of the story – Go and set up those kofi, buy me a coffee, paypalme, patreon, whatever buttons next to your blog/profiles. You’re doing things for free anyway. You never know. Maybe there were several times when someone would like to donate you some small tip, but there just wasn’t a way. Provide that way.</p>
<p>But, on the other hand, you need to provide a good content too. Well, I can’t teach you that part. If I could, I would teach myself first.</p>
<p>If you have spare minute or two, <a target="_blank" href="https://brunosays.com/">go to my blog homepage</a> and check what I’m usually writing about. Maybe you’ll find something for yourself.</p>
<hr />
<p>Like my blogposts? Here's my KoFi button.</p>
<div class="hn-embed-widget" id="kofi"></div>]]></content:encoded></item><item><title><![CDATA[Viral app in 3 days and how we exceeded Free Firebase plan]]></title><description><![CDATA[I’ll try to summarise how we build a viral app in 3 days and what seemed like an internal fun here in codecentric Bosnia ended up us having to change a Firebase pricing plan 😉.
jaje.cc [jaje == egg] was launched on Sunday, 19th Apr, when the Orthodo...]]></description><link>https://brunosays.com/viral-app-in-3-days-and-how-we-exceeded-free-firebase-plan</link><guid isPermaLink="true">https://brunosays.com/viral-app-in-3-days-and-how-we-exceeded-free-firebase-plan</guid><category><![CDATA[prototyping]]></category><category><![CDATA[Firebase]]></category><category><![CDATA[social media]]></category><category><![CDATA[Company]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Mon, 19 Oct 2020 19:10:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1603134532721/aZmfZoTF2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I’ll try to summarise how we build a viral app in 3 days and what seemed like an internal fun here in codecentric Bosnia ended up us having to change a Firebase pricing plan 😉.</p>
<p>jaje.cc [jaje == egg] was launched on Sunday, 19th Apr, when the Orthodox Christians were celebrating Easter and we had a lot of fun with it. This is a story about that journey, narrated from the moment idea was shared till being actually used on Easter.</p>
<h2 id="background">Background</h2>
<p>Not sure about the Easter customs in your place but here we have tradition of cracking eggs (<a target="_blank" href="https://www.youtube.com/watch?v=G351IgSZJeA">can’t believe somebody create a video of this but hey, it’s useful this time</a>), and it’s most interesting part for kids, families and friends.</p>
<p>But now, in corona times, <a target="_blank" href="https://balkaninsight.com/2020/04/19/clergy-celebrate-easter-ceremonies-alone-in-pandemic/">we had a total lockdown for the Easter holidays</a> and people were not allowed to leave their homes. Also, a lot of people couldn’t come home from abroad because of closed borders. So we wanted to make something for them. Hey, we’re developers, maybe we can <strong>do something to bring a smile on people’s faces</strong>.</p>
<p>It all started as a shy idea from my colleague <a class="user-mention" href="https://hashnode.com/@Nemanjas">Nemanja Vasić</a>. It resonated very well with few of us and we were like – <strong>LET’S DO IT!!!</strong></p>
<blockquote>
<p>Maybe we could build something like online cracking egg…</p>
<p>— Nemanja Vasic (check out his other cool side project where he <a target="_blank" href="https://covid19-balkan.com/">visualises corona impact on Balkan countries</a>)</p>
</blockquote>
<p>I mean, we had <strong>3 trending factors</strong> for building a viral app</p>
<ul>
<li>Easter time and Easter related app,</li>
<li>Corona time with lockdown and</li>
<li>it’s emotional since people are experiencing this for the first time, not to be able to visit friends and families.</li>
</ul>
<h2 id="we-didnt-have-a-vision-to-build-a-viral-app">We didn't have a vision to build a viral app</h2>
<p><code>We had a vision to give an extra reason for happiness on Sunday, and we didn’t aim for big reach.</code></p>
<p>We were like <em>if only codecentric employees play this on Easter, it will be fun</em>. Even if nothing is launched on <strong>Sunday</strong> – it would be a funny journey to prepare a full product. No matter how that product is small in terms of functionality, we still have to think a lot about all of those things that follows launching a product.</p>
<p>Background goal was also to spread a word about our company, a place where</p>
<ul>
<li>you can get support if you have some idea (even crazy one),</li>
<li>you have people who are capable to do it from the beginning till the end,</li>
<li>and they are capable to do it quickly in 2-3 days,
there is also room for funny times</li>
</ul>
<p>and also to generate some content for community building, because we all have enough <code>#WFH</code> posts with user having cats sitting next to their laptops 😂</p>
<h2 id="timebox">Timebox</h2>
<p>One more thing to mention is that this idea came on 14.4. - <strong>Tuesday</strong>. So we had very little time to think about “game mechanics”, implementation, viral factors, shipping it to the end user etc.</p>
<p>We focused on simplicity, making it shareable, with the simplest technology stack so that everyone can jump in to finish and I will repeat – we really had to keep it simple – since deadline is really fixed. Next year it will probably be the different situation, this one is pretty much unique.</p>
<h2 id="how-do-you-even-start-building-a-viral-app">How do you even start building a viral app?</h2>
<p>Ensar Bavrk bought domain jaje.cc on 15.4. <strong>Wednesday</strong>, setup a Firebase Account by the end of the day we had a proof of concept.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603133485333/ekHTe7VjF.gif" alt="poc-egg.gif" /></p>
<p><code>Idea was that user can create the egg (name and color), get unique url which can be shared, and whoever opens the link has a possibility to crate their own egg and to respond to the challenge, i.e. to crack the egg. Results could be shared again on social medias to attract more users and we would have a leaderboard, like a top 10 eggs on index page, ordered by the number of the wins.</code></p>
<h2 id="thursday">Thursday</h2>
<p>On Thursday I’ve created a user touch points, or user journey, to go through the complete flow when user:</p>
<ul>
<li>hits the index page,</li>
<li>sees the invitation link or</li>
<li>sees the challenge match for other 2 friends etc.</li>
</ul>
<p>We also set a scope of sharing options to include Facebook, Viber, Whatsapp, Twitter.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603133592826/MCYkH4cIG.png" alt="e1-768x689.png" /></p>
<p>We had some other options in the beginning as well (see picture) because they were coming out of the box , but we wanted to keep it simple so we didn’t complicate. Even with these options there were some glitches but the decisions were made on the fly. Ain’t nobody got time to prioritise features. There was really no time to think about possible edge cases and we were constantly deciding is it worth going particular path or not, keeping in mind that we still need to ship the product in time. Of course, it would be nice to open FB native app to share it directly, but if it can’t be done – here’s the link, copy it and share it wherever you like. End of discussion, moving to the another topic.</p>
<h2 id="this-should-be-fun-lets-add-some-dandd">This should be fun, let’s add some D&amp;D</h2>
<p>Tin Mijatovic introduced basic Dungeons and Dragons fight mechanism, we could afford such luxury. Very lightweight, but again – a funny journey. And we did this pretty much after our working hours or some people did it in their 20% time (<em>if you wan’t to know more about codecentric 4+1 model, reach out to me</em>).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603133670839/LdPsmwS17.png" alt="e2-768x768.png" /></p>
<p>Meanwhile, Mihajlo Sobat worked on design and Aleksandar Popadic started to think about facebook ads to promote the page in Bosnia, Serbia and Montenegro. We even set up Facebook page for Tuc-Tuc Challenge and make our link previews include the graphics too.</p>
<p>There was an idea of dynamically altering the text on the share preview but again, no time. We tried it, but for our time box it was just too much.</p>
<h2 id="friday">Friday</h2>
<p>We had first draft of home page done on Friday</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603133733956/HLKZTIJJp.png" alt="Screenshot-2020-04-17-at-20.42.07-1.png" /></p>
<p>From the beginning we had idea of choosing the color for the egg. Nemanja Vasic did that and we soon merged it, so we ended up with simple way to choose a color for the egg</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603133760245/xsjGuZGAx.png" alt="e3-768x740.png" /></p>
<h2 id="saturday">Saturday</h2>
<p>So, one more day left and we were still facing up a lot of unfinished work on many fields. So we spend Saturday mostly on fixing things, deciding what will go live, and what not. What we are not ashamed if we release as it is etc.</p>
<p><code>Of course, there was an easter egg in an easter egg app. You’re probably guessing , we left console log statement. Something like “If you think you could write this better in 72h, send your CV to codecentric bosnia”. Kudos to Tin Mijatovic for this idea</code></p>
<p>Of course, <strong>we found out ways how you could cheat</strong>. And even there was a struggle to prevent that, we draw a line and said – if that will make someone happy, well hey, it’s still aligned with the mission of the product. So we left it as it is. You could cheat to be first on top 10.</p>
<p>So, on <strong>Saturday</strong> evening we were like – ok, this is going live tomorrow. We know that there are x things to fix/improve, but it is what it is. Ensar Bavrk reset the database entries and we were ready to go. A big test was ahead us to check if we managed to build a viral app in 3 days.</p>
<h2 id="easter-sunday">Easter Sunday</h2>
<p>So, the plan was to start the first wave among cc colleagues in the morning, share to our social networks, start the FB campaign and see it in action. I spent the morning with my family, as usual on Easter and then I’ve checked the social medias. </p>
<p>We saw some action already at <strong>09:32</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603133897461/PBQmfc1JJ.png" alt="Screenshot-2020-04-19-at-09.28.21-1-1536x674.png" /></p>
<p>These reads/writes are referring to reading and writing two entities (eggs, and matches). But again, this was at nine o clock in the morning.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603133932010/WNXvD6EUE.png" alt="Screenshot-2020-04-24-at-14.13.01-768x969.png" /></p>
<h2 id="every-game-has-a-cheaters">Every game has a cheaters</h2>
<p>We had one “cheater” as well, Afrojaje who in the end came up as a first, but watching his activity in action, I’ve realised that Ensar also implemented live update for this stream for top 10. You could see live how the numbers are changing and how the top 10 behaves. That was <strong>wow</strong> moment for me. At one moment we had 65 people on the index page (this is statistics for this top 10 stream)</p>
<blockquote>
<p>Some of my previous projects took months to have activity like this. It’s 13:00, let’s hope it will stay under 20k till the end of the day</p>
<p>— Ensar Bavrk</p>
</blockquote>
<p>13:00 We have <strong>28/50k reads and 3.2/20k writes</strong>.</p>
<p><code>Even if we were afraid that some trolls would take over this site, it didn’t happen. Anyway, it was funny to see it in action on the social media, between the friends, even if it’s not perfect product. We managed to deliver happiness on this day. And we were proud of it.</code></p>
<p>Facebook page also get some traction. People were liking something that is meant to be active only one day. </p>
<p>15:20 Ensar is switching <strong>from Free to Paid firebase plan</strong> as we’re reaching 50k reads. We had <strong>51k reads at 17:00</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603134136117/1z6ouAS5K.png" alt="Screenshot-2020-04-19-at-20.23.55-1-1536x873.png" /></p>
<p><strong>23:40</strong> Ensar is giving the recap of today’s activity</p>
<ul>
<li>76k reads</li>
<li>6.6k writes</li>
<li>3.1k eggs created</li>
<li>2.6k eggs with one or more wins</li>
<li>1.6gb of static content downloaded</li>
<li>2.1k unique matches</li>
</ul>
<p>Wow. 🚀 For an app where you share an egg with your friend. We didn’t expect that much activity</p>
<h2 id="if-you-want-how-viral-your-app-is-you-better-include-google-analytics">If you want how viral your app is, you better include Google Analytics</h2>
<p>We didn’t find time to put Google analytics to analyze this, and we are feeling really bad about it. We didn’t expect it to be this way, and google analytics could bring us a lot more data. Anyway, it’s learning for the future experiments.</p>
<h2 id="conclusion">Conclusion</h2>
<p>So, we had a lot of fun, and lot of traffic there! This is the traffic on <strong>Easter, Monday and Tuesday</strong>. So people were still clicking on that site. Facebook page had around 300 likes. We believe that we managed to launch a viral app in those 3 days, at least for the area where we targeted our users.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603134275591/dLOR17GsB.png" alt="Screenshot-2020-04-20-at-19.59.11-1-1536x926.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603134282780/tgjCeX2ow.png" alt="Screenshot-2020-04-22-at-08.11.42-1-1536x902.png" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1603134290368/tLm570iRY.png" alt="Screenshot-2020-04-22-at-21.05.51-1-1536x1063.png" /></p>
<p>People used it. People re-shared their matches. We were part of it, we made it possible. I’m proud to be part of that team. Although I didn’t contribute as others. <strong>If we made 10 people happy that day, our mission is done</strong> ✅ but I believe we did more than that. Happy to be part of this company, cheers.</p>
]]></content:encoded></item><item><title><![CDATA[Gumroad makes it really easy to earn a buck or two!]]></title><description><![CDATA[If you’re on the Internet these days, you might have noticed that everyone is selling something on Gumroad. Let me share my thoughts why is that. It’s not because everyone has something to sell. It’s because selling via Gumroad is so damn easy. PDFs,...]]></description><link>https://brunosays.com/gumroad-makes-it-really-easy-to-earn-a-buck-or-two</link><guid isPermaLink="true">https://brunosays.com/gumroad-makes-it-really-easy-to-earn-a-buck-or-two</guid><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Thu, 01 Oct 2020 14:11:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1601561351013/PyHfbelmm.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you’re on the Internet these days, you might have noticed that everyone is selling something on Gumroad. Let me share my thoughts why is that. It’s not because everyone has something to sell. It’s because selling via Gumroad is so damn easy. PDFs, design templates, videos, you name it.</p>
<p>Think for a moment, do you have any digital asset you’ve created? Would you like to start selling it? If you’re thinking even for a second “Nobody would buy it” I’m gonna give you the look and pretend I didn’t hear anything. Developers can always teach something. You can create a mini PDF course any time.</p>
<p>I’m about to present you possibilities. You can use it right now for that product you have in mind. It would be real shame if you don’t publish it at the end of the reading. Then you’ll have to re-read it. 😅 Jokes aside, I’ll present very few things that you need to setup (decide) before you can have your public page for the product. You won’t have to worry about the technical details at all. Gumroad takes care of that.</p>
<h2 id="first-steps">First steps</h2>
<p>I’m about to offer you my invitation link to Gumroad. I would get one time compensation if you upgrade your account. No hard feelings if you go directly to https://gumroad.com/. </p>
<p>If you are checking Gumroad pricing options between free and paid plans, you are looking too far away.<strong> Let’s make $1 first</strong>. Then we will think about the optimisation later. Yes, comparing fees on different plans is optimisation. And it will take you too much time. Let’s start now with the Free plan. Focus on what’s important. Do you have a PayPal account? I’ve used it as a way for getting payments, but there are other options too. Now, let’s start creating your product</p>
<h2 id="product-type">Product type</h2>
<p>Gumroad is asking you for a name and a price. Don’t worry, you can edit it any time. But, those are expected fields. What I want to show you here is that there are different types of products</p>
<ul>
<li>Classic: start selling today</li>
<li>Pre-order: sell before a release date</li>
<li>Membership: charge on a recurring basis</li>
</ul>
<p>Most of you will be satisfied with the Classic product. Unless you wrote a book and you have a release date in the future.</p>
<h2 id="pricing">Pricing</h2>
<p>I like how flexible you can go with Gumroad pricing. I’ll show you some options, and you can see which one suits you. $1 is a minimum price, unless you’re going to give your product for free. That means no $0.99 prices. From one dollar up.</p>
<h2 id="fixed-price">Fixed price</h2>
<p>You specify exact amount and that’s what you’ll get if someone buys your product. No more, no less.</p>
<h2 id="allow-to-pay-what-they-want">Allow to pay what they want</h2>
<p>Extension to “Fixed price”. Suitable if you’re open for tips. So, you can put your product to be like “$5+”. That will mean the minimum price is $5, but people can pay you $10 if they want.</p>
<h2 id="different-price-for-different-versions">Different price for different versions</h2>
<p>You can set a several pricing levels of your product. Let’s say you have a video course, code examples in pdf and a list of additional resources or references. You could set something like this really easy:</p>
<ul>
<li>Video only for $9</li>
<li>Video plus code examples for $12</li>
<li>Full bundle for $15</li>
</ul>
<h2 id="special-deals-and-promotions">Special deals and promotions</h2>
<p>Gumroad support discount codes and you can achieve different experience. For example:</p>
<ul>
<li>Set price to $0 and send it to your friend</li>
<li>Set discount in percentages (like 50%)</li>
<li>Set discount in amount (like $10 off)</li>
</ul>
<p>You can use generated discount codes (5 chars) or you can set some personalised ones. For example, you can have:</p>
<ul>
<li><code>tw20off</code> for Twitter</li>
<li><code>redd10bucks</code> for Reddit</li>
<li><code>hashnodefriends</code> for Hashnode members</li>
</ul>
<p>What I like about these discount codes is that you can set an amount of time they can be used. After that, the price will go back. I’m using this for my monthly giveaway of 3 copies.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/brunoraljic/status/1289086263740571653">https://twitter.com/brunoraljic/status/1289086263740571653</a></div>
<h2 id="publishing-your-products">Publishing your products</h2>
<p>Gumroad offers cool snippets to include in your website. But, you don’t need a website in order to sell your product. Gumroad offers pretty nice page for your product which you can customise.</p>
<p>So, you don’t have to worry, about setting any payment on your website, or thinking about SSL or whatever. You can also customise payment form in case you want to collect some additional data from your customers</p>
<h2 id="payments">Payments</h2>
<p>Payments are done on Fridays. Meaning they will transfer funds to your PayPal. Bear in mind, PayPal may hold your money for additional amount of time, regarding your account and country. Gumroad will send payments for any sales made in between.</p>
<p>Few things to have in mind when talking about Gumroad payments. First payment may be delayed a bit, because they are verifying your account, and everything connected to it because of, well, reasons.</p>
<p>The second thing about the payment, you need to have at least $10 to actually trigger the payment. That means if you have $9.90 in your Gumroad account, you’ll need to wait till you make next sale.</p>
<p>Gumroad also takes some fees, but don’t worry about that too much. You still need to make that first sale. That’s not easy, trust me.</p>
<h2 id="summary">Summary</h2>
<p>Gumroad helps creators to sell their work by removing any obstacle that can pop in between. You have the product, and you want money for it. Thats all you should care about. Gumroad will take care of everything else.</p>
<p>You don’t need to worry about payment systems, credit card, hosting, availability of product page.</p>
<p>There are a lot of other features Gumroad is offering. I’ve written here just enough to ignite those thoughts in your head.</p>
<p>If you like the blogpost, consider using my invitation link. If you have any additional questions, feel free to <a target="_blank" href="https://twitter.com/brunoraljic">reach me out on Twitter @brunoraljic</a>. Thanks for reading!</p>
<hr />
<p>Now go and earn those buck or two on Gumroad!</p>
]]></content:encoded></item><item><title><![CDATA[How to set up Mailchimp signup form on Hashnode blog?]]></title><description><![CDATA[Intro
Hashnode is young, but evolving, blogging platform, oriented towards DEV community. I saw a lot of people migrating their blog posts to Hashnode recently. I did it too, from self-hosted WordPress. Even if my blog is not 100% DEV oriented. 
Of c...]]></description><link>https://brunosays.com/how-to-set-up-mailchimp-signup-form-on-hashnode-blog</link><guid isPermaLink="true">https://brunosays.com/how-to-set-up-mailchimp-signup-form-on-hashnode-blog</guid><category><![CDATA[Blogging]]></category><category><![CDATA[Hashnode]]></category><category><![CDATA[newsletter]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Sun, 27 Sep 2020 17:44:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1601228789869/LlkaGbc5l.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="intro">Intro</h2>
<p>Hashnode is young, but evolving, blogging platform, oriented towards DEV community. I saw a lot of people migrating their blog posts to Hashnode recently. I did it too, from self-hosted WordPress. Even if my blog is not 100% DEV oriented. </p>
<p>Of course, people refrain from migrating to Hashnode for several reasons, and I'm not here to convince you to anything. However, I would like to name a few reasons, because they would serve as a nice introduction for the article.</p>
<ul>
<li>My blog is not 100% DEV oriented</li>
<li>There aren't enough supported integrations (Mailchimp, Ko-Fi, Gumroad)</li>
</ul>
<p>Many people are "scared away" by the impression that Hashnode is blogging platform <em>only for developers</em>. And, I have to say, if you post a dev-related article, it will be published to fast-growing, Hashnode readers community. However, there's a way to mark your blog post as a <em>non-dev article</em>. That way it won't go to the platform directly, and you won't "disturb" dev readers out there. I hope I cleared some fog there for you</p>
<p>The second thing that keeps people away from Hashnode is the number of supported integrations. But, that's not a problem, since I'll show you on a specific example how you can integrate whatever you want.</p>
<h2 id="mailchimp-and-hashnode">Mailchimp and Hashnode</h2>
<p>If you take a look in Hashnode integrations settings, you won't see Mailchimp in those settings. You may see Google Analytics, Fathom Analytics, FB Pixel and so on, but no Mailchimp. And, this is probably holding you back. </p>
<p>That's totally ok. You have already something that works on your site (newsletter signup form), on the other hand you see that Hashnode doesn't integrate with Mailchimp. Well, you can set it up. Bear with me, I'll explain how. Just did it for my blog. <strong>Hashnode Widgets to the rescue.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1601226052362/cq4xK_5Vb.png" alt="Screenshot 2020-09-27 at 19.00.43.png" /></p>
<p>Go to the <strong>Dashboard</strong> and find <strong>Widgets</strong> tab. Add a new one. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1601226436078/FAseeJXJ6.png" alt="Screenshot 2020-09-27 at 19.02.30.png" /></p>
<p>It's pretty much simple.</p>
<ul>
<li>Provide Mailchimp Embedded Form code</li>
<li>Give a name to your widget, let's say <code>mailchimp</code></li>
<li>reference the widget in your hashnode articles or pages asa <code>%%[mailchimp]</code></li>
</ul>
<p>To get the Mailchimp Form code, go to your Mailchimp Form settings, it should look something like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1601226583328/6KnfVduOI.png" alt="Screenshot 2020-09-27 at 19.06.12.png" /></p>
<h2 id="im-already-using-it">I'm already using it</h2>
<p>This article came up as a result after setting this for my blog. I've tested it, subscribing works just fine. But double check it for yourself, as with everything you find and read on the internet. </p>
<p>One thing, this widget short codes can be used everywhere in your Hashnode blog. In my case, it wasn't even on the article, but rather on the standalone page. </p>
<p>Check it out at 👉 https://brunosays.com/podcast 👈</p>
<p>I wouldn't mind if you check out that whole page. It's about my podcast that I recently started, <strong>Bruno Talks With</strong>. My audience are indie hackers, creators, makers. Some of you fit already, but it's totally ok if you're here with different background and just want to see the integration part.</p>
<hr />
<p>Thanks for reading, hopefully this article will make you start using Mailchimp on the Hashnode blog, or maybe convince you to migrate here completely.</p>
<p>I'm a Hashnode Ambassador, and I'm inviting you to <a target="_blank" href="https://hashnode.com/@brunor/joinme">start your Hashnode powered blog today</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Ep#5 • No CS degree]]></title><description><![CDATA[Ep#5 overview
https://anchor.fm/bruno-talks-with/episodes/Ep5-No-CS-Degree--Pete-Codes-ejpva3
YouTube link at the bottom.
My guest in episode 5 was Pete from "No CS degree", a newsletter where the interesting stories from people without CS degree are...]]></description><link>https://brunosays.com/ep5-no-cs-degree</link><guid isPermaLink="true">https://brunosays.com/ep5-no-cs-degree</guid><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Mon, 21 Sep 2020 17:27:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1600709175271/Wc_C-Y1u1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="ep5-overview">Ep#5 overview</h2>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://anchor.fm/bruno-talks-with/episodes/Ep5-No-CS-Degree--Pete-Codes-ejpva3">https://anchor.fm/bruno-talks-with/episodes/Ep5-No-CS-Degree--Pete-Codes-ejpva3</a></div>
<p>YouTube link at the bottom.</p>
<p>My guest in episode 5 was Pete from "No CS degree", a newsletter where the interesting stories from people without CS degree are collected and shared. He provided some nice examples that proves you don't need to have CS degree. Still, you need to learn. And to learn a lot. We talked also about idea validation, learning to code and self-publishing ebooks.</p>
<p>Pete is also inviting you to share your cool "No CS Degree" story. You can do it via this form. Don't say I sent you 🤫</p>
<p>https://nocsdegree.typeform.com/to/ax5uTV</p>
<p>You can check what Pete is doing here:</p>
<p>https://www.nocsdegree.com/
https://www.petecodes.io/
https://gumroad.com/petecodes
https://twitter.com/petecodes</p>
<h2 id="episode-behind-the-scenes">Episode "behind the scenes"</h2>
<p>The episode was released on Friday. It was a bit busy week on my regular job and it drained a lot of energy. Friday came, and I didn't have ready YouTube preview for the episode nor did I split the episode in those smaller chunks. Damn. First I wanted to postpone it to Saturday, but then I said - who cares, I'll release it this way. Saturday was also packed up, so it wouldn't fit anyway. Heck, this mail is also postponed, I'm sending it on Monday. Maybe I'll also stick to that schedule. </p>
<p>One thing, that week I had stuffy nose, and in the recording I sound worse that I was actually feeling. But anyway, that's the cost of producing the content on a weekly basis. You have to deliver.</p>
<h2 id="podcast-behind-the-scenes">Podcast "behind the scenes"</h2>
<p>Three episodes recorded last week. Whoa, last week I produced 3 episodes. Recorded, not produced, still have to edit it though. Saturday was also very productive, podcast wise, since 2 episodes were recorded in a single day. </p>
<p>But, as I already said, last week was pretty much busy. Both on professional and personal plans. What that meant for me and for the episode? Well, I had very little time to actually prepare the episodes. Luckily, I know my guests so the flow was nice. But to give you more context for those 3 episodes, the script for first one was prepared kind of "on time", second one was prepared 30 minutes before the episode and the third one was scribbled with ball pen 10 minutes before the start. </p>
<h2 id="bruno-talks-with-is-on-patreon">Bruno Talks With is on Patreon</h2>
<p>I dared to create a Patreon account. I would encourage you to check the Patreon Tiers and check if there is something for you, since every Tier has different offers. The good thing is that you can cancel any time. No hard feelings. I would be happy to get some short time supporters. It just needs one to start with the snowball effect. The number of patrons are public so it feels kind of empty when the big zero is shown there. </p>
<p>Interested in what I can offer in return? <a target="_blank" href="https://www.patreon.com/brunotalks">Become the first Patron of Bruno Talks With!</a></p>
<p>And, now that video you waited so long. </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=4U4RbHWcXIE">https://www.youtube.com/watch?v=4U4RbHWcXIE</a></div>
]]></content:encoded></item><item><title><![CDATA[Ep#4 Product managing your side project • Krupali Patel]]></title><description><![CDATA[https://anchor.fm/bruno-talks-with/episodes/Ep4-Product-managing-your-side-projects--Krupali-Patel-ejo25c
What is it like when you switch from corporate to indiehacker world? How is it when you have tech and non-tech founder? Why people avoid buildin...]]></description><link>https://brunosays.com/ep4-product-managing-your-side-project-krupali-patel</link><guid isPermaLink="true">https://brunosays.com/ep4-product-managing-your-side-project-krupali-patel</guid><category><![CDATA[podcasts]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Wed, 16 Sep 2020 19:44:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1600285465948/pp6F79Wzw.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://anchor.fm/bruno-talks-with/episodes/Ep4-Product-managing-your-side-projects--Krupali-Patel-ejo25c">https://anchor.fm/bruno-talks-with/episodes/Ep4-Product-managing-your-side-projects--Krupali-Patel-ejo25c</a></div>
<p>What is it like when you switch from corporate to indiehacker world? How is it when you have tech and non-tech founder? Why people avoid building landing pages as the first step in their product journey? I've discussed this with my guest, <strong>Krupali Patel</strong>, co-founder of Kiba Labs and everypage.</p>
<h2 id="what-can-you-find-in-the-episode-54-mins">What can you find in the episode (54 mins)?</h2>
<ul>
<li>Coming from management consulting background</li>
<li>EveryPage and EverySize</li>
<li>Declarative way to build a landing page</li>
<li>Working on someone's else project vs working on your own</li>
<li>How to approach your first users</li>
<li>Landing page is least expensive of all product costs</li>
<li>Content writing support group</li>
<li>Launching mini product as a test on ProductHunt</li>
<li>What Krupali is doing in her free time</li>
<li>Where people can find Krupali</li>
</ul>
<h2 id="half-of-the-way">Half of the way</h2>
<p>At the moment of writing, 5 episodes with 5 different guests were recorded. My original plan is to record 10 episodes no matter what happens. That will be a good foundation to decide where to go next. It can be also called a Season 1. That will give me enough understanding on </p>
<ul>
<li>what's necessary for content creation, </li>
<li>am I capable of doing it and</li>
<li>are people interested in what I'm making.</li>
</ul>
<p>This will also help me decide on technical details of the show. Audio only, keep doing video? Equipment, editing, overall style etc.</p>
<h2 id="experiments-and-fails">Experiments and fails</h2>
<p>I'm doing experiments with my podcast constantly. They are small in size and often not worth mentioning. I'm experiment mostly to reduce the resources needed to produce the episode. Be it technical equipment or time. Money is still not involved so no experiments on that. I still don't have proper diffused lighting so my videos might seem a bit off, and I did an experiment with the natural light in one of the episode. It was all good (acceptable) till the moment when clouds covered the sun and it become dark. Not dark as dark dark but it impacted a bit my conversation flow (hopefully not noticeable), because I was thinking in parallel what should I do, pause recording, turn on the lights, pros and cons. But I left it that way and had no worries afterwards</p>
<p>Fails. Yes, technical fails, please come. In one of the recordings my USB driver crashed and everything connected to it (two cameras and a mic) stopped working for a split second. It wouldn't be a big problem if it weren't stopped complete recording. Because, yeah, no camera can be found and the recording software said this is where I stop. It was funny to see all of those popup messages appearing, my cold sweat while my guest kept talking. Not really a good feeling to explain and to try to setup everything in the middle of the episode again. But that's not the worst thing, this fail kicked me out totally, so when the guest asked me should we re-record, I had totally no idea what we were talking. It seemed like I wasn't even listening. At least it seemed that way for me. Embarrassing. But it's one of those scary things that can happen. Later, I was a bit nervous, thinking if it will happen again. Luckily it didn't.</p>
<h2 id="audio-version-on-podcast-platforms">Audio version on podcast platforms</h2>
<p>During the week I checked few options where to upload my audio episodes, and I've decided to go with <a target="_blank" href="https://anchor.fm/bruno-talks-with">anchor fm</a>. </p>
<p>What's nice, this platform is already in the process of pushing the podcast to other platforms, so you can find it on Spotify, PocketCast, RadioPublic, Google Podcasts. It will eventually become available on few more places. Check out if it's available on your favourite podcast app.</p>
<h2 id="are-two-recordings-in-one-day-exhausting">Are two recordings in one day exhausting?</h2>
<p>I don't know, we will find out. Next Saturday I have scheduled two episodes to be recorded. One in the morning, and one in the evening. So far it was maximum one per day. But I'm looking forward to meet two awesome guests that day. Alex West and Danny Postma. Hopefully it won't impact the quality of the episodes. But, there's only one way to find out!</p>
<hr />
<p>Haven't watched the episode yet? Make sure to subscribe so you don't miss the next one.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=tn7ptUGX0V8">https://www.youtube.com/watch?v=tn7ptUGX0V8</a></div>
]]></content:encoded></item><item><title><![CDATA[Focus on the idea – Don’t waste your time]]></title><description><![CDATA[Focusing on the idea, the core value that you’re building, is crucial when developing a product. Let me share my thoughts why I think that way. Should we lose time on things that doesn’t increase the value? At the end of the article I’ll provide a li...]]></description><link>https://brunosays.com/focus-on-the-idea-dont-waste-your-time</link><guid isPermaLink="true">https://brunosays.com/focus-on-the-idea-dont-waste-your-time</guid><category><![CDATA[side project]]></category><category><![CDATA[ideas]]></category><category><![CDATA[coding]]></category><category><![CDATA[#growth]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Sun, 13 Sep 2020 15:57:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1600011751249/64xwS0P4U.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Focusing on the idea, the core value that you’re building, is crucial when developing a product. Let me share my thoughts why I think that way. Should we lose time on things that doesn’t increase the value? At the end of the article I’ll provide a list of 300+ tools that can help you save days or even weeks of work. Courtesy of <a target="_blank" href="https://www.cenario.co/">cenario.co</a>.</p>
<h2 id="who-im-writing-this-post-for">Who I’m writing this post for?</h2>
<p>You are a developer who had several ideas but abandoned them in the middle of the process. Or even worse. You didn’t even start with it because you were overthinking about things. You have several unfinished side projects. Yes, you. Bear with me till the end, I’ll try to plant a seed in your mind that could result in your idea actually seeing the world.</p>
<h2 id="focus-on-how-to-build-instead-of-focus-on-the-idea-is-not-necessarily-a-bad-thing-but">Focus on how to build instead of focus on the idea is not necessarily a bad thing, but…</h2>
<p>As developers, we have to learn constantly. And we have to try things to learn them. New things. Sometimes even scary ones. Starting a hello world side project to learn a technology tends to be boring, and the next thing you know – you’re thinking about some potential idea that could make that learning process attractive. But here’s a trap. You often pour your best ideas into that project. Some ideas that you really believe in. Something that you would like to see one day in action, used by people. Don’t do this! Don’t put your killer idea in the project just to learn a technology. Or even worse a whole technology stack.</p>
<p>We end up in a situation where we have a cool idea in mind, hyped about it, but with every day our enthusiasm is lower and lower. Our backlog is filled with technical tasks.</p>
<ul>
<li>GraphQL doesn’t work</li>
<li>CI/CD doesn’t build the correct Docker image</li>
<li>AWS refuses to connect SSH connection</li>
<li>This new ORM is setting the wrong timezone in DB</li>
<li>I HATE LINTER!!1</li>
</ul>
<blockquote>
<p>You don’t have much time to work on the idea, yet you spend 90% of it on fixing technical stuff.</p>
</blockquote>
<h2 id="pick-one-side">Pick one side</h2>
<p>One side will always suffer. Either you’ll repeat some technical tasks (== no new technical knowledge) because your idea requires similar features OR you will making up some features (== no new value in idea) because you want to learn how something works.</p>
<p>To understand what I’m saying: Imagine you need to add another submit form. You already know how it’s done with this technology you’re learning. But for the sake of the idea you need to have few more submit forms. And it tends to be boring. Or another way around, you saw that it is possible to do some kind of cron tasks, and then you sit there and think which feature could you add to utilize this out of the box solution.</p>
<h2 id="focus-on-the-idea-and-how-to-make-something-that-people-will-return-to">Focus on the idea and how to make something that people will return to</h2>
<p>How to make this? How do I make something that people want? I don’t know. It’s a million-dollar question. But I do know how you are <em>not</em> going to make this – by losing that 90% of the time on tackling technical problems. The end. Period. Full stop.</p>
<p>Ideas in the whole indie hacker world are springing up like mushrooms. And in the same manner, they are being devastated, unproved, gone. People are earning money on thins you could never imagine. Just search on Google “who paid 99 cents”.</p>
<p>I believe we often have ideas that can tickle our minds, thinking how useful would it be, how people would like it, etc., but we won’t end up delivering it if we first think about scaling, making it perfect or the worst part – someone mentioned Kubernetes???</p>
<blockquote>
<p>For the extremely great bargain of 99¢, find out who else dared to pay 99¢</p>
<p>-- <a target="_blank" href="https://whopaid99cents.com/">whopaid99cents.com</a></p>
</blockquote>
<p>We should be able to launch the idea in no time. Ok, in some days/weeks. But you got the point. I’m also aiming that state of mind.</p>
<h2 id="theres-already-a-saas-for-that">There’s already a SaaS for that</h2>
<p>Unless you’re reinventing the payment process – don’t build one from the scratch. Your core idea might involve payments, but there is no value in spending weeks implementing the payment process that will have more bugs and unknowns that it seemed in the first place. You are web dev, I’m sure you know how to build user management, but please don’t! Use the existing tools, there are plenty of them out there. For most of the things, there’s already a SaaS.</p>
<ul>
<li><strong>Do you want to build a landing page?</strong> I know it might be hard to swallow, you are a web developer you know how to put HTML tags together. But hey! Do yourself a favor. Pick an existing landing page builder, at the end of the day you’ll have a fully responsive site. You won’t struggle with flex or grid or some third thing you forgot a long time ago. And in the end, the solution will look way more professional, admit it.</li>
<li><strong>Want to charge for some features?</strong> There are existing tools. And guess what, they’ve been developing that thing way longer than you plan to invest in the whole product.</li>
<li><strong>Waiting lists?</strong> You saw somewhere a waiting list, want to include it in your site too. If your next step is to think about which type of field EMAIL should be in your database and how to validate it, stop! <code>Solution_Already_Exists</code>. Embed the generated code in your site and welcome your first guest. Trust me, you’ll need time and energy to drive people to sign up for a waiting list.</li>
</ul>
<h2 id="conclusion">Conclusion</h2>
<p>Coming from the developer world, it’s understandable that we tend to hack our way. And we’re often in delusion how much something will take. Even worse, we can’t objectively say when it’s too much time spent.</p>
<p>Building a product, on the other hand, is not just building the technical part. You need to finish the product, you need to deliver it. You need to find a first user. And a paying user. And a returning user. Satisfied one as well.</p>
<p>So, imagine a situation where your whole product is stuck because resetting passwords doesn’t work and you’re using customers. Just because of that. And you may not be even aware of that until you had to reset it for yourself. And then you realize how much you’ve lost.</p>
<p>Some of those solutions cost money. But you can weigh and see if it is worth your time and expertise. And do you even have the expertise in that field?</p>
<p>Focus on your core idea, let us see what you’ve built. Launch it.</p>
<hr />
<h2 id="heres-the-list-you-were-waiting-for">Here’s the list you were waiting for</h2>
<p><a target="_blank" href="https://airtable.com/shrj6NgwuHn4z5VMQ/tblvVsIts85J3JTFq">People from cenario.co compiled a list of Business Growth tools</a> that could help you while building your product. Some of them are well known, some are not. Definitely worth checking. They add information on price, but also a category, so it can help you narrow your search.</p>
<hr />
<p>Thanks for reading, make sure to <a target="_blank" href="https://twitter.com/brunoraljic">follow me on Twitter</a> to get more of this, so called, wisdom 😅</p>
]]></content:encoded></item><item><title><![CDATA[Ep#3 Newsletters are never out of fashion]]></title><description><![CDATA[https://anchor.fm/bruno-talks-with/episodes/Ep3-Newsletter-are-never-out-of-fashion--Andrew-Kamphey-ejo0gt
Hey there,
Another episode was published this Friday. I've talked with Andrew Kamphey about newsletters. He run "Influence Weekly" newsletter, ...]]></description><link>https://brunosays.com/ep3-newsletters-are-never-out-of-fashion</link><guid isPermaLink="true">https://brunosays.com/ep3-newsletters-are-never-out-of-fashion</guid><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Sat, 12 Sep 2020 15:12:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1599923391924/B-zrcmbvS.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://anchor.fm/bruno-talks-with/episodes/Ep3-Newsletter-are-never-out-of-fashion--Andrew-Kamphey-ejo0gt">https://anchor.fm/bruno-talks-with/episodes/Ep3-Newsletter-are-never-out-of-fashion--Andrew-Kamphey-ejo0gt</a></div>
<p>Hey there,</p>
<p>Another episode was published this Friday. I've talked with Andrew Kamphey about newsletters. He run "Influence Weekly" newsletter, which has over 7k subscribers. One of his sayings is "I read things so you don't have to". Andrew is also a maker, indie hacker. That's one of the reasons why I invited him to be my guest. </p>
<p>These are the topics we discussed</p>
<ul>
<li>How was it to start a newsletter few years ago</li>
<li>How is your newsletter useful to your subscriber</li>
<li>How Influence Weekly newsletter was born?</li>
<li>How much time does it take weekly?</li>
<li>What's the main benefit of starting a newsletter</li>
<li>Promoting newsletter</li>
<li>Monetising newsletter</li>
<li>Which newsletter platform to chose for beginners</li>
<li>Indie hacker scene in Bali</li>
</ul>
<h2 id="behind-the-scenes-of-bruno-talks-with">Behind the scenes of Bruno Talks With</h2>
<p>So far, I had always 1 episode ready to launch before every Friday. That's important when you commit to release content weekly. It's a bit different than producing written content weekly. There are more constraints. I'll give you a bit perspective. You need to:</p>
<ul>
<li>find a guest</li>
<li>schedule the recording within the covered period (until I have episodes to publish)</li>
<li>if we can't schedule within that period, find another guest who can</li>
<li>record the episode</li>
<li>edit it</li>
<li>prepare youtube video (description, thumbnail etc)</li>
</ul>
<p>That's why I'm keeping track of all of this in an Google sheet. It's kind of messy but it serves the purpose. That way I have overview how much days I have before I need to "start screaming".</p>
<h2 id="episode-3-trivia">Episode #3 trivia</h2>
<ul>
<li>This was my first ever recorded episode of BTW. However, the planned schedule was to air it as an Ep 3</li>
<li>Microphone was turned backwards so this episode has the worst sound</li>
<li>You can see the microphone logo because it's turned to camera, but obviously that's not the point of having the microphone 😅</li>
</ul>
<h2 id="next-guests">Next guests</h2>
<p>Here's the list of scheduled recordings so you can see what to expect in the coming period</p>
<ul>
<li>Pete from No CS Degree, where we will talk about variety of passive income and do you need a CS degree</li>
<li>Lena Sesardic, she interviewed 20 product managers and wrote an ebook</li>
<li>Danny Postma, indie hacker who builds in public. Pros and cons of that, where's the line.</li>
<li>Alex West, Things are different when MRR is in the house. Business is going great for him and we'll hear his story</li>
</ul>
<h2 id="patreon">Patreon</h2>
<p>I'm thinking about option to support me via Patreon. Not created an account yet. There's a struggle inside me, since I'm not doing this for money. On the other hand, you can often hear me saying "Why not". I'm completely aware of my current audience size (~30 YT subs, ~50 newsletter subs). On the other side, why not start early and offer it as an opportunity. What do you think of it? I would appreciate your reply to this mail on this topic. Whatever you say is valuable to me. Both yes and no answers.</p>
<p>That would be it for this update. If you missed the episode, <a target="_blank" href="https://www.youtube.com/channel/UCMgspYM8ZN0FGtF8Kd7TwLQ">subscribe on YouTube</a>.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=rukSOy02lcs">https://www.youtube.com/watch?v=rukSOy02lcs</a></div>
]]></content:encoded></item><item><title><![CDATA[Search GitHub instead of Stackoverflow when in trouble]]></title><description><![CDATA[Usually when we wan’t to try new things (new libraries, new framework, new language), we’re not quite sure how the code would look like in the end, or what is necessary to configure it correctly.
We follow the documentation, but suddenly there’s one ...]]></description><link>https://brunosays.com/search-github-instead-of-stackoverflow-when-in-trouble</link><guid isPermaLink="true">https://brunosays.com/search-github-instead-of-stackoverflow-when-in-trouble</guid><category><![CDATA[developers]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Stack Overflow]]></category><dc:creator><![CDATA[Bruno Raljic]]></dc:creator><pubDate>Wed, 09 Sep 2020 12:08:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1599653152992/CYsDJt6i6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Usually when we wan’t to try new things (new libraries, new framework, new language), we’re not quite sure how the code would look like in the end, or what is necessary to configure it correctly.</p>
<p>We follow the documentation, but suddenly there’s one step missing and you’re stuck. Or the documentation authors assume you know enough, but you’re sitting there, feeling dumb and then it comes to you:</p>
<p>I SHOULD GOOGLE IT!</p>
<p>Hoping for that first result, including Stackoverflow question. But then comes describing your own problems. So you try one thing, and the results are promising but 0 value. You return and modify search query, but the same outcome. So you know the answer is so close, but you just can’t formulate your query to map it 1:1 to your problem. And you feel even more dumb, because you can’t solve a problem of unique username in a new framework, although YOU KNOW HOW TO GOOGLE IT, but it still don’t give you desired results.</p>
<p>So, instead of trying descriptive approach, where the result depends on how well can you describe your problem or express yourself, why not try direct approach. Copy one line of code that you think other should’ve written in their projects before and search for them in GitHub. Now the result depends more on what you’ve copied, not how did you express yourself. And it’s less likely to be “misunderstood”.</p>
<p>You’ll bee amazed about the results. You’re probably not the first person implementing something, and you’ll often find hundreds of thousands repos where others had implemented the same thing. And it’s probably working code, since people USUALLY keep their repos working.</p>
<p>Often, you’ll find another approaches. Some of them are not expected at all. Maybe you have one idea in mind, bot someone solved the same thing in totally different way. Maybe one line in some side configuration that you weren’t aware of at all.</p>
<p>So, be quick in finding your answers, be productive!</p>
<p>—</p>
<p>Follow me on <a target="_blank" href="https://twitter.com/brunoraljic">@brunoraljic</a></p>
]]></content:encoded></item></channel></rss>