<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Max</title>
    <description>The latest articles on DEV Community by Max (@maksim36ua).</description>
    <link>https://dev.to/maksim36ua</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%2F5809%2F10496082.jpeg</url>
      <title>DEV Community: Max</title>
      <link>https://dev.to/maksim36ua</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maksim36ua"/>
    <language>en</language>
    <item>
      <title>How Michael Curry chose Wasp to build Grabbit: an internal tool for managing dev resources at StudentBeans</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Mon, 28 Nov 2022 11:53:13 +0000</pubDate>
      <link>https://dev.to/wasp/how-michael-curry-chose-wasp-to-build-grabbit-an-internal-tool-for-managing-dev-resources-at-studentbeans-12dm</link>
      <guid>https://dev.to/wasp/how-michael-curry-chose-wasp-to-build-grabbit-an-internal-tool-for-managing-dev-resources-at-studentbeans-12dm</guid>
      <description>&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%2Fey6k1bfvkjtsjdaq7nbc.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%2Fey6k1bfvkjtsjdaq7nbc.png" alt="Image description" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cursorial" rel="noopener noreferrer"&gt;Michael Curry&lt;/a&gt; is a senior front-end engineer at &lt;a href="https://www.improbable.io/" rel="noopener noreferrer"&gt;Improbable&lt;/a&gt;, a metaverse and simulation company based in London. In his free time he enjoys learning about compilers.&lt;/p&gt;

&lt;p&gt;In his previous position at StudentBeans, he experienced the problem of multiple engineering teams competing for the same dev environment (e.g. testing, staging, …). Then he discovered Wasp and decided to do something about it!&lt;/p&gt;

&lt;p&gt;Read on to learn why Michael chose Wasp to build and deploy an internal tool for managing development environments at StudentBeans.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: the battle for the dev environment
&lt;/h2&gt;

&lt;p&gt;StudentBeans has a microservices-based architecture with multiple environments - test, staging, production, …. The team practices CI/CD and deploys multiple times a day. With such a rapid development speed, it would relatively often happen that multiple engineering teams attempt to claim the same dev environment at the same time.&lt;/p&gt;

&lt;p&gt;There wasn't an easy way for teams to synchronize on who is using which environment and it would eventually lead to unexpected changes, confusion, and prolonged development times.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution: Grabbit - claim and release dev environments as-you-go
&lt;/h2&gt;

&lt;p&gt;After the incident described above repeated for the n-th time, the team got together for a postmortem. They decided their new development process should look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;merge your changes&lt;/li&gt;
&lt;li&gt;claim the environment you want to deploy to (e.g. testing, staging, …)&lt;/li&gt;
&lt;li&gt;deploy your changes&lt;/li&gt;
&lt;li&gt;test your changes&lt;/li&gt;
&lt;li&gt;release the environment once you are done with it so others are able to claim it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The other requirements were to build the solution in-house to save money and also not to spend more than a few hours on it as they still needed to deliver some important features for the ongoing sprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The power of rapid prototyping with Wasp
&lt;/h2&gt;

&lt;p&gt;Michael learned about Wasp during its &lt;a href="https://news.ycombinator.com/item?id=26091956" rel="noopener noreferrer"&gt;first HackerNews launch&lt;/a&gt; and it immediately caught his eye. Being a programming language enthusiast himself, he immediately understood the value of a DSL approach and how it could drastically simplify the development process, while at the same time not preventing him from using his preferred tech stack (React, Node.js) when needed.&lt;/p&gt;

&lt;p&gt;Also, although Michael had full-stack experience, his primary strength at the time was on the front-end side. Wasp looked like a great way of not having to deal with the tedious back-end setup and wiring (setting up the database, figuring out API, …) and being able to focus on the UX.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When I first learned about Wasp on HN I was really excited about its DSL approach. It was amazing how fast I could get things running with Wasp - I had the first version within an hour! The language is also fairly simple and straightforward and plays well with React &amp;amp; Node.js + it removes a ton of boilerplate.&lt;br&gt;
— Michael Curry - Grabbit&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Out-of-the-box deployment
&lt;/h2&gt;

&lt;p&gt;Once Michael was satisfied with the first version of Grabbit, and confirmed with the team it fits their desired process, the only thing left to do was to deploy it! It is well known this step can get really complicated, especially if you're not yet well-versed in the sea of config options that usually come with it.&lt;/p&gt;

&lt;p&gt;Wasp CLI comes with a &lt;code&gt;wasp build&lt;/code&gt; command that does all the heavy lifting for you - it creates a directory with static front-end files that you can easily deploy to e.g. Netlify, and on the other hand, a Docker image for the back-end. Since Heroku is ending its free plan, our recommendation is to deploy to Fly.io, for which the detailed guide is provided. You can find the &lt;a href="https://wasp-lang.dev/docs/deploying" rel="noopener noreferrer"&gt;detailed deployment instructions here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Michael's case, he deployed Grabbit behind the VPN since it was an internal tool, and this process was made easy by having a ready-to-go Dockerfile.&lt;/p&gt;

&lt;h2&gt;
  
  
  From MVP to a full-fledged SaaS without a rewrite
&lt;/h2&gt;

&lt;p&gt;The presented functionality of Grabbit above is quite simple (create a resource → claim it → release it), and it could have easily been implemented in some no-code tool or, if we really wanted to go simple, with a Trello board. So why use Wasp at all?&lt;/p&gt;

&lt;p&gt;One reason is that developers know and prefer their tools and trust code over the no-code solutions, especially when requirements are still evolving and it is not evident they won't get "stuck" in some closed system. Michael had similar thinking - as he identified this problem at his own company, he realized others must be facing the same issue as well. That is why his plan was to keep improving Grabbit and eventually offer it as a standalone SaaS.&lt;/p&gt;

&lt;p&gt;This is where Wasp comes in - he could develop and deploy an initial version of Grabbit in a matter of hours, but still end up with a platform that he can extend indefinitely through the power of code with his stack of choice, React &amp;amp; Node.js, while also using the npm packages he is using everyday at work.&lt;/p&gt;

&lt;p&gt;Once he starts adding more advanced features, such as multi-user support with authentication, email notifications, and integration with CI/CD, no-code tools won't cut it any more. This way he saved himself and the company from throwing an MVP away and starting everything from scratch (having to learn the new technology and figure out how to set it all up) as the product evolves.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>ios</category>
      <category>ai</category>
      <category>career</category>
    </item>
    <item>
      <title>Wasp Beta Launch Week announcement</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Sat, 26 Nov 2022 16:44:27 +0000</pubDate>
      <link>https://dev.to/wasp/wasp-beta-launch-week-announcement-2363</link>
      <guid>https://dev.to/wasp/wasp-beta-launch-week-announcement-2363</guid>
      <description>&lt;p&gt;It’s almost here! After almost two years since our Alpha release, countless apps developed, React and Node versions upgraded, and PRs merged &lt;strong&gt;we’re only a day away from Beta!&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%2Fa5nmldbtit4qo27f2zvu.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%2Fa5nmldbtit4qo27f2zvu.png" alt="Image description" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’re going to follow a launch week format, &lt;strong&gt;which means our Beta launch will last for the whole week!&lt;/strong&gt; Starting with the Product Hunt launch this Sunday (we’ll let you know once we’re live, so sharpen your upvoting fingers!) &lt;strong&gt;we’ll highlight a new feature every day.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’ll try not to spoil too much in advance but we’re really excited about this - here follows a quick overview of what it’s gonna look like:&lt;/p&gt;

&lt;h2&gt;
  
  
  Sunday, Nov 27 - Product Hunt launch event 🚀 + let’s get this party started: Auth 🎉
&lt;/h2&gt;

&lt;p&gt;Besides defending our Product Hunt title (we won &lt;a href="https://www.producthunt.com/products/wasp-lang-alpha#wasp-lang-alpha" rel="noopener noreferrer"&gt;#1 Product of the Day&lt;/a&gt; last time), this time we’ll also have an online party for all of us to celebrate together!&lt;/p&gt;

&lt;p&gt;It will be held &lt;strong&gt;on our Discord at 9:00 am EST / 15:00 CET&lt;/strong&gt; - &lt;a href="https://discord.gg/4kUcXChX?event=1042717917097246720" rel="noopener noreferrer"&gt;sign up here&lt;/a&gt; and make sure to mark yourself as “Interested”!&lt;/p&gt;

&lt;p&gt;Join us to meet the team, attend a relaxed AMA session to learn everything about Wasp, from how it started to development challenges (having fun with Haskell, web dev and compilers) and ideas and plans for the future.&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%2Fcbe20f3cldqlqbpxmpsj.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%2Fcbe20f3cldqlqbpxmpsj.png" alt="Image description" width="667" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first feature to announce will be authentication in Wasp! It’s easier and cooler than ever, supports 3rd party providers (hint: starts with “G”), and works smoother than a jar of peanut butter (not the crunchy one of course)!&lt;/p&gt;

&lt;h2&gt;
  
  
  Monday, Nov 28 - TypeScript support!
&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%2Fkmrwrhd5l9yemas5n4gc.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%2Fkmrwrhd5l9yemas5n4gc.gif" alt="Image description" width="168" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we asked you what was missing in Wasp during our &lt;a href="https://wasp-lang.dev/blog/2022/11/16/alpha-testing-program-post-mortem" rel="noopener noreferrer"&gt;Alpha Testing Program&lt;/a&gt;, you were pretty clear:&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%2Fip2ot4to7625y3ixjskm.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%2Fip2ot4to7625y3ixjskm.png" alt="Image description" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We heard you (honestly we were missing it too) and now it’s here! You can write your code in TypeScript and enjoy all the goodies that types bring. Some things already work really well and there are a few for which we still have ideas on how to make them better, but more on that on Tuesday!&lt;/p&gt;

&lt;h2&gt;
  
  
  Wednesday, Nov 29 - Tailwind support! 🐈 💨
&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%2Fgt5itij833nq2t6xrwqz.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%2Fgt5itij833nq2t6xrwqz.gif" alt="Image description" width="300" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s beautiful! Another highly anticipated featured that also comes with Beta - support for Tailwind CSS framework! Since it has an additional build step it didn’t work out-of-the-box with Alpha, but now it works like a breeze (see what I did here?)!&lt;/p&gt;

&lt;p&gt;Honestly, having used it for designing our new Beta landing page I can really see why it gained so much popularity. So long, making up names for classes, “containers”, and “wrappers”!&lt;/p&gt;

&lt;h2&gt;
  
  
  Thursday, Nov 30 - Optimistic updates!
&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%2Ftg8ltbrwjx6yvy0cy71a.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%2Ftg8ltbrwjx6yvy0cy71a.gif" alt="Image description" width="567" height="260"&gt;&lt;/a&gt; Stop glitching, dang it!&lt;/p&gt;

&lt;p&gt;You know that feeling when you move your Trello card “Try Wasp Beta” from “Todo” column to “Done” column and everything works super smoothly without any glitches? That’s because of optimistic updates! You may not need it often but if you needed and it wasn’t possible you’d feel really sad.&lt;/p&gt;

&lt;p&gt;Well, that’s why Alpha is called Alpha and Beta is called Beta 😅. Long story short, now it’s possible to do it in Wasp and it’s also super easy and clean! We're actually very optimistic you’ll feel really good about implementing optimistic updates for your app in Wasp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Friday, Dec 1 - Improved IDE support, tooling and Wasp LSP!
&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%2Fa6wv0kij3ubb6xeljdcx.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%2Fa6wv0kij3ubb6xeljdcx.png" alt="Image description" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like types in TypeScript (and in general), then you will also enjoy Wasp! Our DSL is also a typed language which means it can report errors in compile time, e.g. in case you haven’t configured your route correctly. And now all that happens directly in your editor!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beta brings LSP, Language Server for Wasp that works with VS Code&lt;/strong&gt; (support for other editors coming soon! I’m VIM user myself so take a guess :D). That means improved syntax highlighting, code autocompletion and live error reporting - everything you’d expect from a language!&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%2Fqmlj7khc5o4gh14s2oxq.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%2Fqmlj7khc5o4gh14s2oxq.gif" alt="Image description" width="922" height="633"&gt;&lt;/a&gt; Wasp LSP in action!&lt;/p&gt;

&lt;h2&gt;
  
  
  Saturday, Dec 2 - Grande Finale + #1 Wasp Hackathon!(Waspathon🐝 ?)
&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%2Fn4wiiggsjtvkg4nr7g7r.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%2Fn4wiiggsjtvkg4nr7g7r.gif" alt="Image description" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don’t want to reveal too much in advance, but yep there will be a hackathon, yep there will be cool rewards (at least we think so) and yep it will be awesome! We’ll officially announce it as we end the launch week, and equipped with all the new features Beta brought we’ll switch into the hacking mode!&lt;/p&gt;

&lt;p&gt;It’s our first hackathon and we can’t wait to tell you more about it (ok, I admit, we’re still working on it) and see what you beeld with Wasp!&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;We are launching Beta this Sunday, Nov 27, on Product Hunt at 1am PST / 4am EST / 10am CET&lt;/strong&gt; - make sure to upvote and comment (anything counts, even “go guys!”) when you can&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beta brings a ton of new exciting features&lt;/strong&gt; - we’ll highlight one each day of the following week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On Saturday, Dec 2, we’ll announce a hackathon&lt;/strong&gt; - our first ever!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it, Waspeteers - keep buzzing as always and see you soon on the other side! 🐝  🅱️&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>workplace</category>
    </item>
    <item>
      <title>Alpha Testing Program: post-mortem</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Wed, 23 Nov 2022 11:51:04 +0000</pubDate>
      <link>https://dev.to/wasp/alpha-testing-program-post-mortem-18hl</link>
      <guid>https://dev.to/wasp/alpha-testing-program-post-mortem-18hl</guid>
      <description>&lt;p&gt;We are working on a new web framework that integrates with React &amp;amp; Node.js, and also happens to be a language. As you can probably imagine, it’s not easy to get people to use a new piece of technology, especially while still in Alpha. On the other hand, without users and their feedback, it’s impossible to know what to build.&lt;/p&gt;

&lt;p&gt;That is why we ran Alpha Testing Program for Wasp - here is what we learned and what went both well and wrong along the way.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  “Of course I know about Wasp! I just haven’t come around to trying it out yet.”
&lt;/h2&gt;

&lt;p&gt;Although we hit the front page of HN &lt;a href="https://news.ycombinator.com/item?id=26091956"&gt;several&lt;/a&gt; &lt;a href="https://news.ycombinator.com/item?id=32098144"&gt;times&lt;/a&gt; and are about to reach 2,000 stars on GitHub, there is still a big difference between a person starring a repo and actually sitting down and building something with it.&lt;/p&gt;

&lt;p&gt;Talking to people, we realised a lot of them had heard of Wasp, thought it was a neat idea, but hadn’t tried it out. These were the main reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;having to find 30 mins to go through our Build a Todo App tutorial - “I'm busy now, but I’ll do it next week.”&lt;/li&gt;
&lt;li&gt;building a bare-bones todo app is not that exciting&lt;/li&gt;
&lt;li&gt;not having an idea what else to build&lt;/li&gt;
&lt;li&gt;“the product is still in alpha, so I will bookmark it for later”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are all obvious and understandable reasons. I must admit, I’m much the same — maybe even worse — when it comes to trying out something new/unproven. It just isn’t a priority, and without a push that will help me overcome all these objections, I usually don’t have an incentive to go through with it.&lt;/p&gt;

&lt;p&gt;Having realised all that, we understood we needed to give people a reason to try Wasp out &lt;strong&gt;now&lt;/strong&gt;, because that’s when we needed the feedback, not next week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Welcome to Wasp Alpha Testing Program!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BVty_nRT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vys2ng4i36dqcqan4wr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BVty_nRT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vys2ng4i36dqcqan4wr9.png" alt="Image description" width="691" height="438"&gt;&lt;/a&gt; We had a bit too much fun &lt;a href="https://wasp-lang.notion.site/CLOSED-Welcome-to-Wasp-Alpha-Testing-program-f3a8a350802341abac87fb7831bb1e60"&gt;here&lt;/a&gt;, but Portal fans will understand.&lt;/p&gt;

&lt;p&gt;We quickly put together an admissions page for alpha testers in Notion (you can see it &lt;a href="https://wasp-lang.notion.site/Wasp-Alpha-Testing-Program-Admissions-dca25649d63849cb8dfc55881e4f6f82"&gt;here&lt;/a&gt;) and started sharing it around. To counter the hurdles we mentioned above, we time-boxed the program (”this is happening now and you have 48 hours to finish once you start”) and promised a t-shirt to everyone that goes through the tutorial and fills out the feedback form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QpiOt8y_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvvm0s6n8zh0cuuef4tr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QpiOt8y_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvvm0s6n8zh0cuuef4tr.png" alt="Image description" width="620" height="274"&gt;&lt;/a&gt; CTA from the admissions page&lt;/p&gt;

&lt;p&gt;Soon, the first applications started trickling in! For each new applicant, we’d follow up with the &lt;a href="https://www.notion.so/CLOSED-Welcome-to-Wasp-Alpha-Testing-program-f3a8a350802341abac87fb7831bb1e60"&gt;instructions&lt;/a&gt; on how to successfully go through the Alpha Testing Program:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fill out intro form (years of experience, preferred stack, etc)&lt;/li&gt;
&lt;li&gt;go through our “build a Todo app” tutorial&lt;/li&gt;
&lt;li&gt;fill out the feedback form - what was good, what was bad etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fSn9VOk---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/onc7r2b25vkg11nthb2t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fSn9VOk---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/onc7r2b25vkg11nthb2t.png" alt="Image description" width="596" height="336"&gt;&lt;/a&gt; People were really respectful of this deadline and would politely ask to extend it in case they couldn’t make it.&lt;/p&gt;

&lt;p&gt;But, soon after we got the following message on Twitter:&lt;/p&gt;

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

&lt;p&gt;We got really scared that we would get a ton of folks putting in minimal effort while trying Wasp out just to get the free swag, leaving us empty-handed and having learned nothing! On the other hand, we didn’t have much choice since we didn’t define the “minimum required quality” of feedback in advance.&lt;/p&gt;

&lt;p&gt;Luckily, it wasn’t the problem in the end, even the opposite -- we did get a surge of applications, but only a portion of them finished the program and the ones that did left really high-quality feedback!&lt;/p&gt;

&lt;h2&gt;
  
  
  How it went - test profile &amp;amp; feedback
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tester profile
&lt;/h3&gt;

&lt;p&gt;We received 210 applications and 53 out of those completed the program — 25% completion rate.&lt;/p&gt;

&lt;p&gt;We also surveyed applicants about their preferred stack, years of programming experience, etc:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5eUBgb0A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zkzzm1dmcc3w9n9twqo5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5eUBgb0A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zkzzm1dmcc3w9n9twqo5.png" alt="Image description" width="656" height="597"&gt;&lt;/a&gt; Yep, we like puns.&lt;/p&gt;

&lt;h3&gt;
  
  
  The feedback
&lt;/h3&gt;

&lt;p&gt;The feedback form evaluated testers’ overall experience with Wasp. We asked them what they found to be the best and worst parts of working with Wasp, as well as about the next features they’d like to see.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  The bad parts
&lt;/h3&gt;

&lt;p&gt;What our testers were missing the most was a full-blown IDE and TypeScript support. Both of these are coming in Beta but only JS was supported at the time. Plus, there were some installation problems with Windows (which is not fully supported yet — best to use it through WSL).&lt;/p&gt;

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

&lt;p&gt;We were already aware that TypeScript support is an important feature, but didn’t have an exact feeling of how much - the feedback was really helpful and helped us prioritise our Beta backlog.&lt;/p&gt;

&lt;h3&gt;
  
  
  The good parts
&lt;/h3&gt;

&lt;p&gt;Testers’ favourite part was the batteries-included experience, particularly the &lt;a href="https://wasp-lang.dev/docs/tutorials/todo-app/06-auth"&gt;auth model&lt;/a&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Post-mortem: what didn’t go well
&lt;/h2&gt;

&lt;h3&gt;
  
  
  No threshold for feedback quality
&lt;/h3&gt;

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

&lt;p&gt;We didn’t put any kind of restrictions on the feedback form, e.g. minimal length of the feedback. That resulted in ~15%-20% of answers being single words, such as depicted above. I’m not sure if there is an efficient way to avoid this or just a stat to live with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using free text form for collecting addresses
&lt;/h3&gt;

&lt;p&gt;It never crossed our minds before that validating addresses could be such an important part of shipping swag, but turns out it is. It seems that there are a lot of ways to specify an address, some of which are different from what is expected by our post office, resulting in a number of shipments getting returned.&lt;/p&gt;

&lt;p&gt;An ideal solution would be to use a specialized “address” field in a survey that would auto-validate it, but turns out Typeform (which we used) doesn’t have that feature implemented yet, although &lt;a href="https://community.typeform.com/suggestions-feedback-34/address-field-question-type-2950"&gt;it’s been highly requested&lt;/a&gt;.&lt;/p&gt;

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

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

&lt;h2&gt;
  
  
  The non-obvious benefit of Alpha Testing Program
&lt;/h2&gt;

&lt;p&gt;What went well is that we got a lot of high-quality feedback that steered and fortified our plan for the upcoming Beta release.&lt;/p&gt;

&lt;p&gt;The other big benefit is that we finally solved the “looks cool but i’ll try it out later maybe” problem. Overall, our usage went well up during the program, but even after it ended, the baseline increased significantly. This was the second-order effect we didn’t foresee.&lt;/p&gt;

&lt;p&gt;Our understanding is that once people finally gave it a try, a portion of them felt the value first-hand and decided to keep using it for other projects as well.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Summary &amp;amp; going forward: Beta
&lt;/h2&gt;

&lt;p&gt;The overall conclusion from our Alpha Testing Program is it was a worthy effort which got us valuable feedback and positively affected the overall usage. Moving forward we’ll try to focus on ensuring more quality feedback and prioritising 1-to-1 communication to make sure we fully understand what bothers Wasp users and what we can improve. It also might be helpful to do testing in smaller batches so we are not overwhelmed with responses and can focus on the individual testers - that’s something we might try out in Beta.&lt;/p&gt;

&lt;p&gt;As mentioned, the next stop is Beta! It comes out on the 27th of November - &lt;a href="https://wasp-lang.dev/#signup"&gt;sign up here&lt;/a&gt; to get notified.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>node</category>
    </item>
    <item>
      <title>How Wasp reached all-time high PR count during HacktoberFest: tips for OSS maintainers</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Mon, 21 Nov 2022 11:09:37 +0000</pubDate>
      <link>https://dev.to/wasp/how-wasp-reached-all-time-high-pr-count-during-hacktoberfest-tips-for-oss-maintainers-4in0</link>
      <guid>https://dev.to/wasp/how-wasp-reached-all-time-high-pr-count-during-hacktoberfest-tips-for-oss-maintainers-4in0</guid>
      <description>&lt;p&gt;2078 lines of code across 24 PRs were changed in &lt;a href="https://github.com/wasp-lang/wasp"&gt;Wasp repo&lt;/a&gt; during &lt;a href="https://hacktoberfest.com/"&gt;HacktoberFest 2022&lt;/a&gt; - the most prominent online event for promoting and celebrating OSS culture. October has been a blast, to say the least, and the most active month in the repo's history.&lt;/p&gt;

&lt;p&gt;This is the story of our journey along with the tips on leveraging HacktoberFest to get your repo buzzing! 🐝🐝&lt;/p&gt;

&lt;h2&gt;
  
  
  How it went: the stats
&lt;/h2&gt;

&lt;p&gt;Let's take a quick look at the charts below (data obtained from &lt;a href="https://ossinsight.io/analyze/wasp-lang/wasp"&gt;OSS Insight&lt;/a&gt; platform) 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UDSDMFia--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zpi67bsurva3hvanfoq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UDSDMFia--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zpi67bsurva3hvanfoq6.png" alt="Image description" width="800" height="399"&gt;&lt;/a&gt;24 contributor PRs in Oct, an all-time high!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2fTcaZAI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0oyj7iogv92394x4kvaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2fTcaZAI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0oyj7iogv92394x4kvaw.png" alt="Image description" width="800" height="370"&gt;&lt;/a&gt;On the other hand, number of changed LoC isn't that huge&lt;/p&gt;

&lt;p&gt;While the number of PRs is at an all-time high, the number of updated lines of code is fewer than usual. If we take a look at the distribution of PR sizes in the first chart, we can see that "xs" and "s" PRs are in the majority (20 out of 24).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This brings us to our first conclusion: first-time contributors start with small steps!&lt;/strong&gt; The main benefit here is getting potential contributors interested and familiar with the project, rather than expecting them to jump in and immediately start implementing the next major feature. Efforts like that require investing time to understand and digest codebase architecture, design decisions and the development process.&lt;/p&gt;

&lt;p&gt;On the other hand, being able to implement and merge any feature, no matter the size, from beginning to the end, and to get your name on the list of contributors of your favourite project is an amazing feeling! That will make your contributors feel like superheroes and motivate them to keep taking on larger and larger chunks, and maybe eventually even join the core team!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thus, the second conclusion would be: don’t underestimate the significance of small PRs!&lt;/strong&gt; It's not about reducing your backlog, but rather encouraging developers to get engaged with your project in a friendly way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To make it easier for your new contributors, you can prepare in advance good issues to get started with - e.g. smaller bugs, docs improvements, fun but isolated problems, etc.&lt;/p&gt;

&lt;p&gt;We added &lt;code&gt;good-first-issue&lt;/code&gt; label to such issues in Wasp repo, and even added extra context such as &lt;code&gt;no-haskell&lt;/code&gt;, &lt;code&gt;webdev&lt;/code&gt;, &lt;code&gt;example&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With your repo being set, the next question is "How do I get people to pick my project to work on"? Relying solely on putting "HacktoberFest" topic on your GitHub repo won't do the trick, not with thousands of other repos doing the same.&lt;/p&gt;

&lt;p&gt;If you want to get noticed, &lt;strong&gt;you need to do marketing. A lot of it. The name of the game here is what you put in is what you get back.&lt;/strong&gt; Let's talk about this in more detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  A thin line between genuine interactions and annoying self-promotion
&lt;/h2&gt;

&lt;p&gt;First and foremost, you'll need to create &lt;a href="https://github.com/wasp-lang/wasp/issues/735"&gt;an entry point&lt;/a&gt; with all the necessary information for the participants. We opted for a GitHub issue where we categorized HacktoberFest issues by type, complexity, etc, but it can be anything - a dedicated landing page, Medium/Dev.to article, or whatever works for you. Once you have that, you can start promoting it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cLOnZuUz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0dt4lymw6plxzogy5kno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cLOnZuUz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0dt4lymw6plxzogy5kno.png" alt="Image description" width="800" height="484"&gt;&lt;/a&gt; Our entry point for HacktoberFest&lt;/p&gt;

&lt;p&gt;Our marketing strategy consisted of the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tweeting regularly - what's new, interesting issues, ...&lt;/li&gt;
&lt;li&gt;Writing meaningful Reddit posts about your achievements&lt;/li&gt;
&lt;li&gt;Hanging out in HacktoberFest &lt;a href="https://discord.com/invite/hacktoberfest"&gt;Discord server&lt;/a&gt;, chatting with others and answering their questions&lt;/li&gt;
&lt;li&gt;Checking posts with &lt;a href="https://dev.to/t/hacktoberfest"&gt;appropriate&lt;/a&gt; &lt;a href="https://medium.com/tag/hacktoberfest2022"&gt;tags&lt;/a&gt; on different blogging websites like Medium, Dev.to, Hashnode, etc. and participating in conversations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are plenty of other ways to advertise your project, like joining events or writing articles. Even &lt;a href="https://github.com/dailydotdev/memetoberfest"&gt;meme contests&lt;/a&gt;. The activities mentioned above worked the best for us. Let’s dive a bit deeper.&lt;/p&gt;

&lt;p&gt;Tweets are pretty obvious - as mentioned, you can share updates on how stuff is going. Tag contributors, inform your followers about available issues and mention those who might be a good fit for tackling them.&lt;/p&gt;

&lt;p&gt;Reddit is a much more complex beast. You need to avoid clickbait post titles, comply with subreddit rules on self-promotion and try to give meaningful info to the community simultaneously. Take less than you give, and you’re good.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E0pYj71K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3vo88x1lbtt8771z2aop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E0pYj71K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3vo88x1lbtt8771z2aop.png" alt="Image description" width="498" height="569"&gt;&lt;/a&gt;How posting on Reddit feels&lt;/p&gt;

&lt;p&gt;The Discord server marketing was pretty straightforward. There’s even a dedicated channel for self-promotion. In case you're not talkative much, dropping a link to your project is OK, and that’s it. On the other hand, the server is an excellent platform for discussing HacktoberFest-related issues, approaches, and ideas. The more you chat, the higher your chances of drawing attention to your project.&lt;/p&gt;

&lt;p&gt;The most engaging but also time consuming activity was commenting on blog posts of other HacktoberFest participants. &lt;strong&gt;Pretending that you’re interested in the topic only to leave a self-promoting comment will not bring you anywhere - it can only result in your comment being removed.&lt;/strong&gt; Make sure to provide value: add more information on the topic of the article, address specific points the author may have missed, or mention how you’ve dealt with the related issue in your project.&lt;/p&gt;

&lt;p&gt;Be consistent and dedicate time to regularly to check new articles and jump into discussions. Share a link to your repo only if it fits into the flow of the conversation.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Was it worth it?
&lt;/h2&gt;

&lt;p&gt;Before joining HacktoberFest as maintainers, we weren’t sure it would be worth the time investment. Our skepticism was reinforced by the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mentions of people submitting trivial PRs just to win the award&lt;/li&gt;
&lt;li&gt;The fact that we're making a relatively complex project (DSL for developing React + Node.js full-stack web apps with less code) and it might be hard for people to get into it&lt;/li&gt;
&lt;li&gt;The compiler is written is Haskell, with templates in JavaScript - again, not the very common project setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fortunately, none of this turned out to be a problem! We've got 24 valid PRs, both Haskell and non-Haskell, a ton of valuable feedback, and several dozen new users and community members.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;Don’t expect magic to happen. HacktoberFest is all about smaller changes and getting community introduced to your project. Be ready to promote your repo genuinely and don’t be afraid to take part in the contest. We hope that helps and wish you the best of luck!&lt;/p&gt;

&lt;p&gt;Remember, HacktoberFest is all about the celebration of open source. Stick to that principle, and you’ll get the results you could only wish for!&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S. - Thanks to our contributors!
&lt;/h2&gt;

&lt;p&gt;Massive shout out to our contributors: &lt;a href="https://twitter.com/ussgarci"&gt;@ussgarci&lt;/a&gt;, &lt;a href="https://twitter.com/h4r1337"&gt;@h4r1337&lt;/a&gt;, &lt;a href="https://twitter.com/d0m96"&gt;@d0m96&lt;/a&gt;, &lt;a href="https://twitter.com/EmmanuelCoder"&gt;@EmmanuelCoder&lt;/a&gt;, &lt;a href="https://twitter.com/gautier_difolco"&gt;@gautier_difolco&lt;/a&gt;, &lt;a href="https://twitter.com/vaishnav_mk1"&gt;@vaishnav_mk1&lt;/a&gt;, &lt;a href="https://twitter.com/NeoLight1010"&gt;@NeoLight1010&lt;/a&gt;, &lt;a href="https://twitter.com/abscubix"&gt;@abscubix&lt;/a&gt;, &lt;a href="https://twitter.com/JFarayola"&gt;@JFarayola&lt;/a&gt;, &lt;a href="https://twitter.com/Shahx95"&gt;@Shahx95&lt;/a&gt; and everyone else for making it possible. You rock! 🤘&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>react</category>
    </item>
    <item>
      <title>Farnance: How Julian built a SaaS for farmers with Wasp and won a hackathon!</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Tue, 08 Nov 2022 13:23:36 +0000</pubDate>
      <link>https://dev.to/wasp/farnance-how-julian-built-a-saas-for-farmers-with-wasp-and-won-a-hackathon-4548</link>
      <guid>https://dev.to/wasp/farnance-how-julian-built-a-saas-for-farmers-with-wasp-and-won-a-hackathon-4548</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KiOCa2CD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/86q3rvulbnhr7vj1llft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KiOCa2CD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/86q3rvulbnhr7vj1llft.png" alt="Image description" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jlaneve.github.io/"&gt;Julian LaNeve&lt;/a&gt; is an engineer and data scientist who currently works at &lt;a href="http://astronomer.io/"&gt;Astronomer.io&lt;/a&gt; as a Product Manager. In his free time, he enjoys playing poker, chess and &lt;a href="https://www.smudailycampus.com/news/smu-graduate-julian-laneve-wins-100k-grand-prize-from-data-science-competition"&gt;winning&lt;/a&gt; data science competitions.&lt;/p&gt;

&lt;p&gt;His project, &lt;a href="https://farnance.netlify.app/"&gt;Farnance&lt;/a&gt;, is a SaaS marketplace that allows farmers to transform their production into a digital asset on blockchain. Julian and his team developed Farnance as a part of the London Business School’s annual hackathon &lt;a href="https://hacklbs.devpost.com/"&gt;HackLBS 2021&lt;/a&gt;, and ended up as winners among more than 250 participants competing for 6 prizes in total!&lt;/p&gt;

&lt;p&gt;Read on to learn why Julian chose Wasp to develop and deploy Farnance and what parts he enjoyed the most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding a perfect React &amp;amp; Node.js hackathon setup
&lt;/h2&gt;

&lt;p&gt;Julian had previous experiences with React and Node.js and loved that he could use JavaScript across the stack, but setting up a new project and making sure it uses all the latest packages (and then also figuring out how to deploy it) was always a pain. Since the hackathon only lasted for two days, he needed a quick way to get started but still have the freedom to use his favourite stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The power of one-line auth and No-API approach
&lt;/h2&gt;

&lt;p&gt;Julian first learned about Wasp when it &lt;a href="https://news.ycombinator.com/item?id=26091956"&gt;launched on HN&lt;/a&gt; and decided it would be a perfect tool for his case. The whole app setup, across the full stack, is covered out-of-the-box, simply by typing &lt;code&gt;wasp new farnance&lt;/code&gt;, and he is ready to start writing own React &amp;amp; Node.js code.&lt;/p&gt;

&lt;p&gt;Except on the app setup, the team saved a ton of time by not needing to implement the authentication and a typical CRUD API, since it is covered by Wasp as well. They could also deploy everything for free on Heroku and Netlify in just a few steps, which was a perfect fit for a hackathon.&lt;/p&gt;

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

&lt;p&gt;Farnance is still running and you can &lt;a href="https://farnance.netlify.app/"&gt;try it out here&lt;/a&gt;! The source code is also &lt;a href="https://github.com/jlaneve/Farnance"&gt;publicly available&lt;/a&gt;, although note it is running on older version of Wasp so some things are a bit different.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spend more time developing features and less time reinventing the wheel
&lt;/h2&gt;

&lt;p&gt;Julian was amazed by how fast he was able to get Farnance of the ground and share a working web app with the users! He decided to go with Google's material-ui for an UI framework which gave his app an instant professional look, although they didn’t have a dedicated designer on the team.&lt;/p&gt;

&lt;p&gt;With all the common web app features (setup, auth, CRUD API) being taken care of by Wasp out-of-the-box they could invest all the time saved in developing and refining their unique features which in the end brought them victory!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I’ve done plenty of hackathons before where I’ve built small SaaS apps, and there’s just so much time wasted setting up common utilities - stuff like user management, databases, routing, etc. Wasp handled all that for me and let me build out our web app in record time&lt;br&gt;
— Julian LaNeve - Farnance&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2&gt;
  
  
  Start quickly, but also scale without worries
&lt;/h2&gt;

&lt;p&gt;Since Wasp compiler generates a full-stack React &amp;amp; Node.js app under the hood, there aren’t any technical limitations to scaling Julian’s app as it grows and gets more users in the future. By running &lt;code&gt;wasp build&lt;/code&gt; inside a project folder, developers gets both frontend files and a Dockerfile for the backend, which can then be deployed as any regular web app to the platform of your choice.&lt;/p&gt;

&lt;p&gt;Wasp provides &lt;a href="https://wasp-lang.dev/docs/deploying"&gt;step-by step instructions&lt;/a&gt; on how to do it with Netlify and Heroku for free (since Heroku is canceling their free plan, we'll publish guides for other providers soon), but we plan to add even more examples and more integrated deployment experience in the coming releases!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deploying the wasp app was incredibly easy - I didn’t have time to stand up full infrastructure in the 2 day hackathon and don’t have an infra/devops background, but I had something running on Netlify within an hour. Other projects at the hackathon struggled to do this, and putting access in the hands of the judges certainly helped get us 1st place.&lt;br&gt;
— Julian LaNeve - Farnance&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>datascience</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>20 pull requests were created in our repo by community members during Hacktoberfest 🚀 🚀 🚀</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Tue, 25 Oct 2022 12:14:51 +0000</pubDate>
      <link>https://dev.to/wasp/20-pull-requests-were-created-in-our-repo-by-community-members-during-hacktoberfest-50cl</link>
      <guid>https://dev.to/wasp/20-pull-requests-were-created-in-our-repo-by-community-members-during-hacktoberfest-50cl</guid>
      <description>&lt;p&gt;Huge step forward for the project. 🎉🥳 Thanks for the contributions, and keep them coming! Let's create the most excellent web app building tool together!&lt;/p&gt;

&lt;p&gt;For the context -- we’ve developed an open-source language for building full-stack web apps with less code and best practices that works alongside React and Node.js. &lt;/p&gt;

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

&lt;p&gt;If you're still thinking about whether you need to join HacktoberFest or not -- you definitely should while there's still time! &lt;/p&gt;

&lt;p&gt;P.S: And if you'd like to join us as a contributor -- &lt;a href="https://github.com/wasp-lang/wasp/issues/735"&gt;click here&lt;/a&gt;! 😄 🐝 &lt;/p&gt;

&lt;p&gt;Tech stack: JS, Haskell, no-code contributions are also welcome&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>hacktoberfest</category>
      <category>react</category>
    </item>
    <item>
      <title>We've passed a 10 PR milestone to our repo during HacktoberFest</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Wed, 19 Oct 2022 10:28:22 +0000</pubDate>
      <link>https://dev.to/wasp/weve-passed-a-10-pr-milestone-to-our-repo-during-hacktoberfest-2nhj</link>
      <guid>https://dev.to/wasp/weve-passed-a-10-pr-milestone-to-our-repo-during-hacktoberfest-2nhj</guid>
      <description>&lt;p&gt;We’ve developed an open-source language for building full-stack Node + React web apps with less code. It's called &lt;a href="https://wasp-lang.dev/"&gt;Wasp&lt;/a&gt;, and its primary purpose is to make a life of a developer easier. &lt;/p&gt;

&lt;p&gt;You describe the application’s functionality (API endpoints, authorization, deployment, etc.) in a single file. The compiler does the rest itself. The result is a full-fledged web app built with Node + React, created in a few minutes.&lt;/p&gt;

&lt;p&gt;We've opted in for HacktoberFest, and it has already brought us tremendous results! Ten merged PRs from the external contributors, six are in progress, and more to come! It's a huge step forward for the project! Not only in terms of the amount of work done. But also the user engagement and general feedback. Definitely a huge win for us!&lt;/p&gt;

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

&lt;p&gt;If you're still thinking about whether you need to join HacktoberFest or not -- you definitely should while there's still time! &lt;/p&gt;

&lt;p&gt;P.S: And if you'd like to join us as a contributor -- &lt;a href="https://github.com/wasp-lang/wasp/issues/735"&gt;click here&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;P.P.S: Only 63 stars left until 2,000 on Github! &lt;a href="https://github.com/wasp-lang/wasp"&gt;Please star Wasp&lt;/a&gt; if you haven't yet 😄 🐝 &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>hacktoberfest</category>
      <category>react</category>
    </item>
    <item>
      <title>Help to build a language for developing full-stack web apps with no boilerplate</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Fri, 07 Oct 2022 10:28:20 +0000</pubDate>
      <link>https://dev.to/wasp/help-to-build-a-language-for-developing-full-stack-web-apps-with-no-boilerplate-205p</link>
      <guid>https://dev.to/wasp/help-to-build-a-language-for-developing-full-stack-web-apps-with-no-boilerplate-205p</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; we’ve developed an open-source language for building full-stack web apps with less code and best practices that works alongside React and Node. Join us during HacktoberFest!&lt;/p&gt;

&lt;p&gt;Hello everyone! We’re a small team of open-source enthusiasts, passionate about web development and extremely tired of writing boilerplate code. &lt;/p&gt;

&lt;p&gt;That’s why we created Wasp - an open-source web application configuration language that takes over all the routine work of creating a project backbone. You describe the application’s functionality (API endpoints, authorisation, deployment, etc.) in a single file. &lt;/p&gt;

&lt;p&gt;The compiler does the rest itself. The result is a full-fledged web app built with Node + React, created in a few minutes.  We are backed by Y Combinator and engineers from Airbnb, Facebook, and Lyft.&lt;/p&gt;

&lt;p&gt;Wasp's compiler is built with Haskell and under the hood it generates a web application in React and NodeJS. Given that, &lt;strong&gt;there are several ways in which you can contribute&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wasp compiler/CLI/LSP internals (Haskell)&lt;/li&gt;
&lt;li&gt;Wasp as a web framework (React, Node, HTML/CSS, database and so on)&lt;/li&gt;
&lt;li&gt;Tutorials or Example apps&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given that we'll find a good first issue for anyone, no matter if you're an experienced dev or just a beginner!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/wasp-lang/wasp/issues/735"&gt;Here's an entry point for anyone who wants to contribute to Wasp during Hacktoberfest.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech stack: JS, Haskell&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>Building an app to find an excuse for our sloppy work</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Mon, 12 Sep 2022 15:49:47 +0000</pubDate>
      <link>https://dev.to/wasp/building-an-app-to-find-an-excuse-for-our-sloppy-work-1laj</link>
      <guid>https://dev.to/wasp/building-an-app-to-find-an-excuse-for-our-sloppy-work-1laj</guid>
      <description>&lt;p&gt;We’ll build a web app to solve every developer's most common problem – finding an excuse to justify our messy work! And will do it with a single config file that covers the full-stack app architecture plus several dozen lines of code. In the quickest possible way, so we can’t excuse ourselves from building it!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The requirements were unclear.
&lt;/h2&gt;

&lt;p&gt;We’ll use Michele Gerarduzzi’s &lt;a href="https://github.com/michelegera/devexcuses-api"&gt;open-source project&lt;/a&gt;. It provides a simple API and a solid number of predefined excuses. A perfect fit for our needs. Let’s define the requirements for the project: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The app should be able to pull excuses data from a public API. &lt;/li&gt;
&lt;li&gt;Save the ones you liked (and your boss doesn't) to the database for future reference.&lt;/li&gt;
&lt;li&gt;Building an app shouldn’t take more than 15 minutes.&lt;/li&gt;
&lt;li&gt;Use modern web dev technologies (NodeJS + React)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result – we’ll get a simple and fun pet project. You can find the complete codebase &lt;a href="https://github.com/wasp-lang/wasp/tree/main/examples/tutorials/ItWaspsOnMyMachine"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0RZwg3u3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mkpk08t58kzup1juph0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0RZwg3u3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mkpk08t58kzup1juph0.gif" alt="Image description" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  There’s an issue with the third party library.
&lt;/h2&gt;

&lt;p&gt;Setting up a backbone for the project is the most frustrating part of building any application. &lt;/p&gt;

&lt;p&gt;We are installing dependencies, tying up the back-end and front-end, setting up a database, managing connection strings, and so on. Avoiding this part will save us a ton of time and effort. So let’s find ourselves an excuse to skip the initial project setup.&lt;/p&gt;

&lt;p&gt;Ideally – use a framework that will create a project infrastructure quickly with the best defaults so that we’ll focus on the business logic. A perfect candidate is &lt;a href="https://wasp-lang.dev/"&gt;Wasp&lt;/a&gt;. It’s an open-source, declarative DSL for building web apps in React and Node.js with no boilerplate&lt;/p&gt;

&lt;p&gt;How it works: developer starts from a single config file that specifies the app architecture. Routes, CRUD API, auth, and so on. Then adds React/Node.js code for the specific business logic. Behind the scenes, Wasp compiler will produce the entire source code of the app - back-end, front-end, deployment template, database migrations and everything else you’ve used to have in any other full-stack app. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--srewzJIn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xshof2uweewyxruv0ro2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--srewzJIn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xshof2uweewyxruv0ro2.jpg" alt="Image description" width="791" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So let’s jump right in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maybe something's wrong with the environment.
&lt;/h2&gt;

&lt;p&gt;Wasp intentionally works with the LTS Node.js version since it guarantees stability and active maintenance. As for now, it’s Node 16 and NPM 8. If you need another Node version for some other project – there’s a possibility to &lt;a href="https://wasp-lang.dev/docs#1-requirements"&gt;use NVM&lt;/a&gt; to manage multiple Node versions on your computer at the same time.&lt;/p&gt;

&lt;p&gt;Installing Wasp on Linux (for Mac/Windows, please &lt;a href="https://wasp-lang.dev/docs#2-installation"&gt;check the docs&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -sSL https://get.wasp-lang.dev/installer.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now let’s create a new web app named ItWaspsOnMyMachine.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wasp new ItWaspsOnMyMachine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Changing the working directory:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ItWaspsOnMyMachine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Starting the app:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wasp start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now your default browser should open up with a simple predefined text message. That’s it! 🥳 We’ve built and run a NodeJS + React application. And for now – the codebase consists of only two files! &lt;code&gt;main.wasp&lt;/code&gt; is the config file that defines the application’s functionality. And &lt;code&gt;MainPage.js&lt;/code&gt; is the front-end.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h5WUiEd---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jyich6eaaovcrtsflma2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h5WUiEd---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jyich6eaaovcrtsflma2.png" alt="Image description" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  That worked perfectly when I developed it.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1) Let’s add some additional configuration to our &lt;code&gt;main.wasp&lt;/code&gt; file. So it will look like this:&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;We’ve added Tailwind to make our UI more pretty and Axios for making API requests. &lt;/p&gt;

&lt;p&gt;Also, we’ve declared a database entity called &lt;code&gt;Excuse&lt;/code&gt;, queries, and action. The &lt;code&gt;Excuse&lt;/code&gt; entity consists of the entity’s ID and the text. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Queries&lt;/code&gt; are here when we need to fetch/read something, while &lt;code&gt;actions&lt;/code&gt; are here when we need to change/update data. Both query and action declaration consists of two lines – a reference to the file that contains implementation and a data model to operate on. You can find more info &lt;a href="https://wasp-lang.dev/docs/tutorials/todo-app/listing-tasks#introducing-operations-queries-and-actions"&gt;in the docs&lt;/a&gt;. So let’s proceed with queries/actions. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Create two files: “actions.js” and “queries.js” in the &lt;code&gt;ext&lt;/code&gt; folder.&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Let’s add &lt;code&gt;saveExcuse()&lt;/code&gt; action to our &lt;code&gt;actions.js&lt;/code&gt; file. This action will save the text of our excuse to the database. Then let’s create two queries in the &lt;code&gt;queries.js&lt;/code&gt; file. First, one &lt;code&gt;getExcuse&lt;/code&gt; will call an external API and fetch a new excuse. The second one, named &lt;code&gt;getAllSavedExcuses&lt;/code&gt;, will pull all the excuses we’ve saved to our database. &lt;/p&gt;

&lt;p&gt;That’s it! We finished our back-end. 🎉 Now, let’s use those queries/actions on our UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Let’s erase everything we had in the &lt;code&gt;MainPage.js&lt;/code&gt; file and substitute it with our new UI.&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Our page consists of three components. &lt;code&gt;MainPage&lt;/code&gt;, &lt;code&gt;ExcuseList&lt;/code&gt; and &lt;code&gt;Excuse&lt;/code&gt;. It may seem at first that this file is pretty complex. It’s not, so let’s look a bit closer. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Excuse&lt;/code&gt; is just a div with an excuse text, &lt;code&gt;ExcuseList&lt;/code&gt; checks if there are any excuses. If the list is empty – show a message &lt;code&gt;No saved excuses&lt;/code&gt;. In other case – excuses will be displayed. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;MainPage&lt;/code&gt; contains info about the current excuses and the list of already saved excuses. Two buttons click handlers &lt;code&gt;handleGetExcuse&lt;/code&gt; and &lt;code&gt;handleSaveExcuse&lt;/code&gt;. Plus, the markup itself with some Tailwind flavor. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) Before starting an app – we need to execute database migration because we changed the DB schema by adding new entities. If you’ve had something running in the terminal – stop it and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wasp db migrate-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll be prompted to enter a name for the migration. Something like &lt;code&gt;init&lt;/code&gt; will be ok. Now we can start the application!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wasp start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can click the “Get excuse” button to receive an excuse. And save the ones you like into the DB with the “Save excuse” button. Our final project should look like this:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  It would have taken twice as long to build it properly.
&lt;/h2&gt;

&lt;p&gt;Now we can think of some additional improvements. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a unique constraint to Entity’s ID so we won’t be able to save duplicated excuses. &lt;/li&gt;
&lt;li&gt;Add exceptions and edge cases handling. &lt;/li&gt;
&lt;li&gt;Make the markup prettier.&lt;/li&gt;
&lt;li&gt;Optimize and polish the code &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, we’ve been able to build a full-stack application with a database and external API call in a couple of minutes. And now we have a box full of excuses for all our development needs! 🥳&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DlvCq9jK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmbh8o9205zgk20rzf05.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DlvCq9jK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmbh8o9205zgk20rzf05.jpg" alt="Image description" width="717" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S: Please like &amp;amp; follow, if you found this article interesting :) And &lt;a href="https://wasp-lang.dev/"&gt;check out Wasp&lt;/a&gt; as well! &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
      <category>react</category>
    </item>
    <item>
      <title>[May Update] Wasp - language for developing full-stack JS apps with no boilerplate</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Mon, 27 Jun 2022 15:29:31 +0000</pubDate>
      <link>https://dev.to/wasp/may-update-wasp-language-for-developing-full-stack-js-apps-with-no-boilerplate-4ap4</link>
      <guid>https://dev.to/wasp/may-update-wasp-language-for-developing-full-stack-js-apps-with-no-boilerplate-4ap4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Wasp is a configuration language (DSL) for building full-stack web apps with less code and best practices that works alongside React and Node.js. We are on a mission to streamline web app development while empowering developers to continue using the power of code and their favorite tools. We are backed by Y Combinator and engineers from Airbnb, Facebook, and Lyft. This is our community update!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://e44cy1h4s0q.typeform.com/to/ycUzQa5A"&gt;We are in Alpha (try it out)!&lt;/a&gt; → &lt;a href="https://discord.gg/rzdnErX"&gt;Join our community &lt;/a&gt; → &lt;a href="https://wasp-lang.notion.site/Founding-Engineer-at-Wasp-402274568afa4d7eb7f428f8fa2c0816"&gt;Work with us&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How hops it, fellow Waspeteers? 🐰 🐝  Welcome to our May update - it's been another packed month of developing and shipping new features, so let's dig in and see what's new:&lt;/p&gt;

&lt;h2&gt;
  
  
  Community highlights - &lt;a href="https://discord.gg/rzdnErX"&gt;join us on Discord&lt;/a&gt;!
&lt;/h2&gt;

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

&lt;p&gt;One of our amazing contributors and users, &lt;a href="https://github.com/cursorial"&gt;cursorial&lt;/a&gt;, gave the whole team a presentation on &lt;strong&gt;how he used Wasp to develop and deploy an internal tool for the company he was working for at the time&lt;/strong&gt;! The next step is to turn it into a standalone SaaS service, and of course, he is again using Wasp for it! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KwNLsoRt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vg4rabqow3hzh3p03uv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KwNLsoRt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vg4rabqow3hzh3p03uv3.png" alt="Image description" width="672" height="191"&gt;&lt;/a&gt;&lt;br&gt;
🤯🤯&lt;/p&gt;

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

&lt;p&gt;Feedback from our Alpha Testing Program - scroll below to learn more and join!  &lt;/p&gt;

&lt;h2&gt;
  
  
  🐝  &lt;a href="https://wasp-lang.notion.site/Wasp-Alpha-Testing-Program-Admissions-dca25649d63849cb8dfc55881e4f6f82"&gt;Become Wasp Alpha Tester&lt;/a&gt; + get a LE Wasp Alpha t-shirt! 👕
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--49R3mnIW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b63n78d5vdveih9upct0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--49R3mnIW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b63n78d5vdveih9upct0.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Want to see how deep the rabbit hole goes? Take the red pill, Luke.&lt;/p&gt;

&lt;p&gt;Our Alpha Testing Program is in full swing and we've been getting some great feedback, but we also &lt;a href="https://wasp-lang.notion.site/Wasp-Alpha-Testing-Program-Admissions-dca25649d63849cb8dfc55881e4f6f82"&gt;need you on board&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;This is your opportunity to get a taste of Wasp, connect with the team, and earn forever bragging rights (+ a t-shirt to prove it) that &lt;a href="https://wasp-lang.notion.site/Wasp-Alpha-Testing-Program-Admissions-dca25649d63849cb8dfc55881e4f6f82"&gt;you tested Wasp while it was still in Alpha&lt;/a&gt; and pretty much single-handedly saved it from the inevitable doom with your feedback! &lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Join for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official recognition in the Wasp community (awesome nick color in Discord + limited edition T-shirt!)&lt;/li&gt;
&lt;li&gt;Direct connection to the Wasp team (via a dedicated channel)&lt;/li&gt;
&lt;li&gt;Be the first to learn about the new features and directly influence them!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to join? &lt;a href="https://wasp-lang.notion.site/Wasp-Alpha-Testing-Program-Admissions-dca25649d63849cb8dfc55881e4f6f82"&gt;Apply here&lt;/a&gt; and we'll be in touch shortly!&lt;/p&gt;

&lt;p&gt;To prove that t-shirt is not a lie, here is a photo of our stash: &lt;/p&gt;

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

&lt;p&gt;Here's also the latest meme of our making (by our CTO Martin, he was very proud of it so I had to include it):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ei8KNm4q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/icmm2uyqfo0r9a9k2789.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ei8KNm4q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/icmm2uyqfo0r9a9k2789.gif" alt="Image description" width="348" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recorded footage of our first testers (we promise, it's better now!! 😅)&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Run async jobs directly from Wasp! 🏗
&lt;/h2&gt;

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

&lt;p&gt;If you have a server task that you want to run in an async way (e.g. sending an email, manipulating an uploaded image via 3rd-party API, generating a lengthy report overnight...), Wasp has you covered!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You simply need to provide a function you want to have executed, define is it a cron job or not and Wasp will cover the rest:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;executing it&lt;/li&gt;
&lt;li&gt;keep retrying in case it fails&lt;/li&gt;
&lt;li&gt;store the progress in the database so you don't lose it if e.g. the server gets restarted&lt;/li&gt;
&lt;li&gt;→ all the heavy lifting you don't want to worry about!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the &lt;a href="https://wasp-lang.dev/blog/2022/06/15/jobs-feature-announcement"&gt;feature announcement post with examples&lt;/a&gt; and also find the docs &lt;a href="https://wasp-lang.dev/docs/language/features#jobs"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❓Easily configure react-query client ⚙️
&lt;/h2&gt;

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

&lt;p&gt;Wasp &lt;code&gt;useQuery&lt;/code&gt; hook is powered by &lt;a href="https://react-query.tanstack.com/"&gt;react-query&lt;/a&gt; under the hood. It already comes with pretty sane default options so you often won't need to touch it, but in case you do now you can! You can do it via &lt;code&gt;configureQueryClient&lt;/code&gt; (above) within the client setup function (below):&lt;/p&gt;

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

&lt;p&gt;For more details and examples, check out &lt;a href="https://wasp-lang.dev/docs/language/features#overriding-default-behaviour-for-queries"&gt;the docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚧 coming soon 🚧 Optimistic UI updates without the hassle! 🧘‍♂️
&lt;/h2&gt;

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

&lt;p&gt;After we've updated react-query to the latest stable version and made it configurable, now is the time to deal with the elephant in the room - optimistic UI updates! It's a pattern that many developers broke their teeth on, which makes it a perfect fit to be streamlined with Wasp!&lt;/p&gt;

&lt;h2&gt;
  
  
  🚧 coming soon 🚧 Improved IDE support for Wasp 📟
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dw189FN---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q8tfd2f11ad1ca25ros3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dw189FN---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q8tfd2f11ad1ca25ros3.gif" alt="Image description" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You asked for it - you're getting it! Building a language has a lot of benefits, such as practically unlimited flexibility to design the best possible DX for you, but it also requires a bit more work to get all the tooling around it to work as you'd expect.&lt;/p&gt;

&lt;p&gt;Wasp already had a basic regex-based syntax highlighting via VS Code extensions, but now we're taking it a step further - &lt;strong&gt;we're building our own LSP! That means all the usual goodies will be supported - autocomplete, syntax highlighting, jumping to a definition, ...&lt;/strong&gt; (we're not taking them for granted anymore! 😅)&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 &lt;a href="https://wasp-lang.dev/blog/2022/05/31/filip-intro"&gt;Welcome Filip&lt;/a&gt; - Founding Engineer! 🎊
&lt;/h2&gt;

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

&lt;p&gt;Another amazing engineer joined the team! Filip is a die-hard open-source user and contributor (his favorite pass time is configuring his archlinux setup), and Wasp is not the first programming language he has worked on.&lt;/p&gt;

&lt;p&gt;To learn more about him and why he joined Wasp of all the places, check out his &lt;a href="https://wasp-lang.dev/blog/2022/05/31/filip-intro"&gt;intro interview.&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  🕹️ &lt;a href="https://wasp-lang.notion.site/DevRel-at-Wasp-dd53d9b3a8b54960b2cb93f9bdad2944"&gt;We are hiring - DevRel at Wasp!&lt;/a&gt; 💾
&lt;/h2&gt;

&lt;p&gt;After seeing how much fun it is to interact with all of you, chat about the code and also write these emails, we decided we can't be selfish and keep that to ourselves - that's why we decided to &lt;a href="https://wasp-lang.notion.site/DevRel-at-Wasp-dd53d9b3a8b54960b2cb93f9bdad2944"&gt;hire a DevRel for Wasp&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TWflB4or--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wbibpejr74cpy537kf94.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TWflB4or--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wbibpejr74cpy537kf94.gif" alt="Image description" width="270" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is how we're going to dance if you apply for DevRel position at Wasp - do you really want to take that away from us (maybe you should though)?&lt;/p&gt;

&lt;p&gt;If you love to code but also enjoy writing and talking to fellow developers, we'd love to meet you! For more details &lt;a href="https://wasp-lang.notion.site/DevRel-at-Wasp-dd53d9b3a8b54960b2cb93f9bdad2944"&gt;take a look here&lt;/a&gt;, and feel free to just reply directly to this email. If this is not your thing but you know somebody whose it is, feel free to forward this to them. We can't wait to hear from you!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/wasp-lang/wasp"&gt;Wasp Github&lt;/a&gt; Star Growth - we are trending on GitHub!
&lt;/h2&gt;

&lt;p&gt;Wasp is trending on GitHub in the "Haskell" category - make sure to &lt;a href="https://github.com/wasp-lang/wasp"&gt;star the repo&lt;/a&gt; and let's make it to the top!&lt;/p&gt;

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

&lt;p&gt;Total star count: 1,706 - we are on fire 🔥🔥! As always, huge thanks to all our &lt;a href="https://github.com/wasp-lang/wasp/graphs/contributors"&gt;contributors&lt;/a&gt; and &lt;a href="https://github.com/wasp-lang/wasp/stargazers"&gt;stargazers&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;And if you haven't yet&lt;/strong&gt;, &lt;a href="https://github.com/wasp-lang/wasp"&gt;please star us on Github&lt;/a&gt;! Yes, we are shameless star beggars, but if you believe in the project and want to support it that's one of the best ways to do it (next to actually building something with Wasp - &lt;a href="https://wasp-lang.dev/docs"&gt;go do that too&lt;/a&gt;! :D). Don't do it for us, do it for Leslie Knope:  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SQKEI88m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qbl5yfq0y53ll4bl30r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SQKEI88m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qbl5yfq0y53ll4bl30r.gif" alt="Image description" width="220" height="124"&gt;&lt;/a&gt;&lt;br&gt;
Even Ron would star Wasp on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/WaspLang"&gt;Wasp is on Twitter &lt;/a&gt;- we stepped up our game and are now tweeting every day (at least we try to)! We share memes, code examples, and announce hackathons and swag giveaways - &lt;a href="https://twitter.com/WaspLang"&gt;follow us to stay in the loop&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--77P1uwZO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f4bq4lb68jho2kr3m0d4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--77P1uwZO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f4bq4lb68jho2kr3m0d4.png" alt="Image description" width="602" height="1156"&gt;&lt;/a&gt;&lt;br&gt;
The cake is a lie! (or is it 🎂?)&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer life 💻⌨️💽
&lt;/h2&gt;

&lt;p&gt;Here is the cool stuff we came across this month:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Sampler *&lt;/em&gt;- &lt;a href="https://github.com/sqshq/sampler"&gt;Visualization for any shell command&lt;/a&gt; - if we ever saw a cool CLI tool, this is the one. Sample any dynamic process right from the terminal, and look like a true h4x0r while doing so! This is actually coming close to Wasp Alpha Testing Program in coolness.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2jsb_ZMK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jzrissya2cp9w6w1ndgf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2jsb_ZMK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jzrissya2cp9w6w1ndgf.gif" alt="Image description" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Flycut *&lt;/em&gt;-&lt;a href="https://github.com/TermiT/Flycut"&gt; clean and simple clipboard for Mac&lt;/a&gt; - if you ever needed to copy/paste a bunch of things over and over, you know how annoying it is to lose the previous item from your clipboard. Well, never again - with this nifty tool that saves your clipboard history you'll boost your productivity and also become a better person (since you'll be cursing less).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xzMTMVG0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nzlv66arjcgvdabuo9gb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xzMTMVG0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nzlv66arjcgvdabuo9gb.png" alt="Image description" width="523" height="339"&gt;&lt;/a&gt;&lt;br&gt;
By pressing Shift + Cmd + V you toggle through your clipboard history&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A mechanical watch&lt;/strong&gt; - &lt;a href="https://ciechanow.ski/mechanical-watch/"&gt;mechanism visualization&lt;/a&gt; - there was a "post the coolest page on the internet" topic on HN, and it for sure did not disappoint. Not connected to programming per se, but it's the next finest piece of engineering. Amazing interactive 3d visualizations of the inner workings of a mechanical watch!&lt;/p&gt;

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

&lt;p&gt;Do you have any tips for us (music, gear, useful apps/plugins, ...)? Let us know by &lt;a href="https://twitter.com/WaspLang"&gt;tagging us on Twitter&lt;/a&gt; and we'll include it in the next update (with due credit of course). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7Ghrq29b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ardc9mou1v2hapfazgre.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Ghrq29b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ardc9mou1v2hapfazgre.gif" alt="Image description" width="480" height="480"&gt;&lt;/a&gt;&lt;br&gt;
I have to leave now and fulfill my destiny (make more memes)&lt;/p&gt;

&lt;p&gt;That's it for this month! Thanks for reading and supporting us - if you have any feedback, ideas, or just want to share your latest swag idea (e.g. &lt;a href="https://www.amazon.com/Antenna-Headband-Ladybug-Accessories-Halloween/dp/B09YQ52CPN/ref=sr_1_9?keywords=bee%2Baccessories&amp;amp;qid=1655816371&amp;amp;sr=8-9&amp;amp;th=1"&gt;wasp antenna headband and honeycomb glasses&lt;/a&gt;?) &lt;a href="https://discord.gg/rzdnErX"&gt;join our Discord&lt;/a&gt; or hit reply to this email!&lt;/p&gt;

&lt;p&gt;Fly freely and feel the wind in your antennae! 🐝🐝&lt;br&gt;
the Wasp team&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>node</category>
    </item>
    <item>
      <title>Hackathon environment + boilerplate from scratch in five steps</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Thu, 16 Jun 2022 12:21:59 +0000</pubDate>
      <link>https://dev.to/wasp/hackathon-environment-boilerplate-from-scratch-in-five-steps-4oaa</link>
      <guid>https://dev.to/wasp/hackathon-environment-boilerplate-from-scratch-in-five-steps-4oaa</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;a href="https://wasp-lang.dev"&gt;Wasp&lt;/a&gt; allows you to build and deploy a full-stack JS web app with a single config file. &lt;a href="https://gitpod.io/"&gt;Gitpod&lt;/a&gt; spins up fresh, automated developer environments in the cloud, in seconds. A perfect tandem to win a hackathon and enjoy free pizza even before other teams even started to set up their coding env and realized they need to update their node version.&lt;/p&gt;

&lt;p&gt;Wasp is a configuration language (DSL) for building full-stack web apps with less code and best practices that works alongside React and Node.js. We are on a mission to streamline web app development while empowering developers to continue using the power of code and their favorite tools. We are backed by Y Combinator and engineers from Airbnb, Facebook, and Lyft.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wasp-lang.notion.site/Wasp-Alpha-Testing-Program-Admissions-dca25649d63849cb8dfc55881e4f6f82"&gt;We are in Alpha (try it out)&lt;/a&gt;! → &lt;a href="https://discord.gg/rzdnErX"&gt;Join our community&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro:
&lt;/h2&gt;

&lt;p&gt;Usually, every hackathon starts from similar activities:&lt;br&gt;
1) &lt;strong&gt;setting up a local dev environment&lt;/strong&gt;, especially if all the team members use different operating systems. There are always issues with the SDK/packages/compiler, etc.&lt;br&gt;
2) &lt;strong&gt;building project backbone&lt;/strong&gt; (folder structure, basic services, CRUD APIs, and so on).&lt;/p&gt;

&lt;p&gt;Both of them are time-consuming, boring, and cause issues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a7NNnWoI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6rr7asx7b2earh6uizen.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a7NNnWoI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6rr7asx7b2earh6uizen.gif" alt="Image description" width="245" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thankfully, those issues can be avoided! Gitpod allows you to spin up a clean, already pre-set dev environment. And Wasp enables you to build a full-stack JS web app with a single config file (alongside your React and Node.js code). But first things first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KQVvzp3E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypvfazcgi85ac5ly95ag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KQVvzp3E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypvfazcgi85ac5ly95ag.png" alt="Pennywise luring into his openspace" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dev environment setup:
&lt;/h2&gt;

&lt;p&gt;Gitpod spins up a bespoke dev environment in the cloud for any git branch (once you configured it for your project), on-demand. So you can start coding right away. Build, debug, commit and push your code in seconds, without any local SDK issues. After you’ve finished – you can host your app after a couple of clicks and share the project with your teammate. You can even make changes to the same project simultaneously, leveraging a pair programming approach.&lt;/p&gt;

&lt;p&gt;Since Gitpod is a cloud-based workspace – spinning up a new application takes a couple of clicks.&lt;/p&gt;

&lt;p&gt;1) Fork &lt;a href="https://github.com/gitpod-io/template-wasp"&gt;template repo&lt;/a&gt; and give it a meaningful name, e.g. “My Awesome Recipes App” -&amp;gt; this is now a repo for your new web app.&lt;br&gt;
2) In your newly created repo, check the Readme and click the “Open in Gitpod” button&lt;br&gt;
3) Login via Github&lt;br&gt;
4) Allow pop-ups&lt;br&gt;
5) That’s it! Enjoy your fresh cloud-based dev environment!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PifGCtpl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9q6qjme9ut2omr5noyyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PifGCtpl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9q6qjme9ut2omr5noyyp.png" alt="Roadmap" width="800" height="1134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An optional thing might be enabling the “Share” option to make the app accessible from the external internet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d9qdwVfs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x042xhgr67b5pv4f34ka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d9qdwVfs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x042xhgr67b5pv4f34ka.png" alt="Share project" width="597" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can pick up one of the following IDE’s, switch between light/dark themes and you can even install all your favorite extensions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zIHs5Ct9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ubtc2emz1kajzo14scq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zIHs5Ct9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ubtc2emz1kajzo14scq6.png" alt="Editors" width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, eventually, the workflow can look like this: someone from the team forks the template repo and shares it with others. Teammates open this repo in Gitpod, creating their own dev branches.&lt;/p&gt;

&lt;p&gt;Voila! 🥳&lt;/p&gt;

&lt;p&gt;The whole team is ready to code in a matter of seconds. After the team is done with the development, someone can pull all the changes, share the project, and present it to the judges.&lt;/p&gt;

&lt;p&gt;No need to fix local issues, ensure the Node version is aligned, or configure the deployment pipeline for DigitalOcean. Gitpod does all development preparations. The only thing the team has to do – is to implement the idea ASAP. And here Wasp comes into play!&lt;/p&gt;

&lt;h2&gt;
  
  
  Building project backbone:
&lt;/h2&gt;

&lt;p&gt;Ok, we’ve successfully set up a shared dev environment. It’s time to create a production-ready web app with just a few lines of code. Based on your needs – you can declare separate pages, routes, database models, etc. - it’s super easy and intuitive!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ideal case would be to:&lt;/strong&gt;&lt;br&gt;
1) Check out &lt;a href="https://wasp-lang.dev/docs/language/overview"&gt;the language overview&lt;/a&gt;&lt;br&gt;
2) Follow a &lt;a href="https://wasp-lang.dev/docs/tutorials/todo-app"&gt;20-minutes tutorial&lt;/a&gt; on how to build a To-Do app with Wasp&lt;/p&gt;

&lt;p&gt;It may seem a bit inconvenient: why spend time on learning, when you already can start building something meaningful? The short answer is: &lt;strong&gt;time-saving&lt;/strong&gt;. Wasp’s main point is to set you free from building time-consuming boilerplate. So even if you’ll spend half of an hour learning the basics – you’ll still be able to outrun other hackathon participants. While they will be copy-pasting CRUD API methods – you’ll be building business logic.&lt;/p&gt;

&lt;p&gt;And 20 minutes is time well spent to become more productive. Setting up each team member's environment locally likely takes more than 20 minutes if you don't use Gitpod.&lt;/p&gt;

&lt;h2&gt;
  
  
  To wrap up:
&lt;/h2&gt;

&lt;p&gt;We think that Wasp + Gitpod is a powerful toolset for speedrunning any hackathon. No matter how complex or ambitious your project is. If it’s built with Node and React – nothing can stop you from winning. Good luck, have fun, and enjoy that pizza 🍕!&lt;/p&gt;

&lt;p&gt;P.S: If you're checking out Wasp &lt;a href="https://wasp-lang.notion.site/Wasp-Alpha-Testing-Program-Admissions-dca25649d63849cb8dfc55881e4f6f82"&gt;check out our Alpha Testing Program&lt;/a&gt;, so you also get a t-shirt 😄&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>node</category>
    </item>
    <item>
      <title>How we built a Trello clone with Wasp - Waspello!</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Wed, 15 Jun 2022 12:12:38 +0000</pubDate>
      <link>https://dev.to/wasp/how-we-built-a-trello-clone-with-wasp-waspello-30b9</link>
      <guid>https://dev.to/wasp/how-we-built-a-trello-clone-with-wasp-waspello-30b9</guid>
      <description>&lt;p&gt;We've built a Trello clone using our new language for building Javasript apps! Read on to learn how it went and how you can contribute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://waspello.netlify.app/"&gt;Try Waspello here! &lt;/a&gt;| &lt;a href="https://github.com/wasp-lang/wasp/blob/main/examples/waspello/main.wasp"&gt;See the code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wasp is a configuration language (DSL) for building full-stack web apps with less code and best practices that works alongside React and Node.js. We are on a mission to streamline web app development while empowering developers to continue using the power of code and their favorite tools. We are backed by Y Combinator and engineers from Airbnb, Facebook, and Lyft.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bit.ly/3Mo0Gu6"&gt;We are in Alpha (try it out)!&lt;/a&gt; → &lt;a href="https://discord.gg/rzdnErX"&gt;Join our community&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Trello?
&lt;/h2&gt;

&lt;p&gt;While building Wasp, our goal is to use it as much as we can to build our projects and play with it, so we can learn what works and what we should do next. This is why Trello was a great choice of app to build with Wasp - it is one of the most well-known full-stack web apps, it's very simple and intuitive to use but also covers a good portion of features used by today's modern web apps.&lt;/p&gt;

&lt;p&gt;So let's dig in and see and how it went - what works, what doesn't and, what's missing/coming next!&lt;/p&gt;

&lt;h2&gt;
  
  
  What works?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It's alive ⚡🤖 !!&lt;/strong&gt;&lt;br&gt;
The good news is all the basic functionality is here - Waspello users can signup/log in which brings them to their project board where they can perform CRUD operations on lists and cards - create them, edit them, move them around, etc. Let's see it in action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1hi9knVQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5nuffowbcy2dsrtmrhv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1hi9knVQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5nuffowbcy2dsrtmrhv.gif" alt="Waspello in action!" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see things work, but not everything is perfect (e.g. there is a delay when creating/moving a card) - we'll examine why is that so a bit later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Under the hood 🚘 🔧&lt;/strong&gt;&lt;br&gt;
Here is a simple visual overview of Waspello's code anatomy (which applies to every Wasp app):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6pCn9yrm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jmh2ieublpyb3ezkajd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6pCn9yrm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jmh2ieublpyb3ezkajd3.png" alt="Waspello code anatomy" width="731" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's now dig in a bit deeper and shortly examine each of the concepts Wasp supports (page, query, entity, ...) and learn through code samples how to use it to implement Waspello.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entities&lt;/strong&gt;&lt;br&gt;
It all starts with a data model definition (called entity in Wasp), which is defined via Prisma Schema Language:&lt;/p&gt;

&lt;p&gt;main.wasp | Defining entities via Prisma Schema Language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Entities

entity User {=psl
    id          Int     @id @default(autoincrement())
    email       String  @unique
    password    String
    lists       List[]
    cards       Card[]
psl=}

entity List {=psl
    id          Int     @id @default(autoincrement())
    name        String
    pos         Float

    // List has a single author.
    user        User    @relation(fields: [userId], references: [id])
    userId      Int

    cards       Card[]
psl=}

entity Card {=psl
    id          Int     @id @default(autoincrement())
    title       String
    pos         Float

    // Card belongs to a single list.
    list        List    @relation(fields: [listId], references: [id])
    listId      Int

    // Card has a single author.
    author      User    @relation(fields: [authorId], references: [id])
    authorId    Int
psl=}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those three entities are all we need! Wasp uses Prisma to create a database schema underneath and allows the developer to query it through its generated SDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queries and Actions (Operations)&lt;/strong&gt;&lt;br&gt;
After we've defined our data models, the next step is to do something with them! We can read/create/update/delete an entity and that is what query and action mechanisms are for. Below follows an example from the Waspello code that demonstrates how it works.&lt;/p&gt;

&lt;p&gt;The first step is to declare to Wasp there will be a query, point to the actual function containing the query logic, and state from which entities it will be reading information.&lt;/p&gt;

&lt;p&gt;main.wasp | Declaration of a query in Wasp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query getListsAndCards {
    // Points to the function which contains query logic.
    fn: import { getListsAndCards } from "@ext/queries.js",

    // This query depends on List and Card entities.
    // If any of them changes this query will get re-fetched (cache invalidation).
    entities: [List, Card]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main point of this declaration is for Wasp to be aware of the query and thus be able to do a lot of heavy lifting for us - e.g. it will make the query available to the client without any extra code, all that developer needs to do is import it in their React component. Another big thing is cache invalidation / automatic re-fetching of the query once the data changes (this is why it is important to declare which entities it depends on).&lt;/p&gt;

&lt;p&gt;The remaining step is to write the function with the query logic.&lt;/p&gt;

&lt;p&gt;ext/queries.js | Query logic, using Prisma SDK via Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const getListsAndCards = async (args, context) =&amp;gt; {
  // Only authenticated users can execute this query.
  if (!context.user) { throw new HttpError(403) }

  return context.entities.List.findMany({
    // We want to make sure user can access only their own cards.
    where: { user: { id: context.user.id } },
    include: { cards: true }
  })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is just a regular Node.js function, there are no limits on what you can return! All the stuff provided by Wasp (user data, Prisma SDK for a specific entity) comes in a context variable.&lt;/p&gt;

&lt;p&gt;The code for actions is very similar (we just need to use action keyword instead of query) so I won't repeat it here. You can check out the code for updateCard action here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pages, routing &amp;amp; components&lt;/strong&gt;&lt;br&gt;
To display all the nice data we have, we'll use React components. There are no limits to how you can use React components within Wasp, the only one is that each page has its root component.&lt;/p&gt;

&lt;p&gt;main.wasp | Declaration of a page &amp;amp; route in Wasp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;route MainRoute { path: "/", to: Main }
page Main {
    authRequired: true,
    component: import Main from "@ext/MainPage.js"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All pretty straightforward so far! As you can see here, Wasp also provides authentication out-of-the-box.&lt;/p&gt;

&lt;p&gt;Currently, the majority of the client logic of Waspello is contained in ext/MainPage.js (we should break it down a little 😅 - you can help us!). Just to give you an idea, here's a quick glimpse into it.&lt;/p&gt;

&lt;p&gt;ext/MainPage.js | Using React component in Wasp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// "Special" imports provided by Wasp.
import { useQuery } from '@wasp/queries'
import getListsAndCards from '@wasp/queries/getListsAndCards'
import createList from '@wasp/actions/createList'

const MainPage = ({ user }) =&amp;gt; {
  // Fetching data via useQuery.
  const { data: listsAndCards, isFetchingListsAndCards, errorListsAndCards }
    = useQuery(getListsAndCards)

  // A lot of data transformations and sub components.
  ...

  // Display lists and cards.
  return (
    ...
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you've defined a query or action as described above, you can immediately import it into your client code as shown in the code sample, by using the &lt;code&gt;@wasp&lt;/code&gt; prefix in the import path. &lt;code&gt;useQuery&lt;/code&gt; ensures reactivity so once the data changes the query will get re-fetched. You can find more details about it &lt;a href="https://wasp-lang.dev/docs/language/features#usequery"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is pretty much it from the stuff that works 😄 ! I kinda rushed a bit through things here - for more details on all Wasp features and to build your first app with Wasp, check out our &lt;a href="https://wasp-lang.dev/docs"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What doesn't work (yet)
&lt;/h2&gt;

&lt;p&gt;The main problem of the current implementation of Waspello is the lack of support for optimistic UI updates in Wasp. What this means is that currently, when an entity-related change is made (e.g. a card is moved from one list to another), we have to wait until that change is fully executed on the server until it is visible in the UI, which causes a noticeable delay.&lt;/p&gt;

&lt;p&gt;In many cases that is not an issue, but when UI elements are all visible at once and it is expected from them to be updated immediately, then it is noticeable. This is also one of the main reasons why we chose to work on Waspello - to have a benchmark/sandbox for this feature! Due to this issue, here's how things currently look like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iRiA7qGM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i2sjolr5g8gzoa7kdmtw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iRiA7qGM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i2sjolr5g8gzoa7kdmtw.gif" alt="Without an optimistic UI update, there is a delay" width="567" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can notice the delay between the moment the card is dropped on the "Done" list and the moment it becomes a part of that list. The reason is that at the moment of dropping the card on "Done" list, the API request with the change is sent to the server, and only when that change is fully processed on the server and saved to the database, the query &lt;code&gt;getListsAndCards&lt;/code&gt; returns the correct info and consequently, UI is updated to the correct state.&lt;br&gt;
That is why upon dropping on "Done", the card first goes back to the original list (because the change is not saved in db yet, so &lt;code&gt;useQuery(getListsAndCards)&lt;/code&gt; still returns the "old" state), it waits a bit until the API request is processed successfully, and just then the change gets reflected in the UI.&lt;/p&gt;

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

&lt;p&gt;There's a MR in our repo,&lt;a href="https://github.com/wasp-lang/wasp/pull/630"&gt; check it out!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pj0TvUeJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hle7ljm8rn5qbzpqjkvh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pj0TvUeJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hle7ljm8rn5qbzpqjkvh.gif" alt="We're almost there!" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's missing (next features)
&lt;/h2&gt;

&lt;p&gt;Although it looks super simple at the first glance, Trello is in fact a huge app with lots and lots of cool features hidden under the surface! Here are some of the more obvious ones that are currently not supported in Waspello:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users can have multiple boards, for different projects (currently we have no notion of a "Board" entity in Waspello at all, so there is implicitly only one)&lt;/li&gt;
&lt;li&gt;Detailed card view - when clicked on a card, a "full" view with extra options opens&lt;/li&gt;
&lt;li&gt;Search - user can search for a specific list/card&lt;/li&gt;
&lt;li&gt;Collaboration - multiple users can participate on the same board&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And many more - e.g. support for workspaces (next level of the hierarchy, a collection of boards), card labels, filters. &lt;/p&gt;

&lt;p&gt;It is very helpful to have such a variety of features since we can use it as a testing ground for Wasp and use it as a guiding star towards Beta/1.0!&lt;/p&gt;

&lt;h2&gt;
  
  
  Become a Waspeller!
&lt;/h2&gt;

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

&lt;p&gt;If you want to get involved with OSS and at the same time familiarize yourself with Wasp, this is a great way to get started - feel free to &lt;a href="https://github.com/wasp-lang/wasp/issues/337"&gt;choose one of the features listed here &lt;/a&gt;or add your own and help us make Waspello the best demo productivity app out there!&lt;/p&gt;

&lt;p&gt;Also, make sure to &lt;a href="https://discord.gg/rzdnErX"&gt;join our community on Discord&lt;/a&gt;. We’re always there and are looking forward to seeing what you build! &lt;/p&gt;

&lt;p&gt;And yeah, subscribe to our updates. There's so much stuff we want to show!&lt;/p&gt;

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