<?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: Friday candour</title>
    <description>The latest articles on DEV Community by Friday candour (@fridaycandours).</description>
    <link>https://dev.to/fridaycandours</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%2F556528%2Fa71dd87e-0a67-4c7a-9259-73a7d1fcea1b.jpg</url>
      <title>DEV Community: Friday candour</title>
      <link>https://dev.to/fridaycandours</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fridaycandours"/>
    <language>en</language>
    <item>
      <title>The Honest Roadmap to Learning Machine Learning</title>
      <dc:creator>Friday candour</dc:creator>
      <pubDate>Sat, 02 Aug 2025 14:39:54 +0000</pubDate>
      <link>https://dev.to/fridaycandours/the-honest-roadmap-to-learning-machine-learning-49al</link>
      <guid>https://dev.to/fridaycandours/the-honest-roadmap-to-learning-machine-learning-49al</guid>
      <description>&lt;p&gt;Tech moves fast. Memorizing every algorithm is a losing game.&lt;br&gt;&lt;br&gt;
Instead, get good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Problem decomposition&lt;/strong&gt; – turn “predict customer churn” into tidy sub-problems.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource hunting&lt;/strong&gt; – know &lt;em&gt;where&lt;/em&gt; to look when the docs fail.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;80/20 filtering&lt;/strong&gt; – ignore the blog-post-of-the-week until you actually need it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can do those three things, the rest is just execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Python &amp;amp; the Notebook Habit (Week 1–2)
&lt;/h2&gt;

&lt;p&gt;Start here because you’ll see results &lt;em&gt;today&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
Install &lt;a href="https://python.org" rel="noopener noreferrer"&gt;Python&lt;/a&gt; and &lt;a href="https://jupyter.org" rel="noopener noreferrer"&gt;JupyterLab&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Then cover the absolute basics:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;th&gt;One-liner test&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Variables &amp;amp; types&lt;/td&gt;
&lt;td&gt;You’ll use these every day.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;age = 32; type(age)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lists/dicts&lt;/td&gt;
&lt;td&gt;Every dataset becomes one of these.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;df['income'].mean()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functions&lt;/td&gt;
&lt;td&gt;Keeps code reusable.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;def clean(df): return df.dropna()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pandas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Excel on steroids.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;df.groupby('state').sales.sum()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt; One beginner course—pick any you like.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.w3schools.com/python/" rel="noopener noreferrer"&gt;W3Schools Python&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://programming-24.mooc.fi/" rel="noopener noreferrer"&gt;Helsinki MOOC&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;My own &lt;a href="https://youtube.com/playlist?list=PLqns..." rel="noopener noreferrer"&gt;Python playlist&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don’t:&lt;/strong&gt; finish three courses “just to be safe.” One is enough; the rest you’ll pick up by building.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Your First &lt;em&gt;Real&lt;/em&gt; Data Project (Week 3–4)
&lt;/h2&gt;

&lt;p&gt;Pick a CSV you care about—your Spotify history, city bike-share logs, anything.&lt;br&gt;&lt;br&gt;
Goal: load → clean → plot → tell a story.&lt;/p&gt;

&lt;p&gt;Checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Import&lt;/strong&gt; with &lt;code&gt;pandas.read_csv()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean&lt;/strong&gt; nulls, units, outliers.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore&lt;/strong&gt; correlations (&lt;code&gt;df.corr()&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visualize&lt;/strong&gt; with &lt;code&gt;matplotlib&lt;/code&gt;/&lt;code&gt;seaborn&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Present&lt;/strong&gt; as a 5-slide Jupyter slideshow (&lt;code&gt;jupyter nbconvert slides.ipynb --to slides --post serve&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Push the repo to GitHub. Congratulations—you now have a portfolio piece.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: The Math You &lt;em&gt;Actually&lt;/em&gt; Need (Week 5–8)
&lt;/h2&gt;

&lt;p&gt;Skip the proofs; learn the intuition.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Core Concepts&lt;/th&gt;
&lt;th&gt;Time Budget&lt;/th&gt;
&lt;th&gt;Free Resource&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stats &amp;amp; Probability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;mean, variance, distributions, Bayes&lt;/td&gt;
&lt;td&gt;2–3 weeks&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.khanacademy.org/math/stat" rel="noopener noreferrer"&gt;Khan Academy Stats&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linear Algebra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;vectors, dot products, matrix multiply&lt;/td&gt;
&lt;td&gt;1 week&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.khanacademy.org/math/line" rel="noopener noreferrer"&gt;Khan Academy Linear Algebra&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Calculus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;derivatives, gradient intuition&lt;/td&gt;
&lt;td&gt;1 week&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.khanacademy.org/math/diff" rel="noopener noreferrer"&gt;Khan Academy Calculus&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pro tip: after each new concept, reopen your earlier project and &lt;em&gt;ask&lt;/em&gt; a question that needs it (e.g., “How does standard deviation change if I drop outliers?”). Learning sticks when it solves a problem you already have.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Core ML Algorithms (Week 9–12)
&lt;/h2&gt;

&lt;p&gt;Resist the urge to binge-watch every neural-network hype video.&lt;br&gt;&lt;br&gt;
Instead, lock in these five:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Linear regression&lt;/strong&gt; – the mother of all models.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logistic regression&lt;/strong&gt; – classification gateway drug.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision trees&lt;/strong&gt; – white-box, human-readable.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Random forest &amp;amp; gradient boosting&lt;/strong&gt; – practical powerhouses.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;k-means clustering&lt;/strong&gt; – when you don’t have labels.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Book (free PDF): &lt;em&gt;An Introduction to Statistical Learning&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Companion videos: &lt;a href="https://youtube.com/playlist?list=PL..." rel="noopener noreferrer"&gt;StatLearning YouTube series&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code-along: scikit-learn’s &lt;a href="https://scikit-learn.org/stable/tutorial/" rel="noopener noreferrer"&gt;official tutorial&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Work each algorithm three ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From scratch (plain Python)
&lt;/li&gt;
&lt;li&gt;With scikit-learn (one-liner &lt;code&gt;.fit()&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;On your own dataset&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s where real understanding happens.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Second Project—End-to-End ML (Week 13–16)
&lt;/h2&gt;

&lt;p&gt;Choose a Kaggle dataset that’s &lt;em&gt;not&lt;/em&gt; Titanic (every recruiter has seen it).&lt;br&gt;&lt;br&gt;
Follow this loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EDA with &lt;code&gt;pandas&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Feature engineering
&lt;/li&gt;
&lt;li&gt;Baseline model (linear regression)
&lt;/li&gt;
&lt;li&gt;Iterate (random forest, XGBoost)
&lt;/li&gt;
&lt;li&gt;Validate properly (train/validation/test split)
&lt;/li&gt;
&lt;li&gt;Write a README with results &amp;amp; business takeaway.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Push to GitHub and link it on your résumé.&lt;br&gt;&lt;br&gt;
A small, clean project beats a half-finished “Uber-for-ML” behemoth every time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Collaborate &amp;amp; Ship (Week 17+)
&lt;/h2&gt;

&lt;p&gt;Learning alone is slow. Speed it up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pair program&lt;/strong&gt;—find a buddy on Discord/Reddit.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code review&lt;/strong&gt;—ask for PR feedback in Kaggle kernels or GitHub.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Talk about it&lt;/strong&gt;—present your findings to a local meetup or on Zoom.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These interactions teach you the unspoken rules: how to structure repos, write readable code, and explain models to non-technical stakeholders.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Advanced Topics—Only When You Need Them
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Learn When&lt;/th&gt;
&lt;th&gt;Starter Resource&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deep learning (CNNs, RNNs, Transformers)&lt;/td&gt;
&lt;td&gt;Your tabular data hits a ceiling&lt;/td&gt;
&lt;td&gt;&lt;a href="https://youtube.com/playlist?list=PL..." rel="noopener noreferrer"&gt;Andrej Karpathy “Neural Networks: Zero to Hero”&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model deployment&lt;/td&gt;
&lt;td&gt;Someone asks for an API&lt;/td&gt;
&lt;td&gt;FastAPI + Docker tutorial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MLOps&lt;/td&gt;
&lt;td&gt;Your models break in production&lt;/td&gt;
&lt;td&gt;&lt;a href="https://madewithml.com/" rel="noopener noreferrer"&gt;Made With ML course&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Follow the &lt;strong&gt;need-not-FOMO rule&lt;/strong&gt;: if a technique doesn’t solve a problem you &lt;em&gt;have&lt;/em&gt;, bookmark it and move on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Dos &amp;amp; Don’ts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Do&lt;/th&gt;
&lt;th&gt;Don’t&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build one small project to completion&lt;/td&gt;
&lt;td&gt;Chase every new framework release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read the scikit-learn docs&lt;/td&gt;
&lt;td&gt;Copy-paste code you don’t understand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ask “why am I learning this?” every hour&lt;/td&gt;
&lt;td&gt;Memorize hyper-parameters by heart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share your work publicly&lt;/td&gt;
&lt;td&gt;Learn in isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Timeline at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Weeks&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;th&gt;Deliverable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1–2&lt;/td&gt;
&lt;td&gt;Python + Jupyter&lt;/td&gt;
&lt;td&gt;“Hello, data” notebook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3–4&lt;/td&gt;
&lt;td&gt;Data project&lt;/td&gt;
&lt;td&gt;GitHub repo + slideshow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–8&lt;/td&gt;
&lt;td&gt;Math foundations&lt;/td&gt;
&lt;td&gt;Updated project with stats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9–12&lt;/td&gt;
&lt;td&gt;Core ML algorithms&lt;/td&gt;
&lt;td&gt;Algorithm comparison notebook&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13–16&lt;/td&gt;
&lt;td&gt;End-to-end ML project&lt;/td&gt;
&lt;td&gt;Kaggle/GitHub repo + README&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17+&lt;/td&gt;
&lt;td&gt;Collaborate &amp;amp; specialize&lt;/td&gt;
&lt;td&gt;Peer-reviewed contributions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Lastly
&lt;/h2&gt;

&lt;p&gt;You won’t feel “ready.” No one does.&lt;br&gt;&lt;br&gt;
But after ~4–6 months of &lt;em&gt;consistent&lt;/em&gt; work you’ll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At-least three solid GitHub projects
&lt;/li&gt;
&lt;li&gt;A grasp of the math that matters
&lt;/li&gt;
&lt;li&gt;A network of peers who push you forward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination is what hiring managers actually care about—not the certificate that claims you finished a 3-month bootcamp in record time.&lt;/p&gt;

&lt;p&gt;Now close this tab, open Jupyter, and start with Step 1.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Javascript await was rogue all along</title>
      <dc:creator>Friday candour</dc:creator>
      <pubDate>Fri, 06 Jun 2025 12:42:21 +0000</pubDate>
      <link>https://dev.to/fridaycandours/js-await-was-rogue-all-along-58nl</link>
      <guid>https://dev.to/fridaycandours/js-await-was-rogue-all-along-58nl</guid>
      <description>&lt;p&gt;Don't tell me you don't know await is rogue too, jess christ.&lt;/p&gt;

&lt;p&gt;Tell me what is going here.&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="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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// 6&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;em&gt;Example by Thomas&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;Right there is a thenable, a big time Javascript interface implemented in .then callback chaining. &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%2Fxh7harz0oxyu5bldil5a.jpg" 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%2Fxh7harz0oxyu5bldil5a.jpg" alt="Image description" width="652" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or as &lt;em&gt;MKRhere&lt;/em&gt; like to put it &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"An object that exposes a then method is a Thenable"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now let's explore some more interesting things.&lt;/p&gt;

&lt;p&gt;Let's quickly reiterate on a fundamental definition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Thenable is simply an object with a &lt;code&gt;.then()&lt;/code&gt; method.&lt;/strong&gt; That's it. No fancy constructors, no &lt;code&gt;new Promise()&lt;/code&gt;, no specific internal slots. Just a method named &lt;code&gt;then&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Think about it, the &lt;code&gt;Promise&lt;/code&gt; specification itself relies heavily on the &lt;code&gt;then&lt;/code&gt; method. It's the core of how asynchronous operations are chained and resolved. And &lt;code&gt;await&lt;/code&gt;, bless its rogue little heart, just says, "Hey, if you've got a &lt;code&gt;then&lt;/code&gt; method that behaves like a &lt;code&gt;then&lt;/code&gt; method, I'm good. I'll wait for whatever value you pass to that function." that's incredibly pragmatic in my opinion.&lt;/p&gt;

&lt;p&gt;Now, if we internalize this, what else becomes possible? What if we don't even need a &lt;code&gt;Promise&lt;/code&gt; at all to &lt;code&gt;await&lt;/code&gt; something? Thomas's example with &lt;code&gt;f =&amp;gt; f(4 + 2)&lt;/code&gt; is simple enough. But what if the "value" isn't immediately available? What if it's... delayed?&lt;/p&gt;

&lt;p&gt;Imagine we've got a function that simulates fetching a user's profile, but instead of returning a &lt;code&gt;Promise&lt;/code&gt;, it returns a plain object that just &lt;em&gt;looks&lt;/em&gt; like a promise.&lt;/p&gt;

&lt;h4&gt;
  
  
  Scenario 1: The 'Fake Promise' that's totally legit to await
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchUserProfileThenable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Fetching user &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;...`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&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="c1"&gt;// Simulate network delay&lt;/span&gt;
            &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userId&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="s2"&gt;`User &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'s Profile`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
                &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`User &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; fetched!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Resolve with the user object&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1 second delay&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;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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Application starting.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchUserProfileThenable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Awaited user 1:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user1&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;user2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchUserProfileThenable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Awaited user 2:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Application finished.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Expected output:
&lt;/h4&gt;

&lt;p&gt;Application starting.&lt;br&gt;
Fetching user 1...&lt;br&gt;
User 1 fetched!&lt;br&gt;
Awaited user 1: { id: 1, name: "User 1's Profile", status: "active" }&lt;br&gt;
Fetching user 102...&lt;br&gt;
User 102 fetched!&lt;br&gt;
Awaited user 2: { id: 2, name: "User 2's Profile", status: "active" }&lt;br&gt;
Application finished.&lt;/p&gt;

&lt;p&gt;Surely that looks fantastic right?, lesser overhead than using new Promise();&lt;/p&gt;

&lt;p&gt;Here's a real life use-case in from Prisma &lt;a href="https://www.prisma.io/docs/orm/overview/introduction/what-is-prisma#:~:text=const%20allUsers%20%3D%20await%20prisma.user.findMany()" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have, probably written code that looks suspiciously like this:&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="c1"&gt;// Prepares the query but does not run any thing;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findMany&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Actually run the query.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;allUsers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// so you know how Prisma is designed to handle this right? &lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Well mostly we will just run...&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findMany&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But in their implementation, It's a form of &lt;strong&gt;lazy execution provided by implementing the thenable interface&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  When NOT to go rogue
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tho powerful, custom thenables can be harder to debug if their &lt;code&gt;then&lt;/code&gt; method is too complex or deviates from expected promise-like behavior. Native Promises often provide more consistent guarantees.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"The &lt;code&gt;Promise.resolve()&lt;/code&gt; Connection":&lt;/strong&gt; Explicitly showing how &lt;code&gt;Promise.resolve(thenable)&lt;/code&gt; works, as &lt;code&gt;await&lt;/code&gt; uses a similar internal mechanism.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How new language features might standardize some of the patterns custom thenables can achieve, is something i'm i will be watching for.&lt;/p&gt;

&lt;p&gt;If you have some interesting additions, let's chat in the comments :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I still prefer SQLite for little things you know.</title>
      <dc:creator>Friday candour</dc:creator>
      <pubDate>Sat, 19 Oct 2024 15:38:09 +0000</pubDate>
      <link>https://dev.to/fridaycandours/i-still-prefer-sqlite-for-little-things-you-know-5hdk</link>
      <guid>https://dev.to/fridaycandours/i-still-prefer-sqlite-for-little-things-you-know-5hdk</guid>
      <description>&lt;p&gt;I still can't express enough how useful SQLite is, when i need a db for small&lt;br&gt;
and experiments stuff, but for a while, i have taken it beyond that subconsciously.&lt;/p&gt;

&lt;p&gt;It’s now a core part of my toolkit for tasks where simplicity and minimal overhead are crucial. What began as a preference for smaller, experimental projects has matured into a deliberate choice in production scenarios. This shift comes in the the rise of managed services that address its traditional limitations.&lt;/p&gt;

&lt;p&gt;I have come across a couple of&lt;br&gt;
&lt;a href="https://www.google.com/search?q=managed+sqlite+db+services" rel="noopener noreferrer"&gt;SQLite managed services&lt;/a&gt;&lt;br&gt;
in a while now and i believe it's eventually going to get better.&lt;/p&gt;

&lt;p&gt;This has opened up new possibilities for developers who appreciate the simplicity and lightweight nature of SQLite but need more robust performance for production environments. With the growing ecosystem around SQLite, from serverless platforms like Cloudflare D1 to promising newcomers like Turso’s libSQL, there’s a clear trend towards making SQLite more scalable and resilient, often these services deploy SQLite in edge environments, providing low-latency access and reducing the distance between users and data.&lt;/p&gt;

&lt;p&gt;In production, i am usually soaked with PostgreSQL and MongoDB depending on&lt;br&gt;
requirements and deadline, but these days using SQLite often in production code&lt;br&gt;
has become my norm and as far i'm using a reputable managed service.&lt;/p&gt;

&lt;p&gt;For me, Cloudflare D1 just works fine and super cheap,turso libSQL looks solid&lt;br&gt;
but i haven't dig into it yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  SQLite vs. PostgreSQL: Just to differentiate
&lt;/h3&gt;

&lt;p&gt;Just to differentiate between these data tools, while both have distinct design philosophies and use cases. we should evaluates their differences in features, performance, and suitability for various applications.&lt;/p&gt;

&lt;h4&gt;
  
  
  Data Modeling Considerations
&lt;/h4&gt;

&lt;p&gt;When choosing between SQLite and PostgreSQL, consider your data modeling requirements. SQLite is suitable for simple data models, while PostgreSQL supports complex data relationships and schema changes, ~i need to stress this part~.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQLite vs. PostgreSQL: A Comparative Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data Types&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Extensive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indexing&lt;/td&gt;
&lt;td&gt;B-tree, Hash&lt;/td&gt;
&lt;td&gt;B-tree, Hash, GiST, SP-GiST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactions&lt;/td&gt;
&lt;td&gt;ACID-compliant&lt;/td&gt;
&lt;td&gt;ACID-compliant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency&lt;/td&gt;
&lt;td&gt;File-level locking&lt;/td&gt;
&lt;td&gt;Row-level locking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Horizontal partitioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL Support&lt;/td&gt;
&lt;td&gt;Partial SQL-92&lt;/td&gt;
&lt;td&gt;Full SQL-92, SQL:2011&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It's reasonable to consider community support and extensibility when comparing SQLite and PostgreSQL. PostgreSQL benefits from a large ecosystem of plugins and extensions that enhance its capabilities in analytics, geospatial data, and beyond. On the other hand, SQLite's simplicity allows for faster iterations, making it perfect for agile development where rapid prototyping is key. The choice ultimately depends on the project's complexity, scalability needs, and how much control over database management is desired.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Cases
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Embedded Systems&lt;/td&gt;
&lt;td&gt;Ideal&lt;/td&gt;
&lt;td&gt;Not suitable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile Applications&lt;/td&gt;
&lt;td&gt;Suitable&lt;/td&gt;
&lt;td&gt;Not ideal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Applications&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Suitable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise Systems&lt;/td&gt;
&lt;td&gt;Not recommended&lt;/td&gt;
&lt;td&gt;Recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Yeah Postgres is a lioness, regardless using a managed SQLite DB offers reliability and security needed for production, plus simplicity.&lt;/p&gt;

&lt;p&gt;Some of the traditional constraints of using SQLite in small to medium scale web and enterprise applications are fading away. For example, managed services provide automated backups, high availability, and even multi-region deployments, allowing SQLite to be a viable option for certain production workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits i enjoy using Managed services
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Benefit&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scalability and cost-effectiveness&lt;/td&gt;
&lt;td&gt;Automatic scaling and cost optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplified application development&lt;/td&gt;
&lt;td&gt;Reduced administrative burden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enhanced performance and reliability&lt;/td&gt;
&lt;td&gt;Optimized database performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrated security features&lt;/td&gt;
&lt;td&gt;Built-in security controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;edge deployments&lt;/td&gt;
&lt;td&gt;managed edge deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Managed services often come with monitoring tools and performance metrics that offer valuable insights into database usage, helping optimize performance over time. For projects that require real-time data processing at the edge, using SQLite in this way is proving to be a cost-effective solution, blending well with serverless architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges i face using managed services.
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Challenge&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cold start latency&lt;/td&gt;
&lt;td&gt;Initial function invocation delay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;latency&lt;/td&gt;
&lt;td&gt;network delay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor lock-in&lt;/td&gt;
&lt;td&gt;Norms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;can't fit large data use case&lt;/td&gt;
&lt;td&gt;SQLite itself is not scalable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Network latency in edge deployments can be minimized, Additionally, while vendor lock-in is a challenge, understanding each service’s offerings and limitations can help mitigate the risks and create a more adaptable database strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mitigating
&lt;/h3&gt;

&lt;p&gt;To overcome the challenges of managed services one could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement caching mechanisms to reduce latency.&lt;/li&gt;
&lt;li&gt;Design applications with scalability in mind.&lt;/li&gt;
&lt;li&gt;Monitor vendor lock-in risks and plan for migration.&lt;/li&gt;
&lt;li&gt;Optimize data storage and retrieval strategies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;last week i needed to make my code reusable, So i worked a query builder that fits my needs for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;using cloudflare D1 via api, (yeah i gotta escape using workers bindings 👀)&lt;/li&gt;
&lt;li&gt;using bun SQLite locally (yeah it's kinda faster)&lt;/li&gt;
&lt;li&gt;just generate the query and let me do the rest (💆)&lt;/li&gt;
&lt;li&gt;in typescript and super lightweight? yeah!!! (💃)&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  If you want to check it out see &lt;a href="https://github.com/FridayCandour/SQLiteBruv" rel="noopener noreferrer"&gt;here&lt;/a&gt;.
&lt;/h4&gt;

&lt;h4&gt;
  
  
  follow me for more contents as well.
&lt;/h4&gt;

</description>
      <category>webdev</category>
      <category>sqlite</category>
    </item>
    <item>
      <title>Empowering Language Learners: Introducing Linguaverse, Your AI Companion.</title>
      <dc:creator>Friday candour</dc:creator>
      <pubDate>Mon, 15 Apr 2024 02:23:50 +0000</pubDate>
      <link>https://dev.to/fridaycandours/empowering-language-learners-introducing-linguaverse-your-ai-companion-14g9</link>
      <guid>https://dev.to/fridaycandours/empowering-language-learners-introducing-linguaverse-your-ai-companion-14g9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/devteam/join-us-for-the-cloudflare-ai-challenge-3000-in-prizes-5f99"&gt;Cloudflare AI Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;My project, crafted for the Cloudflare AI Challenge, is designed to redefine how we learn languages with the help of AI.&lt;/p&gt;

&lt;p&gt;Linguaverse is designed to make language learning interactive and accessible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Interactive Learning Chat: Engage in real conversations tailored to you, providing practical language practice with AI asistance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seamless Translations: ~&lt;del&gt;Effortlessly translate text across multiple languages with accuracy and context, making communication across language barriers easy and intuitive&lt;/del&gt;~.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;This is entirely based off cloudflare workers and pages.&lt;br&gt;
pure html, css and javascript but with professional touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&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%2F1rqiyfecnymuek36wcfq.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%2F1rqiyfecnymuek36wcfq.png" alt="Image description" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F037mom9rfu2fy7vvsu1s.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%2F037mom9rfu2fy7vvsu1s.png" alt="Image description" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffundvztkm9s65q8rzbo4.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%2Ffundvztkm9s65q8rzbo4.png" alt="Image description" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26ywu0bao1kjaz4khm6k.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%2F26ywu0bao1kjaz4khm6k.png" alt="Image description" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9av2thszy4a49hdnqzg.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%2Fa9av2thszy4a49hdnqzg.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0kjtn1y9latzh4ec0rzl.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%2F0kjtn1y9latzh4ec0rzl.png" alt="Image description" width="800" height="1646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Code
&lt;/h2&gt;

&lt;p&gt;Live preview: &lt;a href="https://linguaverse.pages.dev/src/index.html" rel="noopener noreferrer"&gt;https://linguaverse.pages.dev/src/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;site: &lt;a href="https://github.com/FridayCandour/Linguaverse" rel="noopener noreferrer"&gt;https://github.com/FridayCandour/Linguaverse&lt;/a&gt;&lt;br&gt;
worker script: &lt;a href="https://github.com/FridayCandour/-linguaverse-api" rel="noopener noreferrer"&gt;https://github.com/FridayCandour/-linguaverse-api&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;Next Steps&lt;br&gt;
Moving forward, we aim to:&lt;/p&gt;

&lt;p&gt;Enhance the interactive learning chat with additional features to provide more personalized feedback and guidance.&lt;br&gt;
Expand language support to include a wider range of languages and dialects, ensuring inclusivity and accessibility for all learners.&lt;br&gt;
Integrate gamification elements to increase engagement and motivation, making language learning a fun and rewarding experience for users of all levels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiple Models and/or Triple Task Types&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AI chat feature only uses: &lt;a class="mentioned-user" href="https://dev.to/cf"&gt;@cf&lt;/a&gt;/meta/llama-2-7b-chat-int8&lt;br&gt;
the translation feautures uses: &lt;a class="mentioned-user" href="https://dev.to/cf"&gt;@cf&lt;/a&gt;/meta/m2m100-1.2b&lt;/p&gt;

&lt;p&gt;glacias :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;At this point, Linguaverse will mostly teach you french.&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Started too late.&lt;/p&gt;

</description>
      <category>cloudflarechallenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introducing JetPath: A Lightning-Fast, Code-Saving Node Framework, for Supercharged Server-Side apps! ✨🚀</title>
      <dc:creator>Friday candour</dc:creator>
      <pubDate>Thu, 28 Dec 2023 09:50:11 +0000</pubDate>
      <link>https://dev.to/fridaycandours/introducing-jetpath-a-lightning-fast-code-saving-node-framework-for-supercharged-server-side-apps-f7k</link>
      <guid>https://dev.to/fridaycandours/introducing-jetpath-a-lightning-fast-code-saving-node-framework-for-supercharged-server-side-apps-f7k</guid>
      <description>&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/analogicus-8164369/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=8173575" rel="noopener noreferrer"&gt;Tom&lt;/a&gt; from &lt;a href="https://pixabay.com//?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=8173575" rel="noopener noreferrer"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Navigating the Challenges of Server-Side Frameworks for Node.js, Deno.js, and Bun.js
&lt;/h2&gt;

&lt;p&gt;I'm writing this article to talk about two things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The heavy and cumbersome nature of server-sider frameworks for NodeJs, Denojs and Bunjs&lt;/li&gt;
&lt;li&gt;The solution y'all been waiting for!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;let's walk in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cumbersome? what's cumbersome?
&lt;/h2&gt;

&lt;p&gt;What's the Challenge?&lt;/p&gt;

&lt;p&gt;Things become cumbersome when they tends to create a dependency tree, complicated interfaces, limited innovation, excessive abstraction layers, and most of all using solutions that implies heavy runtime overhead. If you've ever felt trapped in this situation, you're not alone.&lt;/p&gt;

&lt;p&gt;As a software engineer i always have this phylosophy of simplicity is easier to manage and extend. The tool I'm about to introduce aligns with this philosophy, providing a refreshing perspective in this early 2024 and beyound.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Culprits in most node Frameworks.
&lt;/h3&gt;

&lt;p&gt;High learning curve, Abstraction layers, Convention over Configuration, Middleware management, boiler-platey codes, Configuration Overheads, Dependency Injection overhead, debugging challeges, updates and compartibility dramas.&lt;/p&gt;

&lt;p&gt;Not to make this article too long and creating a debate over the value of whatever advantages or disadvantages. i won't go much into detail on which tools is lacking or what's not.&lt;/p&gt;

&lt;p&gt;Instead, Let's find out something better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rationale
&lt;/h2&gt;

&lt;center&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%2F7c3xyitbapupuzcml1fd.png" alt="JetPath" width="800" height="829"&gt;
&lt;h1&gt;
JetPath
&lt;/h1&gt;
&lt;/center&gt;

&lt;p&gt;JetPath is one of Bun's fastest web frameworks.&lt;br&gt;
&lt;a href="https://github.com/FridayCandour/jetpath-benchmark" rel="noopener noreferrer"&gt;benchmark repo&lt;/a&gt;&lt;br&gt;
JetPath is Javascripts's easiest backend library.&lt;br&gt;
&lt;a href="https://github.com/Uiedbook/jetpath" rel="noopener noreferrer"&gt;JetPath repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many are obviously fed up of dealing with heavy and cumbersome server-side frameworks for our Node.js, Deno.js, and Bun.js applications. Looking into &lt;code&gt;JetPath&lt;/code&gt; which revolutionize our development experience With its lightweight design and intuitive routing patterns, &lt;code&gt;JetPath&lt;/code&gt; takes server-side JavaScript frameworks to a new level of innovation and simplicity.&lt;/p&gt;

&lt;p&gt;Whether you're using Node.js, Deno.js, or Bun.js, &lt;code&gt;JetPath&lt;/code&gt; adapts seamlessly to your preferred runtime. Let's look into &lt;code&gt;JetPath&lt;/code&gt; maybe it will solve all your problems.&lt;/p&gt;

&lt;p&gt;It's a runtime 'Drop in' it only use the native http api of the runtime you run your app with, so zero http compartibility overhead.&lt;/p&gt;

&lt;p&gt;With a simple design and high performance, &lt;code&gt;JetPath&lt;/code&gt; offers a refreshing experience, i have ever seen. this is new innovation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fast, Small, and Easy-Peasy
&lt;/h2&gt;

&lt;p&gt;JetPath is a small and efficient framework, weighing in at just 5kb. Its lightweight nature bare level of abstraction ensures your applications performs optimally without unnecessary overhead. Additionally, &lt;code&gt;JetPath&lt;/code&gt; offers an easy-to-use context (ctx) API.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Need for more Speed and Simplicity
&lt;/h2&gt;

&lt;p&gt;When it comes to server-side frameworks, speed and simplicity are of utmost importance. JetPath's aim is to avoid performance bottle necks, with a lightweight and minimalist design that emphasizes on speed and simplicity.&lt;/p&gt;

&lt;p&gt;It's has an inbuilt intuitive routing system, which uses function names as routing patterns, sets it apart from traditional frameworks like Express or Fastify. This innovative approach simplifies your code and enhances the readability of your routing logic, making it easier to design and manage your API(s) with unparalleled granularity.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Power of JetPath
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;JetPath&lt;/code&gt; seamlessly adapts to your preferred runtime. With JetPath, you have the flexibility to choose the runtime that best suits your project's requirements without sacrificing the simplicity and speed that &lt;code&gt;JetPath&lt;/code&gt; offers. Why limit yourself to a single runtime when &lt;code&gt;JetPath&lt;/code&gt; empowers you to explore all three? with no extra steps, configurations or overheads!!!&lt;/p&gt;
&lt;h2&gt;
  
  
  Exploring How JetPath's Work
&lt;/h2&gt;

&lt;p&gt;JetPath operates by searching through your source folder and automatically assembling any exported defined paths and hooks functions following its intuitive route patterns.&lt;/p&gt;

&lt;p&gt;This seamless integration saves you precious development time and effort. Instead of spending time configuring and setting up routes you just write them as the function name and you can focus on crafting your application's core logic while &lt;code&gt;JetPath&lt;/code&gt; handles the rest for you.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;JetPath&lt;/code&gt;'s minimalist and efficient approach streamlines the development process, allowing you to build powerful server applications with ease and speed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Easy Setup and Configuration
&lt;/h2&gt;

&lt;p&gt;Getting started with &lt;code&gt;JetPath&lt;/code&gt; is a breeze. Simply install &lt;code&gt;JetPath&lt;/code&gt; using npm or your preferred JavaScript package manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install jetpath --save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, configure your JetPath instance with necessary options, such as setting the source folder for your routes and specifying the port you want to listen on. Here's an example:&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;JetPath&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;jetpath&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JetPath&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Optional: Set the source folder for your routes&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Optional: Specify the port you want to listen on&lt;/span&gt;
  &lt;span class="na"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Optional: Enable CORS support&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Start listening for requests&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With just a few lines of code, you're up and running with JetPath, ready to take advantage of its speed and simplicity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core features of &lt;code&gt;JetPath&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;These features are the core of JetPath.&lt;/p&gt;

&lt;h3&gt;
  
  
  Function Names as Routing Patterns
&lt;/h3&gt;

&lt;p&gt;JetPath introduces an innovation where your function names declares the routing pattern for the function. This unique approach eliminates the need for complex configuration files and enables you to define routes with ease.&lt;/p&gt;

&lt;p&gt;My first testimony - ( more below )&lt;/p&gt;

&lt;p&gt;&lt;code&gt;not going to spend time thinnking about what to name this function anymore, cus now i know!&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pre, Post, and Error Request Hooks
&lt;/h3&gt;

&lt;p&gt;JetPath provides hooks that allows you to execute code before and after each request, as well as handle any runtime errors that may occur. These hooks offer unparalleled flexibility to customize the behavior of your application. Whether you need to manipulate data, validate requests, or handle errors gracefully, &lt;code&gt;JetPath&lt;/code&gt;'s hooks has got you covered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decoration Hook
&lt;/h3&gt;

&lt;p&gt;This allows you to extend the power of the CTX object that is avaible on every request by adding your custom functionality, like auth or specific Utils needed by your app on every request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built-in CORS Handlers
&lt;/h3&gt;

&lt;p&gt;JetPath has an built-in CORS hook. Enable CORS support with a simple iniatilisation option, and &lt;code&gt;JetPath&lt;/code&gt; takes care of the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements and Installation
&lt;/h2&gt;

&lt;p&gt;JetPath is built for the major server-side JavaScript runtimes, Node.js, Deno.js, and Bun.js. Additionally, it offers experimental support for environments like Deno Deploy and edge runtimes such as Cloudflare Workers (coming soon). To get started, simply install &lt;code&gt;JetPath&lt;/code&gt; using your preferred package manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="sb"&gt;`&lt;/span&gt;jetpath&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting Started with JetPath
&lt;/h2&gt;

&lt;p&gt;Using &lt;code&gt;JetPath&lt;/code&gt; is incredibly straightforward. Let's walk through a basic app setup to demonstrate the simplicity of JetPath:&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;JetPath&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;jetpath&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JetPath&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Optional: Set the source folder for your routes&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Optional: Specify the port you want to listen on&lt;/span&gt;
  &lt;span class="na"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Optional: Enable CORS support&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Start listening for requests&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example Routes
&lt;/h2&gt;

&lt;p&gt;To provide a better understanding of JetPath's capabilities, let's take a look at&lt;/p&gt;

&lt;p&gt;some example routes:&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="c1"&gt;// File: src/routes/cats.js&lt;/span&gt;

&lt;span class="c1"&gt;// GET localhost:8080/&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET_cats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x00000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome home, `JetPath` fellas!&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="c1"&gt;// GET localhost:8080/cats&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET_cats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// ctx.throw(400, "meow");&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// POST localhost:8080/cats&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST_cats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Enter skelter&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="c1"&gt;// GET localhost:8080/cats/friday/12/male&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET_cats&lt;/span&gt;&lt;span class="nx"&gt;$name$age&lt;/span&gt;&lt;span class="nf"&gt;$sex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sex&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`Hello &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, you are &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; years old and you are &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sex&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Thanks for visiting the JetPath App!`&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// GET localhost:8080/cats?*&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET_cats&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sex&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`Hello &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, you are &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; years old and you are &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sex&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Thanks for visiting the JetPath App!`&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// GET localhost:8080/default/dog/types&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET_default_dog_types&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// custom ctx methods&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendDefaultDoglist&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Hooks&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hook__POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// console.log("POST boohoo");&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hook__PRE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// console.log("PRE function boohoo");&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hook__ERROR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bad request!&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="c1"&gt;// hook to decorate the CTX&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hook__DECORATOR&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;sendDefaultDoglist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rottweiler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;german sheepherd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;boerbull&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;husky&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;neopolitan mastiff&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pitbull&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pug&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eskimo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;labrador&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;golden retrieval&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="p"&gt;});&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;We define routes using function names, allowing for clear and concise code. &lt;code&gt;JetPath&lt;/code&gt; also supports pre and post-request hooks, providing extra flexibility for customizations. Additionally, &lt;code&gt;JetPath&lt;/code&gt; includes inbuilt CORS hooks, things everyone web dev needs :).&lt;/p&gt;

&lt;h2&gt;
  
  
  It's time to JetPath, JetPath, Jet.
&lt;/h2&gt;

&lt;p&gt;JetPath is the game-changing innovation you've been waiting for — a fast, minimalist framework that empowers you to build powerful server applications with ease. With its lightning speed, simplicity-driven design, and passionate community, &lt;code&gt;JetPath&lt;/code&gt; is the ideal choice for your Node.js, Deno.js, or Bun.js projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  My testimony
&lt;/h2&gt;

&lt;p&gt;Jetpath greatly reduced the code on all my node code-bases and let me focus on what's important.&lt;/p&gt;

&lt;p&gt;Wait i forgot to mention my apis are several orders of magnitude faster than previous frameworks my projects were based on.&lt;/p&gt;

&lt;p&gt;Add your testimonies below&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Some read-world codes (copied with permission)&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;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST_admin_create_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AppCTXType&lt;/span&gt;&lt;span class="p"&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;productSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validateData&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;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&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;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// code stopped executing here if erred&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// ignore it don't share my data validator library it's too fast.&lt;/span&gt;

  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uploadedOn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toDateString&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;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&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;data&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;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Get_products_search$query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AppCTXType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// post hook handovers&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;search&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;Product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$regex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;i&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;search&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;share the love, tell someone about JetPath. i told my friends and my mum.&lt;/p&gt;

&lt;h2&gt;
  
  
  Joining the Community
&lt;/h2&gt;

&lt;p&gt;Our &lt;a href="https://t.me/uiedbookHQ" rel="noopener noreferrer"&gt;Telegram group&lt;/a&gt; with other web tools i have made like Exabase and Cradova, stuffs you would love.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where's JetPath future gonna be like?
&lt;/h2&gt;

&lt;p&gt;currently we are working on integration with industry tools like&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Logger (easy)&lt;/li&gt;
&lt;li&gt;Swagger (in progress)&lt;/li&gt;
&lt;li&gt;Web Socket (in the next release)&lt;/li&gt;
&lt;li&gt;http stream (in the next release)&lt;/li&gt;
&lt;li&gt;file upload (in the next release)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those in (in the next release) can be done easily by getting the req object from ctx, but it's going to be available by default soon.&lt;/p&gt;

&lt;p&gt;What about Logger?&lt;/p&gt;

&lt;p&gt;I major just use this jet-logger solution. the developer added a way to persit to a log file which is nice.&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="c1"&gt;// npm i jet-logger&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jet-logger&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// hook to decorate the CTX&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hook__DECORATOR&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
      &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;imp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
      &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
      &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&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;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;



&lt;p&gt;This road map is short and narrow to what everyone would benenfit from the most, if you have any suggestions kindly reach out to me on the &lt;a href="https://t.me/uiedbookHQ" rel="noopener noreferrer"&gt;community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to make npm packages for JetPath and need support, send a dm.&lt;/p&gt;

&lt;p&gt;dog names suggestions was provided by @da-favice.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Pizza Area
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/fridaycandour" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.buymeacoffee.com%2Fbutton-api%2F%3Ftext%3DBuy%2520me%2520a%2520pizza%26emoji%3D%26slug%3Dfridaycandour%26button_colour%3DFFDD00%26font_colour%3D000000%26font_family%3DCookie%26outline_colour%3D000000%26coffee_colour%3Dffffff" width="225.99999999999997" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>bunjs</category>
      <category>backend</category>
      <category>express</category>
    </item>
    <item>
      <title>Jump and Slide</title>
      <dc:creator>Friday candour</dc:creator>
      <pubDate>Sat, 15 May 2021 09:35:20 +0000</pubDate>
      <link>https://dev.to/fridaycandours/jump-and-slide-n73</link>
      <guid>https://dev.to/fridaycandours/jump-and-slide-n73</guid>
      <description>&lt;p&gt;Original animation by Vitaly Silkin: &lt;a href="https://dribbble.com/shots/4268258-Evitare-loader" rel="noopener noreferrer"&gt;https://dribbble.com/shots/4268258-Evitare-loader&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also inspired by the @keyframers! &lt;a href="https://www.twitch.tv/keyframers" rel="noopener noreferrer"&gt;https://www.twitch.tv/keyframers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/ste-vg/embed/OEbYqZ?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Modern Google Loader in Pure CSS</title>
      <dc:creator>Friday candour</dc:creator>
      <pubDate>Sat, 15 May 2021 09:18:49 +0000</pubDate>
      <link>https://dev.to/fridaycandours/modern-google-loader-in-pure-css-5c6b</link>
      <guid>https://dev.to/fridaycandours/modern-google-loader-in-pure-css-5c6b</guid>
      <description>&lt;p&gt;Modern Google spinning loader animating through four colors.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/jczimm/embed/vEBpoL?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
