<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Justforvan Blog]]></title><description><![CDATA[Justforvan Blog, anything tech-related. Mostly about web dev, multi-platform app dev, and Windows.]]></description><link>https://blog.jfv.sh</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 11:33:47 GMT</lastBuildDate><atom:link href="https://blog.jfv.sh/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Quick Solution for @libsql/hrana-client/LICENSE Syntax Error (Expected ';', '}' or <eof>) in Next.js 15]]></title><description><![CDATA[Error message
> Build error occurred
Error: Turbopack build failed with 1 errors:
./node_modules/@libsql/hrana-client/LICENSE:1:5
Parsing ecmascript source code failed
> 1 | MIT License
    |     ^^^^^^^
  2 |
  3 | Copyright 2023 the sqld authors
  ...]]></description><link>https://blog.jfv.sh/quick-solution-for-libsqlhrana-clientlicense-syntax-error-expected-or-eof-in-nextjs-15</link><guid isPermaLink="true">https://blog.jfv.sh/quick-solution-for-libsqlhrana-clientlicense-syntax-error-expected-or-eof-in-nextjs-15</guid><category><![CDATA[Next.js]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[libsql]]></category><category><![CDATA[DrizzleORM]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[Justforvan]]></dc:creator><pubDate>Tue, 09 Sep 2025 13:01:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1757422692361/ba38fb18-604e-49a6-acb8-134f86dcdc42.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-error-message">Error message</h1>
<pre><code class="lang-javascript">&gt; Build error occurred
<span class="hljs-attr">Error</span>: Turbopack build failed <span class="hljs-keyword">with</span> <span class="hljs-number">1</span> errors:
./node_modules/@libsql/hrana-client/LICENSE:<span class="hljs-number">1</span>:<span class="hljs-number">5</span>
Parsing ecmascript source code failed
&gt; <span class="hljs-number">1</span> | MIT License
    |     ^^^^^^^
  <span class="hljs-number">2</span> |
  <span class="hljs-number">3</span> | Copyright <span class="hljs-number">2023</span> the sqld authors
  <span class="hljs-number">4</span> |
Expected <span class="hljs-string">';'</span>, <span class="hljs-string">'}'</span> or &lt;eof&gt;
    at ./node_modules/ (libsql/hrana-client/LICENSE:<span class="hljs-number">1</span>:<span class="hljs-number">5</span>)
<span class="hljs-attr">Error</span>: Command <span class="hljs-string">"npm run build"</span> exited <span class="hljs-keyword">with</span> <span class="hljs-number">1</span>
</code></pre>
<p>Such error was shown when pushing to Vercel and was not seen in development environtment.</p>
<h1 id="heading-tech-stacks">Tech Stacks</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Techs</strong></td><td><strong>Version</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Next.js</td><td>15.5.2 (with turbopack)</td></tr>
<tr>
<td>Node</td><td>24.4.0</td></tr>
<tr>
<td>Biomejs</td><td>2.2.0</td></tr>
<tr>
<td>Libsql/client</td><td>0.15.15</td></tr>
<tr>
<td>Drizzle ORM</td><td>0.44.5</td></tr>
<tr>
<td>Vercel</td><td>N/A</td></tr>
</tbody>
</table>
</div><h1 id="heading-solution">Solution</h1>
<ol>
<li><p>Find your <code>package.json</code> file</p>
</li>
<li><p>Find the following lines:</p>
<pre><code class="lang-json">   <span class="hljs-string">"scripts"</span>: {
     <span class="hljs-attr">"dev"</span>: <span class="hljs-string">"next dev --turbopack"</span>,
     <span class="hljs-attr">"build"</span>: <span class="hljs-string">"next build --turbopack"</span>,
     <span class="hljs-attr">"start"</span>: <span class="hljs-string">"next start"</span>,
     <span class="hljs-attr">"lint"</span>: <span class="hljs-string">"biome check"</span>,
     <span class="hljs-attr">"format"</span>: <span class="hljs-string">"biome format --write"</span>
   },
</code></pre>
</li>
<li><p>Remove the <code>--turbopack</code> from build command, so it becomes:</p>
<pre><code class="lang-json">   <span class="hljs-string">"scripts"</span>: {
     <span class="hljs-attr">"dev"</span>: <span class="hljs-string">"next dev --turbopack"</span>,
     <span class="hljs-attr">"build"</span>: <span class="hljs-string">"next build"</span>, <span class="hljs-comment">//LOOK HERE</span>
     <span class="hljs-attr">"start"</span>: <span class="hljs-string">"next start"</span>,
     <span class="hljs-attr">"lint"</span>: <span class="hljs-string">"biome check"</span>,
     <span class="hljs-attr">"format"</span>: <span class="hljs-string">"biome format --write"</span>
   },
</code></pre>
</li>
</ol>
<h1 id="heading-notes">Notes</h1>
<p>This error seems to affect Turbopack builds since removing <code>--turbopack</code> from the build script can resolve the build error. This error also mentioned here <a target="_blank" href="https://community.vercel.com/t/build-error-an-unexpected-error-happened-when-running-this-build/20836">https://community.vercel.com/t/build-error-an-unexpected-error-happened-when-running-this-build/20836</a></p>
<p>Attempting to manually delete all the LICENSE and README files relating to hrana library from the Node Modules proven to not work for me. However, it may yields different result to other people as seen here <a target="_blank" href="https://github.com/vercel/next.js/issues/82881#issuecomment-3220603319">https://github.com/vercel/next.js/issues/82881#issuecomment-3220603319</a></p>
]]></content:encoded></item><item><title><![CDATA[Fixing the "Types of property 'params' are incompatible" Issue in NextJS 15]]></title><description><![CDATA[NextJS is a huge framework in the web development industry in 2025. Lots of people using it for their application. Be it hobbyists, professionals, etc. One thing is for sure, when we build a dynamic web app, we will almost always encountering the use...]]></description><link>https://blog.jfv.sh/fixing-the-types-of-property-params-are-incompatible-issue-in-nextjs-15</link><guid isPermaLink="true">https://blog.jfv.sh/fixing-the-types-of-property-params-are-incompatible-issue-in-nextjs-15</guid><category><![CDATA[Next.js]]></category><category><![CDATA[Next.js 15]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Justforvan]]></dc:creator><pubDate>Fri, 08 Aug 2025 12:01:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754655029330/809d7fe8-f864-4417-b4bc-61b6accd02d6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>NextJS is a huge framework in the web development industry in 2025. Lots of people using it for their application. Be it hobbyists, professionals, etc. One thing is for sure, when we build a dynamic web app, we will almost always encountering the use of <code>params</code>.</p>
<p>The move from previous versions to Next 15 brings some unique challenges, especially when dealing with <code>params</code>. As the saying goes, “Every change breaks someone’s workflow”. And today, that was exactly what happened to me 😂. Hence, I want to document it as a blog post for further reference for anyone who need it (might as well be future me imo).</p>
<h1 id="heading-tldr">TL;DR</h1>
<pre><code class="lang-typescript"><span class="hljs-keyword">type</span> Params = <span class="hljs-built_in">Promise</span>&lt;{ slug: <span class="hljs-built_in">string</span> }&gt;;
</code></pre>
<h1 id="heading-the-problem">The problem</h1>
<p>Let’s say we develop a dynamic web app. Dynamic in here means we populate the app with dynamic data streams from the server (database, API, or such). As for me, I was in the middle of making two pages: <code>blog</code> and <code>blog/[id]</code>. You might have guessed that <code>blog/[slug]</code> needs the <code>slug</code> as a parameter to fetch the data from the API. My file is something like this:</p>
<p><code>blog/[slug]</code> page:</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// <span class="hljs-doctag">NOTE:</span> I only put in the conflicting lines.</span>
...
<span class="hljs-keyword">const</span> PostPage = <span class="hljs-keyword">async</span> ({ params }: { params: { slug: <span class="hljs-built_in">string</span> } }) =&gt; {
  <span class="hljs-keyword">const</span> post = <span class="hljs-keyword">await</span> getPostBySlug(params.slug);

  <span class="hljs-keyword">if</span> (!post) {
    <span class="hljs-keyword">return</span> &lt;div&gt;Post not found&lt;/div&gt;;
  }

  <span class="hljs-keyword">return</span> (
    &lt;&gt;
      &lt;Layout&gt;
        &lt;div className=<span class="hljs-string">"container mx-auto px-4 max-w-3xl"</span>&gt;
...
</code></pre>
<p>and <strong>while this does work locally</strong>, it went full alarm once I pushed it to Vercel. The error was</p>
<pre><code class="lang-javascript">Failed to compile.
app/blog/[slug]/page.tsx
Type error: Type <span class="hljs-string">'{ params: { slug: string; }; }'</span> does not satisfy the constraint <span class="hljs-string">'PageProps'</span>.
  Types <span class="hljs-keyword">of</span> property <span class="hljs-string">'params'</span> are incompatible.
    Type <span class="hljs-string">'{ slug: string; }'</span> is missing the following properties <span class="hljs-keyword">from</span> type <span class="hljs-string">'Promise&lt;any&gt;'</span>: then, <span class="hljs-keyword">catch</span>, <span class="hljs-keyword">finally</span>, [<span class="hljs-built_in">Symbol</span>.toStringTag]
</code></pre>
<h1 id="heading-first-trial">First trial</h1>
<p>After reading the error, I then trying to do something like this</p>
<pre><code class="lang-typescript"><span class="hljs-comment">// <span class="hljs-doctag">NOTE:</span> I only put in the conflicting lines.</span>
...
<span class="hljs-keyword">type</span> PageProps = {
  params: {
    slug: <span class="hljs-built_in">string</span>;
  };
};

<span class="hljs-keyword">const</span> PostPage = <span class="hljs-keyword">async</span> ({ params }: PageProps) =&gt; {
  <span class="hljs-keyword">const</span> post = <span class="hljs-keyword">await</span> getPostBySlug(params.slug);

 <span class="hljs-keyword">if</span> (!post) {
    <span class="hljs-keyword">return</span> &lt;div&gt;Post not found&lt;/div&gt;;
  }

  <span class="hljs-keyword">return</span> (
    &lt;&gt;
      &lt;Layout&gt;
        &lt;div className=<span class="hljs-string">"container mx-auto px-4 max-w-3xl"</span>&gt;
...
</code></pre>
<p>as you can see, I now throw in <code>PageProps</code> as a type. Once again, everything works well in dev/local but then scream when pushed to Vercel. The dreaded error was still there.</p>
<h1 id="heading-the-solution">The solution</h1>
<p>Desperate times called for a Google search. With quick searches I then found this post <a target="_blank" href="https://github.com/vercel/next.js/discussions/71997">https://github.com/vercel/next.js/discussions/71997</a><br />and within that post was this guy’s brilliant idea (shout out to ignatiosdev):</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754653984831/518ff05a-3eb4-415c-a9c1-2925312cd2f2.png" alt class="image--center mx-auto" /></p>
<p>Intrigued by his idea, I then try this</p>
<pre><code class="lang-typescript">...
<span class="hljs-keyword">type</span> Params = <span class="hljs-built_in">Promise</span>&lt;{ slug: <span class="hljs-built_in">string</span> }&gt;;

<span class="hljs-keyword">const</span> PostPage = <span class="hljs-keyword">async</span> ({ params }: { params: Params }) =&gt; {
  <span class="hljs-keyword">const</span> { slug } = <span class="hljs-keyword">await</span> params;
  <span class="hljs-keyword">const</span> post = <span class="hljs-keyword">await</span> getPostBySlug(slug);

  <span class="hljs-keyword">if</span> (!post) {
    <span class="hljs-keyword">return</span> &lt;div&gt;Post not found&lt;/div&gt;;
  }

  <span class="hljs-keyword">return</span> (
    &lt;&gt;
      &lt;Layout&gt;
        &lt;div className=<span class="hljs-string">"container mx-auto px-4 max-w-3xl"</span>&gt;
...
</code></pre>
<p>aaand it works!<br />Now it works both in local and production env and nothing was broken no more. All needed to be done was adding <code>type Params = Promise&lt;{ slug: string }&gt;;</code> before calling the params as an argument to the async function.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>Initiate Params as a type Promise and only then you can call it to the async function. For further reference, I do suggest reading the NextJS documentation. But for now, that did the job for me so I will leave it there.</p>
<p>Hope this helps!<br />Let's have further discussion in the comment and bye for now 👋👋</p>
]]></content:encoded></item><item><title><![CDATA[Simple fix to {Schema validation failed with the following errors: Data path "" must have required property 'browserTarget'} in Angular 17]]></title><description><![CDATA[Today I went to try Angular 17 with Material Angular and Tailwind. Nothing fancy. However I then got this error on my console when I'm trying to do ng serve:
Schema validation failed with the following errors: Data path "" must have required property...]]></description><link>https://blog.jfv.sh/simple-fix-to-schema-validation-failed-with-the-following-errors-data-path-must-have-required-property-browsertarget-in-angular-17</link><guid isPermaLink="true">https://blog.jfv.sh/simple-fix-to-schema-validation-failed-with-the-following-errors-data-path-must-have-required-property-browsertarget-in-angular-17</guid><category><![CDATA[Angular]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Bugs and Errors]]></category><dc:creator><![CDATA[Justforvan]]></dc:creator><pubDate>Mon, 25 Mar 2024 06:03:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1711377669971/3f65202d-e8ea-4781-a27b-4c6fdc2c1a4d.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today I went to try Angular 17 with Material Angular and Tailwind. Nothing fancy. However I then got this error on my console when I'm trying to do <code>ng serve</code>:</p>
<p><code>Schema validation failed with the following errors: Data path "" must have required property 'browserTarget'</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1711345554449/c4ea9b8f-7d52-47db-9fbf-231fda60da7a.png" alt class="image--center mx-auto" /></p>
<p>Naturally, I was confused and questioning where I went wrong 😵. These are what I did on the terminal before getting the error:</p>
<pre><code class="lang-bash">PS E:\Code&gt; ng new atmedsphere
PS E:\Code&gt; <span class="hljs-built_in">cd</span> atmedsphere 
PS E:\Code\atmedsphere&gt; ng add @angular/material
PS E:\Code\atmedsphere&gt; npm install -D tailwindcss postcss autoprefixer; npx tailwindcss init
PS E:\Code\atmedsphere&gt; npm audit
PS E:\Code\atmedsphere&gt; npm audit fix --force
PS E:\Code\atmedsphere&gt; ng serve
</code></pre>
<p>Pretty standard isn't it? I don't think I got anything wrong so then I look it up on <a target="_blank" href="https://stackoverflow.com/questions/52398449/error-schema-validation-failed-with-the-following-errors-data-path-should-n">Stackoverflow</a> and <a target="_blank" href="https://github.com/angular/angular-cli/issues/11479">GitHub issues</a>. One term that got my attention was "Significantly older". It seems like there's a package in the package.json file that is significantly older compared to the Angular version in use.</p>
<p>I also try to look up the solution brought by @pinarella:</p>
<blockquote>
<p>my app is on angular 7.2.3</p>
<p>remove "es5BrowserSupport": true from angular.json. and npm start now works.</p>
</blockquote>
<p>However I was unable to find es5BrowserSupport in my Angular.json or package.json file.</p>
<p>So I started looking around a bit and was making a unique finding. Inside my package.json file, a dependency named <code>"@angular-devkit/build-angular"</code> that is <em>suspiciously</em> older than my Angular version (Angular 17).</p>
<pre><code class="lang-json"><span class="hljs-string">"@angular-devkit/build-angular"</span>: <span class="hljs-string">"^15.0.5"</span>
</code></pre>
<p>full <code>package.json</code> file:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"atmedsphere"</span>,
  <span class="hljs-attr">"version"</span>: <span class="hljs-string">"0.0.0"</span>,
  <span class="hljs-attr">"scripts"</span>: {
    <span class="hljs-attr">"ng"</span>: <span class="hljs-string">"ng"</span>,
    <span class="hljs-attr">"start"</span>: <span class="hljs-string">"ng serve"</span>,
    <span class="hljs-attr">"build"</span>: <span class="hljs-string">"ng build"</span>,
    <span class="hljs-attr">"watch"</span>: <span class="hljs-string">"ng build --watch --configuration development"</span>,
    <span class="hljs-attr">"test"</span>: <span class="hljs-string">"ng test"</span>,
    <span class="hljs-attr">"serve:ssr:atmedsphere"</span>: <span class="hljs-string">"node dist/atmedsphere/server/server.mjs"</span>
  },
  <span class="hljs-attr">"private"</span>: <span class="hljs-literal">true</span>,
  <span class="hljs-attr">"dependencies"</span>: {
    <span class="hljs-attr">"@angular/animations"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/cdk"</span>: <span class="hljs-string">"^17.3.1"</span>,
    <span class="hljs-attr">"@angular/common"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/compiler"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/core"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/forms"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/material"</span>: <span class="hljs-string">"^17.3.1"</span>,
    <span class="hljs-attr">"@angular/platform-browser"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/platform-browser-dynamic"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/platform-server"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/router"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/ssr"</span>: <span class="hljs-string">"^17.3.1"</span>,
    <span class="hljs-attr">"express"</span>: <span class="hljs-string">"^4.18.2"</span>,
    <span class="hljs-attr">"rxjs"</span>: <span class="hljs-string">"~7.8.0"</span>,
    <span class="hljs-attr">"tslib"</span>: <span class="hljs-string">"^2.3.0"</span>,
    <span class="hljs-attr">"zone.js"</span>: <span class="hljs-string">"~0.14.3"</span>
  },
  <span class="hljs-attr">"devDependencies"</span>: {
    <span class="hljs-attr">"@angular-devkit/build-angular"</span>: <span class="hljs-string">"^15.0.5"</span>,
    <span class="hljs-attr">"@angular/cli"</span>: <span class="hljs-string">"^17.3.1"</span>,
    <span class="hljs-attr">"@angular/compiler-cli"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@types/express"</span>: <span class="hljs-string">"^4.17.17"</span>,
    <span class="hljs-attr">"@types/jasmine"</span>: <span class="hljs-string">"~5.1.0"</span>,
    <span class="hljs-attr">"@types/node"</span>: <span class="hljs-string">"^18.18.0"</span>,
    <span class="hljs-attr">"autoprefixer"</span>: <span class="hljs-string">"^10.4.19"</span>,
    <span class="hljs-attr">"jasmine-core"</span>: <span class="hljs-string">"~5.1.0"</span>,
    <span class="hljs-attr">"karma"</span>: <span class="hljs-string">"~6.4.0"</span>,
    <span class="hljs-attr">"karma-chrome-launcher"</span>: <span class="hljs-string">"~3.2.0"</span>,
    <span class="hljs-attr">"karma-coverage"</span>: <span class="hljs-string">"~2.2.0"</span>,
    <span class="hljs-attr">"karma-jasmine"</span>: <span class="hljs-string">"~5.1.0"</span>,
    <span class="hljs-attr">"karma-jasmine-html-reporter"</span>: <span class="hljs-string">"~2.1.0"</span>,
    <span class="hljs-attr">"postcss"</span>: <span class="hljs-string">"^8.4.38"</span>,
    <span class="hljs-attr">"tailwindcss"</span>: <span class="hljs-string">"^3.4.1"</span>,
    <span class="hljs-attr">"typescript"</span>: <span class="hljs-string">"~5.4.2"</span>
  }
}
</code></pre>
<p>Instinctively, I decided to try replacing it with the current Angular version number I was on as so:</p>
<pre><code class="lang-json"><span class="hljs-string">"@angular-devkit/build-angular"</span>: <span class="hljs-string">"^17.0.5"</span>
</code></pre>
<p>Hence the full <code>package.json</code> file:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"atmedsphere"</span>,
  <span class="hljs-attr">"version"</span>: <span class="hljs-string">"0.0.0"</span>,
  <span class="hljs-attr">"scripts"</span>: {
    <span class="hljs-attr">"ng"</span>: <span class="hljs-string">"ng"</span>,
    <span class="hljs-attr">"start"</span>: <span class="hljs-string">"ng serve"</span>,
    <span class="hljs-attr">"build"</span>: <span class="hljs-string">"ng build"</span>,
    <span class="hljs-attr">"watch"</span>: <span class="hljs-string">"ng build --watch --configuration development"</span>,
    <span class="hljs-attr">"test"</span>: <span class="hljs-string">"ng test"</span>,
    <span class="hljs-attr">"serve:ssr:atmedsphere"</span>: <span class="hljs-string">"node dist/atmedsphere/server/server.mjs"</span>
  },
  <span class="hljs-attr">"private"</span>: <span class="hljs-literal">true</span>,
  <span class="hljs-attr">"dependencies"</span>: {
    <span class="hljs-attr">"@angular/animations"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/cdk"</span>: <span class="hljs-string">"^17.3.1"</span>,
    <span class="hljs-attr">"@angular/common"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/compiler"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/core"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/forms"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/material"</span>: <span class="hljs-string">"^17.3.1"</span>,
    <span class="hljs-attr">"@angular/platform-browser"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/platform-browser-dynamic"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/platform-server"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/router"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@angular/ssr"</span>: <span class="hljs-string">"^17.3.1"</span>,
    <span class="hljs-attr">"express"</span>: <span class="hljs-string">"^4.18.2"</span>,
    <span class="hljs-attr">"rxjs"</span>: <span class="hljs-string">"~7.8.0"</span>,
    <span class="hljs-attr">"tslib"</span>: <span class="hljs-string">"^2.3.0"</span>,
    <span class="hljs-attr">"zone.js"</span>: <span class="hljs-string">"~0.14.3"</span>
  },
  <span class="hljs-attr">"devDependencies"</span>: {
    <span class="hljs-attr">"@angular-devkit/build-angular"</span>: <span class="hljs-string">"^17.0.5"</span>,
    <span class="hljs-attr">"@angular/cli"</span>: <span class="hljs-string">"^17.3.1"</span>,
    <span class="hljs-attr">"@angular/compiler-cli"</span>: <span class="hljs-string">"^17.3.0"</span>,
    <span class="hljs-attr">"@types/express"</span>: <span class="hljs-string">"^4.17.17"</span>,
    <span class="hljs-attr">"@types/jasmine"</span>: <span class="hljs-string">"~5.1.0"</span>,
    <span class="hljs-attr">"@types/node"</span>: <span class="hljs-string">"^18.18.0"</span>,
    <span class="hljs-attr">"autoprefixer"</span>: <span class="hljs-string">"^10.4.19"</span>,
    <span class="hljs-attr">"jasmine-core"</span>: <span class="hljs-string">"~5.1.0"</span>,
    <span class="hljs-attr">"karma"</span>: <span class="hljs-string">"~6.4.0"</span>,
    <span class="hljs-attr">"karma-chrome-launcher"</span>: <span class="hljs-string">"~3.2.0"</span>,
    <span class="hljs-attr">"karma-coverage"</span>: <span class="hljs-string">"~2.2.0"</span>,
    <span class="hljs-attr">"karma-jasmine"</span>: <span class="hljs-string">"~5.1.0"</span>,
    <span class="hljs-attr">"karma-jasmine-html-reporter"</span>: <span class="hljs-string">"~2.1.0"</span>,
    <span class="hljs-attr">"postcss"</span>: <span class="hljs-string">"^8.4.38"</span>,
    <span class="hljs-attr">"tailwindcss"</span>: <span class="hljs-string">"^3.4.1"</span>,
    <span class="hljs-attr">"typescript"</span>: <span class="hljs-string">"~5.4.2"</span>
  }
}
</code></pre>
<p>And then I run <code>npm update</code> in the terminal. Honestly, it was not clear wether I should have been using <code>npm update</code> or <code>ng update</code>. So I went <code>npm update</code> anyway since I think the change I made is in <code>package.json</code> file that is accessed by npm.</p>
<p>The update went smooth and I was then able to do <code>ng serve</code> without any further issue. So yeah, if you are experiencing the same issue, try</p>
<pre><code class="lang-json"><span class="hljs-string">"@angular-devkit/build-angular"</span>: <span class="hljs-string">"^17.0.5"</span>
</code></pre>
<p>in your <code>package.json</code> file.</p>
<p>Hope this helps!<br />Let's have further discussion in the comment and bye for now 👋👋</p>
]]></content:encoded></item><item><title><![CDATA[Thought on the one kinda messed up Web Developer "roadmap"]]></title><description><![CDATA[Today I went on Instagram and saw an advertisement for some sort of programming course. The image was.. interesting, to say the least.So I took a screenshot 📷:

I censored the username and profile picture because I sincerely have no intention of mes...]]></description><link>https://blog.jfv.sh/thought-on-the-one-kinda-messed-up-web-developer-roadmap</link><guid isPermaLink="true">https://blog.jfv.sh/thought-on-the-one-kinda-messed-up-web-developer-roadmap</guid><category><![CDATA[Web Development]]></category><category><![CDATA[learning]]></category><category><![CDATA[Learning Journey]]></category><dc:creator><![CDATA[Justforvan]]></dc:creator><pubDate>Wed, 20 Mar 2024 07:34:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1711377744645/9a94c405-c6d3-4ffa-8ecb-676dd0b504b4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today I went on Instagram and saw an advertisement for some sort of programming course. The image was.. interesting, to say the least.<br />So I took a screenshot 📷:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710918471934/3d03f0f0-55d6-4b06-bad7-3b04949d3538.jpeg" alt class="image--center mx-auto" /></p>
<p>I censored the username and profile picture because I sincerely have no intention of messing other people's business ❌. I just genuinely want to talk about the Ads.</p>
<p>In the picture there are 12 well-known web-related terms being shown with the word "Week" written on top and a number following it. Presumably, it's what the student will learn on that respective week when taking the course. Let's call it "roadmap" for short.</p>
<p>Some things definitely stand out for me and honestly I disagree much with the roadmap. Here's some:</p>
<ol>
<li><h2 id="heading-learning-javascript-before-html-and-css">Learning Javascript before HTML and CSS</h2>
</li>
</ol>
<p>Start it off nice and easy. The roadmap planned to teach Javascript before HTML and CSS. Now of course this is not so bad. However, I kinda think the opposite is much better. Javascript is a great language to teach programming logic and functionality for beginners. However, without HTML and CSS, Javascript is pretty much a theoretical language. Sure you can <code>console.log()</code> your code to the terminal, but that's pretty much it, right?<br />Keep in mind we're talking beginners here since it's said to be done on Week 1.</p>
<p>Human loves to brag, that's just in our DNA. How you would brag your Javascript code to your pals when all it can do is showing things on the terminal?</p>
<p>Imagine if we're doing the opposite. In a span of a week, you can build a really simple landing page or whatever, and host it for free on those serverless services, and then show it to your friends! 😲<br />Add another week to that and you can build a BMI calculator with DOM modification with vanilla JS and CSS (no framework).</p>
<p>Don't forget to <a target="_blank" href="https://hashnode.com/post/cltvck342000809l49ge98ebm">block those known bots</a> when hosting your site so they don't waste your bandwith. ✨</p>
<ol start="2">
<li><h2 id="heading-learning-angular-at-week-5">Learning Angular at week 5</h2>
</li>
</ol>
<p>Okay now what the actual f is going on 😂. Diving right into Angular with basic JS, HTML, and CSS knowledge doesn't seem like a great idea...</p>
<p>I'm more inlined with studying React first instead of Angular. React is much more flexible and has a gentle-er learning curve. With React you can more quickly transcends from <em>learning</em> to <em>building</em>; a great way to maintain motivation!</p>
<p>Another great idea why learning Angular at week 5 is not so great is because you need Typescript to build with Angular which seems like won't be learned until week 10.</p>
<p>After you know Typescript, you can start building with Angular. Probably then <a target="_blank" href="https://hashnode.com/post/cltvck342000809l49ge98ebm">host your page on Cloudflare Pages for free</a>. Also, while we are talking Typescript...</p>
<ol start="3">
<li><h2 id="heading-learning-typescript-after-angular">Learning Typescript <em>after</em> Angular</h2>
</li>
</ol>
<p>This one is still in a direct connection with poin 2 above. Pretty much you will need Typescript to build with Angular so there's really no point learning it <em>after</em> you know Angular. 🤓</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>So yeah that pretty much some parts which I disagree with the Ads. What do you think?<br />I'm open for discussion so please let your voice be heard in the comment section. I'll be seeing you again. Bye now 👋</p>
]]></content:encoded></item><item><title><![CDATA[Questionable Traffic and How to Block with CloudFlare WAF]]></title><description><![CDATA[A bit of story 📖
Lately, my websites have been dealing with massive amount of requests. There are literally hundreds of thousands of request each month for about three consecutive months. Well, trafic's a good thing but pardon me for saying that tra...]]></description><link>https://blog.jfv.sh/questionable-traffic-and-how-to-block-with-cloudflare-waf</link><guid isPermaLink="true">https://blog.jfv.sh/questionable-traffic-and-how-to-block-with-cloudflare-waf</guid><category><![CDATA[cloudflare]]></category><category><![CDATA[bot]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Justforvan]]></dc:creator><pubDate>Mon, 18 Mar 2024 14:00:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710770818706/34c746c2-d7a9-428c-8f56-71b717578b3b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-a-bit-of-story">A bit of story 📖</h1>
<p>Lately, my websites have been dealing with massive amount of requests. There are literally hundreds of thousands of request each month for about three consecutive months. Well, trafic's a good thing but pardon me for saying that traffic seems.. "questionable", at best 🤔.</p>
<p>Fortunately for me, I host my sites on CloudFlare Pages with does not charge for network egress. It just my curiosity that causes me to dig deeper on this topic.</p>
<p>At first I thought it was DDOS until I see the analytics. The requests were different in location and also consistent for three months. Three months. Who in their right minds would DDOS my sites for three months in a row?? ⁉️<br />I mean it's fine if you want to attack like NASA or whatever, but come on now..</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710768967398/e39b3278-4bb0-4273-9743-488f725959c9.png" alt class="image--center mx-auto" /></p>
<p>It just so happens that I stumbled across this video by Matt KC that then I started thinking about it seriously:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/Hi5sd3WEh0c?feature=shared">https://youtu.be/Hi5sd3WEh0c?feature=shared</a></div>
<p> </p>
<p>So I dug a little deeper and found out how this "Bytespider" bots have been wrecking people's nerve on the internet. Just look at this post by @generosus on the Wordpress forum from 9 months ago: (link: <a target="_blank" href="https://wordpress.org/support/topic/psa-bytedance-and-bytespider-bots-recommend-blocking/">https://wordpress.org/support/topic/psa-bytedance-and-bytespider-bots-recommend-blocking/</a>)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769116471/134204a5-b5dc-4d26-97d2-67bf2958f809.png" alt class="image--center mx-auto" /></p>
<p>Or this one in the phpBB forum from 2020: (<a target="_blank" href="https://www.phpbb.com/community/viewtopic.php?t=2550501">https://www.phpbb.com/community/viewtopic.php?t=2550501</a>)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769151242/f7844d48-f817-4d33-b2c0-592e5779c319.png" alt class="image--center mx-auto" /></p>
<p>Well, I might be a bit late to the party since the anomaly has only occured to me lately. Nevertheless, here's how to block these bots with CloudFlare WAF in case you experiencing the same issue or just want to be careful.</p>
<hr />
<h1 id="heading-here-goes">Here goes 🛡️</h1>
<p>Well first of all of course you need a CloudFlare account and I will assume you already have one.</p>
<h1 id="heading-step-1-go-to-your-dashboard-and-click-on-your-site">Step 1: Go to your dashboard and click on your site</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769482279/d66aaf24-132b-43da-848e-62f9a92e4418.png" alt class="image--center mx-auto" /></p>
<p>For this tutorial I will go with <a target="_blank" href="https://justforvan.com/">justforvan.com</a>.</p>
<h2 id="heading-step-2-on-the-sidebar-go-to-security-then-waf">Step 2: On the sidebar, Go to "Security" then "WAF"</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769544077/c2165747-292e-4a40-9cc5-75b474069876.png" alt class="image--center mx-auto" /></p>
<p>Pretty straightforward I guess. Just click on "Security" first then choose "WAF".</p>
<h2 id="heading-step-3-click-create-rule">Step 3: Click "Create Rule"</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769636628/0f387c7b-3385-47ee-a46d-2fafd8917d41.png" alt class="image--center mx-auto" /></p>
<p>On the middle pane that uncover after you done step 2, click the blue button "Create rule".</p>
<h2 id="heading-step-4-fill-in-the-rule">Step 4: Fill in the rule</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769718607/a6f6519a-0173-4981-84f0-07ef59f65596.png" alt class="image--center mx-auto" /></p>
<p>Fill it like so:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Section</td><td>Content</td><td>Modifiable?</td></tr>
</thead>
<tbody>
<tr>
<td>Rule name</td><td><code>Byte bots</code></td><td>YES</td></tr>
<tr>
<td>Field</td><td><code>User Agent</code></td><td>NO</td></tr>
<tr>
<td>Operator</td><td><code>contains</code></td><td>NO</td></tr>
<tr>
<td>Value</td><td><code>Bytedance</code></td><td>NO</td></tr>
<tr>
<td>Choose action</td><td><code>Block</code></td><td>NO</td></tr>
</tbody>
</table>
</div><p>After that, press the OR button on the side:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769967543/ff64b4a7-cfff-433f-8d6c-bfbe29ba340a.png" alt class="image--center mx-auto" /></p>
<p>Then in the new row, fill it like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710770004453/b2810a6b-2bcc-471b-aafd-d57e602e383f.png" alt class="image--center mx-auto" /></p>
<p>So the entire page will be like:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710770042307/309e40c1-0c41-4aca-9ec7-5d58c708a8c4.png" alt class="image--center mx-auto" /></p>
<p>Or in tabular form:</p>
<p>Rule name</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Section</td><td>Content</td><td>Modifiable?</td></tr>
</thead>
<tbody>
<tr>
<td>Rule name</td><td><code>byte bots</code></td><td>YES</td></tr>
<tr>
<td>Field</td><td><code>User Agent</code></td><td>NO</td></tr>
<tr>
<td>Operator</td><td><code>contains</code></td><td>NO</td></tr>
<tr>
<td>Value 1</td><td><code>Bytedance</code></td><td>NO</td></tr>
<tr>
<td>Value 2</td><td><code>Bytespider</code></td><td>NO</td></tr>
<tr>
<td>Choose action</td><td><code>Block</code></td><td>NO</td></tr>
</tbody>
</table>
</div><h2 id="heading-step-5-deploying-the-rule">Step 5: Deploying the rule</h2>
<p>And yes finally just click the sweet blue button of Deploy ✅.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710770198979/b3c15722-d4cf-44e1-8ba8-63ddc102e005.png" alt class="image--center mx-auto" /></p>
<hr />
<h1 id="heading-closing-ceremony">Closing ceremony</h1>
<p>And yes that's how you do it. Pretty straightforward I suppose. Goes pretty well when you serve your site through Cloudflare, like your <a target="_blank" href="https://blog.justforvan.com/publishing-angular-web-app-on-cloudflare-pages">Angular site that is deployed on Pages</a>.</p>
<p>Hope this helps and I will be seeing you next time! 😁👋</p>
<hr />
<h1 id="heading-special-mentions">Special mentions</h1>
<p>Big thanks for the amazing people behind these posts:</p>
<p><a target="_blank" href="https://community.cloudflare.com/t/blocking-user-agents/523190">https://community.cloudflare.com/t/blocking-user-agents/523190</a></p>
<p><a target="_blank" href="https://stackoverflow.com/questions/57908900/what-is-the-bytespider-user-agent">https://stackoverflow.com/questions/57908900/what-is-the-bytespider-user-agent</a></p>
<p><a target="_blank" href="https://wordpress.org/support/topic/psa-bytedance-and-bytespider-bots-recommend-blocking/">https://wordpress.org/support/topic/psa-bytedance-and-bytespider-bots-recommend-blocking/</a></p>
<p><a target="_blank" href="https://www.phpbb.com/community/viewtopic.php?t=2550501">https://www.phpbb.com/community/viewtopic.php?t=2550501</a></p>
<p><a target="_blank" href="https://www.johnlarge.co.uk/blocking-aggressive-chinese-crawlers-scrapers-bots/#comment-11823">https://www.johnlarge.co.uk/blocking-aggressive-chinese-crawlers-scrapers-bots/#comment-11823</a></p>
]]></content:encoded></item><item><title><![CDATA[Publishing Angular Web App on Cloudflare Pages 2024]]></title><description><![CDATA[I recently got into the hassle of trying to publish my Angular web app into Pages. None of the tutorial on the web helped me so I decided to come up with a simple twist. If you recently experienced the same thing, this is what finally works for me so...]]></description><link>https://blog.jfv.sh/publishing-angular-web-app-on-cloudflare-pages</link><guid isPermaLink="true">https://blog.jfv.sh/publishing-angular-web-app-on-cloudflare-pages</guid><category><![CDATA[Angular]]></category><category><![CDATA[cloudflare-pages]]></category><category><![CDATA[cloudflare-worker]]></category><category><![CDATA[cloudflare]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Justforvan]]></dc:creator><pubDate>Sun, 17 Mar 2024 10:01:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710770752866/a869123f-31d7-4ee6-a0d4-a5d2f4c47e16.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I recently got into the hassle of trying to publish my Angular web app into Pages. None of the tutorial on the web helped me so I decided to come up with a simple twist. If you recently experienced the same thing, this is what finally works for me so it might help.</p>
<h1 id="heading-on-the-ide">On the IDE 💻</h1>
<p>Try to run</p>
<pre><code class="lang-plaintext">npx ng build --c production
</code></pre>
<p>This is to check whether the build can run locally on your system. The idea being if it can't run locally, then it will most probably won't run on the cloud.</p>
<p>The <code>--c production</code> flag is there to indicate that it is a production setting that should be run by the <code>ng build</code>. You can also run <code>--configuration production</code> if you want the long version (<code>--c</code> is a shortened version of <code>--configuration</code>). <code>Npx</code> is there because I use Node. Refer to <a target="_blank" href="https://stackoverflow.com/questions/73156911/ng-build-prod-error-unknown-argument-prod">this discussion</a> on Stackoverflow to learn more.</p>
<p><strong>P.s.</strong> Do not run <code>ng build --prod</code> as it has been deprecated. ‼️</p>
<h2 id="heading-if-youre-using-node">If you're using Node</h2>
<p>Run <code>node -v</code></p>
<pre><code class="lang-plaintext">PS A:\Code\&gt; Node -v
v20.11.1
</code></pre>
<p>Note whatever number showed up. For me, it is <code>20.11.1</code>. This indicates your Node version.</p>
<h2 id="heading-if-you-are-using-anything-else">If you are using anything else..</h2>
<p>Just try to find your environtment version.</p>
<hr />
<h1 id="heading-on-cloudflare-pages">On Cloudflare Pages 🛜</h1>
<p>Use this configuration:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710691043114/26731395-4f1d-4a03-8a00-4f6d08a6b294.png" alt class="image--center mx-auto" /></p>
<p>Details:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Settings</strong></td><td>Value</td><td>Changeable?</td></tr>
</thead>
<tbody>
<tr>
<td>Project name</td><td><code>X</code></td><td><strong>YES</strong> (Note the value because the exact same value needs to go into the Build output directory after <code>/dist</code>)</td></tr>
<tr>
<td>Production branch</td><td><code>main</code> or <code>master</code></td><td><strong>YES</strong> (according to the branch you push your code, usually <code>main</code> or <code>master</code>)</td></tr>
<tr>
<td>Framework preset</td><td><code>Angular (Angular CLI)</code></td><td><strong>NO</strong></td></tr>
<tr>
<td>Build command</td><td><code>npm run build</code></td><td><strong>PROBABLY</strong> (if you use Yarn or something, haven't tried)</td></tr>
<tr>
<td>Build output directory</td><td><code>dist/X/browser</code></td><td><strong>YES</strong> (according to your project name) <strong>and NO</strong> (keep the <code>/browser</code> behind it)</td></tr>
</tbody>
</table>
</div><p><strong>P.s.</strong> Do not use npx <code>ng build --c production --watch</code>. Your deployment does not need to wait for a code changes (<code>--watch</code>) as Pages will take care of that and rebuild after every commit to your repo. ‼️</p>
<p>After that, open the <strong>Environment variables (advanced)</strong> and <strong>Add new variable</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710669297373/94659119-2568-46a7-a966-362ab8bd3b86.png" alt class="image--center mx-auto" /></p>
<p>Variable name: NODE_VERSION (or change like YARN VERSION)<br />Value: Depends on the number shown on your environtment <code>node -v</code>.</p>
<p>Finally, click <strong>SAVE AND DEPLOY.</strong></p>
<p>You should be good to go. For a simple, one page app, it should be deployed between 1-2 minutes. If anything goes longer than that, you might have a problem. That's the steps which have been succesful for me. I hope this helps! 😁</p>
]]></content:encoded></item><item><title><![CDATA[[SOLVED] Microsoft Editor missing in Microsoft 365]]></title><description><![CDATA[Microsoft 365 brings a whole bunch of exciting features. They range from collaboration tools like Sharepoint, to designing like the Powerpoint's Design Ideas. One thing does stands out for me is the Microsoft Editor.
Microsoft Editor (will be reffere...]]></description><link>https://blog.jfv.sh/solved-microsoft-editor-missing-in-microsoft-365</link><guid isPermaLink="true">https://blog.jfv.sh/solved-microsoft-editor-missing-in-microsoft-365</guid><category><![CDATA[Microsoft365]]></category><dc:creator><![CDATA[Justforvan]]></dc:creator><pubDate>Sat, 16 Mar 2024 03:27:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710770888555/1e352acf-9852-4a02-8b29-4322a76c60e4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Microsoft 365 brings a whole bunch of exciting features. They range from collaboration tools like Sharepoint, to designing like the Powerpoint's Design Ideas. One thing does stands out for me is the Microsoft Editor.</p>
<p>Microsoft Editor (will be reffered to as "Editor") is, according to Wikipedia, "closed source AI-powered intelligent writing assistant available for Word, Outlook, and as a Chromium browser extension part of Office 365. It includes the essentials in a writing assistant, such as a grammar and spell checker." (<a target="_blank" href="https://www.blogger.com/u/2/#">source</a>)<br />It's kind of Microsoft's answer for Grammarly, a software that does more or less the same.</p>
<p>Even after I thought my struggle has come to an end after seeing all Office apps have been installed, I found that I was wrong. I didn't see the Editor icon on the Home ribbon. I search back and forth, try updating the app as well, but none seems to work. Until ...</p>
<h2 id="heading-1-update-your-office-apps">1. Update your Office apps 💡</h2>
<p>Admittedly, this step is so arguable since there is no evidence it helps solving the case 😀.<br />But, since I did it before my Editor appear, I'm going to add this step here. It's up to you whether you want to go on or update your apps first. I do recommend updating your apps on regular basis, though.  😉😉</p>
<hr />
<h2 id="heading-2-open-microsoft-edge">2. Open Microsoft Edge 💡</h2>
<p>In case you don't know what Edge is, it's a built-in browser for Windows 10. Being built-in, you can do this step without installing anything beforehand. Just click the icon (it's a blue round-shape icon, shaped like the letter "E").</p>
<hr />
<h2 id="heading-3-install-the-editor-extension">3. Install the Editor extension 💡</h2>
<p>Okay, telling the truth, I don't know why you have to install this extension of your browser (even if you're not using Edge as your browser after all) to work on the Office apps 😕😕.<br />But it is what it is.</p>
<p>Click this link: <a target="_blank" href="https://www.blogger.com/u/2/#">https://microsoftedge.microsoft.com/addons/detail/microsoft-editor-spellin/hokifickgkhplphjiodbggjmoafhignh</a> (this is an official link from Microsoft. Don't worry)</p>
<p>And click on the "Get" button. It will install the extension.</p>
<p><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAAbBQrIEaLozWrEHE-Lpt2SHZiG568BSsJBqJ5A_U9fCM5huRMBmKolY8w-0-GHPgbxBi8uL6ItTzeuaR-qFO47vTiGIMjkO2Ot5r8t34bKlxzvK1VmV6tpFNhloPk_a-0HUHE2uYYd8n/w586-h329/Editor+tutorial1.png" alt /></p>
<p>You then have to sign in to fully enable the extension.</p>
<p>After that? Close and try to reopen your Office app, preferably Word. You should see the icon on the right Home ribbon.</p>
]]></content:encoded></item></channel></rss>