<?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: Filipe Névola</title>
    <description>The latest articles on DEV Community by Filipe Névola (@filipenevola).</description>
    <link>https://dev.to/filipenevola</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%2F171290%2Fd95d28c2-c122-4f05-8373-8cd4a9e3c566.jpg</url>
      <title>DEV Community: Filipe Névola</title>
      <link>https://dev.to/filipenevola</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/filipenevola"/>
    <language>en</language>
    <item>
      <title>AI, Cursor, Verbosity and Meteor without frontend frameworks</title>
      <dc:creator>Filipe Névola</dc:creator>
      <pubDate>Sun, 29 Sep 2024 13:40:36 +0000</pubDate>
      <link>https://dev.to/quave/ai-cursor-verbosity-and-meteor-without-frontend-frameworks-2jn8</link>
      <guid>https://dev.to/quave/ai-cursor-verbosity-and-meteor-without-frontend-frameworks-2jn8</guid>
      <description>&lt;h2&gt;
  
  
  Cursor: Changing the IDE Game
&lt;/h2&gt;

&lt;p&gt;Cursor provides three modes: Inline, Composer, and Chat. These modes offer unique ways to interact with AI during coding. However, they are not without their drawbacks.&lt;/p&gt;

&lt;p&gt;You might want to skip this section if you're a VSCode enthusiast who's never experienced JetBrains IDEs. As I say, ignorance is bliss, especially when it comes to food taste and IDEs.&lt;/p&gt;

&lt;p&gt;For those familiar with more robust IDEs, Cursor's limitations become apparent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code navigation features are lacking (find usages, go-to reference, go-to implementation, etc.)&lt;/li&gt;
&lt;li&gt;Git integration is limited&lt;/li&gt;
&lt;li&gt;Search, find, and replace capabilities are weak&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know it inherits all of VSCode's issues, but even when I configure 30+ keyboard shortcuts to do things I do naturally on JetBrains IDEs, the experience is still sufferable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the possible best setup today?
&lt;/h2&gt;

&lt;p&gt;Use Cursor for AI-specific coding tasks and WebStorm (or other JetBrains IDEs) for everything else. The dream scenario would be JetBrains shamelessly copying all of Cursor's features.&lt;/p&gt;

&lt;p&gt;Cursor's AI capabilities shine because it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilizes Claude 3.5 Sonnet&lt;/li&gt;
&lt;li&gt;Provides three distinct interaction methods&lt;/li&gt;
&lt;li&gt;Allows Composer to modify and create multiple files simultaneously&lt;/li&gt;
&lt;li&gt;Offers separate diff and apply actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine having JetBrains' superior diff feature in Cursor – that would be a game-changer.&lt;/p&gt;

&lt;p&gt;To expand on "AI-specific coding tasks":&lt;/p&gt;

&lt;p&gt;I still prefer to code myself in many cases, though I expect these instances to decrease over time. I believe the sweet spot for AI now is handling simple tasks, especially in unfamiliar projects or when dealing with verbose tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verbosity: No Longer a Developer's Nemesis?
&lt;/h2&gt;

&lt;p&gt;Verbosity has long been a thorn in developers' sides, but AI-generated code is shifting this paradigm. This change could make verbose languages like Java and tools like TailwindCSS more palatable to developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meteor Frontend Without Frameworks: A Fresh Perspective
&lt;/h2&gt;

&lt;p&gt;Exploring Meteor's reactivity without client-side frameworks unveils how powerful the Meteor's reactive model is on its foundation. Here's a quick demo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Function to render the video list&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;renderVideoList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;h2&amp;gt;YouTube Videos&amp;lt;/h2&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;input type="text" id="newVideoUrl" placeholder="Enter YouTube URL"&amp;gt;
      &amp;lt;button id="addVideoBtn"&amp;gt;Add Video&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;ul&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;videoList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;li&amp;gt;
      &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
      &amp;lt;button onclick="removeVideo('&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;')"&amp;gt;Remove&amp;lt;/button&amp;gt;
    &amp;lt;/li&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;renderHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Add event listeners&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;addVideoBtn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addVideo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;newVideoUrl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keypress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleNewVideoKeyPress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Simple function to render HTML using JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;renderHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Element with id "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elementId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" not found.`&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeVideo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Meteor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;videos.remove&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;videoId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// If successful, the UI should update automatically if you're using Tracker or ReactiveVar&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error removing video:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Optionally, show an error message to the user&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;Meteor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startup&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="s1"&gt;Meteor.startup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;Meteor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;youtubeVideos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Set up the reactive computation&lt;/span&gt;
  &lt;span class="nx"&gt;Tracker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;autorun&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;videoList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;YoutubeVideosCollection&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;renderVideoList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;videoList&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;As you can see, this HTML was generated by AI, so it was "coded in English," and I didn't have to type anything. Meteor's powerful foundation allowed me to create very simple code that is reactive and updates the UI in real-time without any UI framework.&lt;/p&gt;

&lt;p&gt;Why does this matter, and why I'm talking about it in this post? &lt;/p&gt;

&lt;p&gt;Because AI can now generate HTML based on natural language requests with ease and speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Embracing the New Era
&lt;/h2&gt;

&lt;p&gt;While we're not suggesting abandoning frameworks altogether, we're undoubtedly entering a new age where verbosity is becoming less of an issue for developers. It's time to consider embracing new patterns and languages.&lt;/p&gt;

&lt;p&gt;Good libraries and frameworks offer much more than just reducing verbosity. They optimize performance for common cases and propose innovative solutions to problems. However, exploring life without them is occasionally beneficial, as this can lead to fresh ideas and perspectives.&lt;/p&gt;

&lt;p&gt;As a bonus insight: TailwindCSS's verbose nature, once considered a drawback, is now less significant in the age of AI-assisted development. Some might call this lucky timing, but as the saying goes, "luck favors the prepared." TailwindCSS's success is a testament to its creators' hard work and foresight, who positioned themselves perfectly for this new era of development (with a good pinch of luck).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>meteor</category>
      <category>javascript</category>
    </item>
    <item>
      <title>What is a Web App? And Why Does it Matter?</title>
      <dc:creator>Filipe Névola</dc:creator>
      <pubDate>Wed, 25 Sep 2024 11:17:52 +0000</pubDate>
      <link>https://dev.to/quave/what-is-a-web-app-and-why-does-it-matter-3pej</link>
      <guid>https://dev.to/quave/what-is-a-web-app-and-why-does-it-matter-3pej</guid>
      <description>&lt;p&gt;Hello! Let's dive into the world of web apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining a Web App
&lt;/h2&gt;

&lt;p&gt;A web app is typically browser-based. Key characteristics include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Platform independence (no reliance on specific operating systems)&lt;/li&gt;
&lt;li&gt;Runs on any device, including mobile&lt;/li&gt;
&lt;li&gt;Internet-dependent (at least for initial loading)&lt;/li&gt;
&lt;li&gt;Dynamic content (frequent updates)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technologies Behind Web Apps
&lt;/h2&gt;

&lt;p&gt;Essential technologies for web apps include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: HTML, CSS, and JavaScript (WebAssembly is emerging but not yet widespread)&lt;/li&gt;
&lt;li&gt;Backend: Various languages like Node.js, Python (with Django or Flask), Java, etc.&lt;/li&gt;
&lt;li&gt;Databases: SQL and NoSQL options (e.g., MongoDB, PostgreSQL)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Examples of Web Apps
&lt;/h2&gt;

&lt;p&gt;Some popular web apps we use daily:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gmail&lt;/li&gt;
&lt;li&gt;Google Docs&lt;/li&gt;
&lt;li&gt;Trello&lt;/li&gt;
&lt;li&gt;Slack (even when used as a desktop app, it's web-based)&lt;/li&gt;
&lt;li&gt;Online banking&lt;/li&gt;
&lt;li&gt;Admin dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security in Web Apps
&lt;/h2&gt;

&lt;p&gt;Web apps benefit from built-in security features, such as HTTPS for encrypted data transmission. This pre-existing infrastructure saves developers from building security measures from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Not a Web App?
&lt;/h2&gt;

&lt;p&gt;To better understand web apps, let's look at what doesn't qualify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native mobile apps&lt;/li&gt;
&lt;li&gt;Native desktop apps&lt;/li&gt;
&lt;li&gt;Command-line interfaces&lt;/li&gt;
&lt;li&gt;Embedded systems (e.g., microwave software)&lt;/li&gt;
&lt;li&gt;Most games (though some use web technologies)&lt;/li&gt;
&lt;li&gt;Simple websites**&lt;/li&gt;
&lt;li&gt;SEO-friendly websites** (these often prioritize static or server-rendered content)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Server-Side Rendering Debate
&lt;/h2&gt;

&lt;p&gt;** There's ongoing discussion about server-side rendering (SSR) versus client-side rendering for web apps. Some companies push for more SSR, partly because they have an incentive to sell server infrastructure. However, for many web apps, client-side rendering is often sufficient and can provide a better user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Loading Times: A Reality Check
&lt;/h2&gt;

&lt;p&gt;Let's consider loading times for web apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First load: ~7-8 seconds&lt;/li&gt;
&lt;li&gt;Subsequent loads: ~1 second (thanks to caching)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most web apps, these loading times are acceptable. Users typically don't mind waiting a few seconds for an app they'll use for an extended period.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hybrid Approach
&lt;/h2&gt;

&lt;p&gt;At Quave, we often use a hybrid approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A website to present and sell the idea (optimized for SEO)&lt;/li&gt;
&lt;li&gt;A web app for the actual product (optimized for user experience)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This combination allows us to leverage the strengths of both approaches.&lt;/p&gt;

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

&lt;p&gt;When deciding on your app's architecture, focus on your specific needs rather than following the latest trends from big tech companies. Consider your app's requirements and user experience goals, and choose the approach that best serves your project.&lt;/p&gt;

&lt;p&gt;Remember, technology is a big industry, and companies must make money. However, your priority should be solving your unique problems, not aligning with someone else's business model.&lt;/p&gt;

&lt;p&gt;Think critically, and make decisions based on your app's principles, not the latest market push from big companies.&lt;/p&gt;

&lt;p&gt;See you in the next one! Bye bye.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This content is part of the &lt;a href="https://aiproofdev.com" rel="noopener noreferrer"&gt;AI Proof Dev Web Apps course&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>meteor</category>
    </item>
    <item>
      <title>Understanding Meteor's Settings File</title>
      <dc:creator>Filipe Névola</dc:creator>
      <pubDate>Wed, 13 Dec 2023 10:59:12 +0000</pubDate>
      <link>https://dev.to/filipenevola/understanding-meteors-settings-file-pai</link>
      <guid>https://dev.to/filipenevola/understanding-meteors-settings-file-pai</guid>
      <description>&lt;p&gt;Understanding configuration files is essential in the world of Javascript programming and &lt;a href="https://www.meteor.com"&gt;Meteor&lt;/a&gt;. You see, typically, most frameworks lack a standard configuration file. Instead, developers use environment variables, which they retrieve when needed. However, Meteor, about ten years ago, chose a different path and decided to introduce a settings file, which essentially transforms into an environment variable in most places. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Basics of Meteor's Configuration
&lt;/h2&gt;

&lt;p&gt;This unique feature of Meteor allows you to store all configurations in a single JSON. Meteor takes this JSON and transforms it into an environment variable. But there's no magic trick here. Meteor, on its own, loads this JSON into a variable termed &lt;code&gt;Meteor.settings&lt;/code&gt;. So, how does it work? Let's explore.&lt;/p&gt;

&lt;p&gt;JSON relies on key-value pairs. In the Meteor's settings file, there's a key named &lt;code&gt;public&lt;/code&gt;. If you place any configurations within the &lt;code&gt;public&lt;/code&gt; key, Meteor automatically forwards it to the client. As a result, you can effortlessly access whatever is &lt;code&gt;public&lt;/code&gt; from the client side. &lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Public and Private Segments
&lt;/h2&gt;

&lt;p&gt;However, anything that doesn't fall within this &lt;code&gt;public&lt;/code&gt; key at the primary level does not reach the client side and remains server-side only. This unique feature is the only "magic" that Meteor performs. &lt;/p&gt;

&lt;p&gt;The utility of this settings file from Meteor is that it can also be used to pass configurations to the client side. Usually, passing configurations to the client side warrants extra work since no environmental variables are available on the client side (considering the client side is really the user's browser, and you can't control the user's environment variables). &lt;/p&gt;

&lt;p&gt;Think of the settings file as a configuration document that you can use to pass configurations to both the server and the client. However, it's important to distinguish what is &lt;code&gt;public&lt;/code&gt; (and therefore accessible client-side) and what should stay only on the server. &lt;/p&gt;

&lt;h2&gt;
  
  
  How to Provide the Settings File to Meteor
&lt;/h2&gt;

&lt;p&gt;It's crucial to provide the settings file correctly to Meteor for effective functioning. To pass these settings to the Meteor application, you must use the &lt;code&gt;--settings&lt;/code&gt; parameter. When running your Meteor app, include the settings file as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;meteor &lt;span class="nt"&gt;--settings&lt;/span&gt; settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this command, ﻿settings.json is the file containing your settings. Notably, the ﻿--settings property helps Meteor recognize this file and load the configurations correctly into ﻿&lt;code&gt;Meteor.settings&lt;/code&gt;, making the configurations available to your application. This way, you can manage server and client configurations within your Meteor application by utilizing the settings file.&lt;/p&gt;

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

&lt;p&gt;Thus, the settings feature of Meteor simplifies a lot of tasks and provides additional ease of use for developers. The settings file is a handy tool, especially for simplifying and managing configurations effectively and efficiently.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Want to try Meteor on the server? Try &lt;a href="https://zcloud.ws"&gt;zCloud&lt;/a&gt;. See how to use Meteor settings in zCloud &lt;a href="https://docs.zcloud.ws/docs/technologies/meteor"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>React Image component resilient to flaky connections</title>
      <dc:creator>Filipe Névola</dc:creator>
      <pubDate>Tue, 14 Apr 2020 14:30:46 +0000</pubDate>
      <link>https://dev.to/filipenevola/react-image-component-resilient-to-flaky-connections-17bg</link>
      <guid>https://dev.to/filipenevola/react-image-component-resilient-to-flaky-connections-17bg</guid>
      <description>&lt;p&gt;I would like to explain here how I include images in my React projects.&lt;/p&gt;

&lt;p&gt;It's very common to use the &lt;code&gt;img&lt;/code&gt; tag directly everywhere like this &lt;code&gt;&amp;lt;img src="my-image.png" /&amp;gt;&lt;/code&gt; but as this is not a React component we can't apply some layer on it then I prefer to have an Image component in my apps.&lt;/p&gt;

&lt;p&gt;In this Image component one case that I usually handle is when the image fails to load, this can happen when the user internet connection is flaky or even if the image is not available anymore, maybe the owner of the image just deleted it. &lt;/p&gt;

&lt;p&gt;By default, the browser will display a broken image icon or something bad for the user and we don't want that. So we can use the &lt;code&gt;onError&lt;/code&gt; property of &lt;code&gt;img&lt;/code&gt; to trigger a state change then we can provide a different image URL that we can trust. Check the Image component code.&lt;/p&gt;


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


&lt;p&gt;Then when the user's connection fails the browser will not show a broken image icon if we provide a better fallback when using this Image component, for instance, in a PersonImage component that displays the user profile picture in our app.&lt;/p&gt;


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


&lt;p&gt;I believe you are thinking: how the browser is going to load the fallback image anyway if the connection is failing? Well, we can add in our HTML head section a preload link to load our fallback image in advance:&lt;/p&gt;


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


&lt;p&gt;That is it, simple and straightforward. Are you doing something like this in our React apps? Did you know about &lt;code&gt;onError&lt;/code&gt; property already? Leave a comment 😉&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Announcing Meteor 1.10</title>
      <dc:creator>Filipe Névola</dc:creator>
      <pubDate>Thu, 19 Mar 2020 19:15:26 +0000</pubDate>
      <link>https://dev.to/filipenevola/announcing-meteor-1-10-32po</link>
      <guid>https://dev.to/filipenevola/announcing-meteor-1-10-32po</guid>
      <description>&lt;p&gt;Meteor 1.10 is a release full of exciting updates such as Cordova, MongoDB, option to exclude architectures, new Meteor DevTools and more&lt;/p&gt;

&lt;p&gt;We started working on Meteor 1.10 last &lt;a href="https://github.com/meteor/meteor/pull/10810"&gt;December&lt;/a&gt; by updating Cordova and &lt;a href="https://github.com/meteor/meteor/pull/10723"&gt;MongoDB&lt;/a&gt; to the latest versions. Since then, we have included the ability to &lt;a href="https://github.com/meteor/meteor/pull/10824"&gt;exclude specific architectures&lt;/a&gt; in development, new &lt;a href="https://chrome.google.com/webstore/detail/meteor-devtools-evolved/ibniinmoafhgbifjojidlagmggecmpgf"&gt;Meteor DevTools&lt;/a&gt; and much more.&lt;/p&gt;

&lt;p&gt;During this release, we were able to close 27 PRs and issues. All this was possible because of our community, more than 40 people have helped in 1.10. Thank you all! 😉&lt;/p&gt;

&lt;p&gt;Let's dive into a few highlights.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cordova Update
&lt;/h1&gt;

&lt;p&gt;Meteor is now up-to-date with Cordova; we have updated from &lt;code&gt;cordova-lib&lt;/code&gt; 7 to 9 and also &lt;code&gt;cordova-ios&lt;/code&gt; and &lt;code&gt;cordova-android&lt;/code&gt; to latest versions. Also, we’ve upgraded every Cordova plugin that is a direct dependency of Meteor.&lt;/p&gt;

&lt;p&gt;As a result of these updates, the problems reported by XCode due to old Swift versions are gone and also the warnings after the submission to the App Store about using &lt;a href="https://forums.developer.apple.com/thread/122114"&gt;UIWebView&lt;/a&gt;. As always you can check everything that was updated in &lt;a href="https://github.com/meteor/meteor/blob/devel/History.md#v1101-2020-03-12"&gt;History&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Cordova integration is very important for many Meteor developers that are delivering their apps or their client’s app to App Store and Google Play. We are now able again to provide a smooth experience for developers creating a native application only using Javascript.&lt;/p&gt;

&lt;p&gt;You can create a new Meteor application with native support via Cordova by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meteor create my-mobile-app
cd my-mobile-app
meteor add-platform ios
meteor run ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;meteor run ios&lt;/code&gt; will open the iOS Simulator with your app running on it. You can also run Android by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meteor add-platform android
meteor run android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;meteor run&lt;/code&gt; android will run your app in the Android Simulator as well.&lt;/p&gt;

&lt;p&gt;If you don’t have iOS or Android development kits setup yet, follow the &lt;a href="https://guide.meteor.com/mobile.html#installing-prerequisites"&gt;steps from our guide&lt;/a&gt; before adding the platforms to your Meteor app.&lt;/p&gt;

&lt;p&gt;Cordova still has a lot of presence on &lt;a href="https://twitter.com/sandofsky/status/1226299695724580864/photo/2"&gt;App Store&lt;/a&gt; and &lt;a href="https://twitter.com/sandofsky/status/1226375018952589312/photo/1"&gt;Google Play&lt;/a&gt;, and Meteor can help a lot with the native experience by providing a Cordova project already configured properly for you.&lt;/p&gt;

&lt;p&gt;In my opinion, Cordova deliveries the best cost-benefit for companies that want to have their apps on Web, iOS, and Android. We will continue to provide support for Cordova and we are also going to enhance the documentation and include more code examples on how to build great native apps. 📱&lt;/p&gt;

&lt;h1&gt;
  
  
  MongoDB Update
&lt;/h1&gt;

&lt;p&gt;As you probably know Meteor has a long story with MongoDB — Meteor even provides a MongoDB ready to be used by your application without requiring that you install MongoDB yourself. This embedded MongoDB for development is now using the version 4.2.1.&lt;/p&gt;

&lt;p&gt;We have also updated the MongoDB driver used by core Meteor packages so we are up-to-date with MongoDB as well. 🎉&lt;/p&gt;

&lt;p&gt;Thanks &lt;a href="https://github.com/klaussner"&gt;Christian Klaussner&lt;/a&gt; for this work!&lt;/p&gt;

&lt;h1&gt;
  
  
  Skeleton Updates
&lt;/h1&gt;

&lt;p&gt;You can create a new Meteor project choosing from a few skeleton &lt;a href="https://github.com/meteor/meteor/blob/8c022eacedb615527f89096168ff999b8399f657/tools/cli/commands.js#L897-L901"&gt;options&lt;/a&gt;, but the React skeleton was still using &lt;code&gt;class&lt;/code&gt; components and &lt;code&gt;withTracker&lt;/code&gt; HOC, these two patterns are still valid but we believe there are better ways to create React apps today. It was time for an update here. Now, it uses &lt;code&gt;function&lt;/code&gt; components and the new hook for tracker called &lt;code&gt;useTracker&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If this hook is new to you, check our &lt;a href="https://blog.meteor.com/introducing-usetracker-react-hooks-for-meteor-cb00c16d6222"&gt;recent blog post introducing&lt;/a&gt; it. See below how it is used in the updated skeleton — &lt;code&gt;useTracker&lt;/code&gt; makes it very simple to have reactive data in your React components!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WHuy5zdn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/5636/1%2AZy1N5e66sYSI7-7yV5Ixiw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WHuy5zdn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/5636/1%2AZy1N5e66sYSI7-7yV5Ixiw.png" alt="Info.jsx" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use this new skeleton running &lt;code&gt;meteor create --react&lt;/code&gt;. The TypeScript skeleton (&lt;code&gt;meteor create --typescript&lt;/code&gt;) also uses React, and therefore it is also updated with &lt;code&gt;function&lt;/code&gt; components and &lt;code&gt;useTracker&lt;/code&gt; hook.&lt;/p&gt;

&lt;p&gt;On the subject of skeletons, a new skeleton is coming soon: the new skeleton (not published yet) will help you to create a native app with Cordova, Push Notification, PWA settings, Service Worker and much more. &lt;a href="https://www.meteor.com/newsletter"&gt;Sign-up&lt;/a&gt; to our newsletter to know when the mobile skeleton is available! 💀&lt;/p&gt;

&lt;h1&gt;
  
  
  Vue.js Tutorial
&lt;/h1&gt;

&lt;p&gt;If you are not using React as your view layer, there is a good chance that you are using Vue.js. We are glad to announce our &lt;a href="https://www.meteor.com/tutorials/vue/creating-an-app"&gt;Vue.js Tutorial&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;In the tutorial, you are going to learn how to create a simple app to manage a “to do” list and collaborate with others on those tasks. By the end, you should have a basic understanding of Meteor and how to use Vue.js with Meteor. Feedback is welcome!&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://www.meteor.com/tutorials/vue/creating-an-app"&gt;Brian Mulhall&lt;/a&gt; who wrote this tutorial and also &lt;a href="https://github.com/Akryum"&gt;Guillaume Chau&lt;/a&gt; who implemented Meteor &lt;code&gt;akryum:vue-component&lt;/code&gt; package.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exclude Architectures
&lt;/h1&gt;

&lt;p&gt;Meteor 1.7 introduced a new client bundle called &lt;code&gt;web.browser.legacy&lt;/code&gt; in addition to the &lt;code&gt;web.browser&lt;/code&gt; (modern) and web.cordova bundles. Naturally, this extra bundle increased client (re)build times. Since developers spend most of their time testing the modern bundle in development, and the legacy bundle mostly provides a safe fallback in production, Meteor 1.8 cleverly postpones building the legacy bundle until just after the development server restarts, so that development can continue as soon as the modern bundle has finished building. This was nice, but not enough, as the &lt;code&gt;web.browser.legacy&lt;/code&gt; is still using machine resources even if it’s not blocking the modern bundle to be used but now this is solved.&lt;/p&gt;

&lt;p&gt;You can now pass an &lt;code&gt;--exclude-archs&lt;/code&gt; option to the &lt;code&gt;meteor run&lt;/code&gt; and &lt;code&gt;meteor test&lt;/code&gt; commands to temporarily disable building certain web architectures saving machine resources. For example, &lt;code&gt;meteor run --exclude-archs web.browser.legacy&lt;/code&gt;. Multiple architectures should be separated by commas. This option can be used to improve (re)build times if you’re not actively testing the excluded architectures during development.&lt;/p&gt;

&lt;p&gt;As you can see below you can optimize your development excluding architectures that are not important for you in a specific moment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3ORTjGQ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/3736/1%2Ay3f94QtdKCYHV0r-pn5WPw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3ORTjGQ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/3736/1%2Ay3f94QtdKCYHV0r-pn5WPw.png" alt="comment in Meteor 1.10 PR" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks &lt;a href="https://github.com/sebakerckhof"&gt;Seba Kerckhof&lt;/a&gt; 😃&lt;/p&gt;

&lt;p&gt;If you want to update an existing Meteor project you can update to 1.10.1 running &lt;code&gt;meteor update&lt;/code&gt; on your app directory. Enjoy!&lt;/p&gt;

&lt;h1&gt;
  
  
  Meteor DevTools Evolved
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/leonardoventurini"&gt;Leonardo Venturini&lt;/a&gt; published a new version of the &lt;a href="https://chrome.google.com/webstore/detail/meteor-devtools-evolved/ibniinmoafhgbifjojidlagmggecmpgf"&gt;Meteor DevTools&lt;/a&gt; that he called Meteor DevTools Evolved, an incredible tool for Meteor developers to debug and understand Meteor methods and publications. Also, it provides a view of your MiniMongo collections.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dZJe_liu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/4208/1%2AJ4QJKJVZK3GItsJ6p7NXJQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dZJe_liu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/4208/1%2AJ4QJKJVZK3GItsJ6p7NXJQ.png" alt="Meteor DevTools evolved running on meteor.com" width="800" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This new DevTools is capable of handling a lot of DDP messages per second without freezing or breaking, and also offers new features like save messages to analyze later (bookmarks), MiniMongo documents filter, etc. If you would like to contribute or if you found a problem feel free to open an &lt;a href="https://github.com/leonardoventurini/meteor-devtools-evolved"&gt;issue or PR&lt;/a&gt;. ⚙️&lt;/p&gt;

&lt;h1&gt;
  
  
  Galaxy News
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.meteor.com/hosting"&gt;Galaxy&lt;/a&gt; also received a new feature today! One of the most requested features on Galaxy was the ability to edit the Meteor settings without requiring a new code deploy. We are glad to announce that now you can edit the settings from the current version of your app deployed to Galaxy.&lt;/p&gt;

&lt;p&gt;It's very simple — go to Versions tab in your Galaxy app dashboard, expand your current version and click in the Edit button below your current settings then a text input will appear for you to edit the settings. Click save when you are ready and a new version will be created with your changed settings. ✏️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KIb_rEry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/5708/1%2AXZIz50RtR1BT-dwJeTrwYw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KIb_rEry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/max/5708/1%2AXZIz50RtR1BT-dwJeTrwYw.png" alt="Button to edit settings in the current version of your app on Galaxy" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case you have missed, Galaxy is offering a free trial of 30 days! You can use up to 4 GBs of RAM, which is the same as 4 standard containers, 2 double containers or 1 quad, so you can try all the Galaxy container sizes for free. Sign-up for Galaxy &lt;a href="https://www.meteor.com/sign-up"&gt;now&lt;/a&gt;! 🆓&lt;/p&gt;

&lt;p&gt;Wow, many things to cover in this post, I hope you liked it. Check the &lt;a href="https://github.com/meteor/meteor/blob/devel/Roadmap.md"&gt;Meteor&lt;/a&gt; and &lt;a href="https://github.com/meteor/galaxy-roadmap/blob/master/README.md"&gt;Galaxy&lt;/a&gt; roadmaps to know what is coming next! 😉&lt;/p&gt;

</description>
      <category>meteor</category>
      <category>node</category>
      <category>cordova</category>
      <category>vue</category>
    </item>
    <item>
      <title>Meteor 1.9 (Node.js 12) and new Roadmaps</title>
      <dc:creator>Filipe Névola</dc:creator>
      <pubDate>Fri, 31 Jan 2020 15:46:31 +0000</pubDate>
      <link>https://dev.to/filipenevola/meteor-1-9-node-js-12-and-new-roadmaps-3n86</link>
      <guid>https://dev.to/filipenevola/meteor-1-9-node-js-12-and-new-roadmaps-3n86</guid>
      <description>&lt;p&gt;Today we’re thrilled to announce the final release of Meteor 1.9, which brings the stable and in long-term support Node.js 12. We also have a new version of Meteor roadmap and the first Galaxy public roadmap. Please check those out when you can so you know what’s to come! We’re very excited, and we hope you are too.&lt;/p&gt;

&lt;h1&gt;
  
  
  Node.js 12
&lt;/h1&gt;

&lt;p&gt;The major change with 1.9 release is Node.js 12 support. In &lt;a href="https://github.com/meteor/meteor/pull/10527"&gt;April of 2019&lt;/a&gt; we started to publish alpha versions of Meteor 1.9 updating to Node 12; with continual feedback from the community members, we are now ready with a final version.&lt;/p&gt;

&lt;p&gt;The upgrade from Node 8 to Node 12 required a number of changes and updates behind the scenes to ensure the compatibility of npm packages. As always, Meteor updates are backward compatible as possible and you can enjoy the benefits of new features without any hassle!&lt;/p&gt;

&lt;p&gt;The new version of the V8 JavaScript engine used by Node 12 brings &lt;a href="https://medium.com/@nodejs/introducing-node-js-12-76c41a1b3f3f"&gt;performance improvements and tweaks&lt;/a&gt; that should improve the performance of your code as a whole. Meteor uses Fibers to avoid async callbacks and now you should see less garbage collection as &lt;a href="https://github.com/laverdet/node-fibers/pull/429"&gt;node-fibers&lt;/a&gt; is no longer asking for adjustments of external allocated memory what should result in less pressure in CPU usage what is always good.&lt;/p&gt;

&lt;p&gt;It is worth to note that 32-bit Linux support was dropped in Node.js 10, and we also dropped the support for it. In other words: Meteor 1.9 supports 64-bit Mac, Windows, and Linux, as well as 32-bit Windows. As always you can check all the changes in &lt;a href="https://github.com/meteor/meteor/blob/devel/History.md#v19-2020-01-09"&gt;History&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We are also excited about new Node features that will be beneficial for the future of Meteor. &lt;a href="https://nodejs.org/api/worker_threads.html"&gt;Worker Threads&lt;/a&gt; that can help to parallelize build process and other intensive processes and also &lt;a href="https://github.com/nodejs/node/pull/29564"&gt;native source map&lt;/a&gt; support for Node stack traces.&lt;/p&gt;

&lt;p&gt;Before you update to Meteor 1.9 we recommend you check your npm dependencies to be sure they are compatible with Node 12.&lt;/p&gt;

&lt;h1&gt;
  
  
  Meteor Roadmap
&lt;/h1&gt;

&lt;p&gt;We’ve updated the Meteor &lt;a href="https://github.com/meteor/meteor/blob/devel/Roadmap.md"&gt;roadmap&lt;/a&gt; to reflect our goals for Meteor, and we hope you will review and share your thoughts. We will continue to update every quarter. There are many different areas for contributions for those interested: Core, Cordova, DB, Documentation, as well as new content for Technologies that we consider first-class citizens in the platform.&lt;/p&gt;

&lt;p&gt;We would love to have you involved! Meteor has and will continue to rely on our community in order for us to grow into the platform we all know it can be. We hope that you will help us make Meteor better by assigning yourself a task.&lt;/p&gt;

&lt;p&gt;Everybody is qualified to work on Meteor, if you need help deciding the best item for you to be involved leave a comment here or ask in the &lt;a href="https://join.slack.com/t/meteor-community/shared_invite/enQtODA0NTU2Nzk5MTA3LWY5NGMxMWRjZDgzYWMyMTEyYTQ3MTcwZmU2YjM5MTY3MjJkZjQ0NWRjOGZlYmIxZjFlYTA5Mjg4OTk3ODRiOTc"&gt;Meteor Community Slack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also get involved in &lt;a href="https://github.com/meteor/meteor/pull/10861"&gt;Meteor 1.10&lt;/a&gt; which includes Cordova updates and also the ability to disable web.browser.legacy build, we already have published beta versions of it and you can help trying it in your apps today.&lt;/p&gt;

&lt;h1&gt;
  
  
  Galaxy Roadmap
&lt;/h1&gt;

&lt;p&gt;Galaxy is the hosting platform specially designed for Meteor apps. It’s the fastest way for you to publish your Meteor apps: One command deploys, free Automatic SSL certificates, built-in SEO prerendering, integrated APM, &lt;a href="https://www.meteor.com/hosting"&gt;etc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Galaxy already provides many features to make your experience running Meteor apps in production as easy as possible; in the next few months it will receive new features such as: notifications about your app activities, auto-scale options, ability to apply new settings without a new deploy and &lt;a href="https://github.com/meteor/galaxy-roadmap/blob/master/README.md"&gt;much more&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have special needs or want support feel free to send us a message (&lt;a href="mailto:support@meteor.com"&gt;support@meteor.com&lt;/a&gt;) and we will be glad to help.&lt;/p&gt;

&lt;h1&gt;
  
  
  Packages updates
&lt;/h1&gt;

&lt;p&gt;Every week we have package updates and since Meteor 1.8.2 we had many updates, a few highlights:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;meteor-apm-agent@3.2.5&lt;/code&gt;: fixes error logs not providing useful information [object Object].&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mdg:seo@3.2.2&lt;/code&gt;: removes deprecated tag and updates prerender-node.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;modern-browsers@0.1.5&lt;/code&gt;: fixes Capacitor (and possibly others) user agents detection.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;react-meteor-data@2.0.1&lt;/code&gt;: makes main module lazy.&lt;/p&gt;

&lt;p&gt;By the way, Kevin Newman published a great &lt;a href="https://blog.meteor.com/introducing-usetracker-react-hooks-for-meteor-cb00c16d6222"&gt;post&lt;/a&gt; about version 2 of react-meteor-data package where he explains how useTracker (new React hook!) works and how to use it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bonus Tip
&lt;/h1&gt;

&lt;p&gt;To conclude this post I would like to ask you a question: Did you know you can use &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining"&gt;optional chaining&lt;/a&gt; &lt;a href="https://github.com/meteor/babel-preset-meteor/commit/9c77868cb342a992d15fc6b046a44139d25a319c#diff-9b5c21a922007319aa514b4819a5eeda"&gt;since&lt;/a&gt; Meteor 1.8.2? 😮&lt;/p&gt;

&lt;p&gt;Yes, you can! Thanks to the great integration between Meteor and Babel you can already use optional chaining without any extra configuration. Optional chaining is great to avoid explicit undefined checks in your code. See one simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// author / coauthor (optional) / title
const blogPost = {
  author: {
    firstName: 'Filipe',
  }  
  title: 'Meteor 1.9 and Node.js 12',
}
// get coauthor first name without optional chaining
if (blogPost.coauthor) {
  console.log(blogPost.coauthor.firstName);
}
// get coauthor first name with optional chaining
console.log(blogPost.coauthor?.firstName);
// output: undefined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check all the proposals available for you in &lt;a href="https://github.com/meteor/babel-preset-meteor/blob/9c77868cb342a992d15fc6b046a44139d25a319c/proposals.js"&gt;babel-preset-meteor&lt;/a&gt; and don’t forget to update your apps to Meteor 1.9. Enjoy!&lt;/p&gt;

</description>
      <category>meteor</category>
      <category>node</category>
      <category>hosting</category>
      <category>cordova</category>
    </item>
  </channel>
</rss>
