<?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: Jeffrey Marvin Forones</title>
    <description>The latest articles on DEV Community by Jeffrey Marvin Forones (@aiscenblue).</description>
    <link>https://dev.to/aiscenblue</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3948810%2F887816b5-f790-4bed-ac3b-2cfc3add1d7f.jpg</url>
      <title>DEV Community: Jeffrey Marvin Forones</title>
      <link>https://dev.to/aiscenblue</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aiscenblue"/>
    <language>en</language>
    <item>
      <title>JS Developers should read "You Don't Know JS Yet"</title>
      <dc:creator>Jeffrey Marvin Forones</dc:creator>
      <pubDate>Mon, 10 Aug 2026 13:27:53 +0000</pubDate>
      <link>https://dev.to/aiscenblue/js-developers-should-read-you-dont-know-js-yet-2962</link>
      <guid>https://dev.to/aiscenblue/js-developers-should-read-you-dont-know-js-yet-2962</guid>
      <description>&lt;p&gt;I was working through Kyle Simpson's You Don't Know JS Yet, and the coercion chapters did the thing good books do: they made me realise I'd been writing JavaScript for years while quietly avoiding the parts I didn't understand.&lt;/p&gt;

&lt;p&gt;Not avoiding them deliberately. Avoiding them the way you avoid a creaky floorboard - instinctively, without noticing you've changed your route. I always used ===. I never thought hard about why, beyond "== is bad". That's not knowledge. That's a superstition that happens to produce correct code.&lt;/p&gt;

&lt;p&gt;Kindly look through the work I made to further help delivering Kyle's work through npm cli.&lt;/p&gt;

&lt;p&gt;It's free&lt;/p&gt;

&lt;p&gt;No tiers, no trial, no email wall. just a normal js npm package where you can practice js quicks.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx wtfjavascript&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you find a challenge that's wrong, tell me. And if the event loop panel ever disagrees with real Node, I especially want to know - it means my oracle missed a case.&lt;/p&gt;

&lt;p&gt;wtf( js )  wtf, JavaScript?! - prove you actually know it&lt;br&gt;
🗿 for JavaScript gigachads - and those about to become one&lt;br&gt;
Every prompt takes h for a hint and s to skip.&lt;br&gt;
Flags, for when you want to&amp;nbsp;aim&lt;br&gt;
wtfjs --list                          # every challenge, topic and difficulty&lt;/p&gt;

&lt;p&gt;wtfjs --topic "Type Coercion"         # drill one subject&lt;br&gt;
wtfjs --count 20                      # how many&lt;br&gt;
wtfjs --easy 2 --medium 5 --hard 3    # pick your own mix&lt;br&gt;
wtfjs --time 10                       # ten-minute run&lt;br&gt;
wtfjs --sudden-death                  # one wrong answer ends it&lt;br&gt;
wtfjs --no-hints                      # +10 points a solve&lt;/p&gt;

&lt;p&gt;284 challenges, and deliberately not all in one format :)&lt;/p&gt;

&lt;p&gt;Credit where it's&amp;nbsp;due&lt;/p&gt;

&lt;p&gt;This exists because of other people's work:&lt;br&gt;
You Don't Know JS Yet by Kyle Simpson - the reason I knew there was something to learn.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnd7lhwmpgv96i8ms9r44.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnd7lhwmpgv96i8ms9r44.png" alt=" " width="799" height="523"&gt;&lt;/a&gt;&lt;br&gt;
JavaScript Questions by Lydia Hallie - proof the format works.&lt;br&gt;
Stack Overflow, and the people who spent years arguing about the abstract equality algorithm so I didn't have to.&lt;/p&gt;

&lt;p&gt;The idea that these quirks are worth drilling isn't mine, and I'd rather point you at the sources than pretend otherwise. If you haven't read YDKJSY, read that first - this is practice, not instruction.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>wtfjavascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Testing OTP email flows shouldn't be flaky — meet AssertKit</title>
      <dc:creator>Jeffrey Marvin Forones</dc:creator>
      <pubDate>Sun, 24 May 2026 08:58:02 +0000</pubDate>
      <link>https://dev.to/aiscenblue/testing-otp-email-flows-shouldnt-be-flaky-meet-assertkit-1kcn</link>
      <guid>https://dev.to/aiscenblue/testing-otp-email-flows-shouldnt-be-flaky-meet-assertkit-1kcn</guid>
      <description>&lt;p&gt;The single most flake-prone test in any E2E suite is "user signs up,&lt;br&gt;
  verifies via emailed OTP, completes onboarding." Why? Because the email&lt;br&gt;
  is async, the test runner can't see it, and the bridge between the two&lt;br&gt;
  is a 60-line polling helper everyone writes once and nobody wants to&lt;br&gt;
  maintain.&lt;/p&gt;

&lt;p&gt;I shipped AssertKit to remove that bridge entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pitch in 8 lines of test code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@assertkit/playwright&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;signup with OTP&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inbox&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/signup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sign up&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;otp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForOtp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;noreply&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;otp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No polling. No regex. No flake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;inbox&lt;/code&gt; fixture gives every test a unique disposable address
 (&lt;a href="mailto:foo-1717xxx@assertkit.com"&gt;foo-1717xxx@assertkit.com&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;waitForOtp&lt;/code&gt; long-polls the AssertKit server for up to 25 seconds.&lt;/li&gt;
&lt;li&gt;The server watches for inbound mail to that address, extracts any
 OTP-shaped code, and returns it as a typed field.&lt;/li&gt;
&lt;li&gt;Your test gets a string, not an email body to parse.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Cypress users:&lt;/strong&gt; same package, same shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@assertkit/cypress&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uniqueInbox&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/signup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input[name="email"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button[type="submit"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForOtp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;otp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input[name="otp"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;otp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Try the live demo (no signup):&lt;/strong&gt;&lt;br&gt;
  &lt;a href="https://assertkit.com/demo" rel="noopener noreferrer"&gt;https://assertkit.com/demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo opens a real long-poll against the real wait endpoint. A&lt;br&gt;
  canned email arrives 3 seconds later. You'll see the OTP land in real&lt;br&gt;
  time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to try:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both npm packages are MIT, zero runtime deps&lt;/li&gt;
&lt;li&gt;The free public API works without an account&lt;/li&gt;
&lt;li&gt;Subscriptions aren't open yet — there's a /beta program for early
access with admin approval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tech stack&lt;/strong&gt; (if anyone's curious): Next.js 16 App Router, Drizzle +&lt;br&gt;
  Neon Postgres, Supabase Realtime for sub-100ms broadcast, CloudMailin&lt;br&gt;
  for inbound MX, Resend for outbound (DKIM-signed), Upstash KV for&lt;br&gt;
  rate limits, argon2id + RFC 6238 TOTP for auth.&lt;/p&gt;

&lt;p&gt;Solo founder, happy to answer anything.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>showdev</category>
      <category>testing</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
