<?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: Yoginth</title>
    <description>The latest articles on Forem by Yoginth (@yo).</description>
    <link>https://forem.com/yo</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%2F70813%2F6501121f-39dd-4e62-b414-fdb2f5077246.png</url>
      <title>Forem: Yoginth</title>
      <link>https://forem.com/yo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/yo"/>
    <language>en</language>
    <item>
      <title>Serving Open Graph to Bots at hey.xyz: Our Client-Side SPA Approach</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Sun, 20 Apr 2025 06:28:23 +0000</pubDate>
      <link>https://forem.com/yo/serving-open-graph-to-bots-at-heyxyz-our-client-side-spa-approach-k8l</link>
      <guid>https://forem.com/yo/serving-open-graph-to-bots-at-heyxyz-our-client-side-spa-approach-k8l</guid>
      <description>&lt;p&gt;At &lt;a href="https://hey.xyz" rel="noopener noreferrer"&gt;hey.xyz&lt;/a&gt;, we built a client-side SPA using Vite and React Router 7. But this created a challenge - how do you serve proper metadata to social media crawlers and search engines when your app renders client-side?&lt;/p&gt;

&lt;p&gt;Our solution was to create a dual-architecture system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Main Web App: CSR app built with Vite + React Router 7 hosted on Cloudflare Pages&lt;/li&gt;
&lt;li&gt;OG Service: Minimal SSR Next.js app hosted on Railway that only renders metadata, no UI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The secret sauce is a Cloudflare Worker that acts as our traffic cop. It checks incoming requests for bot user agents, and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If it's a regular user: Pass them to our slick CSR app&lt;/li&gt;
&lt;li&gt;If it's a bot: Redirect to our specialized OG service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the Cloudflare Interface where we connect the Worker with the Web app&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%2F2hjrgxylvdnldhlupmz5.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%2F2hjrgxylvdnldhlupmz5.png" alt="Image description" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've set a generous cache policy (30 days) for bot responses since our metadata doesn't change often.&lt;/p&gt;

&lt;p&gt;This approach lets us keep our main app fast and interactive for actual users while still having proper social sharing and SEO. No need to sacrifice the benefits of a modern CSR app just to satisfy crawlers.&lt;/p&gt;

&lt;p&gt;Here is the flow diagram of how things work&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%2Fpq673j16nsqcq6g5z6tk.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%2Fpq673j16nsqcq6g5z6tk.png" alt="Image description" width="800" height="777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Honestly, this pattern is so clean and efficient - we're never going back to server-rendering our entire app just for bots.&lt;/p&gt;

&lt;p&gt;This strategy helps us deliver millions of requests in a cost-efficient way, keeping our infrastructure costs low while providing the best experience for both users and search engines.&lt;/p&gt;

&lt;p&gt;PS: Here is our Cloudflare worker code the checks for all requests&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;botRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;Bot|Twitterbot|facebookexternalhit|LinkedInBot|Slackbot|Discordbot|TelegramBot|WhatsApp|Googlebot|Bingbot|Applebot&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user-agent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// If not a bot, pass through&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;botRegex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userAgent&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// If bot, rewrite to og.hey.xyz&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;targetUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://og.hey.xyz&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rewrittenRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HEAD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;follow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rewrittenRequest&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;newHeaders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;newHeaders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public, max-age=2592000, immutable&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;statusText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newHeaders&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Original version can be found here: &lt;a href="https://world.hey.com/yoginth/serving-open-graph-to-bots-at-hey-xyz-our-client-side-spa-approach-8b4af2a3" rel="noopener noreferrer"&gt;https://world.hey.com/yoginth/serving-open-graph-to-bots-at-hey-xyz-our-client-side-spa-approach-8b4af2a3&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>seo</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to ship small features rapidly to production 🚀 and what is feature flags</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Sat, 09 Jan 2021 13:01:35 +0000</pubDate>
      <link>https://forem.com/yo/how-to-ship-small-features-rapidly-to-production-and-what-is-feature-flags-11ic</link>
      <guid>https://forem.com/yo/how-to-ship-small-features-rapidly-to-production-and-what-is-feature-flags-11ic</guid>
      <description>&lt;p&gt;Hey folks 👋&lt;/p&gt;

&lt;p&gt;I'm the creator of &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt;, I deploy Taskord more than 100 times daily.&lt;/p&gt;

&lt;p&gt;In this article, I'm gonna explain how to &lt;strong&gt;ship rapidly to production&lt;/strong&gt; without any error and let us see what the heck is &lt;strong&gt;Staff Ship&lt;/strong&gt; and feature flags!&lt;/p&gt;

&lt;h2&gt;
  
  
  🌱 Planning
&lt;/h2&gt;

&lt;p&gt;Let us consider we are building a brand new &lt;strong&gt;Explore page&lt;/strong&gt; and &lt;code&gt;/explore&lt;/code&gt; is going to be the URL. Plan about&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How is the &lt;strong&gt;UI&lt;/strong&gt; going to look&lt;/li&gt;
&lt;li&gt;Do we have all &lt;strong&gt;UI components&lt;/strong&gt; available&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data model&lt;/strong&gt; and what are the &lt;strong&gt;tables&lt;/strong&gt; we need to create for a &lt;strong&gt;database&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Any &lt;strong&gt;blocking&lt;/strong&gt; Issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't think a lot and waste the time, we can add/improve it in the next Iteration.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌵 First Pull/Merge Request
&lt;/h2&gt;

&lt;p&gt;After the proper planning just go ahead and create the first page just saying &lt;code&gt;Hello, World!&lt;/code&gt; and point it to &lt;code&gt;/explore&lt;/code&gt; in your routes file.&lt;/p&gt;

&lt;p&gt;After that commit and push to GitHub/GitLab and create your first pull request.&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%2Fi%2F9fqpueazuqgot6ei7h0v.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%2Fi%2F9fqpueazuqgot6ei7h0v.png" alt="Screenshot 2021-01-09 173436" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This step is optional if you are a solo developer, you can push all the way straight to &lt;code&gt;main&lt;/code&gt;/&lt;code&gt;master&lt;/code&gt; branch (but it is not suggested).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  👨‍💻 Development
&lt;/h2&gt;

&lt;p&gt;After creating the pull request start concentrating on developing the app. If you have any dependency on the backend team don't wait for them until they complete.&lt;/p&gt;

&lt;p&gt;Instead, just mock the JSON Response and start developing the work, make sure to give the JSON Spec to the backend team to develop the API in such a way you want. If not we need to rework again based on their API response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Communication and time are crucial.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧪 Testing
&lt;/h2&gt;

&lt;p&gt;After completing the development wait for the CI to become green for that pull request.&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%2Fi%2F9849dlcgaaxfz4nfq56g.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%2Fi%2F9849dlcgaaxfz4nfq56g.png" alt="Screenshot 2021-01-09 175331" width="671" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once all the tests have been passed merge the branch to &lt;code&gt;main&lt;/code&gt;/&lt;code&gt;production&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Deploy the feature to your staging instance, so you can deploy to production servers without fear. Test everything well, create a small checklist and check everything is done and working fine in staging instance before moving to production.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is feature flags/toggle?
&lt;/h3&gt;

&lt;p&gt;Feature flags are simply a toggle button which has the ability to turn features of your application on/off easily based on condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡 Staff Release
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbg08uqagn3onq47e60bv.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%2Fi%2Fbg08uqagn3onq47e60bv.png" alt="Screenshot 2021-01-09 182645" width="230" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After testing well, deploy &lt;code&gt;main&lt;/code&gt; branch to production servers where the new feature exists.&lt;/p&gt;

&lt;p&gt;Post in your internal slack that &lt;em&gt;"Hey, we just shipped the explore page to our production servers 🐿, make sure to tun on staff ship. Feedbacks welcomed 😊"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then sit back and relax for some time till the feedback arrives. If it has any bugs fix it ASAP.&lt;/p&gt;

&lt;h3&gt;
  
  
  By the way what is staff ship 🤔
&lt;/h3&gt;

&lt;p&gt;Staff ship is a feature flag which is available only for site admins possibly mods, where admin can tun on the flag and check whether the feature is working or not.&lt;/p&gt;

&lt;p&gt;When staff ship is enabled admins can see this special admin/performance bar above the navbar which is heavily inspired by GitHub.com&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taskord's admin bar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fef0ncehewxgsqjcst3t8.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%2Fi%2Fef0ncehewxgsqjcst3t8.png" alt="Screenshot 2021-01-09 181035" width="800" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub's admin bar&lt;/strong&gt; (GH Enterprise)&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%2Fi%2Fgai7ydvykwzz7vw0rolu.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%2Fi%2Fgai7ydvykwzz7vw0rolu.png" alt="3" width="800" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the sample video how staff ship works in &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt;, the staff ship is enabled when pressing backtick or &lt;code&gt;pb&lt;/code&gt; shortcut key in the keyboard which is available only for admins.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/OhXQc8I-GpU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  👥 Beta Release
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7azsaqxkfo449069yit9.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%2Fi%2F7azsaqxkfo449069yit9.png" alt="Screenshot 2021-01-09 182727" width="182" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release the &lt;code&gt;/explore&lt;/code&gt; page for selected users, usually, you can do by shipping to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users based on age&lt;/li&gt;
&lt;li&gt;50% of platform users&lt;/li&gt;
&lt;li&gt;Users with beta flag enabled, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💬 Feedback
&lt;/h2&gt;

&lt;p&gt;Feedbacks are critical, you will get a lot if the userbase is huge, make sure to evaluate quickly and fix the bugs in upcoming &lt;strong&gt;Iterations&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatic Error Tracking
&lt;/h3&gt;

&lt;p&gt;Error Tracking is also a part of feedback, this need be done automatically. We use &lt;a href="https://sentry.io" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt; to track errors and patch the fix quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is how Sentry looks like&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdzx820fc868jqor6rmdc.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%2Fi%2Fdzx820fc868jqor6rmdc.png" alt="Screenshot 2021-01-09 182053" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌎 General Availability
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feyz156cw9qo9kyrlzqzj.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%2Fi%2Feyz156cw9qo9kyrlzqzj.png" alt="Screenshot 2021-01-09 182805" width="183" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If all settled and good to go, just go ahead and remove all the feature flags for &lt;code&gt;/explore&lt;/code&gt; page. Make sure to keep an eye on Sentry for a few days.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠ Be careful
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prepare to revert the PR anytime if there is an issue in production ↩&lt;/li&gt;
&lt;li&gt;Commit every change 😅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope this article helped you 😊&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Shipping 🚀&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Taskord Changelog - Dec 27</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Sun, 27 Dec 2020 14:40:58 +0000</pubDate>
      <link>https://forem.com/taskord/taskord-changelog-dec-27-5f1i</link>
      <guid>https://forem.com/taskord/taskord-changelog-dec-27-5f1i</guid>
      <description>&lt;p&gt;Welcome to &lt;strong&gt;Taskord Changelog&lt;/strong&gt; 📜, This is a weekly post where we share what we shipped to &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt; this week.&lt;/p&gt;

&lt;p&gt;Visit Taskord: &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This week on Taskord&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added &lt;strong&gt;Sweetalert 2&lt;/strong&gt; for alerts ✅&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%2Fi%2F4bpw3rjjv5c8tx2v1tiz.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%2Fi%2F4bpw3rjjv5c8tx2v1tiz.png" alt="Screenshot 2020-12-27 194942" width="391" height="238"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RSS feed&lt;/strong&gt; for User and Product's Tasks 🔊&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example feed: &lt;a href="https://taskord.com/feed/user/yo" rel="noopener noreferrer"&gt;https://taskord.com/feed/user/yo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhlcgurnou58azuw2u0sa.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%2Fi%2Fhlcgurnou58azuw2u0sa.png" alt="Screenshot 2020-12-27 195244" width="279" height="126"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://taskord.com/settings/logs" rel="noopener noreferrer"&gt;&lt;strong&gt;Security Logs&lt;/strong&gt;&lt;/a&gt; for user account 📜&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%2Fi%2Fz567rni28t6ekziqakml.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%2Fi%2Fz567rni28t6ekziqakml.png" alt="Screenshot 2020-12-27 195322" width="800" height="382"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User reputation points &lt;a href="https://taskord.com/reputation" rel="noopener noreferrer"&gt;&lt;strong&gt;log page&lt;/strong&gt;&lt;/a&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%2Fi%2Fi1pl12bu7v1f6kw44b3l.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%2Fi%2Fi1pl12bu7v1f6kw44b3l.png" alt="Screenshot 2020-12-27 195404" width="800" height="375"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added &lt;strong&gt;keyboard shortcuts&lt;/strong&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%2Fi%2Fxi7yw0lcx2bh1dhscdij.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%2Fi%2Fxi7yw0lcx2bh1dhscdij.png" alt="Screenshot 2020-12-27 195443" width="522" height="462"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix &lt;strong&gt;accessibility&lt;/strong&gt; around the site 👁&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%2Fi%2Fprnk048txzf000c34x5g.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%2Fi%2Fprnk048txzf000c34x5g.png" alt="Screenshot 2020-12-27 195526" width="800" height="257"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Markdown&lt;/strong&gt; support is enhanced 📝&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%2Fi%2Fvaphiaa98nnypkv0zetc.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%2Fi%2Fvaphiaa98nnypkv0zetc.png" alt="Screenshot 2020-12-27 195609" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User can now export their &lt;strong&gt;account logs&lt;/strong&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%2Fi%2F3oup5xhtbft7nlvzz0t4.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%2Fi%2F3oup5xhtbft7nlvzz0t4.png" alt="Screenshot 2020-12-27 195652" width="800" height="357"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User can now able to &lt;strong&gt;reset their account&lt;/strong&gt; without deleting 🔃&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%2Fi%2Fsm900ejm1k6buz9s1lw9.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%2Fi%2Fsm900ejm1k6buz9s1lw9.png" alt="Screenshot 2020-12-27 201031" width="800" height="255"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;strong&gt;Links Prefetch&lt;/strong&gt; so the platform feels faster 🚀&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JQuery&lt;/strong&gt; is no more on Taskord 😊&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy shipping ❤️&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>changelog</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Taskord Changelog - Dec 21</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Mon, 21 Dec 2020 02:15:04 +0000</pubDate>
      <link>https://forem.com/taskord/taskord-changelog-dec-21-2d55</link>
      <guid>https://forem.com/taskord/taskord-changelog-dec-21-2d55</guid>
      <description>&lt;p&gt;Welcome to &lt;strong&gt;Taskord Changelog&lt;/strong&gt; 📜, This is a weekly post where we share what we shipped to &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt; this week.&lt;/p&gt;

&lt;p&gt;Visit Taskord: &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This week on Taskord&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brand new Icon set, Thanks to &lt;a href="https://heroicons.com" rel="noopener noreferrer"&gt;Heroicons&lt;/a&gt;, no more slowly Font Awesome&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%2Fi%2Fsp1x89ll1exuoc98v3f2.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%2Fi%2Fsp1x89ll1exuoc98v3f2.png" alt="Screenshot 2020-12-21 073420" width="533" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fyjikgxnzzihwopt8psyk.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%2Fi%2Fyjikgxnzzihwopt8psyk.png" alt="Screenshot 2020-12-21 073536" width="207" height="387"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users can now set account Status&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%2Fi%2F6l5l0blb0nwhmkl581mh.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%2Fi%2F6l5l0blb0nwhmkl581mh.png" alt="Screenshot 2020-12-21 073630" width="434" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flqqyjfe92avfz3s1b1ss.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%2Fi%2Flqqyjfe92avfz3s1b1ss.png" alt="Screenshot 2020-12-21 073652" width="258" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improved web vitals score&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%2Fi%2F9e89tr5aak5dd8c2e3hh.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%2Fi%2F9e89tr5aak5dd8c2e3hh.png" alt="Screenshot 2020-12-21 073934" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dark mode is now even darker&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%2Fi%2Fbztx6iu1zeiosrtjdf0b.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%2Fi%2Fbztx6iu1zeiosrtjdf0b.png" alt="Screenshot 2020-12-21 074053" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added Product avatar on the popover&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%2Fi%2Fjlv70eaj009il882zlt1.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%2Fi%2Fjlv70eaj009il882zlt1.png" alt="Screenshot 2020-12-21 074315" width="359" height="174"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improved sidebar design&lt;/li&gt;
&lt;li&gt;Now Images are served from Imagekit CDN&lt;/li&gt;
&lt;li&gt;Lot more security and performance improvement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy shipping ❤️&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>changelog</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Taskord is out now 🎉</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Sat, 17 Oct 2020 08:27:18 +0000</pubDate>
      <link>https://forem.com/yo/taskord-is-out-now-enf</link>
      <guid>https://forem.com/yo/taskord-is-out-now-enf</guid>
      <description>&lt;p&gt;Hey folks 👋&lt;/p&gt;

&lt;p&gt;We are now live on ProductHunt &lt;a href="https://meow.ph/taskord" rel="noopener noreferrer"&gt;https://meow.ph/taskord&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the past three months, I was working on a project called Taskord as a part of 100 Days of Code. Fortunately, the project now turns into a public product.&lt;/p&gt;

&lt;p&gt;Make sure to signup today &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Taskord?
&lt;/h2&gt;

&lt;p&gt;Taskord is free open source social media for tasks! where users can post public and private todos, ask questions, and launch products. Taskord helps you to get things done together with the members of the community.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Login / Signup&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Secured PWNED Validator 🛡&lt;/li&gt;
&lt;li&gt;Social auth via Google or Twitter 🌐&lt;/li&gt;
&lt;li&gt;Magic Link authentication 🔮&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Tasks&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Pending Tasks ⌛&lt;/li&gt;
&lt;li&gt;Done Tasks ✅&lt;/li&gt;
&lt;li&gt;Due date 📅 (only for patrons)&lt;/li&gt;
&lt;li&gt;Multiple Image Upload 📸&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Questions&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Answers 💬&lt;/li&gt;
&lt;li&gt;Trending Questions 📈&lt;/li&gt;
&lt;li&gt;Patron's Questions 🔒 (only for patrons)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Product&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Product related tasks ✅&lt;/li&gt;
&lt;li&gt;Subscribe ➕&lt;/li&gt;
&lt;li&gt;Release Updates 📦&lt;/li&gt;
&lt;li&gt;Stats 📊 (Coming Soon)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;User&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;User related tasks ✅&lt;/li&gt;
&lt;li&gt;Follow ➕&lt;/li&gt;
&lt;li&gt;Reputations 🎮&lt;/li&gt;
&lt;li&gt;Goals 🎯&lt;/li&gt;
&lt;li&gt;Stats 📊 (Coming Soon)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Integration&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;GitHub 🐙&lt;/li&gt;
&lt;li&gt;GitLab 🦊&lt;/li&gt;
&lt;li&gt;Webhook ⚓&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Deals&lt;/strong&gt; 🎁 (only for patrons)&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Meetups&lt;/strong&gt; 🤝 (coming soon)&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Dark mode&lt;/strong&gt; 🌑 (only for patrons)&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;We are looking forward to your feedback, roasts, bugs, features, anything you want!&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Taskord Changelog - Oct 13</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Tue, 13 Oct 2020 03:04:16 +0000</pubDate>
      <link>https://forem.com/taskord/taskord-changelog-oct-13-2bc</link>
      <guid>https://forem.com/taskord/taskord-changelog-oct-13-2bc</guid>
      <description>&lt;p&gt;Welcome to &lt;strong&gt;Taskord Changelog&lt;/strong&gt; 📜, This is a weekly post where we share what we shipped to &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt; this week.&lt;/p&gt;

&lt;p&gt;Visit Taskord: &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This week on Taskord&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implemented Abuse detection and prevention system to prevent DOS and bad users&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%2Fi%2F58et5qm81elinf7o4sg1.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%2Fi%2F58et5qm81elinf7o4sg1.png" alt="Screenshot (24)" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix alert's close buttons&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%2Fi%2Fhjgaf8gq7abtz2m5pfju.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%2Fi%2Fhjgaf8gq7abtz2m5pfju.png" alt="Screenshot 2020-10-12 084244" width="800" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Display Product members in the product card&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%2Fi%2Favv4qno4l4wm8q8xjt5s.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%2Fi%2Favv4qno4l4wm8q8xjt5s.png" alt="Screenshot (24)" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Able to post tasks from the product page for that particular product without the hashtag&lt;/li&gt;
&lt;li&gt;Turbolinks is back now with more fluidity&lt;/li&gt;
&lt;li&gt;Fixed webhook bugs no more 500&lt;/li&gt;
&lt;li&gt;Git webhook allow only commits from the default branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure to signup today! &lt;a href="https://taskord.com/register" rel="noopener noreferrer"&gt;https://taskord.com/register&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks 🙏
&lt;/h3&gt;

&lt;p&gt;For providing constant feedback and feature requests!&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__171721"&gt;
    &lt;a href="/filiptronicek" 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%2F171721%2F7966547e-20f7-460b-9d19-2ec667bf5969.jpg" alt="filiptronicek 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="/filiptronicek"&gt;Filip Troníček&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/filiptronicek"&gt;Open Source for life &amp;lt;3&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Happy shipping ❤️&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>changelog</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Tips to prevent spam ☔️</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Thu, 08 Oct 2020 13:54:35 +0000</pubDate>
      <link>https://forem.com/yo/tips-to-prevent-spam-2gc1</link>
      <guid>https://forem.com/yo/tips-to-prevent-spam-2gc1</guid>
      <description>&lt;p&gt;Hey folks 👋,&lt;/p&gt;

&lt;p&gt;Hope you all doing good!&lt;/p&gt;

&lt;p&gt;As we all know recently dev.to got flooded with spam, read more here.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/devteam" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__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%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" alt="The DEV Team" width="800" height="800"&gt;
      &lt;div class="ltag__link__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%2F1%2Ff451a206-11c8-4e3d-8936-143d0a7e65bb.png" alt="" width="797" height="797"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/devteam/spam-sucks-dm8" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Spam sucks&lt;/h2&gt;
      &lt;h3&gt;Ben Halpern for The DEV Team ・ Oct 6 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#meta&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;In this article let us see how to detect and prevent spam automatically in your social platform. Here as an example, I'll show how we fight for spam in Taskord (&lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;).&lt;/p&gt;

&lt;h1&gt;
  
  
  Detection
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What is rate-limiting?
&lt;/h2&gt;

&lt;p&gt;Rate limiting is the control of the number of requests per unit time. It can be applied to &lt;strong&gt;ports, IP, routes, users&lt;/strong&gt;, etc. It can efficiently block out malicious bots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Throttle Web requests
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt; is built using &lt;strong&gt;Laravel&lt;/strong&gt;, which has inbuilt throttler for requests.&lt;/p&gt;

&lt;p&gt;This snippet is used in &lt;code&gt;routes/web.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'middleware'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'throttle:30,1'&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// All Routes&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;throttle:30,1&lt;/code&gt; means it allows 30 requests per minute.&lt;/p&gt;

&lt;p&gt;When a user tries to abuse the platform by clicking links back and forth from the same IP address they will hit the limit and it will automatically be redirected to the warning 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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwusml0ctthx8pc3v3dbb.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%2Fi%2Fwusml0ctthx8pc3v3dbb.png" alt="Screenshot (22) (1)" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tried to simulate simple DOS attack by using curl from multiple terminals, this is what I end up with.&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%2Fi%2Fmusnbnm3fuy2p2788t3n.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%2Fi%2Fmusnbnm3fuy2p2788t3n.png" alt="image" width="764" height="360"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Throttle API requests
&lt;/h2&gt;

&lt;p&gt;API endpoints are most vulnerable one, most of the attackers target on these. It is very important to rate limit API requests&lt;/p&gt;

&lt;p&gt;The same rules can be applied in what we followed in throttling the web requests. In Taskord we use GraphQL API so we have added some additional steps to prevent spam.&lt;/p&gt;

&lt;p&gt;For Queries requests, we do simple 30 reqs / min throttling. But for Mutations request, we flag the user if they rate-limited twice in a short period of time. (User can ask admins for more requests and we will validate the use case and provide them with additional points).&lt;/p&gt;
&lt;h1&gt;
  
  
  Prevention
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Block disposable emails
&lt;/h2&gt;

&lt;p&gt;Blocking disposable emails is the very first important step to prevent spam. So make sure to implement disposable email blocker.&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%2Fi%2Ftum992qkk4vhar7wyx0n.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%2Fi%2Ftum992qkk4vhar7wyx0n.png" alt="image (1)" width="490" height="558"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Multiple accounts on the same IP
&lt;/h2&gt;

&lt;p&gt;If multiple users registered or logged with the same IP the system will automatically flag all the users connected with the same IP and it will notify the admins and we review it manually if they violated the terms we will suspend their account if not we will un-flag them.&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%2Fi%2Fprvucx3ie8yvh1o2h30o.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%2Fi%2Fprvucx3ie8yvh1o2h30o.png" alt="image (2)" width="439" height="207"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Limit the functionality
&lt;/h2&gt;

&lt;p&gt;Limit users with 3 types&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unverified&lt;/strong&gt; - User can do everything except liking and creating the post.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flagged&lt;/strong&gt; - User can log in but they can only see other's activities, and the profile is hidden from the public.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suspended&lt;/strong&gt; - User can do anything, not even log in.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Rate limit based flagging
&lt;/h2&gt;

&lt;p&gt;Count the throttled requests, if the limit is N and the account exceeds N+10 within mentioned time requests, the system will automatically flag the account.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$throttler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Throttle&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$throttler&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$throttler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Helper&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;flagAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Auth&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$throttler&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;flash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'error'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Your are rate limited, try again later!'&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;&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%2Fi%2Fujjdckzd3wwqp39x7cgv.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%2Fi%2Fujjdckzd3wwqp39x7cgv.png" alt="Screenshot (23) (1)" width="800" height="141"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Hide entities
&lt;/h2&gt;

&lt;p&gt;You can hide only the particular entities without affecting the user.&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%2Fi%2Fjw2zihakwc43q77qdxy9.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%2Fi%2Fjw2zihakwc43q77qdxy9.png" alt="Screenshot (24)" width="800" height="187"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You can use the following package to prevent DOS attacks.&lt;/p&gt;
&lt;h3&gt;
  
  
  For Laravel
&lt;/h3&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/GrahamCampbell" rel="noopener noreferrer"&gt;
        GrahamCampbell
      &lt;/a&gt; / &lt;a href="https://github.com/GrahamCampbell/Laravel-Throttle" rel="noopener noreferrer"&gt;
        Laravel-Throttle
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A rate limiter for Laravel
    &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;h1 class="heading-element"&gt;Laravel Throttle&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Laravel Throttle was created by, and is maintained by &lt;a href="https://github.com/GrahamCampbell" rel="noopener noreferrer"&gt;Graham Campbell&lt;/a&gt;, and is a rate limiter for &lt;a href="https://laravel.com/" rel="nofollow noopener noreferrer"&gt;Laravel&lt;/a&gt;. Feel free to check out the &lt;a href="https://github.com/GrahamCampbell/Laravel-ThrottleCHANGELOG.md" rel="noopener noreferrer"&gt;change log&lt;/a&gt;, &lt;a href="https://github.com/GrahamCampbell/Laravel-Throttle/releases" rel="noopener noreferrer"&gt;releases&lt;/a&gt;, &lt;a href="https://github.com/GrahamCampbell/Laravel-Throttle/security/policy" rel="noopener noreferrer"&gt;security policy&lt;/a&gt;, &lt;a href="https://github.com/GrahamCampbell/Laravel-ThrottleLICENSE" rel="noopener noreferrer"&gt;license&lt;/a&gt;, &lt;a href="https://github.com/GrahamCampbell/Laravel-Throttle.github/CODE_OF_CONDUCT.md" rel="noopener noreferrer"&gt;code of conduct&lt;/a&gt;, and &lt;a href="https://github.com/GrahamCampbell/Laravel-Throttle.github/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contribution guidelines&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/2829600/71477509-693e3c80-27e2-11ea-8497-46b3a1c8f1f4.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F2829600%2F71477509-693e3c80-27e2-11ea-8497-46b3a1c8f1f4.png" alt="Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/GrahamCampbell/Laravel-Throttle/actions?query=workflow%3ATests" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2d103a8137c69a2c1587ff2bf7970fae609636465a4fc4a5caf60ee654fe035e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f47726168616d43616d7062656c6c2f4c61726176656c2d5468726f74746c652f74657374732e796d6c3f6c6162656c3d5465737473267374796c653d666c61742d737175617265" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://github.styleci.io/repos/15437427" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f19bea75eb3770e0796c8248cf3259816f9d1d29eb7b5b6a4913a65f320d927/68747470733a2f2f6769746875622e7374796c6563692e696f2f7265706f732f31353433373432372f736869656c64" alt="StyleCI Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/GrahamCampbell/Laravel-ThrottleLICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ed92f9dd0f1ee8a7bddffcd906f4e0e6d1ee462cacc0e8ea177a95656893639f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e3f7374796c653d666c61742d737175617265" alt="Software License"&gt;&lt;/a&gt;
&lt;a href="https://packagist.org/packages/graham-campbell/throttle" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/22b5bd73687ca73b75ad342f2df10d9f70978436d11974212bec43324e0c88ae/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f67726168616d2d63616d7062656c6c2f7468726f74746c653f7374796c653d666c61742d737175617265" alt="Packagist Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/GrahamCampbell/Laravel-Throttle/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/df477797e46f3c1882d2a2395d94b3498b08b02410f7cb65ce6ce14207f7d545/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f47726168616d43616d7062656c6c2f4c61726176656c2d5468726f74746c653f7374796c653d666c61742d737175617265" alt="Latest Version"&gt;&lt;/a&gt;
&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;This version requires &lt;a href="https://www.php.net/" rel="nofollow noopener noreferrer"&gt;PHP&lt;/a&gt; 8.1-8.4 and supports &lt;a href="https://laravel.com/" rel="nofollow noopener noreferrer"&gt;Laravel&lt;/a&gt; 10-12.&lt;/p&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Throttle&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L5.5&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L5.6&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L5.7&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L5.8&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L6&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L7&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L8&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L9&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L10&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L11&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;L12&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;8.2&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;9.0&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;10.3&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;11.0&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;To get the latest version, simply require the project using &lt;a href="https://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 &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;graham-campbell/throttle:^11.0&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Once installed, if you…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/GrahamCampbell/Laravel-Throttle" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h3&gt;
  
  
  For Rails
&lt;/h3&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/rack" rel="noopener noreferrer"&gt;
        rack
      &lt;/a&gt; / &lt;a href="https://github.com/rack/rack-attack" rel="noopener noreferrer"&gt;
        rack-attack
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Rack middleware for blocking &amp;amp; throttling
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;⚠️  You are viewing the development's branch version of README which might contain documentation for unreleased features
For the README consistent with the latest released version see &lt;a href="https://github.com/rack/rack-attack/blob/6-stable/README.md" rel="noopener noreferrer"&gt;https://github.com/rack/rack-attack/blob/6-stable/README.md&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Rack::Attack&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Rack middleware for blocking &amp;amp; throttling abusive requests&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Protect your Rails and Rack apps from bad clients. Rack::Attack lets you easily decide when to &lt;em&gt;allow&lt;/em&gt;, &lt;em&gt;block&lt;/em&gt; and &lt;em&gt;throttle&lt;/em&gt; based on properties of the request.&lt;/p&gt;
&lt;p&gt;See the &lt;a href="https://www.kickstarter.com/backing-and-hacking/rack-attack-protection-from-abusive-clients" rel="nofollow noopener noreferrer"&gt;Backing &amp;amp; Hacking blog post&lt;/a&gt; introducing Rack::Attack.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://badge.fury.io/rb/rack-attack" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/59963bebcee7208af45797994054f3da975ae27a25274730d9a7656c6f7a4aa0/68747470733a2f2f62616467652e667572792e696f2f72622f7261636b2d61747461636b2e737667" alt="Gem Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/rack/rack-attack/actions/workflows/build.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/rack/rack-attack/actions/workflows/build.yml/badge.svg" alt="build"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/kickstarter/rack-attack" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c8cdecbb6241d9fd607bc77474f910c111393c7674d778dfa861e4dad82b2b83/68747470733a2f2f636f6465636c696d6174652e636f6d2f6769746875622f6b69636b737461727465722f7261636b2d61747461636b2e737667" alt="Code Climate"&gt;&lt;/a&gt;
&lt;a href="https://gitter.im/rack-attack/rack-attack" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/18246089acd121288de954e1ca6b2fdf50f27055a3c2c0bc5a9bddbe77209fea/68747470733a2f2f6261646765732e6769747465722e696d2f7261636b2d61747461636b2f7261636b2d61747461636b2e737667" alt="Join the chat at https://gitter.im/rack-attack/rack-attack"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rack/rack-attack#getting-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#installing" rel="noopener noreferrer"&gt;Installing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#plugging-into-the-application" rel="noopener noreferrer"&gt;Plugging into the application&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rack/rack-attack#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/rack/rack-attack#safelisting" rel="noopener noreferrer"&gt;Safelisting&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#safelist_ipip_address_string" rel="noopener noreferrer"&gt;&lt;code&gt;safelist_ip(ip_address_string)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#safelist_ipip_subnet_string" rel="noopener noreferrer"&gt;&lt;code&gt;safelist_ip(ip_subnet_string)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#safelistname-block" rel="noopener noreferrer"&gt;&lt;code&gt;safelist(name, &amp;amp;block)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rack/rack-attack#blocking" rel="noopener noreferrer"&gt;Blocking&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#blocklist_ipip_address_string" rel="noopener noreferrer"&gt;&lt;code&gt;blocklist_ip(ip_address_string)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#blocklist_ipip_subnet_string" rel="noopener noreferrer"&gt;&lt;code&gt;blocklist_ip(ip_subnet_string)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#blocklistname-block" rel="noopener noreferrer"&gt;&lt;code&gt;blocklist(name, &amp;amp;block)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#fail2ban" rel="noopener noreferrer"&gt;Fail2Ban&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#allow2ban" rel="noopener noreferrer"&gt;Allow2Ban&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rack/rack-attack#throttling" rel="noopener noreferrer"&gt;Throttling&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#throttlename-options-block" rel="noopener noreferrer"&gt;&lt;code&gt;throttle(name, options, &amp;amp;block)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#tracks" rel="noopener noreferrer"&gt;Tracks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#cache-store-configuration" rel="noopener noreferrer"&gt;Cache store configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rack/rack-attack#customizing-responses" rel="noopener noreferrer"&gt;Customizing responses&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#ratelimit-headers-for-well-behaved-clients" rel="noopener noreferrer"&gt;RateLimit headers for well-behaved clients&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#logging--instrumentation" rel="noopener noreferrer"&gt;Logging &amp;amp; Instrumentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#testing" rel="noopener noreferrer"&gt;Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rack/rack-attack#how-it-works" rel="noopener noreferrer"&gt;How it works&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#about-tracks" rel="noopener noreferrer"&gt;About Tracks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#performance" rel="noopener noreferrer"&gt;Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#motivation" rel="noopener noreferrer"&gt;Motivation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#code-of-conduct" rel="noopener noreferrer"&gt;Code of Conduct&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#development-setup" rel="noopener noreferrer"&gt;Development setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rack/rack-attack#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting started&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installing&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Add this line to your application's Gemfile:&lt;/p&gt;
&lt;div class="highlight highlight-source-ruby notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;# In your Gemfile&lt;/span&gt;

&lt;span class="pl-en"&gt;gem&lt;/span&gt; &lt;span class="pl-s"&gt;'rack-attack'&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;And then execute:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;$&lt;/code&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/rack/rack-attack" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Thanks ❤&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Shipping&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Taskord for next Hacktoberfest</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Wed, 07 Oct 2020 11:31:17 +0000</pubDate>
      <link>https://forem.com/yo/taskord-for-next-hacktoberfest-1nd0</link>
      <guid>https://forem.com/yo/taskord-for-next-hacktoberfest-1nd0</guid>
      <description>&lt;p&gt;I heard that there will be a chance GitLab will be a part of Hacktoberfest from 2021!&lt;/p&gt;

&lt;p&gt;My current project Taskord is hosted on GitLab&lt;/p&gt;

&lt;p&gt;Taskord is free open source social media for tasks! where users can post public and private todos, ask questions, and launch products. Taskord helps you to get things done together in public with the members of the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/taskord/taskord" rel="noopener noreferrer"&gt;https://gitlab.com/taskord/taskord&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Taskord mobile is hosted on GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/filiptronicek/taskord-mobile" rel="noopener noreferrer"&gt;https://github.com/filiptronicek/taskord-mobile&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Taskord Changelog - Oct 6</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Tue, 06 Oct 2020 02:24:57 +0000</pubDate>
      <link>https://forem.com/taskord/taskord-changelog-oct-6-5f4d</link>
      <guid>https://forem.com/taskord/taskord-changelog-oct-6-5f4d</guid>
      <description>&lt;p&gt;Welcome to &lt;strong&gt;Taskord Changelog&lt;/strong&gt; 📜, This is a weekly post where we share what we shipped to &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt; this week.&lt;/p&gt;

&lt;p&gt;Visit Taskord: &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This week on Taskord&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design Improvements, more curved edges&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%2Fi%2Furui4cq005lsxl14igl7.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%2Fi%2Furui4cq005lsxl14igl7.png" alt="Screenshot 2020-10-05 082219" width="800" height="379"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Block Disposable emails to fight spam users&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%2Fi%2Fcywp7g0qypue3ywef3af.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%2Fi%2Fcywp7g0qypue3ywef3af.png" alt="Screenshot 2020-10-05 082331" width="525" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hidden Task for moderators to hide a task from the public &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%2Fi%2Fsv80fi4s9w0dwql4rnv2.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%2Fi%2Fsv80fi4s9w0dwql4rnv2.png" alt="Screenshot 2020-10-05 082425" width="800" height="186"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Sponsors Page&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%2Fi%2Fqezxer1lvltu4ojlerix.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%2Fi%2Fqezxer1lvltu4ojlerix.png" alt="Screenshot (18)" width="800" height="379"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improved Dark mode by reducing color complexity and using native Bootstrap colors&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%2Fi%2F3i0mwefxqxln15i6ne4u.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%2Fi%2F3i0mwefxqxln15i6ne4u.png" alt="Screenshot (19)" width="800" height="380"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personal Access Token to access our GraphQL API&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%2Fi%2Fql299je75xqz6qeae1zx.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%2Fi%2Fql299je75xqz6qeae1zx.png" alt="Screenshot (20)" width="800" height="225"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo link support for products, currently GitHub, GitLab and Bitbucket links are supported&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%2Fi%2F0on5ztrl0cg0h9jmvza9.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%2Fi%2F0on5ztrl0cg0h9jmvza9.png" alt="Screenshot (21)" width="430" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic favicons for a website link in product and user's social section&lt;/li&gt;
&lt;li&gt;Improved Font Awesome speed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure to signup today! &lt;a href="https://taskord.com/register" rel="noopener noreferrer"&gt;https://taskord.com/register&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks 🙏
&lt;/h3&gt;

&lt;p&gt;For providing constant feedback and feature requests!&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__171721"&gt;
    &lt;a href="/filiptronicek" 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%2F171721%2F7966547e-20f7-460b-9d19-2ec667bf5969.jpg" alt="filiptronicek 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="/filiptronicek"&gt;Filip Troníček&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/filiptronicek"&gt;Open Source for life &amp;lt;3&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Happy shipping ❤️&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>changelog</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Taskord Changelog - Sep 29</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Tue, 29 Sep 2020 10:21:12 +0000</pubDate>
      <link>https://forem.com/taskord/taskord-changelog-sep-29-48al</link>
      <guid>https://forem.com/taskord/taskord-changelog-sep-29-48al</guid>
      <description>&lt;p&gt;Welcome to &lt;strong&gt;Taskord Changelog&lt;/strong&gt; 📜, This is a weekly post where we share what we shipped to &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt; this week.&lt;/p&gt;

&lt;p&gt;Visit Taskord: &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This week on Taskord&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GraphQL API is shipped with all basic queries and some mutations. Currently, it is behind the Staff's feature flag, DM us on Twitter to give you early access.&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%2Fi%2Fgnt4cruuqw2wmpq468vc.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%2Fi%2Fgnt4cruuqw2wmpq468vc.jpg" alt="Eixtc3IU8AATMOa" width="800" height="365"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added Separate Comment Page&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%2Fi%2Fi8wbmg8o6lgg3daba8fw.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%2Fi%2Fi8wbmg8o6lgg3daba8fw.png" alt="Ei3F0XLUwAIjPiC" width="748" height="398"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added Horizon to Speed up and monitor Redis Jobs&lt;/li&gt;
&lt;li&gt;Added Daily Goals, If the goal is reached the user will be praised by additional Reputations, Thanks &lt;a class="mentioned-user" href="https://dev.to/filiptronicek"&gt;@filiptronicek&lt;/a&gt; for working on Praising Algorithm&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%2Fi%2Fww8z63rf9drhox82vy6d.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%2Fi%2Fww8z63rf9drhox82vy6d.png" alt="Ei3FGlVUcAEdp61" width="750" height="290"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Make sure to signup today! &lt;a href="https://taskord.com/register" rel="noopener noreferrer"&gt;https://taskord.com/register&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks 🙏
&lt;/h3&gt;

&lt;p&gt;For taking care of marketing stuff!&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__348025"&gt;
    &lt;a href="/theaadithyan" 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%2F348025%2F9f2123d3-be7e-4297-a97f-38e05340a6b7.jpeg" alt="theaadithyan 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="/theaadithyan"&gt;Aadithyan Rajesh&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/theaadithyan"&gt;13 y/o, Maker, Designer, Developer.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;For providing constant feedback and feature requests!&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__171721"&gt;
    &lt;a href="/filiptronicek" 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%2F171721%2F7966547e-20f7-460b-9d19-2ec667bf5969.jpg" alt="filiptronicek 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="/filiptronicek"&gt;Filip Troníček&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/filiptronicek"&gt;Open Source for life &amp;lt;3&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Happy shipping ❤️&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>changelog</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Tech Stack that powers Taskord ⚡</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Mon, 28 Sep 2020 06:19:31 +0000</pubDate>
      <link>https://forem.com/yo/taskord-s-tech-stack-2b16</link>
      <guid>https://forem.com/yo/taskord-s-tech-stack-2b16</guid>
      <description>&lt;h3&gt;
  
  
  What is Taskord?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://taskord.com/?ref=devto" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt; is free open source social media for tasks! where users can post public and private todos, ask questions, and launch products. Taskord helps you to get things done together with the members of the community.&lt;/p&gt;

&lt;p&gt;We released our alpha version to the public a couple of weeks before and we got some awesome feedback!&lt;/p&gt;

&lt;p&gt;Join Taskord today &lt;a href="https://taskord.com/?ref=devto" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack powering Taskord
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🐘 PHP and Laravel
&lt;/h4&gt;

&lt;p&gt;PHP is our primary language and supported by the Laravel framework to make Taskord more fluid, fast and secured&lt;/p&gt;

&lt;h4&gt;
  
  
  🦑 Laravel Livewire
&lt;/h4&gt;

&lt;p&gt;Livewire is a full-stack framework for Laravel that makes building dynamic interfaces simple, without leaving the comfort of Laravel.&lt;/p&gt;

&lt;h4&gt;
  
  
  💾 MySQL
&lt;/h4&gt;

&lt;p&gt;MySQL is our primary database which has around 25 tables which are powered by InnoDB storage engine&lt;/p&gt;

&lt;h4&gt;
  
  
  Ⓜ️ Memcached
&lt;/h4&gt;

&lt;p&gt;Memcached is used extensively across all models to provide a blazing-fast experience, here is the shot of with and without Memcache.&lt;/p&gt;

&lt;p&gt;Look at &lt;code&gt;response total&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Without Cache&lt;/th&gt;
&lt;th&gt;With Cache&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fi%2Fys73v30jfk9stixk5mru.png" alt="560" width="390" height="90"&gt;&lt;/td&gt;
&lt;td&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%2Fi%2Fhphrftvc21tbsub15t1h.png" alt="160" width="392" height="90"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  🚦 Redis
&lt;/h4&gt;

&lt;p&gt;Redis is used to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send web notification&lt;/li&gt;
&lt;li&gt;Send email notification&lt;/li&gt;
&lt;li&gt;Queue Background Jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;we initially used the database to queue those jobs, but it was too slow and inconsistent so we finally found an alternative and moved to Redis.&lt;/p&gt;

&lt;h4&gt;
  
  
  ☯️ Laravel Horizon
&lt;/h4&gt;

&lt;p&gt;Horizon provides a beautiful dashboard and code-driven configuration for your Laravel powered Redis queues. Horizon allows you to easily monitor key metrics of your queue system such as job throughput, runtime, and job failures.&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%2Fi%2Fcxswjzlamfip49msmgr1.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%2Fi%2Fcxswjzlamfip49msmgr1.png" alt="Screenshot 2020-09-28 112131" width="800" height="414"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  ⚡ AWS Lightsail
&lt;/h4&gt;

&lt;p&gt;Lightsail is an easy-to-use cloud platform that offers you everything needed to build an application or website, plus a cost-effective, monthly plan.&lt;/p&gt;

&lt;p&gt;It feels more like a DigitalOcean inside AWS, It is more powerful and simple to manage&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%2Fi%2F06yz7rh1nww1pxh86fnn.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%2Fi%2F06yz7rh1nww1pxh86fnn.png" alt="Screenshot 2020-09-28 112712" width="800" height="247"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  💌 AWS SES
&lt;/h4&gt;

&lt;p&gt;Amazon Simple Email Service (SES) is a cost-effective email service built on the reliable and scalable infrastructure that Amazon.com developed to serve its own customer base. With Amazon SES, you can send transactional email, marketing messages, or any other type of high-quality content.&lt;/p&gt;

&lt;p&gt;Taskord has powerful notification preference where the user can turn off and on anytime.&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%2Fi%2Fib660ufi55y5if650lqm.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%2Fi%2Fib660ufi55y5if650lqm.png" alt="Screenshot 2020-09-28 113109" width="430" height="658"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  ⛅ Cloudflare
&lt;/h4&gt;

&lt;p&gt;Cloudflare is used in Taskord to increase our security and speed&lt;/p&gt;

&lt;p&gt;Our primary domain name is purchased from Namecheap but we are in the process of transferring it to Cloudflare.&lt;/p&gt;

&lt;h4&gt;
  
  
  🐶 Datadog
&lt;/h4&gt;

&lt;p&gt;Datadog is a monitoring service for cloud-scale applications, providing monitoring of servers, databases, tools, and services, through a SaaS-based data analytics platform.&lt;/p&gt;

&lt;p&gt;Here is our &lt;a href="https://p.datadoghq.eu/sb/g48fdkupyazcm66z-0005f6c81a18046e186dcfdb7591a444" rel="noopener noreferrer"&gt;Public Dashboard&lt;/a&gt; you can take a look at how the resource is used.&lt;/p&gt;

&lt;h4&gt;
  
  
  🐛 Sentry
&lt;/h4&gt;

&lt;p&gt;Sentry is our Raven to carry an error/exception that user face in the production instance.&lt;/p&gt;

&lt;h4&gt;
  
  
  🦊 GitLab
&lt;/h4&gt;

&lt;p&gt;Taskord is open-source and we hosted it on GitLab &lt;a href="https://gitlab.com/taskord/taskord" rel="noopener noreferrer"&gt;https://gitlab.com/taskord/taskord&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We use these features extensively&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tags and Release&lt;/li&gt;
&lt;li&gt;CI to Test inside the GitLab Infrastructure&lt;/li&gt;
&lt;li&gt;CD to deploy the code to our production server&lt;/li&gt;
&lt;li&gt;Security Dashboards&lt;/li&gt;
&lt;li&gt;On-Demand DAST Scanning&lt;/li&gt;
&lt;li&gt;Dependency Management&lt;/li&gt;
&lt;li&gt;License Compliance&lt;/li&gt;
&lt;li&gt;Threat Monitoring&lt;/li&gt;
&lt;li&gt;Error Tracking&lt;/li&gt;
&lt;li&gt;Metrics (Planned)&lt;/li&gt;
&lt;li&gt;Feature Flags (Planned)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  💰 Paddle
&lt;/h4&gt;

&lt;p&gt;The paddle is our payment gateway provider for patron plans if someone subscribed to one our plan the webhook response will be sent to our servers and enable Patron features for that particular user automatically.&lt;/p&gt;

&lt;p&gt;We are also using some awesome microservices to make everything simple and fast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://taskord.com/?ref=devto" rel="noopener noreferrer"&gt;Join Taskord&lt;/a&gt; today and you have a possibility to get free Patron plan for the lifetime 🎉&lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Feedback on my new product</title>
      <dc:creator>Yoginth</dc:creator>
      <pubDate>Thu, 24 Sep 2020 07:13:45 +0000</pubDate>
      <link>https://forem.com/yo/feedback-on-my-new-product-5b56</link>
      <guid>https://forem.com/yo/feedback-on-my-new-product-5b56</guid>
      <description>&lt;p&gt;Hi folks 👋&lt;/p&gt;

&lt;p&gt;I have build a new product called Taskord in 1.5 months in my #100DaysOfCode Challenge, currently, we are in public alpha and we planned to release it to the public this month.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;Taskord&lt;/a&gt; is free &lt;a href="https://gitlab.com/taskord/taskord" rel="noopener noreferrer"&gt;open source&lt;/a&gt; social media for tasks! where users can post public and private todos, ask questions, and launch products. Taskord helps you to get things done together with the members of the community.&lt;/p&gt;

&lt;p&gt;I'd greatly appreciate any feedback 💬.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://taskord.com" rel="noopener noreferrer"&gt;https://taskord.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go ahead and roast 🔥 the product in comments 🤝!&lt;/p&gt;

</description>
      <category>help</category>
      <category>webdev</category>
      <category>discuss</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
