<?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: 🅲🅰🆁🆃🅴🆁</title>
    <description>The latest articles on DEV Community by 🅲🅰🆁🆃🅴🆁 (@crtr0).</description>
    <link>https://dev.to/crtr0</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%2F65888%2Fd349c8a9-ee18-4ea0-8c1d-0bcf08f9ee8e.jpg</url>
      <title>DEV Community: 🅲🅰🆁🆃🅴🆁</title>
      <link>https://dev.to/crtr0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/crtr0"/>
    <language>en</language>
    <item>
      <title>Talks from SeattleJS Conf 2023 (free)</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Fri, 01 Sep 2023 22:01:00 +0000</pubDate>
      <link>https://dev.to/crtr0/talks-from-seattlejs-conf-2023-free-578p</link>
      <guid>https://dev.to/crtr0/talks-from-seattlejs-conf-2023-free-578p</guid>
      <description>&lt;p&gt;The talks from SeattleJS Conf 2023 have been posted online, for free!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLLiioAbFTbKMJMlJnhkiKy7IfsnsCVAb5"&gt;https://www.youtube.com/playlist?list=PLLiioAbFTbKMJMlJnhkiKy7IfsnsCVAb5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Talk rundown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What to Know About Deno 2.0 by Kevin Whinnery&lt;/li&gt;
&lt;li&gt;Rebuilding in Rust for Good Reason by Eve Porcello&lt;/li&gt;
&lt;li&gt;50 shades of React rendering with Next.js by Ben Ilegbodu&lt;/li&gt;
&lt;li&gt;FLIP no more; Viva View Transitions by Adam Argyle&lt;/li&gt;
&lt;li&gt;Creating a Design System using Design Tokens With Amplify by Erik Hanchett&lt;/li&gt;
&lt;li&gt;Move over passwords, passkeys are my new best friend! by Daphne Liu&lt;/li&gt;
&lt;li&gt;Understanding LangChain Agents and Tools with Twilio (or with SMS) by Lizzie Siegle&lt;/li&gt;
&lt;li&gt;Building a Real-Time Multiplayer Reactions Component by John Pham&lt;/li&gt;
&lt;li&gt;Every Process, Everywhere, All at Once by Luis Montes&lt;/li&gt;
&lt;li&gt;ES13 and Beyond: The Future of JavaScript by Christina Zhu&lt;/li&gt;
&lt;li&gt;Static Analysis: Don't Fear the Linter! by Josh Goldberg&lt;/li&gt;
&lt;li&gt;A Plea for Boring Tech by Jason Lengstorf&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
      <category>css</category>
    </item>
    <item>
      <title>Tutorial: Sending Mobile Push Notifications Using Courier and Their New Android SDK</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Thu, 31 Aug 2023 20:07:00 +0000</pubDate>
      <link>https://dev.to/crtr0/tutorial-sending-mobile-push-notifications-using-courier-and-their-new-android-sdk-151l</link>
      <guid>https://dev.to/crtr0/tutorial-sending-mobile-push-notifications-using-courier-and-their-new-android-sdk-151l</guid>
      <description>&lt;p&gt;If you're building mobile applications, learning how to deliver push notifications is essential to creating engaging experience and notifying your users of urgent tasks or updates. &lt;/p&gt;

&lt;p&gt;Sending push notifications to Android apps is pretty straightforward, but quickly gets complex when you start to consider sequencing notifications across multiple devices, managing tokens, complying with regional regulations, localizing notifications, and respecting user preferences. 😬&lt;/p&gt;

&lt;p&gt;Enter Courier, a platform designed to streamline this process. Courier’s Android SDK provides a comprehensive solution for push notifications, simplifying the complex task of managing product-triggered communications across different platforms. &lt;/p&gt;

&lt;p&gt;In this tutorial, we will focus on Courier's push notification capabilities within Android apps, covering the setup process, key features, and how to send a test push notification. By the end, you’ll see how Courier can make managing Android push notifications a more manageable task, leaving you with more time to focus on creating a great user experience.&lt;/p&gt;

&lt;p&gt;Tutorial → &lt;a href="https://www.courier.com/blog/android-sdk-push-notifications-using-courier/"&gt;https://www.courier.com/blog/android-sdk-push-notifications-using-courier/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github Repo → &lt;a href="https://github.com/trycourier/tutorial-android-push-notifs"&gt;https://github.com/trycourier/tutorial-android-push-notifs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>android</category>
      <category>push</category>
      <category>notifications</category>
    </item>
    <item>
      <title>Building a Virtual Conference Ticket with Begin, AWS &amp; Puppeteer</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Tue, 14 Sep 2021 03:44:47 +0000</pubDate>
      <link>https://dev.to/crtr0/building-a-virtual-conference-ticket-with-begin-aws-puppeteer-hgk</link>
      <guid>https://dev.to/crtr0/building-a-virtual-conference-ticket-with-begin-aws-puppeteer-hgk</guid>
      <description>&lt;p&gt;This year, inspired by the folks at Next.js Conf, I decided to build &lt;a href="https://2021.cascadiajs.com/tickets/140"&gt;virtual tickets&lt;/a&gt; for my conference &lt;a href="https://2021.cascadiajs.com"&gt;CascadiaJS&lt;/a&gt;. It's a fun feature for attendees because they get to help spread the word about an event they're excited about.&lt;/p&gt;

&lt;p&gt;Here is the user flow for attendees choosing to create a virtual ticket:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;They click a link to create the virtual ticket.&lt;/li&gt;
&lt;li&gt;This sends them to Github for an OAuth flow.&lt;/li&gt;
&lt;li&gt;On success, Github returns with OAuth code.&lt;/li&gt;
&lt;li&gt;Web app stores success marker in DB for this attendee.&lt;/li&gt;
&lt;li&gt;Web app fires event to generate the virtual ticket image.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's walk through each of these steps!&lt;/p&gt;

&lt;h2&gt;
  
  
  0. Using Begin to build on AWS
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/cascadiajs/cascadiajs-2021"&gt;CascadiaJS 2021 web app&lt;/a&gt; is built on a framework called &lt;a href="http://arc.codes"&gt;Arc&lt;/a&gt; and hosted on AWS via a new platform called &lt;a href="http://begin.com"&gt;Begin&lt;/a&gt;. The combination of Arc and Begin make it easy to build a full-stack web application that takes full advantage of AWS services like Lambda, DynamoDB and SNS without 99% of the boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Creating the Github OAuth link.
&lt;/h2&gt;

&lt;p&gt;First, you'll need to go to Github and &lt;a href="https://docs.github.com/en/developers/apps/building-oauth-apps/creating-an-oauth-app"&gt;create an OAuth application&lt;/a&gt;. Once you do this, you'll be provided with a &lt;code&gt;Client ID&lt;/code&gt; and you can create a &lt;code&gt;Client Secret&lt;/code&gt;. Store both of these values in your &lt;a href="https://learn.begin.com/basic/state/env"&gt;environment variables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Building the link to kick-off a Github OAuth flow is as simple as constructing the URL below with your &lt;code&gt;Client ID&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;a href="https://github.com/login/oauth/authorize?client_id=${ clientID }"&amp;gt;Get Added to Directory&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. This sends them to Github for an OAuth flow.
&lt;/h2&gt;

&lt;p&gt;When the user lands on this page, they'll see the name of your Github OAuth app and the logo you've uploaded. Make sure these are things that folks will trust. &lt;/p&gt;

&lt;h2&gt;
  
  
  3. On success, Github returns with OAuth code.
&lt;/h2&gt;

&lt;p&gt;Once the user authorizes this connection, Github will redirect to the &lt;code&gt;Authorization callback URL&lt;/code&gt; that you will have configured and will pass along a &lt;code&gt;code&lt;/code&gt; as a query parameter.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Web app stores success marker in DB for this attendee.
&lt;/h2&gt;

&lt;p&gt;In the HTTP function that handles the OAuth callback, we use the code passed in the request to &lt;a href="https://github.com/cascadiajs/cascadiajs-2021/blob/main/src/http/get-home-000view/github.js"&gt;retrieve the public information&lt;/a&gt; for this Github user. We then update the attendees ticket record to store their Github username and avatar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let info = await github(req)
await data.set({ table: 'tickets', ...ticket, github: info.login, avatar: info.avatar })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Web app fires event to generate the virtual ticket image.
&lt;/h3&gt;

&lt;p&gt;Finally, the stuff you've &lt;em&gt;really&lt;/em&gt; been waiting for: generating dynamic images!&lt;/p&gt;

&lt;p&gt;First, since this image generation process can take time, I chose to kick-off an asynchronous job using &lt;a href="https://docs.begin.com/en/event-functions/provisioning"&gt;Arc events&lt;/a&gt; which are sugar for more easily using AWS SNS. This way the HTTP functions returns to the user immediately, while imagine generation happens in the background.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const name = 'ticket-shared'
const payload = { number: ticket.number }
await arc.events.publish({ name, payload })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The event function, when invoked, is provided with the unique ticket number for this attendee. It uses this number to generate the image of virtual ticket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let file = await screenshot({ number })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's dig into the &lt;code&gt;screenshot&lt;/code&gt; module, since that's where the magic happens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const chromium = require('chrome-aws-lambda')
require('puppeteer-core')

function getBaseUrl() {
  let url
  if (process.env.NODE_ENV === 'testing') {
      url = 'http://localhost:3333'
  }
  else  {
      url = `https://${ process.env.NODE_ENV === 'staging' ? 'staging.' : '' }2021.cascadiajs.com`
  }
  return url
}

module.exports = async function screencap({ number }) {
    let browser
    let baseUrl = getBaseUrl()
    // set-up headless browser
    let height = 628
    let width = 1200
    let deviceScaleFactor = 1
    try {
      browser = await chromium.puppeteer.launch({
        args: chromium.args,
        defaultViewport: {
          height, width, deviceScaleFactor
        },
        executablePath: await chromium.executablePath,
        headless: chromium.headless,
        ignoreHTTPSErrors: true,
      })
      let page = await browser.newPage()
      await page.goto(`${ baseUrl }/tickets/${ number }?social`)
      const file = await page.screenshot()
      await browser.close()
      return file
    } finally {
      if (browser) {
        await browser.close()
      }
    }
  }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This module uses &lt;code&gt;chrome-aws-lambda&lt;/code&gt; and &lt;code&gt;puppeteer-core&lt;/code&gt; to fire up a headless Chrome browser and navigate to a webpage that dynamically builds a page for the &lt;a href="https://2021.cascadiajs.com/tickets/140?social"&gt;attendee's virtual ticket&lt;/a&gt;. It then takes a screenshot of this webpage and returns the buffer of bytes.&lt;/p&gt;

&lt;p&gt;This is a good time to note that you want to configure the Lambda associated with this event handler to be pretty beefy and not to timeout too quickly. You can accomplish by setting properties in &lt;code&gt;arc.config&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@aws
runtime nodejs14.x
timeout 90
memory 3008
@arc
shared false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;shared false&lt;/code&gt; command tells Arc not to build and include code and dependencies from the applications shared folder. This is really important because Lambda has a hard 250MB limit on code/deps and &lt;code&gt;chrome-aws-lambda&lt;/code&gt; and &lt;code&gt;puppeteer-core&lt;/code&gt; gobble up a ton of that space.&lt;/p&gt;

&lt;p&gt;We then save this generated screen to s3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    const s3 = new AWS.S3()
    let fileName = `ticket-${ number }.png`
    await s3
      .putObject({
        Bucket: process.env.ARC_STATIC_BUCKET,
        Key : process.env.ARC_STATIC_PREFIX + '/' + fileName,
        ContentType: 'image/png',
        Body: file,
        ACL: 'public-read',
      })
      .promise()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;ARC_STATIC_BUCKET&lt;/code&gt; and &lt;code&gt;ARC_STATIC_PREFIX&lt;/code&gt; are automatically available in your app's environment variables thanks to Begin.&lt;/p&gt;

&lt;p&gt;The last step is to attach this beautiful image to the attendee's custom ticketing page. If you go to &lt;a href="https://2021.cascadiajs.com/tickets/140"&gt;my ticketing page&lt;/a&gt; and view the source you'll see &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags for Open Graph and Twitter image URLs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;meta property="og:image" content="${ socialUrl }" /&amp;gt;
    &amp;lt;meta name="twitter:image" content="${ socialUrl }"&amp;gt;
    &amp;lt;meta name="twitter:card" content="summary_large_image"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Phew! I'm sure I skipped a few steps, but you get the gist of how this works and find this helpful! The source code for the CascadiaJS web app can be found on Github at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cascadiajs/cascadiajs-2021"&gt;https://github.com/cascadiajs/cascadiajs-2021&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>node</category>
      <category>webdev</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Refactoring JavaScript using JavaScript</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Fri, 27 Mar 2020 18:23:29 +0000</pubDate>
      <link>https://dev.to/crtr0/refactoring-javascript-using-javascript-5h43</link>
      <guid>https://dev.to/crtr0/refactoring-javascript-using-javascript-5h43</guid>
      <description>&lt;p&gt;&lt;em&gt;As we look ahead to &lt;a href="https://2020.cascadiajs.com"&gt;CascadiaJS 2020&lt;/a&gt; (🤞🏽) I thought I'd share some of the awesome talks from our 2019 event. Enjoy!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Saimon Sharif
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aN8nyEJW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://begin-static-p6uw2-production.s3.us-west-2.amazonaws.com/forest-1dg/images/speakers/saimon-sharif.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aN8nyEJW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://begin-static-p6uw2-production.s3.us-west-2.amazonaws.com/forest-1dg/images/speakers/saimon-sharif.jpg" alt="saimon sharif" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With codemods, engineers can programmatically refactor their code, saving hundreds of hours while reducing tech debt. I’ll share my love, struggles, and successes applying them in a large codebase. We’ll see my favorite codemods along with tips on how to use them effectively, and also write one from scratch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/t8aQ5zVaEgU"&gt;Watch the talk (24:22)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>javascript</category>
      <category>metaprogramming</category>
      <category>video</category>
    </item>
    <item>
      <title>When writing too much code kills your business</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Thu, 26 Mar 2020 18:36:44 +0000</pubDate>
      <link>https://dev.to/crtr0/when-writing-too-much-code-kills-your-business-1gpl</link>
      <guid>https://dev.to/crtr0/when-writing-too-much-code-kills-your-business-1gpl</guid>
      <description>&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href="https://www.indiehackers.com/post/when-writing-too-much-code-kills-your-business-3150e57975"&gt;Indie Hackers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RdWWTu2P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pbs.twimg.com/media/ET-Lv2tUYAExGOe%3Fformat%3Djpg%26name%3Dlarge" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RdWWTu2P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pbs.twimg.com/media/ET-Lv2tUYAExGOe%3Fformat%3Djpg%26name%3Dlarge" alt="fizbuz v1 schematic" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About a year ago I &lt;a href="https://www.indiehackers.com/product/fizbuz/launching-v1-of-fizbuz--LeXoPIUfRMPWtgvwwmj"&gt;shipped Fizbuz v1&lt;/a&gt;. It was built on AWS Lambda, DynamoDB and Auth0. I had discovered a new, but really interesting, open source tool called &lt;a href="http://arc.codes"&gt;Architect&lt;/a&gt; that made it really easy to spin-up AWS resources and build fast, and for a while I was &lt;em&gt;really&lt;/em&gt; productive. And it worked well... for a bit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting Fast
&lt;/h2&gt;

&lt;p&gt;After doing customer discovery and building a prototype on Rails, I had clear backend requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless architecture&lt;/li&gt;
&lt;li&gt;REST API for simple read/writes&lt;/li&gt;
&lt;li&gt;GraphQL API for complex reads&lt;/li&gt;
&lt;li&gt;APIs &amp;amp; the data layer bootstrapped by GraphQL type definitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had never built a web application using Lambda or DynamoDB, so I was in full "learn" mode. I soaked up everything I could about how to build these kinds of applications and ended up building a ton of API and data layer tooling from scratch. &lt;/p&gt;

&lt;p&gt;This felt very productive at the time and I was incredibly proud of how slick it was that I could define a new business object in GraphQL and that matching REST API endpoints and data layer CRUD operations would be automatically provisioned with minimal additional work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Slowing Down
&lt;/h2&gt;

&lt;p&gt;After a furious few months of coding, I shipped v1 of Fizbuz and started onboarding users. As I came in contact with users, I started to collect more and more feedback on how to improve the product.&lt;/p&gt;

&lt;p&gt;This is where I started noticing a slow-down in my ability to ship new features. As I would context switch from non-technical tasks (talking to customers, doing discovery, networking, etc) back to the code, I would sometimes have a hard time understanding how the code worked. Since I wasn't using third-party tools for commons tasks like client-side data fetching or API request processing or database interaction, I couldn't rely on documentation or Google to get unstuck.&lt;/p&gt;

&lt;p&gt;The issue came into much sharper focus when I would try to onboard other developers for contract work. Since I wasn't using tooling that they were familiar with, too much time was wasted getting them up to speed on how the system worked, rather than spending time on shipping new customer-facing features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screeching to a Halt
&lt;/h2&gt;

&lt;p&gt;A few days ago a user alerted me that when they were using Fizbuz, they noticed that the app seemed to be caught in an infinite loop and was making an endless series of HTTP requests to the server. This wasn't visible in the UI, which is why I hadn't noticed, so I dove into the codebase to figure out what was wrong.&lt;/p&gt;

&lt;p&gt;It turned out that I had refactored some client-side data fetching code in order to be more compliant with React best practices around &lt;a href="https://github.com/facebook/react/issues/14920"&gt;Hooks and Exhaustive Deps&lt;/a&gt;. I unwittingly broke perfectly good code and created an infinite loop. In this case, the requests were idempotent reads, but next time who knows? What if they had been writes?&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving Forward
&lt;/h2&gt;

&lt;p&gt;I love making things, I think all developers do. And I'm proud of much of the code I wrote. It solved a real problem for me and did so in an elegant way. But I had to look myself in the mirror and ask myself this:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Do I really care about building tools to layer REST and GraphQL APIs on top of DynamoDB?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I decided that I care more help developers build better networks and find better opportunities, and my engineering cycles for the rest of the year will be spent on building product and features that deliver on this.&lt;/p&gt;

&lt;p&gt;I am currently in the process of evaluating stacks that meet my original requirements and &lt;a href="https://twitter.com/crtr0/status/1240843878967607298?s=20"&gt;talking to developers&lt;/a&gt; who have experience with these stacks and are available for contract work. Right now it looks like AWS AppSync, Prisma and Hasura are strong contenders for the backend and data layer.&lt;/p&gt;

&lt;p&gt;I'll be writing more about my journey to ship a v2 of Fizbuz, so please feel free to follow along!&lt;/p&gt;

&lt;p&gt;If you have any suggestions on a stack I should look at, please feel free to leave a comment.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>coding</category>
    </item>
    <item>
      <title>Accessibility is a Hydra</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Thu, 26 Mar 2020 16:20:10 +0000</pubDate>
      <link>https://dev.to/crtr0/accessibility-is-a-hydra-gpb</link>
      <guid>https://dev.to/crtr0/accessibility-is-a-hydra-gpb</guid>
      <description>&lt;p&gt;&lt;em&gt;As we look ahead to &lt;a href="https://2020.cascadiajs.com"&gt;CascadiaJS 2020&lt;/a&gt; (🤞🏽) I thought I'd share some of the awesome talks from our 2019 event. Enjoy!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  EJ Mason
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mNlvCt7Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://begin-static-p6uw2-production.s3.us-west-2.amazonaws.com/forest-1dg/images/speakers/ej-mason.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mNlvCt7Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://begin-static-p6uw2-production.s3.us-west-2.amazonaws.com/forest-1dg/images/speakers/ej-mason.jpg" alt="EJ Mason" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When Hercules fought the hydra, its heads would grow back no matter how many times he cut them off. Web accessibility professionals put repeated effort toward fighting accessibility barriers, and often feel like their work is never done. If we want to prevail against accessibility barriers, we have to understand our own hydra: we have to talk about ableism.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/SDdsD5AmKYA"&gt;Watch the talk (22:06)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>javascript</category>
      <category>a11y</category>
      <category>video</category>
    </item>
    <item>
      <title>Authentication for the REST of Us</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Wed, 25 Mar 2020 15:24:04 +0000</pubDate>
      <link>https://dev.to/crtr0/video-authentication-for-the-rest-of-us-2ido</link>
      <guid>https://dev.to/crtr0/video-authentication-for-the-rest-of-us-2ido</guid>
      <description>&lt;p&gt;&lt;em&gt;As we look ahead to &lt;a href="https://2020.cascadiajs.com"&gt;CascadiaJS 2020&lt;/a&gt; (🤞🏽) I thought I'd share some of the awesome talks from our 2019 event. Enjoy!&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Divya Sasidharan
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w20sBtC_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://begin-static-p6uw2-production.s3.us-west-2.amazonaws.com/forest-1dg/images/speakers/divya-sasidharan.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w20sBtC_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://begin-static-p6uw2-production.s3.us-west-2.amazonaws.com/forest-1dg/images/speakers/divya-sasidharan.jpg" alt="divya sasidharan" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Authentication is a complicated subject that is hard to grok, let’s unpack all kinds of auth concepts and examine how we can apply them to our applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cascadiajs.com/talks/authentication-for-the-rest-of-us/"&gt;Watch the talk (26:08)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>authentication</category>
      <category>javascript</category>
      <category>video</category>
    </item>
    <item>
      <title>[Video] The Future of the Decentralized Web</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Fri, 16 Aug 2019 18:53:58 +0000</pubDate>
      <link>https://dev.to/crtr0/video-the-future-of-the-web-4894</link>
      <guid>https://dev.to/crtr0/video-the-future-of-the-web-4894</guid>
      <description>&lt;p&gt;&lt;em&gt;As we lead up to &lt;a href="https://2019.cascadiajs.com"&gt;CascadiaJS 2019&lt;/a&gt;, I'm going to share the 24 amazing talks from 2018 here on dev.to. Sit back and enjoy the show!&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Mikeal Rogers
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YW5gIqa4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://2018.cascadiajs.com/speakers/mikeal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YW5gIqa4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://2018.cascadiajs.com/speakers/mikeal.png" alt="Mikeal Rogers" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The original vision of the Internet was for a fully decentralized system that empowered its users at the edges. In the many years since the birth of The Web we’ve moved more towards centralized structures to solve the issues of scale and data and it has not come without consequence. In order to move past these issues we need new primitives for a new vision of The Web that can be decentralized.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=83Gws-dPL8A"&gt;Watch the talk on YouTube (19:38)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>javascript</category>
      <category>dweb</category>
      <category>cascadiajs2018</category>
    </item>
    <item>
      <title>[Video] Conversational Semantics for the Web</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Fri, 16 Aug 2019 16:42:42 +0000</pubDate>
      <link>https://dev.to/crtr0/video-conversational-semantics-for-the-web-1ekj</link>
      <guid>https://dev.to/crtr0/video-conversational-semantics-for-the-web-1ekj</guid>
      <description>&lt;p&gt;&lt;em&gt;As we lead up to &lt;a href="https://2019.cascadiajs.com"&gt;CascadiaJS 2019&lt;/a&gt;, I'm going to share the 24 amazing talks from 2018 here on dev.to. Sit back and enjoy the show!&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Aaron Gustafson
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--69gDIgjz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://2018.cascadiajs.com/speakers/gustafson.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--69gDIgjz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://2018.cascadiajs.com/speakers/gustafson.jpg" alt="Aaron Gustafson" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over time, your users will become more accustomed to and reliant on voice-based interactions with their computers and, thereby, the web. Enabling them to complete critical tasks without a visual user interface will be crucial for the long-term success of your website. In this session, Aaron Gustafson will discuss how smart markup choices can improve the overall usability and accessibility of your projects without disrupting your current workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=gZiysmuwwMA"&gt;Watch the talk on YouTube (31:51)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>javascript</category>
      <category>voice</category>
      <category>cascadiajs2018</category>
    </item>
    <item>
      <title>[Video] Enabling Web Developers to Build the Future of the Web</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Thu, 15 Aug 2019 23:46:46 +0000</pubDate>
      <link>https://dev.to/crtr0/video-enabling-web-developers-to-build-the-future-of-the-web-27kg</link>
      <guid>https://dev.to/crtr0/video-enabling-web-developers-to-build-the-future-of-the-web-27kg</guid>
      <description>&lt;p&gt;&lt;em&gt;As we lead up to &lt;a href="https://2019.cascadiajs.com"&gt;CascadiaJS 2019&lt;/a&gt;, I'm going to share the 24 amazing talks from 2018 here on dev.to. Sit back and enjoy the show!&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Yehuda Katz
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vrEOQCvD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://2018.cascadiajs.com/speakers/yehuda.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vrEOQCvD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://2018.cascadiajs.com/speakers/yehuda.jpg" alt="Yehuda Katz" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=3bStv_QbFlo"&gt;Watch the talk on YouTube (30:15)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>standards</category>
      <category>opensource</category>
      <category>cascadiajs2018</category>
    </item>
    <item>
      <title>[Video] Observing Node.js</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Thu, 15 Aug 2019 19:24:57 +0000</pubDate>
      <link>https://dev.to/crtr0/video-observing-node-js-mb9</link>
      <guid>https://dev.to/crtr0/video-observing-node-js-mb9</guid>
      <description>&lt;p&gt;&lt;em&gt;As we lead up to &lt;a href="https://2019.cascadiajs.com" rel="noopener noreferrer"&gt;CascadiaJS 2019&lt;/a&gt;, I'm going to share the 24 amazing talks from 2018 here on dev.to. Sit back and enjoy the show!&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  James Snell
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F2018.cascadiajs.com%2Fspeakers%2Fsnell.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F2018.cascadiajs.com%2Fspeakers%2Fsnell.jpg" alt="James Snell"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Understanding what is really happening within your Node.js processes can be... Difficult. I'll pull back the curtain and demonstrate tools and techniques for observing Node.js.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=C8dwQw7M8Pk" rel="noopener noreferrer"&gt;Watch the talk on YouTube (25:43)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>node</category>
      <category>observability</category>
      <category>cascadiajs2018</category>
    </item>
    <item>
      <title>[Video] N-API - The New Native in Node.js</title>
      <dc:creator>🅲🅰🆁🆃🅴🆁</dc:creator>
      <pubDate>Thu, 15 Aug 2019 15:58:57 +0000</pubDate>
      <link>https://dev.to/crtr0/video-n-api-the-new-native-in-node-js-2ej1</link>
      <guid>https://dev.to/crtr0/video-n-api-the-new-native-in-node-js-2ej1</guid>
      <description>&lt;p&gt;&lt;em&gt;As we lead up to &lt;a href="https://2019.cascadiajs.com" rel="noopener noreferrer"&gt;CascadiaJS 2019&lt;/a&gt;, I'm going to share the 24 amazing talks from 2018 here on dev.to. Sit back and enjoy the show!&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Atishay Jain
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F2018.cascadiajs.com%2Fspeakers%2Fatishay.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F2018.cascadiajs.com%2Fspeakers%2Fatishay.jpg" alt="Atishay Jain"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ever tried calling C++ from Node or Electron. Hate native modules because of the compilation and maintenance issues. This talk is all about the solution to this problem - N-API that is stable with node 10. C++ to Node.js interop is a lot of fun.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=E0w7Tc0f2fA" rel="noopener noreferrer"&gt;Watch the talk on YouTube (27:38)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>node</category>
      <category>javascript</category>
      <category>cascadiajs2018</category>
    </item>
  </channel>
</rss>
