<?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>Forem: Mazen Touati</title>
    <description>The latest articles on Forem by Mazen Touati (@mazentouati).</description>
    <link>https://forem.com/mazentouati</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%2F112675%2Fec691b63-af5d-4468-9a8e-17f39fa6cd43.jpeg</url>
      <title>Forem: Mazen Touati</title>
      <link>https://forem.com/mazentouati</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mazentouati"/>
    <language>en</language>
    <item>
      <title>Nimbus v0.4.0-alpha: 10 New Features to streamline your Laravel API workflow</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Mon, 02 Feb 2026 11:57:39 +0000</pubDate>
      <link>https://forem.com/mazentouati/nimbus-v040-alpha-10-new-features-to-streamline-your-laravel-api-workflow-b6g</link>
      <guid>https://forem.com/mazentouati/nimbus-v040-alpha-10-new-features-to-streamline-your-laravel-api-workflow-b6g</guid>
      <description>&lt;p&gt;A few months ago, I shared Nimbus. A Laravel-aware API client that lives inside your app and basically "auto-magically" understands your routes and validation rules so you don't have to set them up manually in Postman or other similar tools. It provides unique features that other traditional tools cannot provide, such as making requests as the currently logged-in user, decrypting cookies, etc.&lt;/p&gt;

&lt;p&gt;The stuff I’m actually excited about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transaction Mode&lt;/strong&gt;: Now, you can toggle Transaction Mode on, and Nimbus automatically rolls back the DB changes. Your data stays clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shareable Links&lt;/strong&gt;: You can now generate a link that pre-loads the exact headers and payload for your teammates. And vice versa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-selecting dynamic sections on click&lt;/strong&gt;: You can now auto-select an entire dynamic route segment (like an ID) just by clicking it. It will remember the position, so clicking again after you've changed the value will re-select the whole segment for quick replacement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAPI Schema Support&lt;/strong&gt;: You can now feed it an OpenAPI spec. It keeps the Nimbus magic but uses your spec as the source of truth (It will reconcile the missing routes automatically, so you can have friction-free DX).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dump and Die responses&lt;/strong&gt;: Nimbus now catches those dumps and renders them in a clean, paginated (for subsequent dumps) viewer inside the UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional New Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tabs Support.&lt;/li&gt;
&lt;li&gt;Request History and Rewind.&lt;/li&gt;
&lt;li&gt;Multi-application configuration Support.&lt;/li&gt;
&lt;li&gt;Spatie Data Support.&lt;/li&gt;
&lt;li&gt;UI Persistence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;lt;&lt;a href="https://github.com/sunchayn/nimbus/discussions/55" rel="noopener noreferrer"&gt;Release Announcement with visuals&lt;/a&gt;&amp;gt;&lt;/p&gt;




&lt;p&gt;Check it out here: &lt;a href="https://github.com/sunchayn/nimbus" rel="noopener noreferrer"&gt;https://github.com/sunchayn/nimbus&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require sunchayn/nimbus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Live demo: &lt;a href="https://nimbus.sunchayn.io/demo" rel="noopener noreferrer"&gt;https://nimbus.sunchayn.io/demo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Small note,&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Last time I posted, there was some healthy confusion about where this fits into the developer workflow. Nimbus isn’t trying to replace your automated test suites. I’m a TDD advocate myself, and you should definitely keep writing those tests.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Think of it like this: Automated tests are your "Safety Net", they ensure your app stays stable and regression-free. Nimbus, on the other hand, is a developer-focused playground to interact with your API with as much kickstart as possible, with as little friction as possible. For example, where you just want to poke the endpoint, verify a data type, or show a live payload to a frontend dev without any boilerplate.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you have a use case for Postman, Insomnia, Hoppscotch, etc., then you're most likely going to find Nimbus useful for your Laravel application.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Would love your feedback!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introducing Nimbus: An integrated, in-browser API client for Laravel with a touch of magic</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Thu, 23 Oct 2025 01:08:11 +0000</pubDate>
      <link>https://forem.com/mazentouati/introducing-nimbus-an-integrated-in-browser-api-client-for-laravel-with-a-touch-of-magic-2nn7</link>
      <guid>https://forem.com/mazentouati/introducing-nimbus-an-integrated-in-browser-api-client-for-laravel-with-a-touch-of-magic-2nn7</guid>
      <description>&lt;p&gt;Testing APIs shouldn’t feel like a chore. Yet, here we are, copy-pasting URLs into Postman, manually typing headers, rebuilding request bodies from scratch, and constantly switching between our code and external tools. It’s 2025, and we’re still doing this.&lt;/p&gt;

&lt;p&gt;What if your API client just… knew about your Laravel app?&lt;/p&gt;

&lt;p&gt;That’s &lt;a href="https://nimbus.sunchayn.io/" rel="noopener noreferrer"&gt;Nimbus&lt;/a&gt;. An integrated, in-browser API client that automatically discovers your routes and validation rules, understands your authentication, and gives you an interface to test everything without leaving your development environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Traditional API Clients
&lt;/h2&gt;

&lt;p&gt;Don’t get me wrong, tools like Postman and Insomnia are great tools. I have been using them all this time. But they’re built for a different problem; they’re generic clients meant to work with any API, anywhere. That generality comes at a cost: &lt;strong&gt;everything is manual&lt;/strong&gt; &lt;em&gt;(including the creation of scripts manually)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Think about your daily workflow:&lt;/p&gt;

&lt;p&gt;You build a new endpoint in Laravel. You define the route, write the controller, and create a Form Request with validation rules. Then you switch to your API client and… start from scratch. Copy the URL. Type the method. Add headers one by one. Build the request body by guessing what fields you need. Send the request. Get a validation error. Go back to your code to check the validation rules. Update your request. Try again. Then, once done, you have to figure out how to communicate it with the rest of the team.&lt;/p&gt;

&lt;p&gt;That’s a lot of friction and wasted time.&lt;/p&gt;

&lt;p&gt;Here’s the thing: your Laravel application already knows everything about your API. It knows the routes, the validation rules, the authentication requirements, and the response structure. Why are we manually reconstructing this information in an external tool?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That was what I was asking myself every time I was fiddling with these tools. Which made me think, why not make it happen?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Nimbus
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nimbus.sunchayn.io/" rel="noopener noreferrer"&gt;Nimbus&lt;/a&gt; takes a different approach: instead of being a generic API client, it’s a Laravel-aware API client. It lives inside your application and automatically understands what you’re building.&lt;/p&gt;

&lt;p&gt;Here’s what happens when you install Nimbus:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It scans your API routes.&lt;/li&gt;
&lt;li&gt;It extracts validation rules from Form Requests and inline validators.&lt;/li&gt;
&lt;li&gt;It builds JSON schemas automatically.&lt;/li&gt;
&lt;li&gt;It gives you an interface to test everything.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is it. No collections to maintain. No manual syncing. Just install and start testing.&lt;/p&gt;

&lt;p&gt;Want to see it in action before installing? Try the &lt;a href="https://nimbus.sunchayn.io" rel="noopener noreferrer"&gt;live demo&lt;/a&gt;. No setup required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98j2sejuwctuf62kb2fh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98j2sejuwctuf62kb2fh.gif" alt="Animated Demo" width="760" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Magic of Laravel-Awareness
&lt;/h2&gt;

&lt;p&gt;Being inside your Laravel application gives Nimbus superpowers that external clients can’t have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session-based authentication&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User impersonation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cookie inspection&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me show you what this means in practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up a new endpoint?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With traditional tools, you manually configure everything: copy URLs, set HTTP methods, add headers one by one, and build request bodies by guessing field names. With Nimbus, routes are discovered automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updating validation rules?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Changed a field from optional to required? With traditional tools, you need to manually update your collection and sync it with your team. With Nimbus, the changes appear immediately. It reads directly from your validation rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing authenticated endpoints?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional tools require extracting tokens, managing expiration, and manually adding authorization headers. Nimbus lets you authenticate with one click, either as your current user or by impersonating any user ID. No token management needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging cookies?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Need to inspect a Laravel session cookie? With external tools, you copy the encrypted value, find (or make) a decoder, paste it somewhere, and try to make sense of it. Nimbus decrypts and displays your cookies automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sharing with your team?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditional tools require exporting collections, sending files around, and hoping everyone imports the latest version. With Nimbus, there’s nothing to share. Everyone on the team just visits /nimbus in their local environment. No exports, no imports, no version mismatches.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;And honestly, the &lt;a href="https://github.com/sunchayn/nimbus/discussions/1" rel="noopener noreferrer"&gt;sky is the limit&lt;/a&gt;. The package embraces a “not afraid of magic” philosophy, and anything that we can do to make the Developer Experience much better, we will do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Nimbus Is Not
&lt;/h2&gt;

&lt;p&gt;Let’s be clear about this: &lt;strong&gt;Nimbus is not an API documentation generator.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It doesn’t produce beautiful, client-facing API documentation. It’s not trying to replace tools like &lt;a href="https://scribe.knuckles.wtf/laravel" rel="noopener noreferrer"&gt;Scribe&lt;/a&gt; or &lt;a href="https://scramble.dedoc.co/usage/getting-started" rel="noopener noreferrer"&gt;Scramble&lt;/a&gt;. Its sole purpose is to improve the developer experience while building and testing APIs.&lt;/p&gt;

&lt;p&gt;Think of it as a developer-focused API playground, not a production documentation tool.&lt;/p&gt;

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

&lt;p&gt;Installation takes less than a minute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require sunchayn/nimbus

php artisan vendor:publish &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nimbus-assets &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nimbus-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. Navigate to &lt;a href="http://your-app.test/nimbus" rel="noopener noreferrer"&gt;http://your-app.test/nimbus&lt;/a&gt; and start testing.&lt;/p&gt;

&lt;p&gt;Nimbus is currently an open alpha release. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You might encounter bugs or unexpected behaviors.&lt;/li&gt;
&lt;li&gt;Some edge cases aren’t handled yet&lt;/li&gt;
&lt;li&gt;Performance could be better for large applications&lt;/li&gt;
&lt;li&gt;Features are intentionally minimal to validate the concept.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m releasing it as alpha to validate whether this approach resonates with the Laravel community. Does automatic schema discovery actually improve your workflow? What features would make it indispensable?&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Notes
&lt;/h2&gt;

&lt;p&gt;We spend so much time building APIs in Laravel. Yet we’ve accepted that testing them requires leaving our environment, reconstructing our routes manually, and fighting with external tools that don’t understand our application.&lt;/p&gt;

&lt;p&gt;Nimbus is my attempt to eliminate that friction. Give it a try.&lt;/p&gt;




&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation: &lt;a href="https://github.com/sunchayn/nimbus/wiki/user-guide" rel="noopener noreferrer"&gt;User Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Want to contribute? &lt;a href="https://github.com/sunchayn/nimbus/wiki/contribution-guide" rel="noopener noreferrer"&gt;Check the contributor guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Found a bug? &lt;a href="https://github.com/sunchayn/nimbus/issues" rel="noopener noreferrer"&gt;Open an issue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Have a feature idea? &lt;a href="https://github.com/sunchayn/nimbus/discussions" rel="noopener noreferrer"&gt;Start a discussion&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>Monetize.js: Event-driven library to manage and simulate Web Monetization</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Thu, 21 May 2020 23:33:24 +0000</pubDate>
      <link>https://forem.com/mazentouati/monetize-js-event-driven-library-to-manage-and-simulate-web-monetization-16nc</link>
      <guid>https://forem.com/mazentouati/monetize-js-event-driven-library-to-manage-and-simulate-web-monetization-16nc</guid>
      <description>&lt;p&gt;My submission for &lt;a href="https://dev.to/devteam/announcing-the-grant-for-the-web-hackathon-on-dev-3kd1"&gt;Grant For The Web Hackathon&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;An event driven library that serves as a wrapper around Web Monetization API. Also, a monetization simulator has been built to support the library and make testing the monetization process extremely easy.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Flexible pointers management (Static and Dynamic).&lt;/li&gt;
&lt;li&gt;Promise-like syntax to watch events.&lt;/li&gt;
&lt;li&gt;Customizable cycle-through list of pointers.&lt;/li&gt;
&lt;li&gt;Support probabilistic cycle-through list of pointers.&lt;/li&gt;
&lt;li&gt;Calculate the total amount grouped by currency.&lt;/li&gt;
&lt;li&gt;Powerful simulator that works without iframe or installed extension.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Foundational Technology&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;I've prepared a detailed README file on how to use the library alongside a set of handy &lt;a href="https://github.com/sunchayn/monetize.js/tree/master/examples"&gt;examples&lt;/a&gt; for some common scenarios.&lt;/p&gt;

&lt;p&gt;The following is a selection of some features provided by the library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watcher API
&lt;/h3&gt;

&lt;p&gt;You can simply start using static mode by manually adding the payment pointer to the head tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt;
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"monetization"&lt;/span&gt;
    &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"$wallet.example.com/alice"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then in your code you can listen to different events using&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your event listener logic here.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;progress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your event listener logic here.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;The provided API is Promise-like but it doesn't necessarily behave like a Promise. For instance &lt;code&gt;then&lt;/code&gt; here will be called as long as the event is fired, unlike Promises.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Use a dynamic pointer
&lt;/h4&gt;

&lt;p&gt;By default, monetize.js will auto-detect the pointer already added to the page. Additionally, it provides a set of handy methods to work with dynamic pointers.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$example/bob&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;watcher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// monetizationstart event has been fired.&lt;/span&gt;

    &lt;span class="nx"&gt;watcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;progress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Your event listener logic.&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Amount API
&lt;/h4&gt;

&lt;p&gt;The following is a basic example on how to work with the total streamed amount and currency for a given pointer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: to use Amount API you must use one of the dynamic pointer methods like &lt;code&gt;pointer&lt;/code&gt; or &lt;code&gt;pluck&lt;/code&gt; etc.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pointer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Get the Raw amount sent.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getPointerTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; output: 5258&lt;/span&gt;

&lt;span class="c1"&gt;// Or get the Formatted amount&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getPointerTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; output: 0.035&lt;/span&gt;

&lt;span class="c1"&gt;// Get the currency&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getPointerCurrency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Select pointer from list
&lt;/h4&gt;

&lt;p&gt;You can randomly select a pointer from a given Array by calling the &lt;code&gt;pluck&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pointers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$alice.example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$connie.example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$bob.example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// Randomly pick a pointer.&lt;/span&gt;
&lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointers&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;Passing an object to &lt;code&gt;pluck&lt;/code&gt; method will make it switch to probability based mode.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pointers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$alice.example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$bob.example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$connie.example&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Randomly pick a pointer based on it's probability.&lt;/span&gt;
&lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointers&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Cycle-through
&lt;/h4&gt;

&lt;p&gt;Sometimes picking a single pointer on page load isn't enough. For this case, you may consider using &lt;code&gt;cycle&lt;/code&gt; and &lt;code&gt;probabilisticCycle&lt;/code&gt; to cycle through a list of &lt;code&gt;pointers&lt;/code&gt; for a given &lt;code&gt;timeout&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Signature&lt;/span&gt;
    &lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointers&lt;/span&gt; &lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="nx"&gt;timeout&lt;/span&gt; &lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="nx"&gt;callback&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;pointers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$wallet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$wallet2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$wallet3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Using probabilistic approach&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// Signature&lt;/span&gt;
    &lt;span class="nx"&gt;probabilisticCycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointers&lt;/span&gt; &lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="nx"&gt;timeout&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;pointers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$wallet&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$wallet2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$wallet3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nx"&gt;monetize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;probabilisticCycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pointers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;This example is available in the &lt;a href="https://github.com/sunchayn/monetize.js/tree/master/examples"&gt;examples&lt;/a&gt; directory.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9cDQnP9O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0vtto6da8ihcydq6qmps.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9cDQnP9O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0vtto6da8ihcydq6qmps.gif" alt="Cycle through example" width="827" height="360"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Simulator
&lt;/h2&gt;

&lt;p&gt;Beside the core library, a powerful Web Monetization simulator is shipped. It does not require any extension or to be executed inside an iframe.&lt;/p&gt;

&lt;p&gt;An example for the simulator in action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T9zOwIdu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y6gv1kqn9ba8psgl0enp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T9zOwIdu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y6gv1kqn9ba8psgl0enp.gif" alt="Simulator example" width="496" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More details and documentation can be found in the repository.&lt;/p&gt;
&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&gt;

&lt;p&gt;Library code is hosted on Github with detailed description on how to setup and use.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sunchayn"&gt;
        sunchayn
      &lt;/a&gt; / &lt;a href="https://github.com/sunchayn/monetize.js"&gt;
        monetize.js
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An event-driven library to manage and simulate Web Monetization.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h3&gt;
Monetize.js&lt;/h3&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/896f74f6f2fe2bf69caed8d3f7abb4ac62329d00f00184c1175eba16bef8afbd/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6d6f6e6574697a652f6c6174657374"&gt;&lt;img src="https://camo.githubusercontent.com/896f74f6f2fe2bf69caed8d3f7abb4ac62329d00f00184c1175eba16bef8afbd/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6d6f6e6574697a652f6c6174657374" alt="Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/sunchayn/monetize.js/actions"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IEhbY0kb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sunchayn/monetize.js/workflows/Release/badge.svg" alt="Release"&gt;&lt;/a&gt;
&lt;a href="https://coveralls.io/github/sunchayn/monetize.js?branch=master" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/874ff81b50779bd5ba2530d7fc8d3adc747e025e6ef5310088b1d43da28d5e42/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f73756e636861796e2f6d6f6e6574697a652e6a732f62616467652e7376673f6272616e63683d6d617374657226743d796147414870" alt="Coverage Status"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/24cc191ad487def0c9166b2529874da4252e06f3992bbe275b68785663be55e4/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e2f6d6f6e6574697a65"&gt;&lt;img src="https://camo.githubusercontent.com/24cc191ad487def0c9166b2529874da4252e06f3992bbe275b68785663be55e4/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e2f6d6f6e6574697a65" alt="npm bundle size"&gt;&lt;/a&gt;
&lt;a href="https://github.com/sunchayn/monetize.js./LICENSE"&gt;&lt;img src="https://camo.githubusercontent.com/ad8758fbaebbced78645b98e446c0bb5ec223676ed61700184320887cadbfb8e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265" alt="Software License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Monetize.js is an Event-driven library that serves as a wrapper and simulator for Web Monetization API.&lt;/p&gt;
&lt;h2&gt;
Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Flexible pointers management (Static and Dynamic).&lt;/li&gt;
&lt;li&gt;Promise-like syntax to watch events.&lt;/li&gt;
&lt;li&gt;Customizable cycle-through list of pointers.&lt;/li&gt;
&lt;li&gt;Support probabilistic cycle-through list of pointers.&lt;/li&gt;
&lt;li&gt;Calculate the total amount grouped by currency.&lt;/li&gt;
&lt;li&gt;Powerful simulator that works without iframe or installed extension.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Installing Monetize.js&lt;/h2&gt;
&lt;p&gt;Using npm&lt;/p&gt;
&lt;div class="snippet-clipboard-content position-relative overflow-auto"&gt;&lt;pre&gt;&lt;code&gt;npm install monetize
// Using it
const monetize = require('monetize')
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Using unpkg CDN:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt; &lt;span class="pl-c1"&gt;src&lt;/span&gt;="&lt;span class="pl-s"&gt;https://unpkg.com/monetize@latest/dist/monetize.js&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
Examples&lt;/h2&gt;
&lt;p&gt;Multiple examples has been created using monetize.js you can find them in this &lt;a href="https://github.com/sunchayn/monetize.js/tree/master/examples"&gt;examples&lt;/a&gt; folder.&lt;/p&gt;
&lt;h2&gt;
Monetize.js API&lt;/h2&gt;
&lt;p&gt;As soon as you import Monetize.js it will start observing the head tag to see if there's a pointer to pick.&lt;/p&gt;
&lt;h3&gt;
Watching Monetization events&lt;/h3&gt;
&lt;p&gt;You can simply start using static mode by manually adding the payment pointer to the head tag:&lt;/p&gt;
&lt;div class="highlight highlight-text-html-basic position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;head&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;meta&lt;/span&gt;
    &lt;span class="pl-c1"&gt;name&lt;/span&gt;="&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sunchayn/monetize.js"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Additional Resources/Info
&lt;/h2&gt;

&lt;p&gt;I've created a glitch project that hosts some example for the library.&lt;/p&gt;


&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/monetize-js-examples?previewSize=100&amp;amp;path=index.html" alt="monetize-js-examples on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;





&lt;p&gt;Thank you for passing by, feel free to leave your feedback or suggestion. Good luck everyone!&lt;/p&gt;

</description>
      <category>gftwhackathon</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Received; Twilio Hackathon submission</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Wed, 29 Apr 2020 17:55:55 +0000</pubDate>
      <link>https://forem.com/mazentouati/received-twilio-hackathon-submission-413k</link>
      <guid>https://forem.com/mazentouati/received-twilio-hackathon-submission-413k</guid>
      <description>&lt;p&gt;Hello, &lt;/p&gt;

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

&lt;p&gt;I've build a web app that enable people to create a gateway to receive and store files from their friends, co-workers and themselves.&lt;/p&gt;

&lt;p&gt;Basically, when a user signup a private bucket will be created for him. He can eventually organize it by folders and create a public access point (write-only)  for a specific folder using a unique password.&lt;/p&gt;

&lt;p&gt;Each user has a unique username which will identify his bucket. Guests need to provide a password for the bucket to unlock a specific folder in it. Then they can upload files for the subject.&lt;/p&gt;

&lt;h4&gt;
  
  
  Category Submission:
&lt;/h4&gt;

&lt;p&gt;With this submission I've aimed mainly for: Exciting X-Factors. I've planned to integrate Cloud Storage APIs too (For syncing and backups) to fit Interesting Integrations but I run out of time apparently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo Link
&lt;/h2&gt;

&lt;p&gt;I've implemented &amp;amp; deployed a MVP on Azure, the plan I've picked not perfect so it may face some latency or slow downs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://received.azurewebsites.net"&gt;https://received.azurewebsites.net&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sunchayn"&gt;
        sunchayn
      &lt;/a&gt; / &lt;a href="https://github.com/sunchayn/received"&gt;
        received
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Public bucket for receiving files
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h2&gt;
&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/77c6b8e4419704c2baf826ad8077b49bd51dfecd9f5fda2272a7b8efd6c8e502/68747470733a2f2f72656365697665642e626c6f622e636f72652e77696e646f77732e6e65742f6173736574732f6c6f676f2d32303070782e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/77c6b8e4419704c2baf826ad8077b49bd51dfecd9f5fda2272a7b8efd6c8e502/68747470733a2f2f72656365697665642e626c6f622e636f72652e77696e646f77732e6e65742f6173736574732f6c6f676f2d32303070782e706e67" alt="Received;"&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/sunchayn/received/actions"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2buHo0Cx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sunchayn/received/workflows/Received%2520CI/badge.svg" alt="Actions Status"&gt;&lt;/a&gt;
&lt;a href="https://coveralls.io/github/sunchayn/received?branch=master" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/17b31e873b2b347d01008c16574f1e157fff42f43346902f249d65f6d7b00583/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f73756e636861796e2f72656365697665642f62616467652e7376673f6272616e63683d6d6173746572" alt="Coverage Status"&gt;&lt;/a&gt;
&lt;a href="https://github.styleci.io/repos/253168130" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/43d052a641fe3f6d6125f57d69dc5e4108d33366b48f9c78ef8d9a625e6529c9/68747470733a2f2f6769746875622e7374796c6563692e696f2f7265706f732f3235333136383133302f736869656c643f6272616e63683d6d6173746572" alt="StyleCI"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/sunchayn/received/maintainability" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/f91004a1443b00c1062a8bae67a3c61c1f04b671ca00cb9840ac6b26d7746e7f/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f33353735353166393464356532373133356533612f6d61696e7461696e6162696c697479" alt="Maintainability"&gt;&lt;/a&gt;
&lt;a href="https://github.com/sunchayn/received./LICENSE"&gt;&lt;img src="https://camo.githubusercontent.com/ad8758fbaebbced78645b98e446c0bb5ec223676ed61700184320887cadbfb8e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265" alt="Software License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Public bucket for receiving files.&lt;/p&gt;
&lt;h2&gt;
About&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Received;&lt;/strong&gt; is a platform that enable people to reserve a storage space and create a public gateway to receives files from their friends, co-worker or themselves.&lt;/p&gt;
&lt;p&gt;the idea is to create one &lt;strong&gt;easy to remember&lt;/strong&gt; URL and protect each folder with different password. Hence, the whoever got the link can use the same URL to share files to different folders each with it's unique password.&lt;/p&gt;
&lt;h2&gt;
Demo&lt;/h2&gt;
&lt;p&gt;A MVP has been implemented and deployed in the following link
&lt;a href="https://received.azurewebsites.net" rel="nofollow"&gt;https://received.azurewebsites.net&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PHP &amp;gt; 7.2&lt;/li&gt;
&lt;li&gt;Composer&lt;/li&gt;
&lt;li&gt;Node &amp;amp; NPM&lt;/li&gt;
&lt;li&gt;Twilio Verify Service&lt;/li&gt;
&lt;li&gt;Twilio Authy&lt;/li&gt;
&lt;li&gt;Twilio Programmable SMS&lt;/li&gt;
&lt;li&gt;Twilio Phone Number&lt;/li&gt;
&lt;li&gt;SendGrid Account ( Or Any mailing service )&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Installation&lt;/h2&gt;
&lt;p&gt;Received built using Laravel, VueJs and Tailwind. Basic knowledge in these technologies would be helpful for inspecting the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1/ Clone the repository&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-shell position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/sunchayn/received.git
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Change directory to the newly created folder&lt;/span&gt;
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; received&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2/ Install&lt;/strong&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sunchayn/received"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I built it (what's the stack? did I run into issues or discover something new along the way?)
&lt;/h2&gt;

&lt;p&gt;I've used Laravel 7, VueJs and Tailwind to tailor this app. I've worked with BDD approach to make sure that the critical features are well covered and implemented. Also, to ensure flexibility of third party services and test-ability I've approached Adapter pattern to encapsulate the SMS logic for instance. &lt;a href="https://github.com/sunchayn/received/tree/master/app/Services/SMS"&gt;see in Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;** Twilio Stack **&lt;br&gt;
I've used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twilio Verify API&lt;/li&gt;
&lt;li&gt;Twilio Authy API&lt;/li&gt;
&lt;li&gt;Twilio SendGrid&lt;/li&gt;
&lt;li&gt;Twilio Programmable SMS
check this &lt;a href="https://github.com/sunchayn/received/blob/master/__guide/SERVICES.md"&gt;Services Guide&lt;/a&gt; to learn more how and where I've implemented them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Twilio Programmable SMS example&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LIsumi9z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rm3nbc37jti3pa7k0vt8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LIsumi9z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rm3nbc37jti3pa7k0vt8.jpeg" alt="Twilio Programmable SMS" width="880" height="1564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources/Info
&lt;/h2&gt;

&lt;p&gt;here are some additional snapshot from within the app&lt;/p&gt;

&lt;h3&gt;
  
  
  Bucket Browser
&lt;/h3&gt;

&lt;p&gt;The main interaction point of the app, here users can create and manage folders. Share and revoke access. Download and delete folders &amp;amp; files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fCeKnsZf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u1q84gkftnlwn74rqrez.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fCeKnsZf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u1q84gkftnlwn74rqrez.PNG" alt="Bucket" width="880" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8U-46xEG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q4x78jicb2ex0ugj4u44.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8U-46xEG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q4x78jicb2ex0ugj4u44.gif" alt="Folder creation" width="266" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uk-ux5A8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2mf6q0wpmjukknn6a451.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uk-ux5A8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2mf6q0wpmjukknn6a451.gif" alt="Folder sharing" width="880" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Public access point
&lt;/h3&gt;

&lt;p&gt;Here's an example how guest can unlock and upload files to a folder within a bucket.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5KpFJnxQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ku7sj3gvy890ip1av6ke.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5KpFJnxQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ku7sj3gvy890ip1av6ke.gif" alt="Public access point" width="773" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Settings
&lt;/h3&gt;

&lt;p&gt;eventually users can change their profile settings, update their username, phone number, change folder passwords, update notifications preferences...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mUKRngsa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q4ye417ny1lvpmba3fwf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mUKRngsa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q4ye417ny1lvpmba3fwf.PNG" alt="settings" width="880" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Last thoughts
&lt;/h2&gt;

&lt;p&gt;The most satisfying moment about this project is when I immedately started to use it. I was in need for such a service for a long time. Many times I've needed to send files for my self with full quality without the need to authenticate to my account in a random computer. An example for using it to send myself the screenshot for the SMS notification (and later on this screenshots itself)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m0RjenUi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/07m991i5zkh38wc22l7i.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m0RjenUi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/07m991i5zkh38wc22l7i.jpeg" alt="Mobile upload" width="880" height="1564"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Thanks for reading, I hope you've liked the app. All feed-backs are welcomed. Let me know if I missed something for my submission. &lt;/p&gt;

</description>
      <category>twiliohackathon</category>
      <category>showdev</category>
      <category>vue</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Twilio hackathon Project update: Received; UI </title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Fri, 17 Apr 2020 23:13:12 +0000</pubDate>
      <link>https://forem.com/mazentouati/twilio-hackathon-project-update-recieved-ui-4kol</link>
      <guid>https://forem.com/mazentouati/twilio-hackathon-project-update-recieved-ui-4kol</guid>
      <description>&lt;p&gt;Hi, I would like to update the status of my Twilio hackathon project.&lt;/p&gt;

&lt;p&gt;A quick reminder about the project's goal&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;my goal, is to build a platform that enable people to reserve a storage space and create a public gateway with an easy to remember URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By now I've reached the step 3 of the project which is preparing the UI or Hi-fi prototype for the app.&lt;/p&gt;

&lt;p&gt;without further ado, these are some UIs design for the main features&lt;/p&gt;

&lt;h2&gt;
  
  
  Landing page
&lt;/h2&gt;

&lt;p&gt;As I described in the initial post, I'm aiming for market ready product. Hence I've prepared a landing page to add more value for the product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvghfxxi7yhmbymoekj6u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvghfxxi7yhmbymoekj6u.jpg" alt="Landing page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage space
&lt;/h2&gt;

&lt;p&gt;When a user logs in, he will have access to a storage space where he can manage all the received files or create and share new folders.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz708kfwxdt4dcek8e2x1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz708kfwxdt4dcek8e2x1.jpg" alt="App main interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Public bucket
&lt;/h2&gt;

&lt;p&gt;When a user share his public profile URL with a friend or a co-worker. The later will need a password to unlock a specific folder and upload files to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffdbvovikrrzocnm6rpq5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffdbvovikrrzocnm6rpq5.jpg" alt="Public bucket password"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzn2sk47wrazni6pfcj8r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzn2sk47wrazni6pfcj8r.jpg" alt="Public bucket upload"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2FA authentication
&lt;/h2&gt;

&lt;p&gt;Regarding Twilio I'll use 4 API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twilio Verify to ensure phone validity.&lt;/li&gt;
&lt;li&gt;Twilio Authy as the 2FA which will be enabled by default.&lt;/li&gt;
&lt;li&gt;Programmable SMS &amp;amp; SendGrid as notification channels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following is the UI part for the 2FA step&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fx0hfux9h38dy2xmwvxzk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fx0hfux9h38dy2xmwvxzk.jpg" alt="2FA"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;I've already pushed all the established UIs alongside the Source file (Adobe XD) to the repository. Also, as for Step 2 of the project I've pushed the initial database model too.&lt;/p&gt;

&lt;p&gt;Project's repository: &lt;a href="https://github.com/sunchayn/received" rel="noopener noreferrer"&gt;Recieved on Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/mazen_touati" rel="noopener noreferrer"&gt;@mazen_touati&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading, feedbacks are appreciated 🦄&lt;/p&gt;

</description>
      <category>twiliohackathon</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Received; Public bucket for receiving files</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Sun, 05 Apr 2020 06:43:17 +0000</pubDate>
      <link>https://forem.com/mazentouati/received-public-bucket-for-receiving-files-24kb</link>
      <guid>https://forem.com/mazentouati/received-public-bucket-for-receiving-files-24kb</guid>
      <description>&lt;p&gt;Hi, I have this idea for a while for building a file sharing platform that allow people to create a public bucket and share it with their friends and co-workers so they can send to them whatever file they want and it will saved their private storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why
&lt;/h2&gt;

&lt;p&gt;I've faced a lot of time wasting situations that led me think about a similar solution. Situations like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The fact that a lot of social media platforms downgrade the images or restrict the file types or nagging about security issues when trying to attach compressed files that contain code (mostly when it contains JavaScript files for example). Even more, platforms like Facebook randomly block the sharing of external storage links (Like Google Drive) in private messages. They sometimes identify them as Spam.&lt;/li&gt;
&lt;li&gt;Sometimes, I use a computer or phone of a friend and I need to send a file for myself. I've always hoped for a place online where I can save it securely for myself later.&lt;/li&gt;
&lt;li&gt;Exchanging files between my phone and computer quickly.&lt;/li&gt;
&lt;li&gt;Sometimes when I ask people to send me files over Wetransfer the majority of them will ask me about my email which annoys me. Probably it's not clear enough that you can rather generate a shareable link than sending the link to an email. Without speaking on the 7 days expiry for the free plan (which is totally understandable)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Goal
&lt;/h2&gt;

&lt;p&gt;My goal, is to build a platform that enable people to reserve a storage space and create a public gateway with an easy to remember URL. Users can protect their public buckets with a password or create a password per folder (to keep the URL simple). Additionally, they will be able to control the type of files and size the want to receive in order to adhere to their hosting plan.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example&lt;/em&gt;&lt;br&gt;
URL will be recieved.app/sunchayn&lt;br&gt;
password to upload to &lt;code&gt;root&lt;/code&gt; folder: 123456&lt;br&gt;
password to upload to &lt;code&gt;personal_files&lt;/code&gt; folder: 123456@&lt;/p&gt;




&lt;p&gt;This Hackathon is an opportunity to explore my ideas and prototype for the product. I'll keep it minimal for now but on the long run I'm planning to add numerous features that will make the experience more pleasant and secure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Theme
&lt;/h3&gt;

&lt;p&gt;Mainly I'll focus on the &lt;em&gt;X-factors&lt;/em&gt; category as I'll push myself toward creating an usable and technically robust product. Also, &lt;em&gt;Interesting Integrations&lt;/em&gt; will be a potential aim as I'll most likely integrate cloud storage APIs like google drive to overcome the storage limitation at the beginning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Twilio APIs
&lt;/h3&gt;

&lt;p&gt;Initially I'll make use of Twilio &lt;code&gt;Verify&lt;/code&gt; and &lt;code&gt;Authy&lt;/code&gt; APIs as I'll enable 2FA by default. However, I would like to use as much as I can. Like integrating &lt;code&gt;SendGrid&lt;/code&gt; and &lt;code&gt;Programmable SMS&lt;/code&gt; to create notification channels. Having these 4 APIs working together would be a good starting point for people interested in learning how to use Twilio products in a real life projects as intended from the Twilio CodeExchange program.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;

&lt;p&gt;My stack will be mainly centered around this golden trio: Laravel + VueJs + Tailwind CSS&lt;/p&gt;

&lt;h3&gt;
  
  
  Plan
&lt;/h3&gt;

&lt;p&gt;Step 1:&lt;br&gt;
First of all I'll explore more Twilio products to get comfortable with.&lt;/p&gt;

&lt;p&gt;Step 2:&lt;br&gt;
I'll establish the architecture and the database design for the product.&lt;/p&gt;

&lt;p&gt;Step 3:&lt;br&gt;
Product design &amp;amp; identity.&lt;/p&gt;

&lt;p&gt;Step 4:&lt;br&gt;
I'll approach an incremental process to delivery functional modules (Design, Testing, Code).&lt;/p&gt;

&lt;p&gt;Step 5:&lt;br&gt;
Deploying a demo.&lt;/p&gt;




&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;p&gt;Project's repository: &lt;a href="https://github.com/sunchayn/received"&gt;Recieved on Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/mazen_touati"&gt;@mazen_touati&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I'm writing this post to serve as a commitment for me to continue this journey. If you find this project interesting feel free to share your feedback or idea. &lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>twiliohackathon</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>php</category>
    </item>
    <item>
      <title>How do you handle the disposable IF statements ?</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Sat, 29 Jun 2019 22:39:04 +0000</pubDate>
      <link>https://forem.com/mazentouati/how-do-you-handle-the-disposable-if-statements-hi6</link>
      <guid>https://forem.com/mazentouati/how-do-you-handle-the-disposable-if-statements-hi6</guid>
      <description>&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;Sometimes you need to write a conditional block that will only be executed once or for a brief period of time then the condition won't be satisfied again, like for ever.&lt;/p&gt;

&lt;p&gt;An example for these IFs is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// User level IFs&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;please activate your account&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Application level IFs&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nf"&gt;isAppProperlyInstalled&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;die&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Please, check the installation guide...'&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;The idea of that residing code that won't be executed again has been bothering me for years. I'm kind of picky and sometimes go crazy about micro-optimization, but sometimes I just ignore it. However, I feel that there's a great design pattern that I'm not aware of that may make me feel better about it. &lt;/p&gt;

&lt;p&gt;What do you think ? Do you share the same feeling ? and how are you dealing with it ?&lt;/p&gt;




&lt;p&gt;Photo by Carolina Pimenta, &lt;a href="https://unsplash.com/photos/ledpW0Zk2fU"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Sharing my bookmark</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Mon, 03 Dec 2018 23:35:33 +0000</pubDate>
      <link>https://forem.com/mazentouati/sharing-my-bookmark-4dda</link>
      <guid>https://forem.com/mazentouati/sharing-my-bookmark-4dda</guid>
      <description>&lt;p&gt;Hi, folks&lt;/p&gt;

&lt;p&gt;I've thought recently about sharing my dev related bookmark. So without further ado let's begin :&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rwaldron/idiomatic.js" rel="noopener noreferrer"&gt;idiomatic.js&lt;/a&gt; : Principles of Writing Consistent, Idiomatic JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.jstips.co/" rel="noopener noreferrer"&gt;JS Tip&lt;/a&gt; : A JavaScript tip per day&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://superherojs.com/" rel="noopener noreferrer"&gt;Superhero&lt;/a&gt; : A collection of the best articles on creating, testing and maintaining a large JavaScript code&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://jstherightway.org/" rel="noopener noreferrer"&gt;JavaScript The Right Way&lt;/a&gt; : A guide intended to introduce new developers to JavaScript and help experienced developers learn more about its best practices.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://eloquentjavascript.net/" rel="noopener noreferrer"&gt;Eloquent JavaScript&lt;/a&gt; : This is a book about JavaScript, programming, and the wonders of the digital (&lt;em&gt;absolutely recommended&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/elsewhencode/project-guidelines" rel="noopener noreferrer"&gt;Project Guidelines&lt;/a&gt; : A set of best practices for JavaScript projects&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/getify/You-Dont-Know-JS" rel="noopener noreferrer"&gt;You Dont Know JS&lt;/a&gt; : A book series on JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://youmightnotneedjquery.com/" rel="noopener noreferrer"&gt;YOU MIGHT NOT NEED JQUERY&lt;/a&gt; : A resource for doing things without jQuery.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/leonardomso/33-js-concepts" rel="noopener noreferrer"&gt;33 js concepts&lt;/a&gt; : 33 concepts every JavaScript developer should know. (&lt;em&gt;absolutely recommended&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://alligator.io/" rel="noopener noreferrer"&gt;Alligator&lt;/a&gt; : JavaScript Related tutorials made easy.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://javascript30.com/" rel="noopener noreferrer"&gt;JavaScript30&lt;/a&gt; : Build 30 things in 30 days with 30 tutorials&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  JavaScript Libraries
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sorrycc/awesome-javascript" rel="noopener noreferrer"&gt;Awesome Javascript&lt;/a&gt; : A collection of awesome browser-side JavaScript libraries, resources and shiny things.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://microjs.com" rel="noopener noreferrer"&gt;Microjs&lt;/a&gt; :  A micro-site for micro-frameworks&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://zeptojs.com/" rel="noopener noreferrer"&gt;ZeptoJS&lt;/a&gt; : Zepto is a minimalist JavaScript library for modern browsers with a largely jQuery-compatible API.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://gionkunz.github.io/chartist-js/" rel="noopener noreferrer"&gt;chartist.js&lt;/a&gt; :  Simple responsive charts.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nivo.rocks/" rel="noopener noreferrer"&gt;Nivo&lt;/a&gt; : nivo provides a rich set of dataviz components, built on top of the awesome d3 and Reactjs libraries.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://sizzlejs.com/" rel="noopener noreferrer"&gt;Sizzle&lt;/a&gt; : A pure-JavaScript CSS selector engine
designed to be easily dropped in to a host library.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://dynamicsjs.com/" rel="noopener noreferrer"&gt;DynamicsJS&lt;/a&gt; : JavaScript library to create physics-based animations.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simulacra.js.org/" rel="noopener noreferrer"&gt;Simulacra&lt;/a&gt; : Data-binding function for the DOM.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://ricostacruz.com/nprogress/" rel="noopener noreferrer"&gt;NProgress.js&lt;/a&gt; : A nanoscopic progress bar. With realistic trickle animations to tell your users that something's happening!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/turbolinks/turbolinks" rel="noopener noreferrer"&gt;Turbolinks&lt;/a&gt; : Turbolinks makes navigating your web application faster.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://clusterize.js.org/" rel="noopener noreferrer"&gt;Clusterize.js&lt;/a&gt; : Tiny plugin to display large data sets easily.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://rivetsjs.com/" rel="noopener noreferrer"&gt;Rivetsjs&lt;/a&gt; : Lightweight and powerful data binding + templating solution for building modern web applications.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/featurist/hyperdom" rel="noopener noreferrer"&gt;hyperdom&lt;/a&gt; : A fast, feature rich and simple framework for building dynamic browser applications.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://barbajs.org/index.html" rel="noopener noreferrer"&gt;barbajs&lt;/a&gt; : Create badass, fluid and smooth transition between your website's pages.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://maxwellito.github.io/vivus/" rel="noopener noreferrer"&gt;Vivusjs&lt;/a&gt; : Vivus is a lightweight JavaScript class (with no dependencies) that allows you to animate SVGs, giving them the appearence of being drawn. &lt;/li&gt;
&lt;li&gt;
&lt;a href="http://selectize.github.io/selectize.js/" rel="noopener noreferrer"&gt;Selectize&lt;/a&gt; : Selectize is the hybrid of a textbox and  box. It's jQuery-based and it's useful for tagging, contact lists, country selectors, and so on.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://popmotion.io/pure/" rel="noopener noreferrer"&gt;Popmotion&lt;/a&gt; : A functional, flexible JavaScript animation library.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CSS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://adamschwartz.co/magic-of-css/" rel="noopener noreferrer"&gt;Magic of css&lt;/a&gt; : The magic of CSS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://maintainablecss.com/" rel="noopener noreferrer"&gt;MaintainableCSS&lt;/a&gt; : Write CSS without worrying that overzealous, pre-existing styles will cause problems. MaintainableCSS is an approach to writing modular, scalable and of course, maintainable CSS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://bradfrost.com/blog/post/atomic-web-design/" rel="noopener noreferrer"&gt;Atomic Design&lt;/a&gt; : A methodology for creating design systems. There are five distinct levels in atomic design.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/chris-pearce/css-guidelines" rel="noopener noreferrer"&gt;CSS guidelines&lt;/a&gt; : Sensible CSS Guidelines for large scale projects.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/codyhouse" rel="noopener noreferrer"&gt;Codyhouse&lt;/a&gt; : Web design nuggets.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/necolas/idiomatic-css" rel="noopener noreferrer"&gt;Idiomatic CSS&lt;/a&gt; : Principles of writing consistent, idiomatic CSS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mycolor.space/gradient" rel="noopener noreferrer"&gt;ColorSpace&lt;/a&gt; : CSS Gradient generator.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context" rel="noopener noreferrer"&gt;The stacking context&lt;/a&gt; : Understand more the stacking context in CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  UI/UX
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://uxdesign.cc/design-better-data-tables-4ecc99d23356" rel="noopener noreferrer"&gt;Design better data tables&lt;/a&gt; : The ingredients of a successful data table UI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hackdesign.org/lessons" rel="noopener noreferrer"&gt;Hackdesign&lt;/a&gt; : An easy to follow design course for people who do amazing things.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://goodui.org/" rel="noopener noreferrer"&gt;Goodui&lt;/a&gt; : A/B test patterns to find out which ones work better than others.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://refactoringui.com/" rel="noopener noreferrer"&gt;Refactoring UI&lt;/a&gt; : Learn how to design awesome UIs by yourself using specific tactics explained from a developer's point-of-view.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.dailyui.co/" rel="noopener noreferrer"&gt;Daily UI&lt;/a&gt; : Become a better designer in 100 days.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://principles.design/" rel="noopener noreferrer"&gt;Design Principles&lt;/a&gt; : An open source collection of Design Principles and methods.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.designbetter.co/" rel="noopener noreferrer"&gt;Design Better&lt;/a&gt; : Introducing the best practices, stories, and insights from the world’s top design leaders.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://icons8.com/articles/web-design-how-to-use-icons-on-landing-pages/" rel="noopener noreferrer"&gt;Web Design: How to Use Icons on Landing Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://readymag.com/shuffle/dieter-rams/ten-commandments/" rel="noopener noreferrer"&gt;Dieter Rams: Ten Principles For Good Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://uxmovement.com/forms/the-best-place-for-error-messages-on-forms/" rel="noopener noreferrer"&gt;The Best Place for Error Messages on Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://microinteractions.com/" rel="noopener noreferrer"&gt;Micro interactions&lt;/a&gt; : Designing with Details&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  PHP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/radiosilence/Ham" rel="noopener noreferrer"&gt;Ham&lt;/a&gt; : PHP Microframework.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/PatrickLouys/no-framework-tutorial" rel="noopener noreferrer"&gt;No Framework Tutorial&lt;/a&gt; : A small tutorial to show how to create a PHP application without a framework.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/domnikl/DesignPatternsPHP" rel="noopener noreferrer"&gt;Design Patterns&lt;/a&gt; : sample code for several design patterns in PHP.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://phptherightway.com/" rel="noopener noreferrer"&gt;PHP The Right Way&lt;/a&gt; : An easy-to-read, quick reference for PHP popular coding standards.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ziadoz/awesome-php" rel="noopener noreferrer"&gt;Awesome PHP&lt;/a&gt; : A curated list of amazingly awesome PHP libraries, resources and shiny things.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://phpsecurity.readthedocs.io/en/latest/index.html" rel="noopener noreferrer"&gt;Survive The Deep End: PHP Security&lt;/a&gt; : PHP Security Book&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://phptownhall.com" rel="noopener noreferrer"&gt;PHPtown hall&lt;/a&gt; : A podcast for developers who want to keep up to date with the latest random happenings in the PHP community.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  General Dev Related
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://softwareengineering.stackexchange.com/questions/46716/what-technical-details-should-a-programmer-of-a-web-application-consider-before" rel="noopener noreferrer"&gt;What technical details should a programmer of a web application consider before making the site public?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://alistapart.com" rel="noopener noreferrer"&gt;A List Apart&lt;/a&gt; : Explores the design, development, and meaning of web content, with a special focus on web standards and best practices.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://a11yproject.com/" rel="noopener noreferrer"&gt;The A11Y Project&lt;/a&gt; : A community-driven effort to make web accessibility easier.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://30secondsofinterviews.org/" rel="noopener noreferrer"&gt;30 seconds of interviews&lt;/a&gt; : A curated collection of common interview questions to help you prepare for your next interview.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://philipwalton.com/articles/why-web-developers-need-to-care-about-interactivity/" rel="noopener noreferrer"&gt;Why Web Developers Need to Care about Interactivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kamranahmedse/developer-roadmap/" rel="noopener noreferrer"&gt;Developer Roadmap&lt;/a&gt; : Roadmap to becoming a web developer in 2018&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackernoon.com/top-12-things-that-destroy-developer-productivity-2ddf0abc190" rel="noopener noreferrer"&gt;Top 12 Things That Destroy Developer Productivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://3perf.com/talks/web-perf-101/" rel="noopener noreferrer"&gt;Web Performance 101&lt;/a&gt; : An introduction to the modern web loading performance.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I hope that you enjoyed this list. It will be great if you too share your bookmarks with us 🦄&lt;/p&gt;

&lt;p&gt;peace&lt;/p&gt;

</description>
      <category>tools</category>
      <category>javascript</category>
      <category>php</category>
      <category>css</category>
    </item>
    <item>
      <title>The first design iteration of my personal website</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Thu, 29 Nov 2018 01:00:14 +0000</pubDate>
      <link>https://forem.com/mazentouati/a-first-design-iteration-of-my-personal-website-37p6</link>
      <guid>https://forem.com/mazentouati/a-first-design-iteration-of-my-personal-website-37p6</guid>
      <description>&lt;p&gt;Hi folks&lt;/p&gt;

&lt;p&gt;Recently, I've shared online my first personal website and asked for feedback and suggestions. Fortunately, I've got what's enough to make another design iteration.&lt;/p&gt;

&lt;p&gt;Before I start talking about what I've changed, I invite you to check my website first, in case you missed it or to check the new version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sunchayn.github.io/old" rel="noopener noreferrer"&gt;Mazen Touati - Old version&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Great welcome back,&lt;/p&gt;

&lt;p&gt;First of all, I'm really happy that the first version got some attention and reached a lot of people world wide in less than one week.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7jlepxvlshzgbkj44eu.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7jlepxvlshzgbkj44eu.PNG" width="587" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to the Dev community for sharing love&lt;/p&gt;
&lt;h2&gt;
  
  
  Change log
&lt;/h2&gt;
&lt;h4&gt;
  
  
  General
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I changed the font family and the size ( I made them bigger and more readable )&lt;/li&gt;
&lt;li&gt;I reformulated the textual content&lt;/li&gt;
&lt;li&gt;For mobile users only: now the navbar has a blue background color across all sections&lt;/li&gt;
&lt;li&gt;I reduced the revealing delay&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Hello world section
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I made the green text glowing&lt;/li&gt;
&lt;li&gt;I added an icon to indicate the keyboard experience ( I'll talk about it later )&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  About section
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I removed the version switcher, now only the full version is accessible. The reason is : I don't want the visitor to miss an important detail about me as he most likely will choose the short path, if he is interested enough I prefer he reads the full version to get a better vision.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyomoavyidxrblscbkxnc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyomoavyidxrblscbkxnc.jpg" width="800" height="698"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I made the signature self-drawing ( a static image is showing for browsers that do not support SVG embedding )&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5sv91er9okd0pt6g9lw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5sv91er9okd0pt6g9lw.gif" width="552" height="427"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Projects section
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;In the initial version, I made a stupid UI mistake and I did not notice it until I published the website. I made the projects appear like two separate group by not maintaining an even spacing horizontally and vertically between the elements. Now it's fixed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbgucvh4mwqlrrbqmx14.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbgucvh4mwqlrrbqmx14.jpg" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I changed the animation for the hover state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k77ux2ahvtkc0i7gh7e.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k77ux2ahvtkc0i7gh7e.gif" width="548" height="231"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Blog section
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I added a title and description for the section&lt;/li&gt;
&lt;li&gt;I added a button to see all articles&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  New section : contact section
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I extracted the contact section from the BSOD section
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frovwzkokkedfh4yep9ii.png" width="800" height="386"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  BSOD section
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I made it look creepier by adding a completion status animation&lt;/li&gt;
&lt;li&gt;I changed the color to be less bright
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Feq4ntedvxnn9cdhnifcp.gif" width="960" height="540"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  New feature: keyboard experience
&lt;/h4&gt;

&lt;p&gt;Previously I made links appear like in command-line based applications. It shows the action's letter between brackets eg. [G]ithub, but I did not made it functional for technical reasons. The issue was that there's multiple links that have the same name even in the same viewport. I though about it and I've came with a solution which is triggering the link that's within the active block. The active block is selected based on the mouse position&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It's a beta feature, if you notice any buggy behavior please let me know&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  404 Page
&lt;/h4&gt;

&lt;p&gt;I noticed that previous traffic did not hit the 404 page, this is a screen shot for the page&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fa7xlquhkjfsu3mmfbna8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fa7xlquhkjfsu3mmfbna8.png" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A live example of 404 page : &lt;a href="http://sunchayn.github.io/somethingNotFound" rel="noopener noreferrer"&gt;http://sunchayn.github.io/somethingNotFound&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Misc
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I made changes on the page structure related to the SEO&lt;/li&gt;
&lt;li&gt;I optimized the content delivery for the CSS ( injected the critical CSS within the HTML )&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Future
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I plan to use the PWA techniques to make the website offline&lt;/li&gt;
&lt;li&gt;Focus more on optimizing content delivery and SEO&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Thanks
&lt;/h2&gt;

&lt;p&gt;Finally, I would like to say thanks to the generous people who gave me feedbacks and suggestions in different communities: Dev community, Twitter, Reddit.&lt;/p&gt;

&lt;p&gt;Specially these people :&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__38627"&gt;
    &lt;a href="/aspittel" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F38627%2F77a2a5e7-603e-41b4-afcc-f7aff468ae2f.jpg" alt="aspittel image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/aspittel"&gt;Ali Spittel&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/aspittel"&gt;Passionate about education, Python, JavaScript, and code art.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag__user ltag__user__id__10538"&gt;
    &lt;a href="/nektro" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F10538%2F7b306000-9464-4426-9f7e-400f0bdbc59d.jpg" alt="nektro image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/nektro"&gt;Meghan (she/her)&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/nektro"&gt;24. Local trans witch who prefers to do magic with a keyboard. she/her. Currently hacking away at making the Web less centralized.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag__user ltag__user__id__99032"&gt;
    &lt;a href="/julesmanson" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F99032%2F33951f65-7498-4b63-9a3e-14b38519568a.jpeg" alt="julesmanson image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/julesmanson"&gt;jules manson&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/julesmanson"&gt;Mechanical engineer who dabbles with Vanilla Javscript and web development as a hobbby. I don't use any libraries or frameworks as they take the fun out creating your own solutions.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag__user ltag__user__id__83883"&gt;
    &lt;a href="/qm3ster" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F83883%2Fe92d6f32-9a89-4a7e-8d5b-f629b42a701e.jpg" alt="qm3ster image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/qm3ster"&gt;Mihail Malo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/qm3ster"&gt;&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;A special thanks go to &lt;a href="https://tylercharboneau.com/" rel="noopener noreferrer"&gt;Tyler Charboneau&lt;/a&gt; for proofreading and suggesting a better textual content for my entire website.&lt;/p&gt;

&lt;p&gt;I'm always thrilled to hear better ideas and suggestions. Please let me know if you have some, peace.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>Sharing my first personal website</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Thu, 22 Nov 2018 19:08:36 +0000</pubDate>
      <link>https://forem.com/mazentouati/sharing-my-first-personal-website-2fao</link>
      <guid>https://forem.com/mazentouati/sharing-my-first-personal-website-2fao</guid>
      <description>&lt;p&gt;Hi, folks&lt;/p&gt;

&lt;p&gt;Finally, I made my first personal website. I'm a full-stack web developer who believes in simplicity and minimalism. In my personal website, I aimed to convey these feelings through a simple geeky design and UX.&lt;/p&gt;

&lt;p&gt;well let's not talk too much, here it is :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sunchayn.github.io/old" rel="noopener noreferrer"&gt;Mazen Touati - Old version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll incrementally add tweaks to the website due the fact that I made it in a rush somehow. I'll open the source code when I organize and document it.&lt;/p&gt;

&lt;p&gt;Third party plugins i used :&lt;br&gt;
&lt;a href="https://scrollrevealjs.org/" rel="noopener noreferrer"&gt;scroll reveal&lt;/a&gt;&lt;br&gt;
Throttle from &lt;a href="https://lodash.com/" rel="noopener noreferrer"&gt;lodash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please let me hear your thoughts and suggestion, thanks.&lt;/p&gt;


&lt;h2&gt;
  
  
  Notice
&lt;/h2&gt;

&lt;p&gt;I made the first design iteration, so what you seeing now is an updated version, please refer to this post to see what's changed&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/mazentouati" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F112675%2Fec691b63-af5d-4468-9a8e-17f39fa6cd43.jpeg" alt="mazentouati"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/mazentouati/a-first-design-iteration-of-my-personal-website-37p6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The first design iteration of my personal website&lt;/h2&gt;
      &lt;h3&gt;Mazen Touati ・ Nov 29 '18&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#portfolio&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>showdev</category>
      <category>portfolio</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Snacks@console Intuitive browser-based SQL Console</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Sat, 17 Nov 2018 18:04:10 +0000</pubDate>
      <link>https://forem.com/mazentouati/snacksconsole-intuitive-browser-based-sql-console-2bci</link>
      <guid>https://forem.com/mazentouati/snacksconsole-intuitive-browser-based-sql-console-2bci</guid>
      <description>&lt;p&gt;Hey, folks&lt;/p&gt;

&lt;p&gt;Recently I kept myself busy creating an opensource project called "Snacks Project". Which is an intuitive database toolkit to make the database management process faster and happier.&lt;/p&gt;

&lt;p&gt;Today, I'm going to share with you the first module of this project. Which is a browser-based console to run and save SQL queries.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sunchayn" rel="noopener noreferrer"&gt;
        sunchayn
      &lt;/a&gt; / &lt;a href="https://github.com/sunchayn/snacks-console" rel="noopener noreferrer"&gt;
        snacks-console
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An intuitive browser-based SQL console to run and save SQL queries.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;mazentouati/snacks-console&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/mazentouati/snacks-console/releases/tag/0.1.0" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3bfd4fe5599658329522d63e7a62e5852b6f6fb816168c76d978c34675da92dc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652d7072652f6d617a656e746f756174692f736e61636b732d636f6e736f6c652e737667" alt="GitHub (pre-)release"&gt;&lt;/a&gt;
&lt;a href="https://scrutinizer-ci.com/g/mazentouati/snacks-console/?branch=master" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/523812beb217dd1048277825f7745ed0bf7b49bf8a71828d51d5947a3f8a20ea/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6d617a656e746f756174692f736e61636b732d636f6e736f6c652f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572" alt="Scrutinizer Code Quality"&gt;&lt;/a&gt;
&lt;a href="https://styleci.io/repos/157928738" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f1256c7e7d44d5fd6ca35337196a6475c5398604e33d980a69c37dee4ccc883/68747470733a2f2f7374796c6563692e696f2f7265706f732f3135373239323038302f736869656c64" alt="StyleCI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/sunchayn/snacks-console./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5ddd6787b46ff6b3a6e8bfa779dc451433a990e470ffe28b66c8fb4a3e5035ca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265" alt="Software License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An intuitive browser-based SQL console to run and save SQL queries.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/90f17d0919b2377eff186587892e4bd91d4b51c37294e81edbc1007db6bcff92/68747470733a2f2f6d617a656e746f756174692e6769746875622e696f2f736e61636b73636f6e736f6c652f7075626c69632f7374617469632f73637265656e73686f74732f736e61636b73636f6e736f6c652e676966"&gt;&lt;img src="https://camo.githubusercontent.com/90f17d0919b2377eff186587892e4bd91d4b51c37294e81edbc1007db6bcff92/68747470733a2f2f6d617a656e746f756174692e6769746875622e696f2f736e61636b73636f6e736f6c652f7075626c69632f7374617469632f73637265656e73686f74732f736e61636b73636f6e736f6c652e676966" alt="demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage guideline&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Snacks@console is a PHP based application. Before you use it, you have to make sure that your system is ready to run PHP applications. All web server such as &lt;a href="https://laragon.org/" rel="nofollow noopener noreferrer"&gt;Laragon&lt;/a&gt; (recommended) or &lt;a href="https://www.apachefriends.org" rel="nofollow noopener noreferrer"&gt;XAMPP&lt;/a&gt; provide bundle all the requirement to run a PHP based application in one package.&lt;/p&gt;
&lt;p&gt;After you setup your webserver. Open the command line inside the web server's root directory, usally &lt;code&gt;www&lt;/code&gt;, and follow along the installation process&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;through composer&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;we recommend installing this package through  &lt;a href="http://getcomposer.org/" rel="nofollow noopener noreferrer"&gt;composer&lt;/a&gt; :&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;composer create-project mazentouati/snacks-console &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;console&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note: make sure that your web server enables the RewriteEngine.&lt;/em&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Plans&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This is an initial version, it's just a prototype to test and enhance the current experience. We plan to add the following features :&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Enhance queries support&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;currently the console supports the following commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select&lt;/li&gt;
&lt;li&gt;Update&lt;/li&gt;
&lt;li&gt;Delete&lt;/li&gt;
&lt;li&gt;Insert&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sunchayn/snacks-console" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;currently the console supports the following commands:
( Select, Update, Delete, Insert, Use &lt;code&gt;database&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;bookmark favorite queries&lt;/li&gt;
&lt;li&gt;built-in terminal commands&lt;/li&gt;
&lt;li&gt;neat table representation for select queries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usage guideline
&lt;/h2&gt;

&lt;p&gt;Snacks@console is a PHP based application. Before you use it, you have to make sure that your system is ready to run PHP applications. All web server such as &lt;a href="https://laragon.org/" rel="noopener noreferrer"&gt;Laragon&lt;/a&gt; (recommended) or &lt;a href="https://www.apachefriends.org" rel="noopener noreferrer"&gt;XAMPP&lt;/a&gt; provide all the requirement to run a PHP based application in one package.&lt;/p&gt;

&lt;p&gt;After you setup your webserver. Open the command line inside the web server's root directory, usally &lt;code&gt;www&lt;/code&gt;, and follow along the installation process&lt;/p&gt;

&lt;h3&gt;
  
  
  through composer
&lt;/h3&gt;

&lt;p&gt;I recommend installing this package through &lt;a href="http://getcomposer.org/" rel="noopener noreferrer"&gt;composer&lt;/a&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer create-project mazentouati/snacks-console &lt;span class="s2"&gt;"_folder_name"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: make sure that your web server enables the RewriteEngine.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;then access your &lt;code&gt;"_folder_name"&lt;/code&gt; folder via your browser and the initial setup will popup to set your database credentials, then redirect you to the console interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future
&lt;/h2&gt;

&lt;p&gt;I plan to enhance the current experience as the current version is somehow a prototype to study the users feed backs and suggestion. Though, i'm going to add the following features :&lt;/p&gt;

&lt;h4&gt;
  
  
  Extended command support
&lt;/h4&gt;

&lt;p&gt;Theoretically, it can execute any SQL command but I plan to make the experience of DDL ( data definition language ) like &lt;code&gt;Create&lt;/code&gt; or &lt;code&gt;Alter&lt;/code&gt; more accessible by supporting interactive inserting in the console.&lt;/p&gt;

&lt;h4&gt;
  
  
  Add syntax highlight
&lt;/h4&gt;

&lt;p&gt;Additionally, I plan to add syntax highlight for the SQL commands&lt;/p&gt;

&lt;h4&gt;
  
  
  Enhance the manipulation of the fetched data
&lt;/h4&gt;

&lt;p&gt;Currently, the data shown when using &lt;code&gt;select&lt;/code&gt; command isn't interactive. I plan to make the table re-sizable, the cells clickable ( shows full column's data when click ) and whatever required to make it more interactive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;p&gt;Unfortunately, I'm overwhelmed by Snacks project and it's sub-projects. I'll incrementally add the documentation, tests for both the source code and the application.&lt;/p&gt;

&lt;p&gt;I'm really thrilled to hear your suggestions and thoughts.&lt;/p&gt;

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

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>php</category>
    </item>
    <item>
      <title>PHP Simple two way config package, and a backstory</title>
      <dc:creator>Mazen Touati</dc:creator>
      <pubDate>Tue, 13 Nov 2018 18:18:24 +0000</pubDate>
      <link>https://forem.com/mazentouati/php-simple-two-way-config-package-and-a-backstory-1aac</link>
      <guid>https://forem.com/mazentouati/php-simple-two-way-config-package-and-a-backstory-1aac</guid>
      <description>&lt;p&gt;Hi, folks&lt;/p&gt;

&lt;p&gt;I'm happy to introduce my first open source project. Which is a two way PHP-based configuration package. This package is designed to make it easy synchronizing the source file with the run-time values. It's suitable for applications that require the use of file-based system to store preferences or configuration.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sunchayn" rel="noopener noreferrer"&gt;
        sunchayn
      &lt;/a&gt; / &lt;a href="https://github.com/sunchayn/simple-2way-config" rel="noopener noreferrer"&gt;
        simple-2way-config
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Simple 2 way (read/write) php-based configuration
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;mazentouati/simple-2way-config&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/mazentouati/simple-2way-config/releases/tag/0.1.0" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/63c4354d48701a97e22bd99cd9e2b3f5d875ded622efbf525de79eda2e824e13/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652d7072652f6d617a656e746f756174692f73696d706c652d327761792d636f6e6669672e737667" alt="GitHub (pre-)release"&gt;&lt;/a&gt;
&lt;a href="https://travis-ci.org/mazentouati/simple-2way-config" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dd402d903863fc152ca92f8b2edef70623a7c9993be2cbc4969474df1c62f2c2/68747470733a2f2f7472617669732d63692e6f72672f6d617a656e746f756174692f73696d706c652d327761792d636f6e6669672e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://scrutinizer-ci.com/g/mazentouati/simple-2way-config/?branch=master" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f5772dd0eda97c9c1579f17cde1f0eefd839626f45f20a12f3eead23fa0384a2/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6d617a656e746f756174692f73696d706c652d327761792d636f6e6669672f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572" alt="Scrutinizer Code Quality"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/mazentouati/simple-2way-config" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3bd75e5cb8598d9dc36b094a2697cc180e82ca55b011715645442eeb777fceeb/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f6d617a656e746f756174692f73696d706c652d327761792d636f6e6669672f6d61737465722e7376673f7374796c653d666c61742d737175617265" alt="Codecov branch"&gt;&lt;/a&gt;
&lt;a href="https://styleci.io/repos/157292080" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f1256c7e7d44d5fd6ca35337196a6475c5398604e33d980a69c37dee4ccc883/68747470733a2f2f7374796c6563692e696f2f7265706f732f3135373239323038302f736869656c64" alt="StyleCI"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/mazentouati/simple-2way-config/maintainability" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/244437e09875270503251c4aa55b06a453c5cfd3c3ffaccd5178a6a4074dba0b/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f38663731626130333533363335633766343335302f6d61696e7461696e6162696c697479" alt="Maintainability"&gt;&lt;/a&gt;
&lt;a href="https://github.com/sunchayn/simple-2way-config./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5ddd6787b46ff6b3a6e8bfa779dc451433a990e470ffe28b66c8fb4a3e5035ca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265" alt="Software License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Simple 2 way configuration is a php-based read and write configuration library. It's suitable for applications that require the use of file system to store preferences or configuration.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;we recommend installing this package through  &lt;a href="http://getcomposer.org/" rel="nofollow noopener noreferrer"&gt;composer&lt;/a&gt; :&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;composer require mazentouati/simple-2way-config&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The simplest way to use it is through the package's factory. The factory's required parameter is the path of the directory that holds your config files.&lt;/p&gt;
&lt;div class="highlight highlight-text-html-php notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;use&lt;/span&gt; &lt;span class="pl-v"&gt;MazenTouati&lt;/span&gt;\&lt;span class="pl-v"&gt;Simple2wayConfig&lt;/span&gt;\&lt;span class="pl-smi"&gt;S2WConfigFactory&lt;/span&gt;;

&lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;config&lt;/span&gt; = S2WConfigFactory::&lt;span class="pl-en"&gt;create&lt;/span&gt;( &lt;span class="pl-c1"&gt;__DIR__&lt;/span&gt; . &lt;span class="pl-s"&gt;'&lt;span class="pl-s"&gt;/demo&lt;/span&gt;'&lt;/span&gt; );&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Now you can access to a config value using dot notation '{filename}.path.to.value'&lt;/p&gt;
&lt;div class="highlight highlight-text-html-php notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;host&lt;/span&gt; = &lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;config&lt;/span&gt;-&amp;gt;&lt;span class="pl-en"&gt;get&lt;/span&gt;(&lt;span class="pl-s"&gt;'&lt;span class="pl-s"&gt;database.drivers.mysql.host&lt;/span&gt;'&lt;/span&gt;);&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note: your config file should be an array-based configuration, check this &lt;a href="https://github.com/sunchayn/simple-2way-config#configuration-file-formats" rel="noopener noreferrer"&gt;example&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;API&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;the config API implements the &lt;code&gt;S2WConfigInterface&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;the examples shown below will assume that you already assigned your config to a variable called &lt;code&gt;$config&lt;/code&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;get(string $path,&lt;/h3&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sunchayn/simple-2way-config" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  example of usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;MazenTouati\Simple2wayConfig\S2WConfigFactory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;S2WConfigFactory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/demo'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Get a value from the config&lt;/span&gt;
&lt;span class="nv"&gt;$old_host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$config&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'database.drivers.mysql.host'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Change the value at the run-time&lt;/span&gt;
&lt;span class="nv"&gt;$config&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'database.drivers.mysql.host'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Sync the changes with the source file&lt;/span&gt;
&lt;span class="nv"&gt;$config&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'database'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;If you like the project kindly share love and leave a start, it will help me a lot. Suggestions and contributions are welcomed too. &lt;/p&gt;

&lt;h2&gt;
  
  
  Back story
&lt;/h2&gt;

&lt;p&gt;Somewhere in my full-stack development journey, I decided to be involved in the open source industry and practice my knowledge more and more, especially for the front-end part as it's evolving so fast with a lot of over-engineered libraries and frameworks. So I started planning then creating a project I thought about for a while. Which is a database toolkit dedicated to small and medium project. Well, it's totally worth it as I learnt a lot of new things. From comparing and testing: Vue, Angular and React, later I abandoned them, to creating my own solutions or small packages like: templating, data binding, etc. I don't think that I'm re-inventing the wheel in this case because as I mentioned before there's a plenty of over-engineered solutions that aim to solve all problems and cover all use cases. I'm a simple, pragmatic man, I want only to use what's enough for me and my product. Bombarding it with a lot of unused code or generic solution is against my most prioritized goal (for the toolkit) which is "Performance".&lt;/p&gt;

&lt;p&gt;With that said, it brings us to this post subject, I came across a point where I needed to make configuring the database credentials read and write. I don't have another choices, I searched for a simple package that offers the ability to make the configuration two ways but noway. &lt;br&gt;
Here is my use case: I'm building a SQL console that execute commands one by one, when the Developer type &lt;code&gt;use _database_&lt;/code&gt; it should take the database name and update it in the config file then return a success message to the console interface (using AJAX of course). So when he continues throwing SQL commands to the console the Back-end code uses the new database name. Which will become persistent for future use. In a case like this I didn't have the luxury to use a database for dynamic configuration. To solve my issue, I forked an existing package and added the write functionality just to be able to continue working on the console. I used composer VCS repositories to load the fork. Later, after I finished the console I created this package and implemented it in my toolkit because I wasn't comfortable enough with that fork.&lt;/p&gt;

&lt;p&gt;The console (part of the toolkit) is ready for a pre-release I'll publish it as soon as I finish creating it's homepage.I'll post more details about my journey creating this toolkit when I release it.&lt;/p&gt;

&lt;p&gt;These are the things I have learned till now as far as I can recall (some I heard about but never used them, some I knew them but I practiced them more)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Javascript: React, Vue, Reveal Pattern, Sub-pub, Data binding, ES2016, Gulp, More VanillaJS, HTML Tag's templating ( usings custom attribute ) ...&lt;/li&gt;
&lt;li&gt;CSS: SMACSS, More flexbox&lt;/li&gt;
&lt;li&gt;PHP: Unit Testing, Continuous Integration, Slim Micro Framework, Code-sniffer, More composer&lt;/li&gt;
&lt;li&gt;Other: Git, Vim, Lossless coupled components, Modular Programming in general, more command line...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, I'm very happy and satisfied for what I passed through till now. Go ahead and start creating your open source projects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;practice makes perfect&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'd like to hear your thoughts, peace !&lt;/p&gt;

</description>
      <category>php</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
