<?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>Forem: Matija Sosic</title>
    <description>The latest articles on Forem by Matija Sosic (@matijasos).</description>
    <link>https://forem.com/matijasos</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%2F331796%2F5d3fd56d-440c-437c-bcda-152c482774b9.jpeg</url>
      <title>Forem: Matija Sosic</title>
      <link>https://forem.com/matijasos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/matijasos"/>
    <language>en</language>
    <item>
      <title>🎨 Join Wasp Design-AI-Thon - Pimp our website and win TRMNL, Playdate, and OB-4! 🤖</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Mon, 13 Oct 2025 13:39:38 +0000</pubDate>
      <link>https://forem.com/wasp/join-wasp-design-ai-thon-pimp-our-website-and-win-trmnl-playdate-and-ob-4-3gj8</link>
      <guid>https://forem.com/wasp/join-wasp-design-ai-thon-pimp-our-website-and-win-trmnl-playdate-and-ob-4-3gj8</guid>
      <description>&lt;p&gt;As promised at the start of this Launch Week, we're bringing our hackathon back! And this time, it's a bit special - &lt;strong&gt;we're asking you to give a revamp to Wasp's website!&lt;/strong&gt; Our design is kinda dated and looks like it was done by a backend engineer (looking at myself), and we think it's about time we did something about it!&lt;/p&gt;

&lt;p&gt;We want to come up with something fun and not what you see every day, which reflects our style and personality.&lt;/p&gt;

&lt;p&gt;The only rule is: there are no rules!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n88aqz3qvlkyb78u66s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n88aqz3qvlkyb78u66s.png" alt="cool prizes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key things to know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You have 10 days to create a redesigned mock-up of &lt;a href="https://wasp.sh/" rel="noopener noreferrer"&gt;Wasp's website&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Starting 10:00 am PT Friday, Oct 10th, 2025&lt;/li&gt;
&lt;li&gt;The submission deadline is &lt;strong&gt;11:59 pm Sunday, midnight PT, Oct 19th, 2025&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Use any tool or format - code, Figma design, drawing. Anything.&lt;/li&gt;

&lt;li&gt;You're welcome to adapt the copy on the website. If you have an idea for a tagline you think would work better (e.g., "Laravel for JS"), we'd love to see it!&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You can find Wasp's existing website code and use it as a starting point &lt;a href="https://github.com/wasp-lang/wasp/blob/release/web/src/pages/index.jsx" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;Here are answers to some questions you might have. If there is something we haven't covered, ping us on &lt;a href="https://discord.com/invite/rzdnErX" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  What should I create? What level of fidelity should it be?
&lt;/h3&gt;

&lt;p&gt;We leave this part up to you. Whatever you think might be a good way to represent your idea on how to upgrade Wasp's page design and/or branding. It could be a page you actually coded and deployed, a Figma/Illustrator design, a drawing or a video in which you present your vision.&lt;/p&gt;

&lt;p&gt;Maybe even a poem. Ok, probably not, but would be interesting to see someone give it a try.&lt;/p&gt;

&lt;p&gt;To get your juices flowing, here's an example we played around with internally :&lt;br&gt;


  &lt;iframe src="https://www.youtube.com/embed/5UWX6XkkbL4"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h3&gt;
  
  
  How much of the website should I mock up?
&lt;/h3&gt;

&lt;p&gt;You can go as far as you want. As a minimum, we recommend focusing on the Above-The-Fold aka Hero section of the page. That is the portion of the page you see on your screen when it loads for the first time, before you scroll down.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which tools should I use? Can I use AI?
&lt;/h3&gt;

&lt;p&gt;Of course! As the title says, it's a design-AI-thon. We believe that AI has made better design more accessible to anyone (even backend engineers, although that's a tough one) and would love to see it in action!&lt;/p&gt;

&lt;p&gt;You're of course also free to go old-school and do it Figma/Sketch/Photoshop/Illustrator or any other design tool out there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prizes
&lt;/h2&gt;

&lt;p&gt;There are 3 categories, and there will be prizes for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best overall project&lt;/li&gt;
&lt;li&gt;Most fun / innovative&lt;/li&gt;
&lt;li&gt;Most technically impressive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the prizes themselves, we'll give away three beautifully designed pieces of hardware. We think that is just right for the theme of this competition, and will inspire you to channel your inner Jony Ive or Dieter Rams.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xbkr4wuvintrlql3v7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xbkr4wuvintrlql3v7f.png" alt="prizes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prize #1: &lt;a href="https://teenage.engineering/store/ob-4-ochre" rel="noopener noreferrer"&gt;OB-4 Bluetooth Loudspeaker by teenage engineering&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Prize #2: &lt;a href="https://usetrmnl.com/" rel="noopener noreferrer"&gt;TRMNL - E-ink companion for your desk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Prize #3: &lt;a href="https://play.date/shop/playdate/" rel="noopener noreferrer"&gt;Playdate - A tiny handheld game system. With The Crank.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Special thanks go to folks at TRMNL for offering to sponsor this event by gifting a device! Seems like me tweeting a lot of stuff eventually pays off!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;A lil' disclaimer&lt;/strong&gt;: If for some reason we can't get our hands on one of the prizes, or can't ship it to your location, we'll swap it out for something just as cool (promise!).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Submission
&lt;/h2&gt;

&lt;p&gt;You should submit your project using the &lt;a href="https://e44cy1h4s0q.typeform.com/to/ZjN0Dr0j" rel="noopener noreferrer"&gt;submission form&lt;/a&gt; before 11:59 pm PT, Sunday, October 19th, 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  Judging
&lt;/h2&gt;

&lt;p&gt;The Wasp team will judge the winners for each category. We will be looking for:&lt;/p&gt;

&lt;h2&gt;
  
  
  Creativity &amp;amp; thinking out of the box
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How well it showcases Wasp’s playful personality&lt;/li&gt;
&lt;li&gt;Visually pleasing&lt;/li&gt;
&lt;li&gt;Attention to detail&lt;/li&gt;
&lt;li&gt;Fun!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Multiple submissions are allowed. You can do as many as you want.&lt;/li&gt;
&lt;li&gt;You must submit before the deadline (no late entries)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Additional info
&lt;/h2&gt;

&lt;p&gt;By making a submission, you grant Wasp permission to use screenshots, code snippets, and/or links to your project on our Twitter, blog, website, email updated, and in the Wasp discord server.&lt;/p&gt;

&lt;p&gt;That's - it have fun. Find your inner artist, pair it with AI and let the sparks fly. We can't wait to see what you come up with!&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>design</category>
      <category>webdev</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>🐝 Wasp: a full-stack, "Laravel for JS" framework. Vibe-coding approved 🕹️</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Wed, 23 Apr 2025 12:57:21 +0000</pubDate>
      <link>https://forem.com/wasp/wasp-a-full-stack-laravel-for-js-framework-vibe-coding-approved-473g</link>
      <guid>https://forem.com/wasp/wasp-a-full-stack-laravel-for-js-framework-vibe-coding-approved-473g</guid>
      <description>&lt;h2&gt;
  
  
  What is Laravel, and why do I need it for JavaScript?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqcjhkscdkzc2wls54yp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqcjhkscdkzc2wls54yp.png" alt="Laravel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Laravel is one of the most popular web frameworks for PHP. It was released in 2011 and has since become a synonym for a well-designed, enjoyable developer experience. Its "superpower" is that it provides pretty much everything you need with the best practices out of the box. Authentication, ORM, emails, jobs, testing - there is a "Laravel" way to do it, and there's nothing for you to figure out - it all just works!&lt;/p&gt;

&lt;p&gt;On the other hand, the JavaScript ecosystem is on the drastically opposite spectrum. There is a standalone library/service for pretty much every web app feature, and it's up to you to figure out the best way to integrate it all together.&lt;/p&gt;

&lt;p&gt;It can be fun to hand-select every part of your stack, but it can also be quite frustrating when you have an idea and want to get it out to users as soon as possible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez58r15o360rr7e09t1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fez58r15o360rr7e09t1k.png" alt="give us Laravel for JS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is why developers who used all-in-one full-stack frameworks such as Laravel, Rails, and Django have been very strongly calling for the same experience in JavaScript.&lt;/p&gt;

&lt;p&gt;There are historical and maturity reasons &lt;a href="https://wasp.sh/blog/2024/05/29/why-we-dont-have-laravel-for-javascript-yet" rel="noopener noreferrer"&gt;why we didn't have that in JavaScript for so long&lt;/a&gt;, but finally, the times are changing.&lt;/p&gt;

&lt;p&gt;There are multiple solutions and frameworks that aim to solve this problem, and today we'll take a look at one of the fastest-growing among them: Wasp! 🐝&lt;/p&gt;

&lt;h2&gt;
  
  
  Wasp: A full-stack, “Laravel for JS” framework. Great for vibe-coders, too!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi35j142goaeg6msqpvtt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi35j142goaeg6msqpvtt.png" alt="Wasp diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;Wasp&lt;/a&gt; is one of the fastest-growing next-gen full-stack web frameworks and is leading the pack when it comes to pushing for a Laravel-like experience in JavaScript. It appeared at about the same time as Redwood and was motivated by the same pain (too fragmented and modular JS ecosystem). Wasp is currently in Beta (recently went through its &lt;a href="https://wasp.sh/blog/2025/04/09/wasp-launch-week-9" rel="noopener noreferrer"&gt;Launch Week #9&lt;/a&gt;) but is already being used by solopreneurs, startups, and Fortune 500 companies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxi18pr3a4yj2i0o4ga27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxi18pr3a4yj2i0o4ga27.png" alt="testimonial"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main “secret sauce” is a declarative specification file where a developer describes their app at a high level - pages and routes, async jobs, database operations, and more. It helps cut down a lot of boilerplate and lets a developer focus on their unique logic in React, Node.js, and Prisma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support us! 🙏⭐️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid9s6t8rcvfxty40bv2m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid9s6t8rcvfxty40bv2m.gif" alt="GH star click"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find this post helpful,&lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;consider giving us a star on Github&lt;/a&gt;! Everything we do at Wasp is open source, and your support helps us make web development easier and motivates us to write more articles like this one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgbmn45pia04bxt6zf83.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgbmn45pia04bxt6zf83.gif" alt="support us"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wasp-lang/wasp" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;⭐️ Thanks For Your Support 🙏&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenSaaS - a free, open-source boilerplate starter for React &amp;amp; Node.js
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kq23qt6cbxcg6imenk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kq23qt6cbxcg6imenk5.png" alt="OS banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, one of the big drivers for developers choosing Wasp for their projects is &lt;a href="https://github.com/wasp-lang/open-saas" rel="noopener noreferrer"&gt;OpenSaaS - a 100% free and open-source SaaS boilerplate starter&lt;/a&gt; on top of Wasp. It comes with a lot of common features out-of-the-box (Stripe &amp;amp; OpenAI integration, blog via Astro, admin dashboard, file uploads, …) and will save you hundreds of development hours. Since its release about a year ago, it has skyrocketed to&lt;a href="https://github.com/wasp-lang/open-saas" rel="noopener noreferrer"&gt;over 10,000 stars on GitHub&lt;/a&gt;, and has been used to bring hundreds of SaaSes to life.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m2gz1av98ajotjnsm3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2m2gz1av98ajotjnsm3j.png" alt="app gallery"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wasp helps vibe coders build their apps further and safer 🕹️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjgk55aux80z0jshmq4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjgk55aux80z0jshmq4u.png" alt="vibe coding workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently, Wasp has been gaining a lot of popularity among so-called “vibe coders”, which is just a trendy term for people who want to build their app as fast as possible using AI. It turns out that a Wasp app’s robust structure that spans the whole stack of your app (client, server, database, and deployment) and less boilerplate code helps AI develop more features and make fewer mistakes along the way.&lt;/p&gt;

&lt;p&gt;Here you can find &lt;a href="https://www.youtube.com/watch?v=WYzEROo7reY" rel="noopener noreferrer"&gt;a detailed video guide&lt;/a&gt; that explains the whole process, step-by-step, on how to build your next app with Wasp and Cursor, and then also deploy it to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Happy building and stay safe!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90gdqxpfz7s5utq1gnuo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F90gdqxpfz7s5utq1gnuo.png" alt="wasp bye"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hopefully, this post gave you an insight into the latest developments of the JavaScript ecosystem and prompted (pun intended) you to start working on your next idea, be it with Wasp or another framework that fits your needs the best.&lt;/p&gt;

&lt;p&gt;Also, whether you adopt less or more AI in your development workflow, make sure to check and understand your app’s code before putting it into production. Although full-stack frameworks such as Wasp can help with ensuring best practices out of the box, &lt;strong&gt;it’s still your responsibility as a developer to make sure that the code that goes out meets all the security standards&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With that said, happy coding! If you want to support our mission with Wasp, we’d appreciate it if you &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;starred it on GitHub&lt;/a&gt;. We’d also love to hear from you, and we’re here if you have any questions about Wasp or web dev in general - you can always find us in &lt;a href="https://discord.gg/rzdnErX" rel="noopener noreferrer"&gt;our Discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>vibecoding</category>
      <category>ai</category>
    </item>
    <item>
      <title>From “You will fail” to 15,000 GitHub stars: The story of Wasp, a "Laravel for JS" full-stack framework</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Wed, 05 Mar 2025 13:03:40 +0000</pubDate>
      <link>https://forem.com/wasp/from-you-will-fail-to-15000-github-stars-the-story-of-wasp-a-laravel-for-js-full-stack-1fil</link>
      <guid>https://forem.com/wasp/from-you-will-fail-to-15000-github-stars-the-story-of-wasp-a-laravel-for-js-full-stack-1fil</guid>
      <description>&lt;h2&gt;
  
  
  "What you're building is the holy grail for developers. No one has succeeded so far." 🏆 ☠️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bojq5h8joplg0f4dbf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bojq5h8joplg0f4dbf7.png" alt="YC holy grail" width="563" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the feedback from Y Combinator when Martin (my twin brother) and I applied with &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;Wasp&lt;/a&gt; for the second time in May 2020. At that point, we had worked on Wasp for 1.5 years, the last nine months full-time. We had quit our previous jobs and gone all in.&lt;/p&gt;

&lt;p&gt;Today, &lt;strong&gt;Wasp has over 15,000 stars on GitHub&lt;/strong&gt;. Even more importantly, developers of all backgrounds have used it to &lt;strong&gt;develop thousands of web apps&lt;/strong&gt;, from side projects that have grown into &lt;a href="https://wasp.sh/blog/2024/09/17/from-idea-to-20k-in-days-how-wasp-accelerated-nuloapps-launch" rel="noopener noreferrer"&gt;acquired&lt;/a&gt; or &lt;a href="https://docs.opensaas.sh/blog/2024-12-10-turboreel-os-ai-video-generator-built-with-open-saas/" rel="noopener noreferrer"&gt;revenue-generating businesses&lt;/a&gt; to venture-backed startups and internal tools deployed within Fortune 500 companies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3dgexditl48vkrwnqks5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3dgexditl48vkrwnqks5.png" alt="Wasp app gallery" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some people have grown to love Wasp and the vision it pursues. Thanks to them, we enjoy working on it. Without the community that gathered around Wasp (&amp;gt;4,000 devs in &lt;a href="https://discord.gg/rzdnErX" rel="noopener noreferrer"&gt;our Discord&lt;/a&gt;), we wouldn’t have been even close to where we are today. For them, we keep pushing towards the holy grail we promised.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F00chj0j1bn1h9va8pwbd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F00chj0j1bn1h9va8pwbd.png" alt="wasp love" width="800" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our work has just begun - but we’re more excited about it than ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The journey - getting from 0 to 15,000 stars
&lt;/h2&gt;

&lt;p&gt;As with most success stories, the success rarely happens linearly. It usually starts with a long period of "drought" with occasional signs of life, and then there is a moment when things click together and start moving really fast. We experienced the same, and it looked something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73xh57mzhglctpsd2vxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73xh57mzhglctpsd2vxp.png" alt="Star journey" width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The inception - “Why not?”
&lt;/h3&gt;

&lt;p&gt;In the beginning, Wasp was just an idea—or rather, a question: "&lt;em&gt;Why hasn't anyone built this yet? What would we discover if we tried?&lt;/em&gt;" After spending a decade building web apps and using every major tech stack (from PHP to Java and Node.js on the server to Backbone, Angular, and React on the client), we were feeling the pain of "framework fatigue," aka reinventing the wheel with each new stack.&lt;/p&gt;

&lt;p&gt;So we set out to start thinking about it and put things on paper (ok, Google Slides). This is how the original idea for Wasp was born - &lt;strong&gt;&lt;em&gt;can we create a framework that removes a lot of boilerplate by offering higher-level abstractions, but is still flexible enough and is not strictly bound to the specific stack and architecture?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now looking that, it really does sound like a holy grail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting in YC and things getting real
&lt;/h3&gt;

&lt;p&gt;We had already quit our jobs a year ago and were quite exhausted and doubtful of the whole concept. We were getting some early traction and received promising feedback from Reddit, Hacker News, and Product Hunt, but we also started realizing how much work is needed to bring a full-stack web framework to a state where it’s usable, especially with the ambitious requirements we set for ourselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzd9lpns27ih8pqbaw1c6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzd9lpns27ih8pqbaw1c6.png" alt="reddit launch" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, we got into YC the third time we applied for it. They were following our progress for the last year and, having seen the community excitement, decided to take a bet on our crazy idea.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jkfjqeo4n2qo24u7q60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jkfjqeo4n2qo24u7q60.png" alt="hn launch" width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Beta and beyond - MAGE and OpenSaaS
&lt;/h3&gt;

&lt;p&gt;Looking at the graph, you can spot two key inflection points. The first one happened in July 2023 when we launched &lt;a href="https://wasp.sh/blog/2023/07/10/gpt-web-app-generator" rel="noopener noreferrer"&gt;&lt;strong&gt;MAGE&lt;/strong&gt;&lt;/a&gt;, a GPT SaaS starter that uses Wasp under the hood (you can think of it as one-shot Loveable/Bolt). It was among the first LLM products that could generate a working full-stack web app, bringing many eyes to Wasp.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwj7j2aikuws0quxymuwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwj7j2aikuws0quxymuwg.png" alt="OpenSaaS banner" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second major growth catalyzer came in December 2023 with the launch of &lt;a href="https://opensaas.sh/" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenSaaS&lt;/strong&gt;&lt;/a&gt;, our open-source SaaS starter built on top of Wasp, which now has almost 10,000 stars on GitHub.&lt;/p&gt;

&lt;p&gt;We realized that most builders really want to start working on their idea as quickly as possible without picking out and patching together all the different features every SaaS needs - authentication, payments, admin dashboard, sending emails, blog, …&lt;/p&gt;

&lt;p&gt;And this is exactly what we provided - &lt;strong&gt;a 100% free &amp;amp; open-source, high-quality, SaaS starter based on React, Node.js, Prisma, and Wasp&lt;/strong&gt;. OpenSaaS basically became a “killer app” for Wasp as it attracts developers to try it and realize how helpful the framework is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/wasp/using-cursor-claude-to-make-full-stack-saas-apps-2aj3"&gt;Open SaaS also pairs extremely well with Cursor&lt;/a&gt; - given Wasp’s robust structure and higher-level primitives, many developers have found it as an ideal combo for getting their SaaS-es from an idea to a production-ready app in a matter of days.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1832194642596508076-687" src="https://platform.twitter.com/embed/Tweet.html?id=1832194642596508076"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1832194642596508076-687');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1832194642596508076&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Language/DSL vs framework - so which one is it?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frergp8xvt5tcxu0yqn2d.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frergp8xvt5tcxu0yqn2d.gif" alt="maybe both" width="400" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see from the examples above, we used to refer to Wasp as a language, DSL - a Domain Specific Language. It was for these reasons that we originally set out to have an abstraction layer that can, in the future, work with any language, library, and architecture.&lt;/p&gt;

&lt;p&gt;For this, we needed to introduce our own compiler that would first analyze your app’s specification that you defined via Wasp (e.g., your routes, async jobs, db operations, …), combine it with the “native” code you wrote in React &amp;amp; Node.js, and finally generate a React/Node.js app. That effectively meant we’ve invented our own language, albeit very limited and simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is how we initially presented Wasp, but we learned that is the wrong way to think about it. Wasp is by its function a web framework, just like Laravel, Rails, or Next.js&lt;/strong&gt;. The fact that it uses a compiler under the hood is simply an implementation detail that gives it its superpowers. For example, thanks to this approach, &lt;strong&gt;&lt;a href="https://wasp.sh/blog/2024/04/25/first-framework-that-lets-you-visualize-react-node-app-code" rel="noopener noreferrer"&gt;we can easily visualize the topology of your whole app&lt;/a&gt;, from database to server and client components&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbktt1garp2xf91y6ubs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbktt1garp2xf91y6ubs.png" alt="wasp studio" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The road to 1.0 and building the next-gen framework
&lt;/h2&gt;

&lt;p&gt;This is the story of how Wasp came to be where it is today. For more details on the very early days (getting from an idea to the first 1,000 stars), you can check out &lt;a href="https://wasp.sh/blog/2022/09/29/journey-to-1000-gh-stars" rel="noopener noreferrer"&gt;this post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What’s next? After almost five years of building and getting feedback from you, we have a pretty clear picture of what Wasp 1.0 needs to look like. Simply put, we have set out to build a full-stack framework with the best possible developer experience. We want you to focus on building your product and spend as little time as possible fighting your stack.&lt;/p&gt;

&lt;p&gt;Think what Rails and Laravel did for Ruby and PHP - we’re doing the same for the modern, AI-powered, JS ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To follow our story and support us, &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;star Wasp on GitHub&lt;/a&gt; and &lt;a href="https://discord.gg/rzdnErX" rel="noopener noreferrer"&gt;join our Discord&lt;/a&gt; - we can’t wait to see you there!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>ai</category>
      <category>react</category>
    </item>
    <item>
      <title>🚨GIVEAWAY🚨 - Help us reach 15,000 stars and win our Ultimate Swag Pack! 🐝 👕</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Tue, 11 Feb 2025 12:49:47 +0000</pubDate>
      <link>https://forem.com/wasp/giveaway-help-us-reach-15000-stars-and-win-our-ultimate-swag-pack-5fal</link>
      <guid>https://forem.com/wasp/giveaway-help-us-reach-15000-stars-and-win-our-ultimate-swag-pack-5fal</guid>
      <description>&lt;p&gt;Hey DEVelopers 👋,&lt;/p&gt;

&lt;p&gt;It feels like it was yesterday when we published a post here about &lt;strong&gt;&lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;Wasp&lt;/a&gt;, an open-source web framework for React, Node.js and Prisma&lt;/strong&gt;, reaching 9,000 stars on GitHub!&lt;/p&gt;

&lt;p&gt;Today, we're just 50 stars away from hitting &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;15,000 stars on GitHub&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93f2na1fsmcdiaqecpex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93f2na1fsmcdiaqecpex.png" alt="wasp-15k-chart" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To celebrate, we're offering a very special treat for three lucky devs that star our repo before we hit 15k stars - our &lt;strong&gt;Ultimate Swag Pack&lt;/strong&gt;! That includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌑 &lt;strong&gt;Dark tee&lt;/strong&gt; for the code ninja in you&lt;/li&gt;
&lt;li&gt;🌔 &lt;strong&gt;Light tee&lt;/strong&gt; for when it gets hot outside&lt;/li&gt;
&lt;li&gt;🎩 &lt;strong&gt;Beanie&lt;/strong&gt; to stand out in a crowd&lt;/li&gt;
&lt;li&gt;🐝 &lt;strong&gt;Wasp plushie&lt;/strong&gt; to help you out in debugging sessions!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkitwlujquu37k2shdvv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frkitwlujquu37k2shdvv.png" alt="wasp-raffle-banner" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sounds like a sweet deal, right? Here's what you need to do to win:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Like this post ❤️&lt;/li&gt;
&lt;li&gt;Star Wasp on GitHub ⭐: &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;https://github.com/wasp-lang/wasp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reply with your GitHub handle 💬 (so we can id you)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We will announce the winners once we hit 15k stars! (so very soon)&lt;/p&gt;

&lt;p&gt;That's it! Happy starring and we can't wait to ship the Ultimate Swag Pack your way! 🐝✈️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Watch this. It will be awesome 🔥</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Thu, 16 Jan 2025 18:41:06 +0000</pubDate>
      <link>https://forem.com/matijasos/watch-this-it-will-be-awesome-5e92</link>
      <guid>https://forem.com/matijasos/watch-this-it-will-be-awesome-5e92</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/wasp" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F3369%2Fc86918f8-76a9-4b01-accf-cc257f9ee56f.png" alt="Wasp" width="151" height="151"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F982343%2F99b7a039-13b3-4eb5-820b-da74b180ddf6.jpeg" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/wasp/can-i-build-market-a-saas-app-to-100-in-1-month-36e7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Can I build &amp;amp; market a SaaS app to $100 in 1 month?&lt;/h2&gt;
      &lt;h3&gt;vincanger for Wasp ・ Jan 15&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#saas&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#marketing&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Should You Use an Open-source SaaS Boilerplate Starter or a $300+ Paid One?</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Wed, 11 Dec 2024 13:18:43 +0000</pubDate>
      <link>https://forem.com/wasp/should-you-use-an-open-source-saas-boilerplate-starter-or-a-300-paid-one-48ea</link>
      <guid>https://forem.com/wasp/should-you-use-an-open-source-saas-boilerplate-starter-or-a-300-paid-one-48ea</guid>
      <description>&lt;p&gt;SaaS boilerplate starters became a very popular thing in the web dev community, and also a pathway to a luxury lifestyle for those behind them, sometimes making north of five figure amounts per month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0l4b43f62icehvm0ar5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0l4b43f62icehvm0ar5.png" alt="Image description" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, there's also been a rise of the open-source SaaS boilerplate starters, that cover various stacks and offer similar features as their paid counterparts, but completely for free and with an active community alongside.&lt;/p&gt;

&lt;p&gt;So, what's the catch? Why pay $300 or $500 for something that you can simply get for free? Are there any trade-offs you should be aware of, and what are the pros and cons of each option?&lt;/p&gt;

&lt;p&gt;As it usually turns out in the real world, the answer isn't completely black and white and depends on what you need (your requirements) but also what you want (your personal preferences).&lt;/p&gt;

&lt;p&gt;The goal of this article is to break these further down and give you an objective, simple framework to follow when choosing a boilerplate starter for your next project. So, let's get into it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a sudden craze with all these starters? SaaS-es are not a new thing at all
&lt;/h2&gt;

&lt;p&gt;We have all been building web apps and SaaS-es for decades, you may rightfully observe, so why this became a thing just now? It seems like everybody is making their own starter today and getting a ton of excitement (and money) from the community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The answer is that the complexity of building a SaaS (or in another words, a web app) in the last ten years increased tenfold.&lt;/strong&gt; Partly it is due to the evolution of the underlying architecture (we switched from monolithic, server-based approach to “rich client ↔ backend”) which introduced more moving parts into the equation, and partly due to the explosion of options for each part of the stack.&lt;/p&gt;

&lt;p&gt;If you were about to build a SaaS fifteen years ago, you pretty much knew you'd go with either Ruby on Rails, Laravel, or Django, depending on which language and community you preferred. These would come as a batteries-included solution, give you their best defaults and you'd be up and running in a matter of hour(s). You got a single, well-tested path to follow and not much decisions to make.&lt;/p&gt;

&lt;p&gt;If you sit down and try to do the same today, your head would probably get dizzy after a few hour(s) of merely reading about all the possible options you could go with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What to use for the frontend?&lt;/strong&gt; Something mainstream as React, Vue or Angular, or something more sexy and bleeding edge like Svelte or Solid?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Should I use a React framework&lt;/strong&gt; e.g. Next or Remix? Or just go with React + Vite?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do I need SSR and SSG&lt;/strong&gt;? Or should I just stick with CSR?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What should I use as an API layer?&lt;/strong&gt; Good ol' REST, or maybe GraphQL, or maybe even typesafe RPC?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What to choose for the backend?&lt;/strong&gt; Do I use something lightweight like Express.js with Node/Bun/Deno or a full-blown solution such as Nest.js/Django/Rails? Or maybe finally try Phoenix/Livewire combo everybody has been talking about? Do I go serverless or not?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What about the database and ORM?&lt;/strong&gt; Relational or non-relational? Should I write raw queries or use a full-blown ORM such as Drizzle and Prisma? If yes, which one?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What are my hosting options?&lt;/strong&gt; Am I going to get locked in with a single provider? What if I want/need to host my app somewhere else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are just some of the questions you need to start thinking about when deciding how to start your SaaS in 2024. As you can see, it's more then enough to make your head spin and even if you're a seasoned developer and makes you feel like you need to be a rocket scientist to figure out the right combination.&lt;/p&gt;

&lt;p&gt;This is why people today turn to SaaS boilerplate starters and gladly even pay for it. It means somebody else did the legwork and (hopefully) made a sensible decision on the stack which will remain current and easy to maintain in the years to come.&lt;/p&gt;

&lt;p&gt;Now that we gave some context to the sudden rise of SaaS starters, let's back to the original question - why pay for something when there is an open-source, free version of it? Let's take a look at some of the factors that come to play.&lt;/p&gt;

&lt;h2&gt;
  
  
  With an open-source SaaS starter, you know exactly what you're getting into
&lt;/h2&gt;

&lt;p&gt;By the definition of open-source, &lt;strong&gt;you can see and examine the full code&lt;/strong&gt; &lt;strong&gt;of the starter in advance&lt;/strong&gt;, before committing to using it for your project.&lt;/p&gt;

&lt;p&gt;Although it's not likely you will go through every line of code beforehand and try to understand it all (that's why you're looking for a starter in the first place), you can check it out and see how you like it - e.g. the style of the code, readability and how well documented and tested it is.&lt;/p&gt;

&lt;p&gt;You can also see the repository's activity stats - number of open and closed issues, features in progress, commit frequency and how fast are things being resolved and new features added.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0uzft496zyumdefdo0ht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0uzft496zyumdefdo0ht.png" alt="Image description" width="800" height="853"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paid, closed-source starters, again by definition, offer at best a fraction of these benefits. You can see the value proposition as the author designed it - some hand-picked testimonials, a demo and potentially have a peek at the docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  With a paid starter, you become a member of an exclusive tribe (aka Air Jordans Effect)
&lt;/h2&gt;

&lt;p&gt;The most popular paid boilerplates today often come from well-known developers, or “indie makers,” who've already built successful products. Buying their boilerplate feels a bit like joining an exclusive club—it's as if you're tapping into their expertise and using the same tools they once used to succeed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9z6x27xpqnuumivd8om3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9z6x27xpqnuumivd8om3.png" alt="Image description" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's like wearing a jersey signed by a famous athlete or a perfume co-created by a pop star. It won't guarantee instant success, but it gives you a sense of connection and inspiration. You're reminded that someone else turned these same tools into something great—and that you could do it too!&lt;/p&gt;

&lt;p&gt;In the long run, this mindset might matter even more than the tools themselves. When things get hard, feeling part of that “club” could be what keeps you going, and taking your idea one step further.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security: in open-source, everyone is a reviewer
&lt;/h2&gt;

&lt;p&gt;Paid boilerplate starters are mostly an effort of a single person. It is the type of project that, past the initial development phase, doesn't require a full-time attention and is more of a seasonal nature (e.g. updating libraries to the latest versions). That makes it a perfect workload for a single person and also makes it much more profitable rather than splitting the margin with the team. If there was a whole team behind, it probably wouldn't cost $500, but rather $2000.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qqnz0havvbigggtnjdh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qqnz0havvbigggtnjdh.png" alt="Image description" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently, there was a security incident with one of the popular paid starters that allowed external parties to send unauthorized web hook requests, which caused a lot of ripples in the online community of builders.&lt;/p&gt;

&lt;p&gt;It is a good reminder that, while it's important to ship quickly, security isn't something that can be skipped over. And while nobody can guarantee the security of any SaaS starter, be it paid or open-source, the fact is that in open-source projects there are much more people involved in both development and code review. Since the code is freely available, you're also free to review it yourself, use any pen-testing tools on it or ask another expert to check it before committing to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  With a paid SaaS starter, the bus factor is 1, with open-source you get the full community support!
&lt;/h2&gt;

&lt;p&gt;A paid SaaS starter typically depends on a single maintainer. Since the code is closed source, nobody else has access nor rights to it, and &lt;strong&gt;if for any reason the author becomes unable or unwilling to continue working on it, that's the end of the story.&lt;/strong&gt; No support, updates, nor anybody to turn to with questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the other hand, &lt;a href="https://opensaas.sh/" rel="noopener noreferrer"&gt;an open-source boilerplate starter&lt;/a&gt; like Open SaaS is a living organism, with a number of contributors behind it.&lt;/strong&gt; As with any open-source project, there will typically be a smaller core team which does the bulk of the work and steers the project (and that might as well be a single person in the start), but anybody can join at any point, and they will. As the project grows and becomes more used, more and more people will start adding fixes and features they need themselves and take ownership of the specific parts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuax88cransu67fh5pt61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuax88cransu67fh5pt61.png" alt="Image description" width="672" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another thing to account for is it takes a long time for SaaS starter business to become more than a side income, and only a fraction of builders will ever come to that point. That means most of boilerplate creators will still have a full-time job or other engagements going on. Which means they will have a limited time for customer support and adding new features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open-source SaaS starter === unlimited updates. Closed source? Sometimes.
&lt;/h2&gt;

&lt;p&gt;An another direct benefit of the SaaS starter code being open-source is that you will have an immediate access to all the updates, as soon as they get released. That includes both security patches, version bumps and completely new features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfky453bdrk4tx9989q5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfky453bdrk4tx9989q5.png" alt="Image description" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With closed source, it varies a lot from one starter to another. Some offer updates as an upsell (e.g. basic and pro tier), some offer a limited time updates (e.g. 1-year), and some promise a lifetime of updates. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b28oc9hcpkkju09fzog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b28oc9hcpkkju09fzog.png" alt="Image description" width="742" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  With a paid SaaS starter, you might need to buy a “license” for every new app
&lt;/h2&gt;

&lt;p&gt;Another thing to be aware of is that, with paid starters, there often might be a limit to the number of apps you are allowed to start with a single starter purchase. It is typically phrased in terms of “licenses”, and if you exceed a limit you're legally required to buy a new one, although you already own the starter code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokb2m8g9hfu0sxsaw5nn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokb2m8g9hfu0sxsaw5nn.png" alt="Image description" width="610" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Again, this is not the case with all paid starters (some offer unlimited projects with a single purchase), but it is a common pattern worth checking before buying.&lt;/p&gt;

&lt;p&gt;With an open-source starter, there naturally isn't any such limit - the full source code is publicly available and you're free to use it in any way you see fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  With an open-source SaaS starter, you can add new features yourself!
&lt;/h2&gt;

&lt;p&gt;One of the most exciting benefits of the open-source approach is that anybody can contribute! If there is a feature you're missing or want to improve, you can simply do it yourself it and create a pull request. Then, the core maintainers will review it, give advice and point you in the right direction if needed. Once it gets merged, it is available for everyone to use!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.opensaas.sh%2F_astro%2Fcommunity-contributions.DlUiCAQ6_Z1ims7E.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.opensaas.sh%2F_astro%2Fcommunity-contributions.DlUiCAQ6_Z1ims7E.webp" width="800" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Now that we have gone through the main differences between open-source and paid SaaS starters, let's give it a bird's-eye view:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Lifetime updates&lt;/th&gt;
&lt;th&gt;Unlimited apps&lt;/th&gt;
&lt;th&gt;Maintainers&lt;/th&gt;
&lt;th&gt;Community&lt;/th&gt;
&lt;th&gt;Air Jordans Effect&lt;/th&gt;
&lt;th&gt;Easily contribute&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open-source SaaS starter&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;Many&lt;/td&gt;
&lt;td&gt;Big, public&lt;/td&gt;
&lt;td&gt;Rarely&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid starter&lt;/td&gt;
&lt;td&gt;$300+&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;td&gt;Typically one&lt;/td&gt;
&lt;td&gt;Sometimes, private&lt;/td&gt;
&lt;td&gt;Often&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is a useful list to be aware of when making a decision which route to go, but in the end there is no one answer that will fit all. Your decision will depend on what exactly you're looking to build and which tech stack you prefer using.&lt;/p&gt;

&lt;p&gt;Also, the factors above will not be equally weighted by everyone - one person might be excited about being a part of a wider community and being able to easily contribute to the project, while other most appreciate the fact there is a strong online personality they can follow and get inspired.&lt;/p&gt;

&lt;p&gt;In the end, the only important thing is to take action and successfully ship that application you've been thinking about for so long. Good luck! &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🎉 Our web framework reached 9,000 stars on GitHub! ⭐️ 9️⃣0️⃣0️⃣0️⃣ ⭐️</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Tue, 05 Mar 2024 14:01:52 +0000</pubDate>
      <link>https://forem.com/wasp/our-web-framework-reached-9000-stars-on-github-9000-jij</link>
      <guid>https://forem.com/wasp/our-web-framework-reached-9000-stars-on-github-9000-jij</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6mrq2mqbhb8dwvrfp26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6mrq2mqbhb8dwvrfp26.png" alt="wasp team photo" width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR - we reached a milestone with a web framework we created, despite all the odds! Check it out (and &lt;a href="https://github.com/wasp-lang/wasp"&gt;support us with the star&lt;/a&gt; if you like it - thank you! 🙏), and read below to learn about our story and what it took to get here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a developer, starting your own web framework is probably one of the scariest things you can do. It is almost certain your project will die, and as the added bonus, other developers will make fun of you along the way, counting all the reasons why it won't work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcu9469qr7fdcy9wwl8o.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcu9469qr7fdcy9wwl8o.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;br&gt;How sharing your idea for a new web framework feels like
  &lt;/p&gt;

&lt;p&gt;It's been no different for us. When we started Wasp, everybody asked &lt;em&gt;"Why another web framework? Why would anybody use your tool next to mature, famous frameworks?"&lt;/em&gt;. These are good questions, I admit, and we didn't have all the answers, not even close. But that was in no way the reason for us not to do it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floncvv6cn5ox644gggvy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floncvv6cn5ox644gggvy.png" width="594" height="168"&gt;&lt;/a&gt;&lt;br&gt;Three years ago, when we launched Wasp Alpha
  &lt;/p&gt;

&lt;p&gt;We kept going. We had a vision in our mind and we wanted to see if we can make it a reality. &lt;strong&gt;We didn't care at all whether Wasp lives or dies, we just knew that we needed to see it through, and that's all that mattered&lt;/strong&gt;. In a few months, we released Alpha version and got our first 100 stars. As a result, that brought in even more questions, and we weren't any closer to figuring out if the concept we imagined can really fly or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But, we also couldn't believe that somebody actually starred our repo. We were both surprised and motivated&lt;/strong&gt;. I still clearly remember Martin Šošić asking me &lt;em&gt;"Matija, can you imagine that the project we created gets to 1,000 stars on GitHub?"&lt;/em&gt;. Both of us immediately shooked our heads and laughed, thinking &lt;em&gt;"yeah, right, like that's gonna happen!"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9z36qtjswggstpgggoyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9z36qtjswggstpgggoyh.png" width="800" height="460"&gt;&lt;/a&gt;&lt;br&gt;Our first community update, celebrating 100 stars on GitHub!
  &lt;/p&gt;

&lt;p&gt;9,500 stars and almost 3 years later, here we are today. Wasp is getting close to entering the elite 10,000 stars club on GitHub, next to the giants of the industry. &lt;strong&gt;The framework we started, and developed further with the invaluable feedback from the community, is being used by all kinds of developers - from weekend projects, to startups and top enterprises&lt;/strong&gt;. Startups made with Wasp &lt;a href="https://dev.to/wasp/from-idea-to-exit-building-and-selling-an-ai-powered-saas-in-5-months-27d9"&gt;have been acquired&lt;/a&gt;. I just saw a job ad today on Upwork, where a company is hiring for &lt;a href="https://github.com/wasp-lang/open-saas"&gt;Open SaaS&lt;/a&gt; (an open-source, free boilerplate starter for React &amp;amp; Node.js, powered by Wasp) developers 🤯.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8qyb3a7qxwbg8d2x5g7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8qyb3a7qxwbg8d2x5g7.png" alt="Open SaaS" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking back, I still find it hard to believe it. Starting from my brother's girlfriend's (now wife) apartment with pretty much no open-source nor community-building experience, we made it to the product that developers all over the world use daily, and willingly choose to use it over the mainstream, famous frameworks we all know. We are incredibly honored and humbled by this.&lt;/p&gt;

&lt;p&gt;We still have an a lot of questions (figured that won't ever go away), but now it's also starting to feel like we got a couple of the answers right.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6md2ilfye1jss9mr7a60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6md2ilfye1jss9mr7a60.png" width="800" height="436"&gt;&lt;/a&gt;&lt;br&gt;The feedback we're getting today
  &lt;/p&gt;

&lt;p&gt;Thanks for reading! Find more about Wasp and support us on our journey to reaching 10,000 stars &lt;a href="https://github.com/wasp-lang/wasp"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;P.S.: If you ever wondered who's really the boss at Wasp, now we've finally made that clear in the photo above. Had to carry the li'l dude all the way to the top just so he could get a nice shot. 🐝&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>news</category>
    </item>
    <item>
      <title>🏞️5 beautiful open-source web apps to learn from and get inspired 🙇‍♀️💡</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Wed, 17 Jan 2024 13:11:12 +0000</pubDate>
      <link>https://forem.com/matijasos/5-beautiful-open-source-web-apps-to-learn-from-and-get-inspired-280f</link>
      <guid>https://forem.com/matijasos/5-beautiful-open-source-web-apps-to-learn-from-and-get-inspired-280f</guid>
      <description>&lt;p&gt;As the title says, in this post, we'll cover open-source web apps you can learn from and use as a starting point for your next project. Stick around till the end, as there is a cool bonus waiting for you there!&lt;/p&gt;

&lt;p&gt;Before we get into it, a few words of wisdom (hopefully 😅):&lt;/p&gt;

&lt;h2&gt;
  
  
  The importance of (open source) role models
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqf1wss7puysn3q0rhso.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqf1wss7puysn3q0rhso.gif" alt="you are beautiful" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When starting a new project from scratch, one of the most helpful things you can do is pick one or more role models.&lt;/strong&gt; For example, if you’re building a new productivity app, you might look after products such as Trello or Asana. Of course, your app will not be the same, and you probably have in mind some core differences that make your app unique, but there will still be a lot of shared concepts and mechanisms that you don’t want to reinvent.&lt;/p&gt;

&lt;p&gt;Even if your role model is a closed-source app, you will still get a lot of value simply by observing it in the wild - design elements, UI, user journey, and terminology used, …&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But now imagine if the app you decided to learn from was open source, and you could easily access its full source code on GitHub - that opens a whole new universe of possibilites!&lt;/strong&gt; Next to simply observing how the app works from the “outside” and guessing what’s happening under the hood, now you get to see every single detail and understand every decision made. Architecture, deployment, API design, libraries, and algorithms used - it’s all in there for you to see!&lt;/p&gt;

&lt;h2&gt;
  
  
  Mind the scale (aka don’t over-engineer)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi51owsfvx8cmajcvvues.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi51owsfvx8cmajcvvues.png" width="800" height="357"&gt;&lt;/a&gt;&lt;br&gt;Credit: &lt;a href="https://twitter.com/Dominus_Kelvin/status/1747315668083417440" rel="noopener noreferrer"&gt;this tweet&lt;/a&gt; by Dominus Kelvin
  &lt;/p&gt;

&lt;p&gt;One more thing to keep in mind is the stage at which your project is currently. Below, we’ll see different examples of open-source SaaS apps, ranging from indie hacker, “build it in a weekend” side projects to enterprise-grade web platforms. &lt;strong&gt;Although you might find a project with millions of users an amazing resource to learn from, keep in mind that not everything they did is what you have to strictly follow. Their architectural and design decisions will often be more complex due to the sheer scale and amount of users they experience daily&lt;/strong&gt;. If you are just starting out, it is best to stick with the simplest (but still sound) approach until you, hopefully, need a more advanced one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;From here on, for each app we mention, we’ll use a “t-shirt size” methodology (S, M, L, …) to give you a rough feeling of its size and complexity, both in terms of features and users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, with the foreword out of the way, let’s together check out some amazing open-source apps you can start learning from right away:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7z4q2cxeiocgpgj3ofs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7z4q2cxeiocgpgj3ofs.gif" alt="fun starts now" width="480" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://coverlettergpt.xyz/" rel="noopener noreferrer"&gt;CoverLetterGPT&lt;/a&gt; - the perfect starting spot for an AI-powered SaaS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpcffse8az1c7ekyqemf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpcffse8az1c7ekyqemf.png" alt="cover letter gpt" width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/vincanger/coverlettergpt" rel="noopener noreferrer"&gt;https://github.com/vincanger/coverlettergpt&lt;/a&gt;&lt;br&gt;
👕 &lt;strong&gt;Size&lt;/strong&gt;: S&lt;br&gt;
&lt;strong&gt;🛠️ Stack&lt;/strong&gt;: Chakra UI, React, Node.js, and Prisma, powered by &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;Wasp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://CoverLetterGPT.xyz" rel="noopener noreferrer"&gt;CoverLetterGPT.xyz&lt;/a&gt; is every indie hacker’s dream - &lt;strong&gt;it’s a GPT-powered SaaS, fully open-source, and most importantly, it’s a real product that people use every day and also pay for&lt;/strong&gt;! Given your CV and a job description, this tool will generate a professionally written cover letter. You can then further adjust the tone for each paragraph or edit it manually.&lt;/p&gt;

&lt;p&gt;It’s perfect for learning since it isn’t too big and the architecture is simple, but it has all the features you might need in an app - social authentication (Google), cron jobs, file upload, GPT integration, payment integration via Stripe, and even payments via Bitcoin!&lt;/p&gt;

&lt;p&gt;CoverLetterGPT is made with React, Node.js, and Prisma, powered by the &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;Wasp framework&lt;/a&gt;, which takes care of all the plumbing and removes a ton of boilerplate. &lt;strong&gt;The best part is you can deploy your app for free when you’re ready by running a single CLI command&lt;/strong&gt;: &lt;code&gt;wasp deploy&lt;/code&gt;.&lt;/p&gt;

&lt;center&gt;&lt;h3&gt;🚨 Attention 🚨&lt;/h3&gt;&lt;/center&gt;

&lt;blockquote&gt;
&lt;p&gt;Hint: The Wasp team recently released &lt;a href="https://kdta.io/github-wasp-lang-open_3" rel="noopener noreferrer"&gt;OpenSaaS&lt;/a&gt;, &lt;strong&gt;a completely free and open-source boilerplate starter for React and Node.js&lt;/strong&gt;. It contains everything mentioned + Tailwind, admin dashboard, landing page, blog, and more. &lt;a href="https://kdta.io/github-wasp-lang-open_4" rel="noopener noreferrer"&gt;Check it out here&lt;/a&gt; to get started even faster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;center&gt;
&lt;a href="https://kdta.io/github-wasp-lang-open_2" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Star OpenSaaS on GitHub ⭐️&lt;/a&gt;
&lt;/center&gt;

&lt;h2&gt;
  
  
  Supabase Studio - a dashboard masterpiece 🖼️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjc2pz1vhg1wysk7o9148.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjc2pz1vhg1wysk7o9148.gif" alt="Supabase studio" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/supabase/supabase/tree/master/apps/studio" rel="noopener noreferrer"&gt;https://github.com/supabase/supabase/tree/master/apps/studio&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;👕 Size&lt;/strong&gt;: M/L&lt;br&gt;
&lt;strong&gt;🛠️ Stack:&lt;/strong&gt; Next.js (React), Tailwind&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; is a renowned open-source project with its core written in Elixir. But, since we are focusing on web apps in this article, we’ll take a look at &lt;strong&gt;Supabase Studio - a dashboard where you can see and manage all of your projects. It is a masterpiece in itself and also fully open-source!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The design is custom-made with Tailwind, and there are plenty of elements you might want to reuse for your own project - user management, tables, lists, etc. It also has its own AI integration for writing SQL queries, which works surprisingly well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Papermark - the open-source DocSend alternative ✉️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkt76y923xnpjhbglbvmn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkt76y923xnpjhbglbvmn.png" alt="papermark_banner" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/mfts/papermark" rel="noopener noreferrer"&gt;https://github.com/mfts/papermark&lt;/a&gt;&lt;br&gt;
👕 &lt;strong&gt;Size&lt;/strong&gt;: M&lt;br&gt;
&lt;strong&gt;🛠️ Stack&lt;/strong&gt;: Next.js (React), Tailwind, Prisma&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mfts/papermark" rel="noopener noreferrer"&gt;Papermark&lt;/a&gt; has recently been getting a lot of love from the community, especially for its clean design and intuitive interface. Although it might look simple from the outside, this app packs a lot of functionalities that make everything work smoothly: file upload, email sending, built-in analytics, and custom domains…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you’re building something that involves a lot of document management and user collaboration&lt;/strong&gt;, this is definitely a project you should take a look at.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://Crowd.dev" rel="noopener noreferrer"&gt;Crowd.dev&lt;/a&gt; - dev community data platform, made with Vue 📊👩‍💻
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykd2vxomnrl02j46i7mm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykd2vxomnrl02j46i7mm.png" alt="crowd_dev_banner" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/CrowdDotDev/crowd.dev" rel="noopener noreferrer"&gt;https://github.com/CrowdDotDev/crowd.dev&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;👕 Size&lt;/strong&gt;: M&lt;br&gt;
&lt;strong&gt;🛠️ Stack:&lt;/strong&gt; Vue, Node.js&lt;/p&gt;

&lt;p&gt;&lt;a href="http://Crowd.dev" rel="noopener noreferrer"&gt;Crowd.dev&lt;/a&gt; is one of the latest rising stars of GitHub - it is a platform for monitoring your community activity, be it on Slack or Discord. If you are running your own developer community, a tool like this is a must-have in order to understand what’s happening and who the most active members are.&lt;/p&gt;

&lt;p&gt;It offers a lot on the dashboard side, but its other forte is &lt;strong&gt;integrations - if you are building an app that ingests and processes a lot of data from outside sources, this is your go-to role model&lt;/strong&gt;. Bonus points if you are a Vue lover because that’s what this project is made with!&lt;/p&gt;

&lt;h2&gt;
  
  
  Habitica - Habit tracker as an RPG 🐲⚔️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg69lfe93k931fyoj1fzv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg69lfe93k931fyoj1fzv.png" alt="habitica_banner" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/HabitRPG/habitica" rel="noopener noreferrer"&gt;https://github.com/HabitRPG/habitica&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;👕 Size&lt;/strong&gt;: L&lt;br&gt;
&lt;strong&gt;🛠️ Stack:&lt;/strong&gt; Vue, Bootstrap, SAAS, Node.js, MongoDB&lt;/p&gt;

&lt;p&gt;&lt;a href="https://habitica.com/" rel="noopener noreferrer"&gt;Habitica&lt;/a&gt; is one of the coolest web apps (they also have iOS and Android apps) I’ve seen in a while - it helps you organize your life, tasks, and habits through the RPG game! Imagine a Kanban board like Trello, but for each task you complete, you earn XP and gold, and you can even team up with friends to take up quests.&lt;/p&gt;

&lt;p&gt;Habitica has been around for 10 years, and it has stood the test of time beautifully with a classical stack of Vue, Node.js/Express, and MongoDB. &lt;strong&gt;If you want to see how rich, interactive UIs are built but also what kind of architecture is needed to run a project at this scale, this app is definitely worth checking out.&lt;/strong&gt; Who knows, you might even end up as a Habitican yourself!&lt;/p&gt;

&lt;h2&gt;
  
  
  🏆 &lt;strong&gt;Bonus&lt;/strong&gt; 🏆 Appflowy - Notion alternative in Rust and Flutter 🤯
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlzizemi22g9wkb48yfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlzizemi22g9wkb48yfz.png" alt="appflowy_banner" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💾 &lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/AppFlowy-IO/AppFlowy" rel="noopener noreferrer"&gt;https://github.com/AppFlowy-IO/AppFlowy&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;👕 Size&lt;/strong&gt;: M&lt;br&gt;
&lt;strong&gt;🛠️ Stack:&lt;/strong&gt; Flutter, Rust&lt;/p&gt;

&lt;p&gt;If you came this far, you deserved a special treat! This one isn’t a web app, but it is so cool I couldn’t help myself - it is &lt;strong&gt;a Notion alternative (so note-taking on steroids) built with Rust and Flutter&lt;/strong&gt;! Due to its local-first nature, the user experience is extremely smooth, and it also syncs everything to the cloud (which you can host yourself if you wish).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you’ve been playing around with Rust but are also looking for a project to contribute to that you could use daily, Appflowy might be a perfect fit.&lt;/strong&gt; It has everything from data storage to business logic and UI, all in one package for you to learn and see what you find the most interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  That's it! I'd love to hear from you 🫵
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovyclq3iyi3d15kfxcaw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovyclq3iyi3d15kfxcaw.gif" alt="that_is_all" width="470" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's all we had for today (&lt;em&gt;drops the mic&lt;/em&gt;), thanks so much for reading! I hope you found it useful and/or interesting.&lt;/p&gt;

&lt;p&gt;There were so many open-source web apps I came across while writing this, and it was so hard to select only 5 of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now, I'd love to hear from you - what are your favorite open-source apps, and how are you using them? Write it below in the comments 👇&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thank you, and see you next time! 👋&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🥇The Best Web Framework Doesn't Exist 🚫</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Wed, 10 Jan 2024 13:23:04 +0000</pubDate>
      <link>https://forem.com/wasp/the-best-web-framework-doesnt-exist-2aom</link>
      <guid>https://forem.com/wasp/the-best-web-framework-doesnt-exist-2aom</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR;&lt;/strong&gt; The web app framework you choose doesn’t really matter. Well, it matters, just not as much as others would like you to believe.&lt;/p&gt;

&lt;p&gt;The fact that so many libraries and frameworks exist in 2024, and that the best one is &lt;a href="https://joshcollinsworth.com/blog/self-fulfilling-prophecy-of-react"&gt;still hotly debated&lt;/a&gt;, proves my point. It’s the web developers' biggest “first-world problem” — a problem that’s not really a problem. On Maslow’s Hierarchy of Developer Needs, it’s definitely near the top (ok, I made that up 😅)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F412awt20ksr3d44a4b7b.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F412awt20ksr3d44a4b7b.jpeg" alt="dev needs" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For example, according to the &lt;a href="https://2022.stateofjs.com/en-US/libraries/front-end-frameworks/"&gt;StateOfJS&lt;/a&gt; survey of 2022 (we're still waiting for 2023 results to roll in), there were 5 Front-end Frameworks with good retention in 2018; there were 11 in 2022. That’s a 120% increase in a matter of 4 years, and that’s not even taking into account the hot meta-frameworks like NextJS, &lt;a href="https://github.com/wasp-lang/wasp"&gt;Wasp&lt;/a&gt;, SvelteKit, or Astro!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94zifqs2ui1rxt9kc0yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94zifqs2ui1rxt9kc0yw.png" alt="frameworks throughout years" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are great developments for the space, overall. They improve things like developer speed, bundle size, performance, and developer experience. But they also make it damn hard for developers and teams to make a decision when trying to decide which to use for their next project. It’s even worse for beginners, which is probably why they just go for React, the most "mainstream" solution.&lt;/p&gt;

&lt;p&gt;And I think all of this is OK, because in the end it doesn’t really matter which one you choose. &lt;strong&gt;When it really comes down to it, all that matters is the framework you chose&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is stable (enough)&lt;/li&gt;
&lt;li&gt;Allows you to move quickly&lt;/li&gt;
&lt;li&gt;Allows you to reach your end goal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why? Because most of them are built around the same concepts, have proven themselves capable of performing at scale, and have communities you can engage with and learn from.&lt;/p&gt;

&lt;p&gt;React might be the most prominent one in job descriptions, but if you’re looking for a new role and only have experience in Vue or Angular, I can’t imagine it would take you more than a week to build a side-project with React to display your ability to prospective employers.&lt;/p&gt;

&lt;p&gt;On the flip side, if you’re a beginner or Junior dev, once you have the basics of HTML, CSS, and JS under your belt, it doesn’t really matter what framework you learn. I personally started learning backend development with PHP, but then later switched to frontend in Angular. In my second subsequent role I used React, and now I work with &lt;a href="https://wasp-lang.dev"&gt;Wasp&lt;/a&gt; (a full-stack framework built on top of React and Node.js) to develop my side project, &lt;a href="https://reflectdaily.app/"&gt;https://reflectdaily.app/&lt;/a&gt;. &lt;a href="https://www.youtube.com/watch?v=gl5HvBpUbt8"&gt;Developers never stop learning&lt;/a&gt;, so it’s kind of a non-argument to deride any specific framework — unless it really sucks, but then no one will continue to use it anyway.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjbnn4xijtjrwxz8p9n4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjbnn4xijtjrwxz8p9n4.jpeg" alt="Use what works" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, in the end, use what works. Because in 99.99% of cases, your choice of web framework will not decide the fate of your project.&lt;/p&gt;

&lt;p&gt;If you’ve done a bit of research and found a framework that suits your needs and you enjoy using it — &lt;strong&gt;use it&lt;/strong&gt;. There’s really no good reason not to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support us! 🙏⭐️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid9s6t8rcvfxty40bv2m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid9s6t8rcvfxty40bv2m.gif" alt="GH star click" width="360" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you liked this article, &lt;a href="https://kdta.io/github-wasp-lang-wasp_18"&gt;consider giving us a star on Github&lt;/a&gt;! Everything we do at Wasp is open source, and your support helps us make web development easier and motivates us to write more articles like this one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgbmn45pia04bxt6zf83.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgbmn45pia04bxt6zf83.gif" alt="support us" width="746" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kdta.io/github-wasp-lang-wasp_19" class="ltag_cta ltag_cta--branded"&gt;⭐️ Thank You For Your Support 🙏&lt;/a&gt;
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI code generation vs. coding by hand - what programming is going to look like in 202X 🤖 🤔</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Mon, 11 Dec 2023 14:39:35 +0000</pubDate>
      <link>https://forem.com/wasp/ai-code-generation-vs-coding-by-hand-what-programming-is-going-to-look-like-in-202x-1idh</link>
      <guid>https://forem.com/wasp/ai-code-generation-vs-coding-by-hand-what-programming-is-going-to-look-like-in-202x-1idh</guid>
      <description>&lt;p&gt;We are working on a &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;full-stack web framework for React &amp;amp; Node.js&lt;/a&gt;, that uses a simple configuration language to get rid of boilerplate. A number of times, we've been asked, &lt;em&gt;“Why are you bothering creating a new framework for web app development? Isn’t ChatGPT / LLM X soon going to be generating all the code for developers anyhow?”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is our take on the situation and what we believe things will look like in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do we need (AI) code generation?
&lt;/h2&gt;

&lt;p&gt;In order to make development faster, we first came up with IDE autocompletion - if you are using React and start typing &lt;code&gt;use&lt;/code&gt;, IDE will automatically offer to complete it to &lt;code&gt;useState()&lt;/code&gt; or &lt;code&gt;useEffect()&lt;/code&gt;. Besides saving keystrokes, maybe even more valuable is being able to see what methods/properties are available to us within a current scope. IDE's awareness of the project structure and code hierarchy also makes refactoring much easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Although that was already great, how do we take it to the next level?&lt;/strong&gt; Traditional IDE support is based on rules written by humans, and if we, for example, wanted to make IDE capable of implementing common functions for us (e.g., &lt;em&gt;fetch X using API Y&lt;/em&gt;, or &lt;em&gt;implement quicksort&lt;/em&gt;), there would be just too many of them to catalogize and maintain by hand.&lt;/p&gt;

&lt;p&gt;If there was only a way for a computer to analyze all the code we’ve written so far and learn by itself how to autocomplete our code and what to do about humanity in general, instead of us doing all the hard work ...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Y6ljFaKRTrI" rel="noopener noreferrer"&gt;Delicious and moist cake aside&lt;/a&gt;, we actually have this working! Thanks to the latest advances in machine learning, IDEs can now do some really cool things, like proposing the full implementation of a function, based on its name and the short comment on top:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9p0mivtdpmjcskgt7qnl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9p0mivtdpmjcskgt7qnl.gif" alt="GPT function implementation example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is pretty amazing! The example above is powered by &lt;a href="https://copilot.github.com/" rel="noopener noreferrer"&gt;Github Copilot&lt;/a&gt; - it’s essentially a neural network trained on a huge amount of publicly available code. I will not get into the technical details of how it works under the hood, but there are plenty of great articles and videos covering the science behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seeing this, questions arise - what does this mean for the future of programming?&lt;/strong&gt; Is this just IDE autocompletion on steroids or something more? Do we need to keep bothering with manually writing code, if we can just type in the comments what we want, and that’s it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Support us! 🙏⭐️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3a8gkl9fcs0a8rl4zsq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3a8gkl9fcs0a8rl4zsq.gif" alt="star_us"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you wish to express your support for what we are doing, consider &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;giving us a star on Github&lt;/a&gt;! Everything we do at Wasp is open source, and your support motivates us and helps us to keep making web app development easier and with less boilerplate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz3ok1dpfkscsoo0n2om.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz3ok1dpfkscsoo0n2om.gif" alt="Toss a star"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kdta.io/github-wasp-lang-wasp_11" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Thanks For Your Support 🙏&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Question: Who maintains the code once it’s generated?
&lt;/h2&gt;

&lt;p&gt;When thinking about how ML code generation affects the overall development process, there is one thing to consider that often doesn’t immediately spring to mind when looking at all the impressive examples.&lt;/p&gt;

&lt;p&gt;The question is - &lt;strong&gt;what happens with the code once it is generated? Who is responsible for it, and who will maintain and refactor it in the future?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bzh9yp2ejwhu4zpio0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bzh9yp2ejwhu4zpio0e.png" alt="always has been"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although ML code generation helps with getting the initial code for a specific feature written, it cannot do much beyond that - if that code is to be maintained and changed in the future (and if anyone uses the product, it is), the developer still needs to own and understand it fully. You can again use AI to help you, but in the end, you're the one responsible for it.&lt;/p&gt;

&lt;p&gt;Imagine all we had was an assembly language, but code generation worked really well for it, and you could say &lt;em&gt;“implement a function that sorts an array, ascending”&lt;/em&gt; and it would produce the required code perfectly. Would that still be something you’d like to return to in the future once you need to change your sort to descending 😅?&lt;/p&gt;

&lt;p&gt;Or, to get closer to our daily lives, would it be all the same to you if the generated React code used the old class syntax, or functional components and hooks?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In other words, it means GPT and other LLMs do not reduce the code complexity nor the amount of knowledge required to build features&lt;/strong&gt;, they just help write the initial code faster and bring the knowledge/examples closer to the code (which is really helpful). &lt;strong&gt;If a developer accepts the generated code blindly, they are just creating tech debt and pushing it forward&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet the big A - Abstraction 👆
&lt;/h2&gt;

&lt;p&gt;If ChatGPT and the gang cannot solve all our troubles of learning how to code and understanding in detail how, for example, session management via JWTs works, what can?&lt;/p&gt;

&lt;p&gt;Abstraction - that’s how programmers have been dealing with code repetition and reducing complexity for decades - by creating libraries, frameworks, and languages. It is how we advanced from vanilla JS and direct DOM manipulation to jQuery and finally to UI libraries such as React and Vue.&lt;/p&gt;

&lt;p&gt;Introducing abstractions inevitably means giving up on a certain amount of power and flexibility (e.g., when summing numbers in Python, you don’t get to exactly specify which CPU registers are going to be used for it), but the point is that, if done right, you don’t need nor want such power in the majority of the cases.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75uhgmdu7fq5wcwhe6tw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75uhgmdu7fq5wcwhe6tw.jpg"&gt;&lt;/a&gt;&lt;br&gt;What Uncle Ben actually meant: avoiding responsibility is the main benefit of abstraction! (Peter totally missed the point, unfortunately, and became Spiderman instead of learning how to code)
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The only way not to be responsible for a piece of code is that it doesn’t exist in the first place.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because as soon as pixels on the screen change their color it’s something you have to worry about, and that is why the main benefit of all frameworks, languages, etc. is &lt;em&gt;less code == fewer decisions == less responsibility&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The only way to have less code is to make fewer decisions and provide fewer details to the computer on how to do a certain task - ideally, we’d just state what we want, and we wouldn’t even care about how it is done, as long as it’s within the time/memory/cost boundaries we have (so we might need to state those as well).&lt;/p&gt;

&lt;p&gt;Let’s take a look at the very common (and everyone’s favorite) feature in the world of web apps - authentication (yaay ☠️ 🔫)! The typical code for it will look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SecurePassword&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secure-password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;util&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;util&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../dbClient.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;handleRejection&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../utils.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../config.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jwtSign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;promisify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jwtVerify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;promisify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;JWT_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jwtSecret&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;jwtSign&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;verify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;jwtVerify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;handleRejection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;authHeader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;authHeader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bearer &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;authHeader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;authHeader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;userIdFromToken&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;userIdFromToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TokenExpiredError&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JsonWebTokenError&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NotBeforeError&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findUnique&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userIdFromToken&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;userView&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;

    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userView&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SecurePassword&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hashPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hashedPwdBuffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;hashedPwdBuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;verifyPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hashedPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hashedPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is just a portion of the backend code (and for the username &amp;amp; password method only)! As you can see, we have quite a lot of flexibility here and get to do/specify things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;choose the implementation method for auth (e.g. session or JWT-based)&lt;/li&gt;
&lt;li&gt;choose the exact npm packages we want to use for the token (if going with JWT) and password management&lt;/li&gt;
&lt;li&gt;parse the auth header and specify for each value (Authorization, Bearer, …) how to respond&lt;/li&gt;
&lt;li&gt;choose the return code (e.g. 401, 403) for each possible outcome&lt;/li&gt;
&lt;li&gt;choose how the password is decoded/encoded (base64)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the one hand, it’s really cool to have that level of control and flexibility in our code, but on the other hand, it’s quite a lot of decisions (== mistakes) to be made, especially for something as common as authentication!&lt;/p&gt;

&lt;p&gt;If somebody later asks “&lt;em&gt;so why exactly did you choose secure-password npm package, or why exactly base64 encoding?&lt;/em&gt;” it’s something we should probably answer with something else rather than “&lt;em&gt;well, there was that SO post from 2012 that seemed pretty legit, it had almost 50 upvotes. Hmm, can’t find it now, though. Plus, it has ‘secure’ in the name, that sounds good, right?&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;Another thing to keep in mind is that we should also track how things change over time, and ensure that after a couple of years, we’re still using the best practices and that the packages are regularly updated.&lt;/p&gt;

&lt;p&gt;If we try to apply the principles from above (less code, less detailed instructions, stating &lt;strong&gt;what&lt;/strong&gt; we want instead of &lt;strong&gt;how&lt;/strong&gt; it needs to be done), the code for authentication might look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;auth: {
    userEntity: User,
    externalAuthEntity: SocialLogin,
    methods: {
      usernameAndPassword: {},
      google: {}
    },
    onAuthFailedRedirectTo: "/login",
    onAuthSucceededRedirectTo: "/dashboard"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Based on this, the computer/compiler could take care of all the stuff mentioned above, and then depending on the level of abstraction, provide some sort of interface (e.g. form components, or functions) to “hook” in with our own e.g. React/Node.js code (btw this is how it actually &lt;a href="https://wasp-lang.dev/docs/auth/overview" rel="noopener noreferrer"&gt;works in Wasp&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;We don’t need to care what exact packages or encryption methods are used beneath the hood - it is the responsibility we trust with the authors and maintainers of the abstraction layer, just like we trust that Python knows the best how to sum two numbers on the assembly level and that it is kept in sync with the latest advancements in the field. The same happens when we rely on the built-in data structures or count on the garbage collector to manage our program’s memory well.&lt;/p&gt;

&lt;h2&gt;
  
  
  But my beautiful generated codez 😿💻! What happens with it then?
&lt;/h2&gt;

&lt;p&gt;Don’t worry, it’s all still here and you can generate all the code you wish! The main point to understand here is that AI code generation and framework/language development complement rather than replace each other and are here to stay, which is ultimately a huge win for the developer community - they will keep making our lives easier and allow us to do more fun stuff (instead of implementing auth or CRUD API for the n-th time)!&lt;/p&gt;

&lt;p&gt;I see the evolution here as a cycle (or an upward spiral in fact, but that’s beyond my drawing capabilities):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;language/framework: exists&lt;/strong&gt;, is mainstream, and a lot of people use it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;patterns start emerging&lt;/strong&gt; (e.g. implementing auth, or making an API call) → AI learns them, offers via autocomplete&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;some of those patterns mature&lt;/strong&gt; and become stable → candidates for abstraction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;new, more abstract, language/framework&lt;/strong&gt; emerges&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;back to step 1.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9na8wwmaqfabhx1dkuaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9na8wwmaqfabhx1dkuaf.png"&gt;&lt;/a&gt;&lt;br&gt;It’s the circle of (language) life, and it moves us all - Ingonyama nengw' enamabala, …
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This means we are winning on both sides - when the language is mainstream we can benefit from AI-powered code generation, helping us write the code faster. On the other hand, when the patterns of code we don’t want to repeat/deal with emerge and become stable we get a whole new language or framework that allows us to write even less code and care about fewer implementation details!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffistx8x0w8ee62nr1kl5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffistx8x0w8ee62nr1kl5.gif" alt="fizz buzz stop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading and hope you found this post informative! I'd love to hear if you agree with this (or not), and how you see the future of programming powered with the AI tools.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>gpt3</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Develop the right thing every time and become a 10x engineer 🏆: The art of writing RFCs 🥋</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Tue, 05 Dec 2023 13:11:40 +0000</pubDate>
      <link>https://forem.com/wasp/develop-the-right-thing-every-time-and-become-a-10x-engineer-the-art-of-writing-rfcs-2mc6</link>
      <guid>https://forem.com/wasp/develop-the-right-thing-every-time-and-become-a-10x-engineer-the-art-of-writing-rfcs-2mc6</guid>
      <description>&lt;p&gt;Imagine you’ve been tasked to implement a crucial new feature in the product you’re working on. That’s the opportunity you’ve been waiting for - everybody will see what a 10x developer you are! You open a list of the coolest new libraries and design patterns you’ve wanted to try out and get right into it, full “basement” mode. One week later, you victoriously emerge and present your perfect pull request!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But then, the senior dev in a team immediately rejects it&lt;/strong&gt; - &lt;strong&gt;&lt;em&gt;“Too complex, you should have simply used library X and reused Y.”&lt;/em&gt;&lt;/strong&gt;. What!? Obviously, they don’t get how genius your solution is, and soon, you’re looking at 100 comments on your PR and days of refactoring to follow.&lt;/p&gt;

&lt;p&gt;If only there were a way to know about X and Y before you implemented everything. Well, it is, and it’s called RFC!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz50pl0vodfeisluten8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz50pl0vodfeisluten8n.png" alt="RFC invention comic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’ll learn about it on the example of &lt;a href="https://www.notion.so/RFC-Auth-without-user-defined-entities-6d2925439627456ab01b74ff4b4cd087?pvs=21" rel="noopener noreferrer"&gt;RFC about implementing authentication in Wasp&lt;/a&gt;. &lt;strong&gt;&lt;a href="https://kdta.io/github-wasp-lang-wasp_4" rel="noopener noreferrer"&gt;Wasp&lt;/a&gt; is a full-stack framework built on top of React, Node.js, and Prisma that offers a ton of features out of the box and is the fastest way to build and deploy your app&lt;/strong&gt;. It also comes with a free GPT-powered codebase generator, &lt;a href="https://usemage.ai/" rel="noopener noreferrer"&gt;MAGE&lt;/a&gt;, that has been used to create over 30,000 applications.&lt;/p&gt;

&lt;p&gt;Let’s dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  Support us! 🙏⭐️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid9s6t8rcvfxty40bv2m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fid9s6t8rcvfxty40bv2m.gif" alt="GH star click"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find this post helpful, &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;consider giving us a star on Github&lt;/a&gt;! Everything we do at Wasp is open source, and your support helps us make web development easier and motivates us to write more articles like this one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgbmn45pia04bxt6zf83.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqgbmn45pia04bxt6zf83.gif" alt="support us"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kdta.io/github-wasp-lang-wasp_3" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Thanks For Your Support 🙏&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what is an RFC?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgno8rt4o3ffxhcj72nmk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgno8rt4o3ffxhcj72nmk.png" alt="RFC overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RFC stands for &lt;em&gt;Request For Comments&lt;/em&gt;, and simply means &lt;strong&gt;“&lt;/strong&gt;a document proposing a codebase change to solve a specific problem.”. &lt;strong&gt;Its main purpose is to find the best way to solve a problem before the implementation starts.&lt;/strong&gt; RFCs were first adopted by the open-source community, but today, they are used in almost any type of developer organization.&lt;/p&gt;

&lt;p&gt;There are other names for this type of document you might encounter in the industry, like TDD (&lt;em&gt;Technical Design Document&lt;/em&gt;) or SDD (&lt;em&gt;Software Design Document&lt;/em&gt;). Some people argue over the distinction between them, but we won’t.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fun fact&lt;/strong&gt;: RFCs were invented by IETF (&lt;em&gt;Internet Engineering Task Force&lt;/em&gt;), the engineering organization behind some of the most important internet standards and protocols we use today! Not too shabby, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  When should I write RFC, and when can I skip it?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1kvwj97oaduwczudc1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1kvwj97oaduwczudc1b.png" alt="RFC meme just code it"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, why bother writing about what you will eventually code, instead of saving time and simply doing it? &lt;strong&gt;If you’re dealing with a bug or a relatively simple feature, where it’s very clear what you must do and doesn’t affect project structure, then there’s no need for an RFC - fire up that IDE and get cracking!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But, if you are introducing a completely new concept (e.g., introducing a role-based permission system) or altering the project’s architecture (e.g., adding support for running background jobs), then you might want to take a step back before typing &lt;code&gt;git checkout -b my-new-feature&lt;/code&gt; and diving into that sweet coding zone.&lt;/p&gt;

&lt;p&gt;All the above being said, sometimes it's not easy to figure out if you should write that RFC or not. Maybe it’s a more prominent feature, but you’ve done something similar before, and you’ve already mapped everything out in your head and pretty much have no questions. To help with that, here’s a simple heuristic I like to use: &lt;strong&gt;Is there more than one obvious way to implement this feature? Is there a new library/service we have to pick?&lt;/strong&gt; If the answer to both of these is “No", you probably don’t need an RFC. Otherwise, there’s a discussion to be had, and RFC is the way to do it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2a956hqeyai31igbl92q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2a956hqeyai31igbl92q.png" alt="RFC flowchart - when to write it"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s in it for me?
&lt;/h2&gt;

&lt;p&gt;We’ve established how to decide &lt;em&gt;when&lt;/em&gt; to write an RFC, but here is also &lt;em&gt;why&lt;/em&gt; you should do it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You will organize your thoughts and get clarity&lt;/strong&gt;. If you’ve decided to write an RFC, that means you’re dealing with a non-trivial, open-ended problem. Writing things down will help distill your thoughts and have an objective look at them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You will learn more&lt;/strong&gt; than if you just jumped into coding. You will give yourself space to explore different approaches and oftentimes discover something you haven’t even thought of initially.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You will crowdsource your team’s knowledge.&lt;/strong&gt; By asking your team for feedback (hence Request For Comments), you will get a complete picture of the problem you’re solving and fill in any remaining gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You will advance your team’s understanding of the codebase.&lt;/strong&gt; By collaborating on your RFC, everybody on the team will understand what you’re doing and how you eventually did it. That means next time somebody has to touch that part of the code, they will need to ask you much less questions (=== more uninterrupted coding time!).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR reviews will go &lt;em&gt;much&lt;/em&gt; smoother&lt;/strong&gt;. Remember that situation from the beginning of this article, when your PR got rejected as "too complex"? That’s because the reviewer is missing the context, and you made a sizeable change without a previous buy-in from the rest of the team. By writing an RFC first, you’ll never encounter this type of situation again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your documentation is already 50% done!&lt;/strong&gt; To be clear, RFC is not the final documentation, and you cannot simply point to it, but you can likely reuse a lot - images, diagrams, paragraphs, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wow, this sounds so good that I want to come up with a new feature right now just so I can write an RFC for it! Joke aside, going through with the RFC first makes the coding part much more enjoyable - you know exactly what you need to do, and you don’t need to question your approach and how it will be received once you create that PR.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ok, ok, I’m sold! So, how do I go about writing one?
&lt;/h2&gt;

&lt;p&gt;Glad you asked! Many different formats are being used, more or less formal, but I prefer to keep it simple. RFCs that we write at Wasp don’t follow a strict format, but there are some common parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Metadata&lt;/strong&gt; - Title, date, reviewers, etc…&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem/Goal&lt;/strong&gt; - what are you going to solve&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proposed solution&lt;/strong&gt; (or more of them)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation overview&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remarks / open questions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s pretty much the gist of it! Each of these can be further broken down and refined, but this is the basic outline you can start with.&lt;/p&gt;

&lt;p&gt;Let’s now go over each of these and see what they look like in practice, on our &lt;a href="https://wasp-lang.notion.site/RFC-Auth-without-user-defined-entities-6d2925439627456ab01b74ff4b4cd087?pvs=4" rel="noopener noreferrer"&gt;Authentication in Wasp&lt;/a&gt; example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metadata ⌗
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e894wa2xsw57or0q8oa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e894wa2xsw57or0q8oa.png" alt="RFC metadata example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one is pretty self-explanatory - you will probably want to track some basic info about your RFCs - status, date of creation, etc. &lt;/p&gt;

&lt;p&gt;Some templates also explicitly list the reviewers and the status of their “approval” of the RFC - we don’t have it since we’re a small team where communication happens fast, but it can be handy for larger teams where not everybody knows everybody, and you want to have a bit more of a process in place (e.g., when mentoring junior developers).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0l4elf6a5xtpa567bfg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0l4elf6a5xtpa567bfg3.png" alt="RFC explicit reviewers example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem 🤔
&lt;/h2&gt;

&lt;p&gt;This is where things get interesting. &lt;strong&gt;The better you define the problem or the goal/feature you need to implement, and why you need to do it, the easier all the following steps will be&lt;/strong&gt;. So this is something worth investing in even before you start writing your RFC - make sure you talk to all the involved parties (e.g., product owner, other developers, and even users) to refine your understanding of the issue you’re about to tackle.&lt;/p&gt;

&lt;p&gt;By doing this, you will also very likely get first hints and pointers on the possible solutions, and develop a rough sense of the problem space you’re in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcx3bm2x24hf2z22sl88n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcx3bm2x24hf2z22sl88n.png" alt="RFC problem definition"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are a few tips from the example above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with a high-level summary&lt;/strong&gt; - that way, readers can quickly decide if this is relevant to them or not and whether they should keep reading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide some context&lt;/strong&gt; - Explain a bit about the current state of the world, as it is right now. This can be a single sentence or a whole chapter, depending on the intended audience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clearly state the problem/goal&lt;/strong&gt; - explain why there is a problem and connect it with the user’s/company’s pain, so that motivation is clear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide extra details if possible&lt;/strong&gt; - diagrams, code examples, … → anything that can help the reader get faster to that “aha” moment. Extra points for using collapsible sections, so the central part of the RFC remains of digestible length.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you did all this, you’re already well on your way to the excellent RFC! Since defining the problem well is essential, don’t be afraid to add more to it and break things down further.&lt;/p&gt;

&lt;h3&gt;
  
  
  Non-goals 🛑
&lt;/h3&gt;

&lt;p&gt;This is the sub-section of the "Problem" that can sometimes be super valuable. Writing what we don't want or will not be doing in this codebase change can help set the expectations and better define its scope.&lt;/p&gt;

&lt;p&gt;For example, if we are working on adding a role-based authentication system to our app, people might assume that we will also build some sort of an admin panel for it to manage users and add/remove roles. By explicitly stating it won't be done (and briefly explaining why - not needed, it would take too long, ...), reviewers will get a better understanding of what your goal is and you will skip unnecessary discussion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution &amp;amp; Implementation 🛠️
&lt;/h2&gt;

&lt;p&gt;Once we know what we want to do, we have to figure out the best way of doing it! You might have already hinted at the possible solution in the Problem section, but now is the moment to dive deeper - research different approaches, evaluate their pros and cons, and sketch how they could fit into the existing system.&lt;/p&gt;

&lt;p&gt;This section is probably the most free-form of all - since it highly depends on the nature of what you are doing, it doesn’t make sense to impose many restrictions here. You may want to stay at the higher level of, e.g., system architecture, or you may need to dive deep into the code and start writing parts of the code you will need. Due to that, I don’t have an exact format for you to follow, but rather a set of guidelines:&lt;/p&gt;

&lt;h3&gt;
  
  
  Write pseudocode
&lt;/h3&gt;

&lt;p&gt;The purpose of RFC is to convey ideas and principles, not production-grade code that compiles and covers all the edge cases. Feel free to invent/imagine/sketch whatever you need (e.g., imagine you already have a function that sends an email and just use it, even if you don’t), and don’t encumber yourself or the reader with the implementation details (unless that’s exactly what the RFC is about).&lt;/p&gt;

&lt;p&gt;It’s better to start at the higher level, and then go deeper when you realize you need it or if one of the reviewers suggests it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find out how are others doing it
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab8elwlb8o2ap85wi72r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab8elwlb8o2ap85wi72r.png" alt="find existing solutions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How you find this out may differ depending on the type of product you’re developing, but there is almost always a way to do it. If you’re developing an open-source tool like &lt;a href="https://github.com/wasp-lang/wasp" rel="noopener noreferrer"&gt;Wasp&lt;/a&gt; you can simply check out other popular solutions (that are also open-source) and learn how they did it. If you’re working on a SaaS and need to figure out whether to use cookies or JWTs for the authentication, you likely have some friends who have done it before, and you can ask them. Lastly, simply Google/GPT it.&lt;/p&gt;

&lt;p&gt;Why is this so helpful? &lt;strong&gt;The reason is that it gives you (and the reviewers) confidence in your solution. If somebody else did it successfully this way, it might be a promising direction.&lt;/strong&gt; It also might help you discover approaches you haven’t thought of before, or serve as a basis on top of which you can build. Of course, never take anything for granted and take into account the specific needs of your situation, but definitely make use of the knowledge and expertise of others.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leave things unfinished &amp;amp; keep it dirty
&lt;/h3&gt;

&lt;p&gt;The main point of RFC is the “C” part, so collaboration (yes, I know it actually stands for "&lt;em&gt;comments&lt;/em&gt;"). It’s not a test where you have to get the perfect score and have no questions asked - if that happens, you probably shouldn’t have written the RFC in the first place.&lt;/p&gt;

&lt;p&gt;Solving a problem is team effort, and you’re just the person taking the first stab at it and pushing things forward. Your task is to lay as much groundwork as you reasonably can (refine the problem, explore multiple approaches to solving it, identify new subproblems that came to light) so the reviewers can quickly grasp the status and provide efficient feedback, directed where it’s needed the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The main job of your RFC is to identify the most important problems and direct the reviewer’s attention to them, not solving them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The RFC you’re writing should be looked at as a discussion area and a work-in-progress, not a piece of art that has to be perfected before it’s displayed in front of the audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remarks &amp;amp; open questions 🎯
&lt;/h2&gt;

&lt;p&gt;In this final section of the document, you can summarise the main thoughts and highlight the biggest open questions. After going through everything, it can be helpful for the reader to be reminded of where his attention can be most valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now I know when and how to write an RFC! Do you have any templates I could use as a starting point?
&lt;/h2&gt;

&lt;p&gt;Of course! As mentioned, our format is extremely lightweight, but feel free to take a look at &lt;a href="https://wasp-lang.notion.site/RFC-Auth-without-user-defined-entities-6d2925439627456ab01b74ff4b4cd087?pvs=4" rel="noopener noreferrer"&gt;the RFC we used as an example&lt;/a&gt; to get inspired. Your company could also already have a ready template they recommend.&lt;/p&gt;

&lt;p&gt;Here are a few you can use and/or adapt to your needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://engineering.squarespace.com/s/Squarespace-RFC-Template.pdf" rel="noopener noreferrer"&gt;Squarespace RFC template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Do you have a template you'd recommend? I'm happy to list it here!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What tool should I use to write my RFCs? There are so many choices!
&lt;/h2&gt;

&lt;p&gt;The exact tool you’re using is probably the least important part of RFC-ing, but it still matters since it sets the workflow around it. If your company has already selected a tool, then of course stick with that. If not, here are the most common choices I’ve come across, along with quick comments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Docs&lt;/strong&gt; - the classic choice. Super easy to comment on any part of the doc, which is the most important feature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion&lt;/strong&gt; - also great for collaboration, plus offers some markdown components such as collapsibles and tables, which can make your RFC more readable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Github issues / PRs&lt;/strong&gt; - this is sometimes used, especially for OSS projects. The drawback is that it is harder to comment on the specific part of the document (you can only comment on the whole line), plus inserting diagrams is also quite clunky. The pro is that everything (code and RFCs) stays on the same platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We currently use Notion, but any of the above can be a good choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyq0qybvnkxbu9awz35bw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyq0qybvnkxbu9awz35bw.gif" alt="it's a wrap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just as it is the best practice to write a summary at the end of your RFC, we will do the same here! This article came out longer than I expected, but there were so many things to mention - I hope you'll find it useful!&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;being able to clearly express your thoughts, formulate the problem, and objectively analyze the possible solutions, with feedback from the team, is what will help you develop the right thing, which is the ultimate productivity hack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is how you become a truly 10x engineer. Thank you for reading, and until the next time!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>career</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🛠️6 tools to kickstart your full-stack app with AI 🤖</title>
      <dc:creator>Matija Sosic</dc:creator>
      <pubDate>Tue, 28 Nov 2023 14:32:58 +0000</pubDate>
      <link>https://forem.com/matijasos/6-tools-to-kickstart-your-full-stack-app-with-ai-4oh3</link>
      <guid>https://forem.com/matijasos/6-tools-to-kickstart-your-full-stack-app-with-ai-4oh3</guid>
      <description>&lt;p&gt;&lt;em&gt;“It’s 2021, where is my flying car?”&lt;/em&gt; - that’s a sentence that Joel Spolsky (creator of Stack Overflow and Trello) used to express his disillusionment with how web development still feels pretty much the same as 20 years ago.&lt;/p&gt;

&lt;p&gt;But today, with GPT in the equation, we can rightfully ask this question again. We see all these fancy tweets and demos, but &lt;strong&gt;what does that mean for me as a developer today, right now, when I need to start a new full-stack web app&lt;/strong&gt;? Do I really have to go through &lt;code&gt;npm create vite my-new-app&lt;/code&gt;, and start with a blank page once again?&lt;/p&gt;

&lt;p&gt;The answer is, finally, “no” - there is a lot of cool stuff you can use that will make your life easier. It might not be a supersonic DeLorean yet, but it’s definitely at least hovering above the ground.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6rrhsmpxovjakg2fif6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6rrhsmpxovjakg2fif6.gif" alt="Flying car"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s explore what the AI scene has to offer us today to make it easier to start and build a full-stack web app:&lt;/p&gt;

&lt;h2&gt;
  
  
  🐝 🤖 MAGE - from a single prompt to a full-stack, React &amp;amp; Node.js app in a minute (Free to use!)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9chayxjmuab1e85evc1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9chayxjmuab1e85evc1.gif" alt="MAGE in action"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://usemage.ai/" rel="noopener noreferrer"&gt;MAGE&lt;/a&gt; (&lt;em&gt;Magic App GEnerator&lt;/em&gt;) is probably the easiest-to-use AI coding agent there is - everything happens through the web interface, and &lt;strong&gt;all you have to do is type in the short description of the app you want to build&lt;/strong&gt;. With that, MAGE will generate a complete, full-stack codebase in React, Tailwind, Node.js, and Prisma powered by &lt;a href="https://wasp-lang.dev/" rel="noopener noreferrer"&gt;Wasp&lt;/a&gt;, that you can freely download.&lt;/p&gt;

&lt;p&gt;The best part about MAGE is that &lt;strong&gt;it is fully open-source and completely free to use&lt;/strong&gt; - all you need to do is &lt;a href="https://usemage.ai/" rel="noopener noreferrer"&gt;log in with your GitHub&lt;/a&gt;, and you can start creating apps!&lt;/p&gt;

&lt;p&gt;MAGE &lt;a href="https://www.producthunt.com/products/wasp-lang-alpha#gpt-webapp-generator-for-react-node-js" rel="noopener noreferrer"&gt;was launched in July on Product Hunt&lt;/a&gt; and has since then been used to create almost 30,000 applications. You can read more about it and what types of apps you can build with it &lt;a href="https://dev.to/wasp/gpt-web-app-generator-let-ai-create-a-full-stack-react-nodejs-codebase-based-on-your-description-2g39"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📟 Aider - an AI pair programmer in your terminal
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1g8iir36pbnja90cldn1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1g8iir36pbnja90cldn1.gif" alt="Aider demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you’ve created the v1 of your app with e.g., MAGE, and got the basic functionality in place, you will probably want to add more features. And why not use AI for that, too? That’s where Aider comes in!&lt;/p&gt;

&lt;p&gt;Aider’s superpower is that you can plug it into any existing project and get going! It feels like chatting with a fellow developer sitting right next to you - simply describe your next feature, and Aider will do its best to implement it while providing all the details of the process and automatically adding a new commit to your repo! How cool is that?&lt;/p&gt;

&lt;p&gt;You can learn more about Aider and try it out here: &lt;a href="https://github.com/paul-gauthier/aider" rel="noopener noreferrer"&gt;https://github.com/paul-gauthier/aider&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🦀 🚀 Shuttle AI - build backends in Rust with GPT!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n2bw3i79f4ojhwdpky1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n2bw3i79f4ojhwdpky1.png" alt="shuttle demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you hear the term “web app”, most of us immediately think of JavaScript. While that is in a big part true for the front-end, we can build our back-end in any technology we like!&lt;/p&gt;

&lt;p&gt;Other than the regular suspects such as Python, Java, and PHP, what about Rust? It is one of the most loved languages among developers, and it shouldn’t be reserved only for low-level algorithms.&lt;/p&gt;

&lt;p&gt;Shuttle AI made that possible - their powerful Rust-based framework already makes it easy to build and deploy backends, while AI on top makes it a total breeze!&lt;/p&gt;

&lt;p&gt;Learn more about it here: &lt;a href="https://www.shuttle.rs/ai" rel="noopener noreferrer"&gt;https://www.shuttle.rs/ai&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡️📦 Supabase AI - goodbye, complex SQL queries
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzydppmhtizqx4poar5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzydppmhtizqx4poar5t.png" alt="Supabase demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; is one of the best ways to get the database for your full-stack app up and running, and you get a ton of features on top of that! Since it is specialized for Postgresql, that means you’ll occasionally have to write some SQL. And why not get some help from AI with that, too?&lt;/p&gt;

&lt;p&gt;Supabase is already renowned for its beautiful and user-friendly dashboard with an integrated SQL editor, and now they made it even better by adding their own AI agent to it. Ask it to create new tables and indexes and even write database functions!&lt;/p&gt;

&lt;p&gt;Learn more about it here: &lt;a href="https://supabase.com/blog/supabase-studio-3-0" rel="noopener noreferrer"&gt;https://supabase.com/blog/supabase-studio-3-0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👁️ 🧑‍✈️Visual Copilot - Your Figma design to code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1jhtqsqtj59wprziesa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1jhtqsqtj59wprziesa.png" alt="figma demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you ever got a Figma design handout from a designer, and then it was your task to implement the UI with it, have you ever wondered if there was a way to automate this? This is what Visual Copilot is after!&lt;/p&gt;

&lt;p&gt;With a single click, and given a Figma design, Visual Copilot will generate the front-end code for it! It will do its best to make it responsive and keep the code clean and reusable.&lt;/p&gt;

&lt;p&gt;It is currently available as a &lt;a href="https://www.figma.com/community/plugin/747985167520967365/builder-io-ai-powered-figma-to-code-react-vue-tailwind-more" rel="noopener noreferrer"&gt;Figma community plugin&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✈️ 🤖 GPT Pilot - Start a new app with a collaborative AI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faz5mkurpyu80dtvthxdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faz5mkurpyu80dtvthxdy.png" alt="Pilot demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GPT Pilot is a coding agent specialized for creating new apps from scratch. Its unique approach is that it collaborates with the developer - whenever it gets stuck, it will ask for your help!&lt;/p&gt;

&lt;p&gt;Internally, it consists of multiple agents collaborating together and going through different stages of app development - from Product Owner and Architect to DevOps and Developer! It is a perfect example of &lt;a href="https://wasp-lang.dev/blog/2023/08/23/using-product-requirement-documents-generate-better-web-apps-with-ai" rel="noopener noreferrer"&gt;PRD (&lt;em&gt;Product Requirement Document&lt;/em&gt;)-led development&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vro6qo3khbskfxxfv0h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vro6qo3khbskfxxfv0h.jpg" alt="Pilot system"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is another completely open-source solution that has lately gotten a lot of love from developers and has been featured on GitHub Trending leaderboard multiple times.&lt;/p&gt;

&lt;p&gt;Learn more about it and give it a try here: &lt;a href="https://github.com/Pythagora-io/gpt-pilot" rel="noopener noreferrer"&gt;https://github.com/Pythagora-io/gpt-pilot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpadyzsbgaec1ophqtqep.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpadyzsbgaec1ophqtqep.gif" alt="wrap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that’s a wrap! There are many more AI tools out there, and every day new ones are coming, but in this overview, we tried to focus on the ones you can use today to kick start a new web app.&lt;/p&gt;

&lt;p&gt;Hopefully, you found this helpful and learned something new that might come in handy! I’d also love to hear from you in the comments - what are your favorite AI tools for web development, either ones you use daily or are simply excited about and what should we cover next?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>react</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
