<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: hzzhdev</title>
    <description>The latest articles on DEV Community by hzzhdev (@hzzhdev).</description>
    <link>https://dev.to/hzzhdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1012342%2Fcd99c6d7-f885-4625-9962-b9768581100d.jpg</url>
      <title>DEV Community: hzzhdev</title>
      <link>https://dev.to/hzzhdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hzzhdev"/>
    <language>en</language>
    <item>
      <title>I've never felt more rejected than when I went through the Apple App Review process</title>
      <dc:creator>hzzhdev</dc:creator>
      <pubDate>Tue, 24 Jan 2023 11:35:43 +0000</pubDate>
      <link>https://dev.to/hzzhdev/ive-never-felt-more-rejected-than-when-i-went-through-the-apple-app-review-process-39pd</link>
      <guid>https://dev.to/hzzhdev/ive-never-felt-more-rejected-than-when-i-went-through-the-apple-app-review-process-39pd</guid>
      <description>&lt;p&gt;I used to have a full head of hair until I chose to build my own iOS app and got grilled by the Apple App Store gatekeepers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cJDkt0lD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5itqe0cgx48407imdbr3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cJDkt0lD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5itqe0cgx48407imdbr3.jpeg" alt="Image description" width="880" height="1904"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I must say that I was a bit naive when I decided to deploy my iOS app for the first time. I mean, I've done it before professionally, and there were some issues here and there, but usually it goes through the review without any issues, but oh boy, I was in for a ride.&lt;/p&gt;

&lt;h2&gt;
  
  
  The magical place called App Store Connect
&lt;/h2&gt;

&lt;p&gt;If you're not familiar with mobile development, this may all sound foreign to you. Unlike app development for the web, with mobile, you're bound to places like the App Store (for iOS) and Google Play (for Android). That also means you have to comply with all their regulations and protocols. However, since I'm only releasing an iOS app for the time being, I'll talk a little about App Store Connect.&lt;/p&gt;

&lt;p&gt;When developing an app for iOS, you'll eventually have to make use of their App Store Connect environment. It's basically your "global control center" for anything app and app store related.&lt;/p&gt;

&lt;p&gt;They've improved it over the years, but it used to be a maze of links and portals, and you'd need tutorials just to find your way through App Store Connect (I'm also looking at you, &lt;a href="https://developer.apple.com/"&gt;developer.apple.com&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Say your app is finished and you want to release it on the app store. The first thing you need to do is create a bunch of certificates, profiles, and identifiers in &lt;a href="https://developer.apple.com/account"&gt;their developer environment &lt;/a&gt;to even be able to push it onto App Store Connect. If you make use of Push Notifications and In-App Purchases, be ready to make an appointment for an anti-hair loss treatment. Anyway, I'm not going to get into that because it's a can of worms I don't want to open right now.&lt;/p&gt;

&lt;p&gt;Once you have that sorted, you can use Xcode, which is Apple's own IDE, to compile and archive a binary that you can sign and deploy to App Store Connect. I'm not even going to get into this, to me this feels lik the 10th circle of hell Dante forgot to mention, but I'm glad I'm not alone in this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kwEuJFGV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3fappu6i5yv9gn90tlw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kwEuJFGV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3fappu6i5yv9gn90tlw.png" alt="Image description" width="658" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But we're going to assume that it all worked out.&lt;/p&gt;

&lt;h2&gt;
  
  
  TestFlight
&lt;/h2&gt;

&lt;p&gt;Once you're able to deploy your app through Xcode, your app will show up in App Store Connect under a section called "TestFlight." TestFlight is basically your testing environment, and it allows you to publish apps through their TestFlight iOS app to your testers. This can be internal, external, alpha, or beta testers. It's all up to you. You can upload multiple builds per version and add test notes so your test users know what to test and what features are new or updated. This is a feature I love about App Store Connect, and it works seamlessly with their whole release process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--POvM7xlw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b810gwtuvhlgdgljom1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--POvM7xlw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b810gwtuvhlgdgljom1r.png" alt="Image description" width="880" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Test users can download or update the app through the TestFlight iOS app, read the test notes, and provide feedback.&lt;/p&gt;

&lt;p&gt;When you're happy with a build, you can add it to your version release and submit it for review, and that's where the fun begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  The App Review (and on getting rejected)
&lt;/h2&gt;

&lt;p&gt;Like I said, I was a naive little boy when I embarked on this journey. Little did I know, I was quickly put in my place, and it took me one too many iterations to make it to the finish line.&lt;/p&gt;

&lt;p&gt;When you submit your app for review, the waiting game starts. There's no time indication whatsoever other than, &lt;a href="https://developer.apple.com/app-store/review/"&gt;according to Apple, the average waiting time is less than 24 hours&lt;/a&gt;. This sounds about right if I think back about the apps I worked on in the past. However, I've read stories of people waiting up to 72 hours for their app to get reviewed, usually for first-time releases, and depending on how busy they are, it can take longer.&lt;/p&gt;

&lt;p&gt;The frustrating part of this process is that they can reject your app for even the smallest reason. They are very nitpicky. If it is in any way not according to &lt;a href="https://developer.apple.com/app-store/review/guidelines/"&gt;Apple's guidelines&lt;/a&gt;, your app will be rejected. I found out the hard way that it is essential that you carefully read the guidelines before you even start working on your app.&lt;/p&gt;

&lt;p&gt;For instance, they have &lt;a href="https://developer.apple.com/design/tips/"&gt;clear guidelines regarding the design of your app&lt;/a&gt; and will reject it if things like contrast or font size do not meet their requirements. Obviously, going through their design guidelines it all makes sense, but it would be a shame if you had to redesign your app because you didn't read their specs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I got rejected
&lt;/h2&gt;

&lt;p&gt;Unlike dating, where there is a possibility you will get ghosted, Apple however, will take every opportunity to shit on your face and tell you what you did wrong. Which is, in this case, very useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TvkPe7d4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tc7hv3a7uhimxq89rl1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TvkPe7d4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tc7hv3a7uhimxq89rl1l.png" alt="Image description" width="880" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It took me three builds to get something reviewed that was passable according to the reviewers. I feel that's still pretty okay, and I'm being a bit of a drama queen in this post, but hey, it's still annoying and could be easily avoided if I'd just read the guidelines and didn't depend on my previous experiences alone.&lt;/p&gt;

&lt;p&gt;However, to give you insight into why Apple rejected my submission:&lt;/p&gt;

&lt;h3&gt;
  
  
  Rejection #1: A functional link to the Terms of Use (EULA)
&lt;/h3&gt;

&lt;p&gt;When you want to deploy your app to the App Store, you will need to have three sets of documents that you have to include in one of the many fields in App Store Connect.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy Policy&lt;/li&gt;
&lt;li&gt;Terms and Conditions&lt;/li&gt;
&lt;li&gt;Terms of Use (EULA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From previous experiences, I knew these documents were required, but what I didn't know is that you had to add them to your app description as links. However, I'm not sure if this is standard practice, but I included auto-renewable subscriptions in the app, and I believe this was the reason why I had to add it to my app description.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rejection #2: Apps that support account creation must also offer account deletion to give App Store users more control of the data they've shared while using your app.
&lt;/h3&gt;

&lt;p&gt;I have a very simple account creation method in the app using an email and password. Users don't have to confirm their account, and because it was an MVP, I wanted to make it as easy as possible for users to sign up and worry about accounts in the next iteration.&lt;/p&gt;

&lt;p&gt;However, what I didn't take into account is that Apple has a strict policy regarding this matter, which states that if you allow users to create accounts, &lt;a href="https://developer.apple.com/support/offering-account-deletion-in-your-app"&gt;you must also offer account deletion&lt;/a&gt;. Slight oversight, but this took the most work to fix.&lt;/p&gt;

&lt;p&gt;I had to create an additional endpoint and add functionality in the backend to allow this, along with all the extra UI work that came with it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rejection #3: We noticed that several screens of your app were crowded or laid out in a way that made it difficult to use your app.
&lt;/h3&gt;

&lt;p&gt;Another slight oversight... I was so busy working on my landing page that I totally forgot to test the app on the iPhone SE. which has a smaller screen size than the more expensive iPhone models (13, 14, etc.).&lt;/p&gt;

&lt;p&gt;So there were a couple views where components overflowed the screen, which made those components unusable. But fortunately, it was just limited to two views and a couple of buttons, so they make it sound worse than it actually is, and they attached screenshots so you don't have to guess where it went wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  There's light at the end of the tunnel
&lt;/h2&gt;

&lt;p&gt;After the third rejection, I deployed another build and submitted it for another review. So you can imagine I was really happy to see this bad boy arrive in my inbox the following morning:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---p-iD-gL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7r5rso6dqztdwj2bxktp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---p-iD-gL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7r5rso6dqztdwj2bxktp.jpeg" alt="Image description" width="880" height="843"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It felt like a relief, and I was able to focus on other things rather than getting the app through the review.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to avoid rejections? (not dating tips)
&lt;/h2&gt;

&lt;p&gt;To be fair, it was all me that was at fault here. I didn't take the time to read the review guidelines and relied too much on my previous experiences. However, if you've never gone through this process, I can give you the following advice to make the whole process less of a pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Actually read the &lt;a href="https://developer.apple.com/app-store/review/"&gt;app review guidelines&lt;/a&gt; before you start building and designing.&lt;/strong&gt; I can't stress this enough. You need to have a general idea of what's acceptable and what's not. The worst thing that can happen is that you have to go back to the drawing board when you thought you were at the finish line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://developer.apple.com/design/human-interface-guidelines/"&gt;Your design matters&lt;/a&gt;&lt;/strong&gt; (even the screenshots you want to use in the app store). Apple is very strict when it comes to your interface. If you're applying custom-designed UI to your app, make sure it conforms to Apple's Human Interface Guidelines. If you don't have any design experience, your best bet would be to use standard UI components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get your paperwork sorted.&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://developer.apple.com/app-store/review/"&gt;There's a whole section under "Avoiding Common Issues"&lt;/a&gt;&lt;/strong&gt; that explains what documents are required and which fields need to be filled in. There is no simple "click here to agree to all" checkbox you can click on. Especially if you're working with in-app purchases, you will need to get everything under &lt;a href="https://help.apple.com/app-store-connect/#/devb6df5ee51"&gt;**Agreements, Tax, and Banking&lt;/a&gt;** covered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://help.apple.com/app-store-connect/#/devb6df5ee51"&gt;Don't mislead your users.&lt;/a&gt;&lt;/strong&gt; Don't be a shithead and trick your users with false promises. Apple will reject you or, worse, ban your app. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be as complete as possible.&lt;/strong&gt; Don't skip any fields in the App Store Connect environment. If you can fill it in, fill it in with valid information. They will check it and reject it if they notice any missing information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://developer.apple.com/design/human-interface-guidelines/patterns/accessing-private-data/"&gt;Be honest about data collection&lt;/a&gt;&lt;/strong&gt;. If you use any analytics tools to measure usage or whatever, be transparent about it. Request permission where it's necessary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test your build thoroughly before submitting it.&lt;/strong&gt; Xcode includes a simulator where you can test your app in various settings and make sure it works on the latest devices (iPhone SE included). If you use capabilities such as in-app purchases, wallet, Apple Sign In, etc., make sure they are configured properly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide a way for Apple reviewers to login.&lt;/strong&gt; If your app has some form of authentication, make sure you make it easy for the reviewer to sign in. Provide a separate Apple test account that reviewers can use to login. There's also a text field where you can describe the steps a user needs to take to sign in. Make use of it, even if it's a simple email or password form of authentication.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  We're finally there
&lt;/h2&gt;

&lt;p&gt;With a total of three rejections, I feel I did okay overall. I could have done worse. However, after reflecting about the rejections, I believe that they could have been easily avoided and that less time could have been spent on resolving issues.&lt;/p&gt;

&lt;p&gt;To get things setup correctly in App Store Connect, though, takes a lot more time when I'm working alone than when I'm with a team. There is more paperwork involved, and you'll probably spend a weekend or two just putting up your App Store environment with the correct copy and visuals. Or, maybe I'm just slow.&lt;/p&gt;

&lt;p&gt;I'm very open to hear what everyone else thinks about it, don't hesitate to give me your 2 cents!&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>flutter</category>
      <category>writing</category>
      <category>ios</category>
    </item>
    <item>
      <title>Nobody cares about your stack (and your code quality)</title>
      <dc:creator>hzzhdev</dc:creator>
      <pubDate>Mon, 23 Jan 2023 08:44:11 +0000</pubDate>
      <link>https://dev.to/hzzhdev/nobody-cares-about-your-stack-and-your-code-quality-3lfl</link>
      <guid>https://dev.to/hzzhdev/nobody-cares-about-your-stack-and-your-code-quality-3lfl</guid>
      <description>&lt;p&gt;Every developer who's had side projects once hit that wall of inability to choose their weapon of choice for their next billion-dollar SaaS idea. The always-returning question being: what stack to pick and how should you approach your project in terms of architecture, testing, and avoiding technical debt? Guess what? &lt;strong&gt;Nobody gives a shit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I've had discussions with other developers about what stack is the best one to work with in terms of building your newest product. Especially if you're building it yourself and do not intend to take anyone else on board. Like myself, others have their biases, considering they've worked with a certain stack. However, if you think about it, 9 out of 10 times it doesn't really matter what stack you pick, and you're probably overthinking and overengineering it.&lt;/p&gt;

&lt;p&gt;An old tweet that I commonly refer to regarding the stack of RemoteOK:&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--n4XRuymP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1589756412078555136/YlXMBzhp_normal.jpg" alt="@levelsio profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        &lt;a class="mentioned-user" href="https://dev.to/levelsio"&gt;@levelsio&lt;/a&gt;
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="mentioned-user" href="https://dev.to/levelsio"&gt;@levelsio&lt;/a&gt;
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      🛠 People keep asking for the stack, it's:&lt;br&gt;- &lt;a href="https://twitter.com/official_php"&gt;@official_php&lt;/a&gt; 7 without framework&lt;br&gt;- JS with &lt;a href="https://twitter.com/jquery"&gt;@jquery&lt;/a&gt; without framework&lt;br&gt;- normal CSS&lt;br&gt;- &lt;a href="https://twitter.com/nginx"&gt;@nginx&lt;/a&gt; on &lt;a href="https://twitter.com/ubuntu"&gt;@ubuntu&lt;/a&gt;&lt;br&gt;- 1x &lt;a href="https://twitter.com/linode"&gt;@linode&lt;/a&gt; VPS @ $400/mo&lt;br&gt;- &lt;a href="https://twitter.com/stripe"&gt;@stripe&lt;/a&gt; for payments&lt;br&gt;- SQLite for db
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      14:01 PM - 22 Sep 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1308406118314635266" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1308406118314635266" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1308406118314635266" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;Yes, we're all familiar with &lt;a href="https://twitter.com/levelsi"&gt;@levelsio&lt;/a&gt;, and some dream the life he lives and some hate to love him; I'm right there in the middle. But there is a reason why he's the OG indiehacker.&lt;/p&gt;

&lt;p&gt;No fancy frameworks, libraries, transpilers, transformers, or other forms of overhead that most of the time will only cause you more headaches than it will help you. Some will call him a fool for using JQuery and not leveraging the newest of the newest, but if it works, it works, right?&lt;/p&gt;

&lt;p&gt;Every user visiting &lt;a href="https://remoteok.com/"&gt;Remote OK&lt;/a&gt; has literally no clue what tech is used behind the scenes, and I bet you a hundo that they don't care. All they care is; does the product performs fast, can this product provide them the value they are looking for and does the product provide that value quickly to them?&lt;/p&gt;

&lt;h2&gt;
  
  
  Code is just a tool
&lt;/h2&gt;

&lt;p&gt;This can't be repeated enough. Early in my career, I was too much concerned about the quality of my code and the technical decisions I made, and I spent a lot of time learning about how I could improve the overall quality of my code. Granted, learning the difference between bad and good code is important, and when you work in an organization with other people and must comply to certain guidelines and protocol, it's important that your code is on par with that of your colleagues.&lt;/p&gt;

&lt;p&gt;However, it is also important to realise that code is just a tool. As a developer, you're essentially a problem solver. Code is just one way to arrive at the solution. When you build a wooden chair, it doesn't matter if it was built using a hammer or a rock, as long as you can deliver the value (comfort) to the person using it.  It's OK to write ugly code. It's likelier that your product is going to fail than it is going to succeed, and improving code quality should be reserved for products that succeed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Haven't you read Clean Code?
&lt;/h2&gt;

&lt;p&gt;Ask yourself this: How many side projects have you given up on already? How many products you've built are halfway there, but you're never going to touch them again?&lt;/p&gt;

&lt;p&gt;Was it worth writing tests for them? Was it worth getting the architecture just right? Basically, those projects are now essentially giant lumps of technical debt. It only matters if the product you've built makes it to the finish line, does something, provides value, and is worth working on.&lt;/p&gt;

&lt;p&gt;I've learned after many failed attempts that when building your own product, you shouldn't worry too much about how the code looks, worry about unit testing, or overthink structure and architecture. I understand that there are many arguments against this, and it's truly up to you how you like to divide your attention and time.&lt;/p&gt;

&lt;p&gt;I'm not arguing that code quality, architecture etc. does not matter. It definitely matters, but it only matters if it's worth worrying about. I'm arguing that in the early stages of your product development lifecycle, you're looking to get something in the field for validation, and in that stage, I personally don't care about code quality. "Good enough" is what you're looking for, and once the product is making that sweet MRR, you can start thinking about improving the quality of your codebase and make iterations that actually matters. It may sound like doing twice as much work, but it's better to do twice as much work for a product that succeeds than to always do twice as much work and waste too much of your precious time.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what stack should I use then?
&lt;/h2&gt;

&lt;p&gt;Whatever gets you the quickest to the finish line, which in this case is getting a minimal viable product online that you can deploy in the field, iterate on, and validate if your product can deliver value to your potential customers.&lt;/p&gt;

&lt;p&gt;Too often, I've taken the occasion of building a new product as an opportunity to try out new tech or a new language, only to see myself burn and want to jump off a cliff while figuring out the little nuances of that new hot thing I'm learning. It's too much of a burden to give yourself while you're trying to realise your idea and considering it's one-man show, you're only going to make it yourself more difficult.&lt;/p&gt;

&lt;p&gt;However, if the intention is to learn new tech and the side-project is the carrier to your world of new knowledge, then yes! I completely agree! That's a great way to learn a new language or understand a new framework and a great way to retain that knowledge by putting it in practice.&lt;/p&gt;

&lt;p&gt;But if the intention is to get something off the ground ASAP, just stick to your guns, make miles and start pounding.&lt;/p&gt;

&lt;h2&gt;
  
  
  But seriously, what stack?
&lt;/h2&gt;

&lt;p&gt;I can't speak for you or any other developers out there, and there are a myriad of tools and frameworks to pick from. It essentially depends on your experience and what your background is.&lt;/p&gt;

&lt;p&gt;If you've worked in tech long enough, you're probably comfortable with a set of tools already. If that toolkit allows you to build a product today, then there you go; you've got your stack.&lt;/p&gt;

&lt;p&gt;If you're new to development and indie hacking in general, then it is important to get your basics straight. I understand that it's hard to navigate through the world of development with people around you holding shiny tech in their hands and promising you the path to nirvana.  But if you really looking to start indiehacking through programming, I imagine your best bet would be to get your hands dirty with JavaScript. Purely for the following reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are so many JavaScript resources online to learn from, and the community is huge.&lt;/li&gt;
&lt;li&gt;Yes, JavaScript has a lot of little quirks that will give you a pain in the ass. But even so, It's a fine language to start with, especially if your next step is to start learning TypeScript right after that.&lt;/li&gt;
&lt;li&gt;JS frameworks and libraries like Vue, React, Svelte, etc. are very beginner-friendly.&lt;/li&gt;
&lt;li&gt;2 for the price of 1 if you decide to throw Node and Express in the mix for your back-end server.&lt;/li&gt;
&lt;li&gt;3 for the price of 1 if you ever want to build a mobile app using Ionic or React Native.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't intend this post to be the beginner's guide to indiehacking or development in general. There already are very good ones on this platform alone, but I do believe JavaScript is a solid gateway drug to the world of development. &lt;/p&gt;

&lt;p&gt;People are going to argue that there are better options to choose from over JavaScript, and they are probably right. But it has worked for me and it's likely that it will work for you as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you use?
&lt;/h2&gt;

&lt;p&gt;Essentially, my toolkit is pretty much as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use React for building web-based applications. Like all hipster React developers, I commonly use &lt;a href="https://nextjs.org/"&gt;Next.js&lt;/a&gt;. However, lately I've been a huge fan of &lt;a href="https://create.t3.gg/"&gt;Create T3&lt;/a&gt; for end-to-end typesafety. I've used &lt;a href="https://nuxt.com/"&gt;Nuxt.js&lt;/a&gt; in the past but haven't used it in a while, but I'm still a huge fan of Vue, and with their latest V3 iteration, I'm thinking of giving it another shot.&lt;/li&gt;
&lt;li&gt;I use Node/Express for building back-ends using TypeScript (with ts-node). I used to work a lot with MongoDB, but recently switched to PostgreSQL using &lt;a href="https://supabase.com/"&gt;Supabase&lt;/a&gt;. Or host it myself—it depends on the situation&lt;/li&gt;
&lt;li&gt;I use &lt;a href="https://flutter.dev/"&gt;Flutter&lt;/a&gt; for building mobile applications. Used to work a lot with Ionic (for side-projects and professionally), but &lt;strong&gt;holy crap&lt;/strong&gt;, I'm so happy I made the switch to Flutter.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://m.do.co/c/3f31950f28b8"&gt;Digital Ocean&lt;/a&gt; for all my server stuff. I believe there are cheaper alternatives, but as far as I know, nothing beats the ease of use of Digital Ocean for me.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't take this as advice; I'm a student of life and I'm learning new things as I go. But these are the guns I'm sticking to.&lt;/p&gt;

&lt;p&gt;I'm very open to hear what everyone else thinks about it, don't hesitate to give me your 2 cents!&lt;/p&gt;

</description>
      <category>indiehacking</category>
      <category>sideprojects</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
