<?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[sozonome | hashnode]]></title><description><![CDATA[sozonome's publishing in hashnode]]></description><link>https://hashnode.sznm.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 08:30:30 GMT</lastBuildDate><atom:link href="https://hashnode.sznm.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How to Secure Your Firebase Project]]></title><description><![CDATA[originally posted here

disclaimer: This is not by any means to be the best practice guide of using firebase in every project. Every project has its own needs and specifications. This guide may not be suitable with your needs.

Do you develop apps us...]]></description><link>https://hashnode.sznm.dev/how-to-secure-your-firebase-project</link><guid isPermaLink="true">https://hashnode.sznm.dev/how-to-secure-your-firebase-project</guid><dc:creator><![CDATA[Agustinus Nathaniel]]></dc:creator><pubDate>Thu, 13 May 2021 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p><a target="_blank" href="https://sznm.dev/blog/how-to-secure-firebase-project">originally posted here</a></p>
<blockquote>
<p>disclaimer: This is not by any means to be the best practice guide of using firebase in every project. Every project has its own needs and specifications. This guide may not be suitable with your needs.</p>
</blockquote>
<p>Do you develop apps using Firebase? If so, we should know that our firebase configs will be exposed to the client (especially for web clients). Then what's the deal? Many possibilities can be happened and prevented. So many articles already covers on how to secure our firebase project by using security rules, authentication check, etc. I usually define my security rules using a package named <a target="_blank" href="https://www.npmjs.com/package/@jahed/firebase-rules"><code>@jahed/firebase-rules</code></a>. But how about preventing someone from making their own client and use our exposed firebase configs to do some shady stuffs towards our realtime database?</p>
<h2 id="heading-apply-restrictions-to-the-api-key">Apply Restrictions to the API Key</h2>
<p>Every firebase project is a GCP (Google Cloud Platform) project, so we can go to Google Cloud console to configure further our firebase project. We can restrict the API key even though it is exposed. Just follow these steps:</p>
<ol>
<li>Go to <a target="_blank" href="https://console.cloud.google.com/apis">https://console.cloud.google.com/apis</a>, <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893693880/dxmJE2oNP.png" alt="Credentials Tab" /></li>
<li>Select the desired firebase project,</li>
<li>Go to <code>Credentials</code> menu,</li>
<li>Look for <code>API Keys</code> section, select the API key which has <code>...(auto created by Firebase)</code>, <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893695377/L0JdTgUz19.png" alt="API Key Restrictions Tab" /></li>
<li>You will be directed to a page called <code>Restrict and rename API key</code>, go to <code>Application restrictions</code> section, select <code>HTTP referrers (web sites)</code>, add your production web client domain in <code>Website restrictions</code> section. Don't add <code>localhost</code> if you intend to use the firebase project for production.</li>
<li>Hit the <code>save</code> button apply changes.</li>
</ol>
<p>Voila! Your API key already restricted!</p>
<h2 id="heading-use-different-firebase-project-for-local-development">Use Different Firebase Project for Local Development</h2>
<p>Now that we already apply restrictions to our API key, how about our local development (<code>localhost</code>)? Well, we can just create a new firebase project which will be used for your local development.</p>
<h3 id="heading-special-case-develop-hybrid-mobile-app-using-ionic">Special Case: Develop Hybrid Mobile App Using Ionic</h3>
<p>When developing hybrid app using ionic, chances are we gonna use the same firebase configs for Web and Android / iOS build (firebase web configs). Even though we made several firebase web configs, the API key will remain the same. If we apply restrictions to the API key to be only accessible for certain domain, then the API key won't be usable for the mobile build. Fortunately, there is a workaround for this. We can just create a new API key which don't have any domain restrictions just for our mobile build (the API key can't be easily accessed by the user anyway for Android / iOS build). So, we can use the same firebase configs for our web and mobile builds, but having different API key. Just go to https://console.cloud.google.com/apis/credentials (make sure you already select the corresponding project first), then just create a new API key which will be used for your mobile apps.</p>
<h3 id="heading-references">References</h3>
<ul>
<li>Defining Firebase security rules<ul>
<li><a target="_blank" href="https://www.npmjs.com/package/@jahed/firebase-rules">https://www.npmjs.com/package/@jahed/firebase-rules</a></li>
</ul>
</li>
<li>Restrict API key<ul>
<li><a target="_blank" href="https://medium.com/@devesu/how-to-secure-your-firebase-project-even-when-your-api-key-is-publicly-available-a462a2a58843">https://medium.com/@devesu/how-to-secure-your-firebase-project-even-when-your-api-key-is-publicly-available-a462a2a58843</a></li>
</ul>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[2020 Recap]]></title><description><![CDATA[originally posted here
I think most would say 2020 is a roller coaster year. Even though, 2020 is one of a hella ride and worth for me to be remembered. I've made a quick recap in 2019 before. So let's review what I've been up to in 2020.
What I Lear...]]></description><link>https://hashnode.sznm.dev/2020-recap</link><guid isPermaLink="true">https://hashnode.sznm.dev/2020-recap</guid><dc:creator><![CDATA[Agustinus Nathaniel]]></dc:creator><pubDate>Thu, 31 Dec 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p><a target="_blank" href="https://sznm.dev/blog/2020-recap">originally posted here</a></p>
<p>I think most would say 2020 is a roller coaster year. Even though, 2020 is one of a hella ride and worth for me to be remembered. I've made a quick recap in <strong><a target="_blank" href="https://sznm.dev/blog/2019-12-31-2019-recap">2019</a></strong> before. So let's review what I've been up to in 2020.</p>
<h2 id="heading-what-i-learned-and-discovered-throughout-the-year">What I Learned and Discovered Throughout the Year</h2>
<h3 id="heading-instagram-filter-creation">Instagram Filter Creation</h3>
<p>I love to edit photos and playing around with colors. Then I learn how to make my own Instagram filter. Turned out facebook provides a tool dedicated for that called Spark AR Studio. You can make literally almost anything starting from a color filter, games, quizzes, anything you can think of when playing around with AR. I just want to edit colors so I just go with color filter. Making a color filter is quite simple, you only have to create a LUT, import it to your Spark AR projects as a layer, export it, and upload it to Spark AR and connect it with your instagram account. Check out some filter I made <a target="_blank" href="https://www.instagram.com/agustinusnathaniel/">here</a>.</p>
<h3 id="heading-react-hooks-and-context">React Hooks and Context</h3>
<p>React hooks been around but I've never learn or use it until I finally get my hands on it when building  an app as part of my undergraduate thesis. I used to stick with Classful Components and use redux (just in desperate moments), but learning hooks and context helps me to switch fully to Functional Components.</p>
<h3 id="heading-tailwindcss">TailwindCSS</h3>
<p>2019 was a year where I finally get my hands on React and started to re-learn GatsbyJS (I tried to learn Gatsby before touching React at 2018 and it was a disaster idea). It was a really fun journey. But there's something I've been wanting to try but never accomplished at 2019....TailwindCSS. So, at 2020 I finally get my hands on it and it was really different than other styling frameworks I've ever used before (Bootstrap, Bulma, SemanticUI). I use it to rebuild my first personal site (agustinusnathaniel.com). But around the end of 2020 I re-write it again using Chakra-UI.</p>
<h3 id="heading-svelte">Svelte</h3>
<p>I heard svelte often but never tried it until I stumble upon Rich Harris's video when he explain about reactivity. His explanation is really great and quite eye-opening for me who mainly develop using React. So I tried it, made some little projects with it and I like how straightforward it is. I'd recommend using svelte if you are looking for a powerful javascript libraries like react or vue (framework) but with an easier learning curve. I'd love to see Svelte's development over the next years. But not long after that I also got my hands on Next.js.</p>
<h3 id="heading-nextjs">Next.js</h3>
<p>I learn Next.js and implement it in some of my projects. I used to avoid learning and using Next.js because I haven't understand SSR properly yet. I thought Next.js is only used for SSR projects. Then I found out Next.js support both static site generation and server side rendering since version 9.3 and I got my hands on it for the first time not so long after version 9.4 released. Since then, Next.js has been my go-to react framework for most of my projects.</p>
<h3 id="heading-chakra-ui">Chakra UI</h3>
<p>I tried several design system or component libraries this year: Fluent UI, Carbon, Material UI, and Chakra UI. After trying out and play around with those design systems, I found out Chakra UI suits my needs the best. It's easy to be configured, easy to use, and it has color mode styling and management built in. After some time, I made a template with Next.js, Chakra UI, and TypeScript pre-configured and has been my go-to template to initiate most of my recent projects.</p>
<h2 id="heading-projects-i-worked-on-in-2020">Projects I Worked on in 2020</h2>
<p>most of the projects are just a little side projects for me to try implement some simple ideas or learning something.</p>
<h3 id="heading-1-personal-site-revamp">1. Personal Site Revamp</h3>
<p>I re-write my personal site <a target="_blank" href="https://agustinusnathaniel.com">agustinusnathaniel.com</a> using TailwindCSS and add blog section. At the end of the year I replace the TailwindCSS usage with Chakra UI.</p>
<h3 id="heading-2-le-cook">2. Le-Cook</h3>
<p>An <a target="_blank" href="https://le-cook.sznm.dev">app</a> to find food recipe, powered by RecipePuppy API</p>
<h3 id="heading-3-covid-19-data">3. Covid-19 Data</h3>
<p><a target="_blank" href="https://covid19.sznm.dev">Monitor Covid-19 statistics</a>, powered by @mathdroid's Covid-19 API, @ariya's Dekontaminasi API, and @Reynaldi531's api-covid19-indonesia v2. First developed using Gatsby, then re-wrote it with Next.js and Chakra UI.</p>
<h3 id="heading-4-advice-generator">4. Advice Generator</h3>
<p>A random <a target="_blank" href="https://advicegen.sznm.dev">advice generator</a> powered by Advice Slip JSON API, written using Svelte.</p>
<h3 id="heading-5-insta-profile">5. Insta Profile</h3>
<p>A simple Svelte <a target="_blank" href="https://instaprofile.sznm.dev">app</a> fetching data from Instagram.</p>
<h3 id="heading-6-sznmdev">6. sznm.dev</h3>
<p>I make <a target="_blank" href="https://sznm.dev">another personal site</a> of myself dedicated for dev content, built using Next.js, composed using Chakra UI.</p>
<h3 id="heading-7-kapturalumina">7. KapturaLumina</h3>
<p>Basic Photography Learning Mobile App with Gamification. Built using Ionic, React, and Firebase. Available as <a target="_blank" href="https://kapturalumina.sznm.dev">PWA</a> and <a target="_blank" href="https://play.google.com/store/apps/details?id=dev.sznm.kapturalumina">android</a> app. I built it as part of my undergraduate thesis.</p>
<h3 id="heading-8-nextchakra-starter">8. NextChakra-Starter</h3>
<p>A <a target="_blank" href="https://nextchakra-starter.sznm.dev/">template</a> I made to initialize Next.js projects with TypeScript and Chakra UI setup. Most of my following projects are initalized / generated using this template.</p>
<h3 id="heading-9-add-to-calendar-generator">9. Add to Calendar Generator</h3>
<p>A web <a target="_blank" href="https://addtocal.sznm.dev">app</a> to generate Add to Calendar link (Google Calendar).</p>
<h3 id="heading-10-instadld">10. InstaDLD</h3>
<p>Instagram post media <a target="_blank" href="https://instadld.sznm.dev">downloader</a> with multipost download supported.</p>
<h3 id="heading-11-public-apis">11. Public APIs</h3>
<p>An <a target="_blank" href="https://publicapis.sznm.dev">app</a> to find public API for you next projects. Didn't thought it could be the <a target="_blank" href="https://www.producthunt.com/posts/public-apis-3">product of the day</a> in Product Hunt at 26 Dec 2020. Powered by api.publicapis.org.</p>
<h2 id="heading-some-other-stuffs-worth-to-mention">Some other stuffs worth to mention</h2>
<ul>
<li>I graduated from college (finally) 😊😊. Really grateful for everyone who supported me until now, especially my family and friends. </li>
<li>I started my career as Software Engineer right after I finished my thesis. </li>
</ul>
<p>All in all, I'm glad I can get through 2020 pretty well enough. I never imagined I'd graduate in time, especially when the pandemic situation started to happen and my thesis proposals got rejected several times. Hoping to grow more in 2021 and crafting greater stuffs. Thank you for reading and I hope you are doing well 😄.</p>
<p>If you're interested in another version of my review of my journey in 2020, I also published it at <a target="_blank" href="https://twitter.com/sozonome/status/1345261139358142467">twitter</a> (focused around the projects I made throughout the year).</p>
<p>My previous recap: <strong><a target="_blank" href="https://sznm.dev/blog/2019-12-31-2019-recap">2019</a></strong>.</p>
]]></content:encoded></item><item><title><![CDATA[Monitor and Measure Site Performance from Time to Time and Automatically using Speedlify]]></title><description><![CDATA[originally posted here
TL;DR
Want to measure and monitor your site performance from time to time and automatically? Deploy Speedlify through Netlify and use Github Actions (cron schedule) or Zapier to automatically trigger build every desired time.
Y...]]></description><link>https://hashnode.sznm.dev/monitor-and-measure-site-performance-from-time-to-time-and-automatically-using-speedlify</link><guid isPermaLink="true">https://hashnode.sznm.dev/monitor-and-measure-site-performance-from-time-to-time-and-automatically-using-speedlify</guid><dc:creator><![CDATA[Agustinus Nathaniel]]></dc:creator><pubDate>Sat, 07 Nov 2020 00:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893711154/Xxp_yNbPrs.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a target="_blank" href="https://sznm.dev/blog/monitor-and-measure-site-performance-with-speedlify">originally posted here</a></p>
<h2 id="heading-tldr">TL;DR</h2>
<p>Want to measure and monitor your site performance from time to time and automatically? Deploy <a target="_blank" href="https://speedlify.dev">Speedlify</a> through <a target="_blank" href="https://www.netlify.com/">Netlify</a> and use <a target="_blank" href="https://github.com/features/actions">Github Actions</a> (cron schedule) or Zapier to automatically trigger build every desired time.</p>
<p>You can directly visit <a target="_blank" href="https://github.com/zachleat/speedlify/#deploy-to-netlify">this page</a> if you know what to do next. But if you need some guidance, this article will help you step by step.</p>
<h3 id="heading-what-will-be-covered-in-this-article">What will be covered in this article?</h3>
<ul>
<li>How to configure Speedlify</li>
<li>How to deploy Speedlify</li>
<li>Using Netlify build hooks and Github Actions to automatically trigger build Speedlify page every desired time.</li>
</ul>
<h3 id="heading-this-article-wont-cover">This article won't cover...</h3>
<p>SEO or visitor related metrics like Google Analytics. The site performance mentioned in this article is <a target="_blank" href="https://developers.google.com/web/tools/lighthouse">Lighthouse</a> based performance measurement.</p>
<hr />
<h2 id="heading-measuring-site-performance">Measuring Site Performance</h2>
<p>Nowadays there are so many ways to measure site performance beside running lighthouse in your local machine (Chrome Dev Tools). Even recently <a target="_blank" href="https://vercel.com">Vercel</a>, PaaS for frontend deployment released a feature called <a target="_blank" href="https://vercel.com/docs/analytics/overview.amp">Analytics</a>. This feature can show your <a target="_blank" href="https://nextjs.org/analytics">Next.js</a> or <a target="_blank" href="https://vercel.com/blog/gatsby-analytics">Gatsby</a> site performance automatically from time-to-time without having to configure anything (<em>almost zero-config</em>). But this feature is limited to be applicable for one project if your vercel account is a free version.</p>
<p>What if we have more than one project / site to be measured from time-to-time without spending extra cost? Well, this is where <a target="_blank" href="https://speedlify.dev">Speedlify</a> comes in, a template for site performance monitor created by <a target="_blank" href="https://github.com/zachleat">Zach Leatherman</a>. Speedlify built using a static site generator framework called <a target="_blank" href="https://www.11ty.dev/">11ty(eleventy)</a>.</p>
<p>I've tried to deploy my own speedlify <a target="_blank" href="https://audit.sznm.dev">here</a>.</p>
<p><em>fun fact: I found Speedlify when I was just randomly exploring 11ty docs page (not really important, just intermezzo 😄)</em></p>
<p>Well, let's get our hands dirty!</p>
<h2 id="heading-how">How?</h2>
<h3 id="heading-what-is-needed">What is needed?</h3>
<ul>
<li>a Github account</li>
<li>a Netlify account</li>
</ul>
<h3 id="heading-this-guide-was-written-with-assumtions-that-you">This Guide was Written with Assumtions that You:</h3>
<ul>
<li>know how to use basic Git commands</li>
<li>familiar with Netlify</li>
<li>familiar with Node.js environment (installed node and npm)</li>
</ul>
<p>I suggest you to visit <a target="_blank" href="https://speedlify.dev">Speedlify</a> to get some glimpse on what we will be using. There's a link to the source code repository on that page which shows you how to deploy your own Speedlify page. However, if you are having some difficulties, you can folow these steps:</p>
<h3 id="heading-1-clone-speedlify-repo">#1: Clone Speedlify Repo</h3>
<p>Import speedlify repository to your github account (<a target="_blank" href="https://github.com/new/import">https://github.com/new/import</a>), input this URL: <code>https://github.com/zachleat/speedlify/</code>.</p>
<p>After the import process is done, clone your speedlify repo into your local machine or just run these command below in your local folder:</p>
<pre><code class="lang-git">git clone https://github.com/[YOUR_GITHUB_USERNAME]/speedlify/
</code></pre>
<pre><code>cd speedlify
</code></pre><p>Then, run <code>npm install</code> or <code>npm i</code>.</p>
<h3 id="heading-2-configure-urls">#2: Configure URLs</h3>
<p>Open <code>_data/sites</code> folder. Every file you create here will represent a category. You can defined more than one URL for every category. Just delete all default files in <code>_data/sites</code>. Create a file <code>[CATEGORY_NAME].js</code>. (change [CATEGORY_NAME] with your desired category name). You can create more than one category, but you must know some limitations here: <a target="_blank" href="https://github.com/zachleat/speedlify/#known-limitations">https://github.com/zachleat/speedlify/#known-limitations</a></p>
<pre><code class="lang-js"><span class="hljs-comment">// _data/sites/[CATEGORY_NAME].js</span>
<span class="hljs-built_in">module</span>.exports = {
    <span class="hljs-attr">name</span>: <span class="hljs-string">"Category Name"</span>, <span class="hljs-comment">// optional, falls back to object key</span>
    <span class="hljs-attr">description</span>: <span class="hljs-string">"Category Description"</span>,
    <span class="hljs-attr">options</span>: {
        <span class="hljs-attr">frequency</span>: <span class="hljs-number">60</span> * <span class="hljs-number">23</span>, <span class="hljs-comment">// 23 hours</span>

        <span class="hljs-comment">// Use "run" if the sites don’t share assets on the same origin</span>
        <span class="hljs-comment">// and we can reset chrome with each run instead of</span>
        <span class="hljs-comment">// each site in every run (it’s faster)</span>
        <span class="hljs-comment">// Use "site" if sites are all on the same origin and share assets.</span>
        <span class="hljs-attr">freshChrome</span>: <span class="hljs-string">"run"</span>,
    },
    <span class="hljs-attr">urls</span>: [
        <span class="hljs-string">"https://[YOUR_SITE_URL]/"</span>,
        <span class="hljs-string">"https://[YOUR_SITE_URL]/"</span>,
        <span class="hljs-comment">// etc</span>
    ]
};
</code></pre>
<h4 id="heading-explanations">explanations</h4>
<ul>
<li><code>options</code><ul>
<li><code>frequency</code>: to set minimum time needed before next measurement. If we set <code>60*23</code> (1380 minutes or 23 hours) it means we will be measuring our site performance once every 23 hours. This value will be used to avoid measurement more than once before the minimum time was passed which will affect the build time. If we set the frequency to 23 hours and trigger build every 6 hours, the measurement for this category will be skipped if the last measurement haven't passed 23 hours.</li>
</ul>
</li>
</ul>
<h3 id="heading-3-test-run-in-local">#3: Test run in local</h3>
<p>Run <code>npm run start</code>. If the categories you input are shown, you can continue to the next step. You won't see any measurements. Measurements will be done at the build time when we deploy your Speedlify to Netlify. Commit your changes and run <code>git push</code> to apply changes to your github repository.</p>
<h3 id="heading-4-deploy-configured-speedlify-through-netlify">#4: Deploy configured Speedlify through Netlify</h3>
<p>Open your Netlify dashboard (<a target="_blank" href="https://app.netlify.com/">https://app.netlify.com/</a>), click "New site from Git". Point it to your Speedlify repository.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893703191/KVFMZVGkn.png" alt="Click New site from Git" /></p>
<p>Confirm the build configurations until "Deploy Site" button is shown and click that button. Netlify build will do the build and deployment process. If the build and deployment process are successful, you can preview your deployment.</p>
<p>The measurement page will look like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893705363/UmR4ufWk_.png" alt="Measurement page" /></p>
<h3 id="heading-5-configure-github-actions-to-automatically-trigger-build-every-desired-time">#5: Configure Github Actions to Automatically Trigger Build Every Desired Time</h3>
<p>To do measurement from time-to-time, we will utilize Netlify build hooks and Github Actions. Why? Because measurement are only done on build time. It will be a hassle to trigger the build process manually. You don't have to use Github Actions if you prefer to use Zapier or similar services which support cron schedule. The same process can be achieved using Zapier with Schedule by Zapier and Webhooks by Zapier. However for the time being Webhooks by Zapier can only be enabled if you are a Zapier premium user. Therefore, in this guide I will use Github Actions as an alternative which are more friendly to our pocket.</p>
<p>We will need build hook link (webhooks) to trigger build in Netlify. To get that link, open your speedlify project in your Netlify dashboard, then open "Site settings". Open "Build &amp; Deploy".</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893706835/DzPtULpcy.png" alt="Open Build and Deploy settings" /></p>
<p>Then point to "Build hooks", click "Add build hook". <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893708270/jowBFznqz.png" alt="Add Build Hook" /></p>
<p>We will get the build hooks URL, copy that link.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893709647/y8UQe2Nt8.png" alt="Alt Text" /></p>
<p>Now we can configure Github Actions to automatically trigger build to Netlify. Go back to your speedlify local folder, add a file named <code>.github/workflows/main.yml</code> and paste the copied build hooks URL into this file:</p>
<pre><code class="lang-yml"><span class="hljs-comment"># .github/workflows/main.yml</span>

<span class="hljs-comment"># edit according to your needs</span>
<span class="hljs-attr">name:</span> <span class="hljs-string">Trigger</span> <span class="hljs-string">Netlify</span> <span class="hljs-string">Build</span> <span class="hljs-string">daily</span> <span class="hljs-string">on</span> <span class="hljs-string">Weekday</span>
<span class="hljs-attr">on:</span>
  <span class="hljs-attr">schedule:</span>
    <span class="hljs-comment"># if you want to define your own build trigger schedule, just change the cron schedule value below</span>
    <span class="hljs-comment"># use https://crontab.guru/ if you are having some difficulties on how to define the cron values</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">cron:</span> <span class="hljs-string">'0 22 * * MON-FRI'</span>
    <span class="hljs-comment"># every day on weekdays 22:00.</span>
<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build:</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">Netlify</span> <span class="hljs-string">build</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Curl</span> <span class="hljs-string">request</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">curl</span> <span class="hljs-string">-X</span> <span class="hljs-string">POST</span> <span class="hljs-string">-d</span> {} <span class="hljs-string">YOUR_BUILD_HOOK_URL</span>
</code></pre>
<p>Commit your changes and run <code>git push</code>. If it's configured correctly, it will be shown in "Actions" tab at your github repository.</p>
<p>Now you have a dedicated page to monitor your site performance from time-to-time and automatically updated.</p>
<h2 id="heading-limitations">Limitations</h2>
<p>It's important to note that the more URL you add to your speedlify configurations, the build time needed will be increased. The free version of Netlify have a maximum 15 minutes build time for every build process and 300 minutes build time quota for every month.</p>
<p>I work around it by limiting my measurement to be done maximum once every 23 hours and limiting the total URLs from all category to be around 5 until 10, and automatically trigger the build every day on weekdays only at 10PM. With those configurations, every build would spend around 4 until 7 minutes (&lt;15 minutes), so I won't hit the monthly build time quota limit (4.5 <em> 5 </em> 7 ~= 160 minutes -&gt; &lt;300 minutes).</p>
<h2 id="heading-thank-you">Thank You!</h2>
<p>For reading this article. I hope you found this useful.</p>
<h2 id="heading-references">References</h2>
<ul>
<li><a target="_blank" href="https://www.speedlify.dev/">https://www.speedlify.dev/</a></li>
<li><a target="_blank" href="https://github.com/zachleat/speedlify/#deploy-to-netlify">https://github.com/zachleat/speedlify/#deploy-to-netlify</a></li>
<li><a target="_blank" href="https://github.com/zachleat/speedlify/#known-limitations">https://github.com/zachleat/speedlify/#known-limitations</a></li>
<li><a target="_blank" href="https://www.zachleat.com/web/speedlify/">https://www.zachleat.com/web/speedlify/</a></li>
</ul>
<h2 id="heading-some-alternatives">Some Alternatives</h2>
<p>(some exhaustive list of other tools to measure your website performance)</p>
<ul>
<li><a target="_blank" href="https://web.dev/measure/">https://web.dev/measure/</a></li>
<li><a target="_blank" href="https://web.dev/measure/">https://www.lightest.app/</a></li>
</ul>
<h2 id="heading-discussions">Discussions</h2>
<p>How important it is to measure site performance for you? How often do you measure your site performance? Which tools do you usually use?</p>
]]></content:encoded></item><item><title><![CDATA[May 2020 Quarantine Self Challenge]]></title><description><![CDATA[originally posted here
Recently I challenged myself to make a web app as soon as possible in two days. Managed to make two. One is a simple Food Recipe App and the other is COVID-19 Data App. Turned out it was so fun.
1. Le Cook
Fun food recipe catal...]]></description><link>https://hashnode.sznm.dev/may-2020-quarantine-self-challenge-1</link><guid isPermaLink="true">https://hashnode.sznm.dev/may-2020-quarantine-self-challenge-1</guid><dc:creator><![CDATA[Agustinus Nathaniel]]></dc:creator><pubDate>Sat, 02 May 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p><a target="_blank" href="https://sznm.dev/blog/quarantine-self-challenge">originally posted here</a></p>
<p>Recently I challenged myself to make a web app as soon as possible in two days. Managed to make two. One is a simple Food Recipe App and the other is COVID-19 Data App. Turned out it was so fun.</p>
<h2 id="heading-1-le-cook">1. Le Cook</h2>
<p>Fun food recipe catalog app powered by <a target="_blank" href="https://recipepuppy.com">RecipePuppy</a> API....</p>
<p><a target="_blank" href="https://le-cook.now.sh/">https://le-cook.now.sh/</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893716098/kvc6C0_8Z.jpeg" alt="Le Cook (1)" /> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893717948/yeu57c3H0.jpeg" alt="Le Cook (2)" /> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893719687/vw0xRGsvv.jpeg" alt="Le Cook (3)" /></p>
<h2 id="heading-2-covid-19-data">2. COVID-19 Data</h2>
<p>presenting COVID-19 statistics powered by <a target="_blank" href="https://github.com/mathdroid/covid-19-api/">@mathdroid</a>'s covid-19-api. I made a vanilla JS version of this app several days ago and I decided to re-develop it using Gatsby (React).</p>
<p><a target="_blank" href="https://covid19data.now.sh/">https://covid19data.now.sh/</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893721454/xdKB46ewP.jpeg" alt="COVID-19 Data App (1)" /> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893723131/K9Hfip1-E.jpeg" alt="COVID-19 Data App (2)" /> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893724820/a0WUHBoLN.jpeg" alt="COVID-19 Data App (3)" /></p>
<p>Both <a target="_blank" href="https://le-cook.now.sh/">Le Cook</a> and <a target="_blank" href="https://covid19data.now.sh/">COVID-19 Data</a> app were developed using Segment's Evergreen UI. Just discovered this React UI Framework and turns out it's so convenient to implement it on these projects.</p>
<p>When developing COVID-19 Data app, I realized Evergreen UI have no opinionated way to construct responsive layouts. So, I decided to combine it with TailwindCSS which I already tried to use at this personal site. It worked.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893726822/fXmp7pIO-.jpeg" alt="Evergreen UI (1)" /> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893729369/SOysBO7HV.jpeg" alt="Evergreen UI (2)" /> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893731293/3UuYyHewT.jpeg" alt="Evergreen UI (3)" /> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893733322/8tV8CmaHm.jpeg" alt="Evergreen UI (4)" /></p>
<p>I decided to deploy it using <a target="_blank" href="https://vercel.com">Vercel</a> and I'm so shocked by how fast it is compared to <a target="_blank" href="https://netlify.com">Netlify</a>. I'm considering to migrate to Vercel from Netlify for my previous projects, including this site.</p>
<p>I posted my recent projects <a target="_blank" href="https://sznm.dev/projects">here</a>. You can access the project and the project's GitHub repository link from this <a target="_blank" href="https://sznm.dev/projects">page</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Stackbit, the Game Changer]]></title><description><![CDATA[originally posted here
by the time I wrote this post, Stackbit is still at Beta.
Have you ever thought of launching a landing page or a blog with the technology of your choice in just under 10 minutes? Since JAMStack is getting more popular these day...]]></description><link>https://hashnode.sznm.dev/stackbit-the-game-changer-1</link><guid isPermaLink="true">https://hashnode.sznm.dev/stackbit-the-game-changer-1</guid><dc:creator><![CDATA[Agustinus Nathaniel]]></dc:creator><pubDate>Sun, 22 Mar 2020 05:51:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893740737/YXrcIXb-5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a target="_blank" href="https://sznm.dev/blog/stackbit-the-game-changer">originally posted here</a></p>
<p><em>by the time I wrote this post, Stackbit is still at Beta.</em></p>
<p>Have you ever thought of launching a landing page or a blog with the technology of your choice in just under 10 minutes? Since <a target="_blank" href="https://jamstack.wtf/#meaning">JAMStack</a> is getting more popular these days, more sites are being developed this way. Building it from scratch is also not too hard. But the problem is sometimes the initialization of the project or the deployment process can spend more time than you think. Not to mention if you are someone who just want to get a little grasp of what all this about without getting your hands dirty and spending some hours just to know what are you actually trying to do. Or if you are a first-timer who needs a step-by-step guide.</p>
<p>Yes, this is for you if you want to get a taste of what is JAMStack site about, how does it work in general, but you don't want to build it from scratch just to know it. This is for you if you are someone who are very familiar with building JAMStack sites, having multiple and upcoming clients who requests high performance yet low-cost site. Well, this is where <a target="_blank" href="https://www.stackbit.com/">Stackbit</a> plays the role for you.</p>
<p>You can call Stackbit as your smart-assistant who helps you to start your JAMStack site. It's very easy to use, you just need to prepare your <a target="_blank" href="https://www.github.com">GitHub</a> account (<a target="_blank" href="https://gitlab.com">GitLab</a> and <a target="_blank" href="https://bitbucket.com">BitBucket</a> support coming soon) and a <a target="_blank" href="https://netlify.com">Netlify</a> account. The next thing is just register yourself into Stackbit (you can even register using your GitHub account so it's more convenient) and you can start to Build a Project. You gonna choose the site theme, the site generator framework, CMS, then you can deploy it. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1632893738963/E1Y5OuY3d.png" alt="Alt Text" />
All of it are done just by picking, doing some clicks, and voila. Yeah, all of the process involve no code. But if you want to develop and customize the project further, that's where your hands start getting dirty.</p>
<p>So, what are you waiting for? Don't just read this post, it won't bring you anywhere. <em><a target="_blank" href="https://www.stackbit.com/">Try it now</a></em> and you will know what I'm talking about 😂.</p>
]]></content:encoded></item><item><title><![CDATA[2019 Recap]]></title><description><![CDATA[originally posted here
I spent most of my time in 2019 at college, trying to finish all my university courses by the end of 7th semester so I can focus on Thesis / Final Project at the final semester (8th semester). Planning to graduate in 2020. So.....]]></description><link>https://hashnode.sznm.dev/2019-recap-1</link><guid isPermaLink="true">https://hashnode.sznm.dev/2019-recap-1</guid><dc:creator><![CDATA[Agustinus Nathaniel]]></dc:creator><pubDate>Tue, 31 Dec 2019 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p><a target="_blank" href="https://sznm.dev/blog/2019-recap">originally posted here</a></p>
<p>I spent most of my time in 2019 at college, trying to finish all my university courses by the end of 7th semester so I can focus on Thesis / Final Project at the final semester (8th semester). Planning to graduate in 2020. So...not really much happened in this year, but I learned so much in terms of mobile application and web development. How to build an Android App and got my hands on React framework for the first-time in this year.</p>
<h2 id="heading-what-i-learned-in-2019">What I learned in 2019</h2>
<ul>
<li>Java and XML - How to build Native Android apps using Android Studio.</li>
<li>REST API - How to fetch data and display it with recycler view in Android app </li>
<li>PHP - how to program a website with PHP, MVC.</li>
<li>How to setup a website using database with PHP, laragon, and MySQL</li>
<li>CodeIgniter - how to use CodeIgniter to build website.</li>
<li>How to deploy PHP sites with its database to cPanel hosting.</li>
<li>How to setup arcanist in Linux Ubuntu.</li>
<li>How to use Git for managing personal and team projects.</li>
<li>TypeScript - how to use it, what is the importance of strong typing, and how to compile it into JS</li>
<li>React - how to build an app using React with CRA.</li>
<li>GraphQL - what is it and how is it used</li>
<li>Apollo - how to implement apollo as a client for GraphQL</li>
<li>GatsbyJS - how to build a site with Gatsby</li>
<li>Ionic - how to build hybrid apps and how does it different from native apps.</li>
<li>Angular2+ - forced to learn this framework because learning Ionic Angular and luckily I've learned TypeScript.</li>
<li>Zeit - found a Netlify alternative and how to deploy site with it.</li>
</ul>
]]></content:encoded></item></channel></rss>