<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ariful Alam</title>
    <description>The latest articles on DEV Community by Ariful Alam (@arifszn).</description>
    <link>https://dev.to/arifszn</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%2F591423%2F34d7d929-9779-4f8a-97d4-1f2c8ac53702.png</url>
      <title>DEV Community: Ariful Alam</title>
      <link>https://dev.to/arifszn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arifszn"/>
    <language>en</language>
    <item>
      <title>Understanding Model Context Protocol (MCP): Bridging LLMs and the Real World</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Thu, 19 Feb 2026 06:21:30 +0000</pubDate>
      <link>https://dev.to/arifszn/understanding-model-context-protocol-mcp-bridging-llms-and-the-real-world-2l8a</link>
      <guid>https://dev.to/arifszn/understanding-model-context-protocol-mcp-bridging-llms-and-the-real-world-2l8a</guid>
      <description>&lt;p&gt;Large language models are increasingly embedded into developer tools, products, and workflows—but most of them still operate in isolation. They can reason, explain, and suggest, yet they remain disconnected from the systems where real work happens. Model Context Protocol (MCP) addresses this gap by defining a standard way for AI models to interact with external tools, data sources, and services in a secure and structured manner.&lt;/p&gt;

&lt;p&gt;Instead of treating AI as a passive interface that only generates text, MCP enables it to participate directly in real-world workflows. It establishes a common contract between models and systems, allowing developers to expose capabilities once and reuse them across different AI clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: LLMs Are Brilliant But Limited
&lt;/h2&gt;

&lt;p&gt;Large language models have revolutionized how we interact with technology, but they face two fundamental limitations that prevent them from being truly useful in real-world scenarios:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Frozen Knowledge
&lt;/h3&gt;

&lt;p&gt;LLMs' knowledge is fixed at training time. They cannot access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time information&lt;/strong&gt;: Current stock prices, weather conditions, or breaking news&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private data&lt;/strong&gt;: Your company's databases, personal files, or internal documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recent developments&lt;/strong&gt;: New libraries, updated APIs, or latest best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. No Action Capability
&lt;/h3&gt;

&lt;p&gt;LLMs can think and reason, but they cannot act:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cannot execute code&lt;/strong&gt; or run commands on your behalf&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cannot modify data&lt;/strong&gt; in files, databases, or external systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cannot interact with APIs&lt;/strong&gt; to perform real actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before MCP, every AI tool needed custom integrations for each external system it wanted to access. This created a fragmented ecosystem where developers had to build bespoke APIs for every combination of AI platform and data source.&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%2Ff1n1jh3vhdiwcoaafme5.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%2Ff1n1jh3vhdiwcoaafme5.png" alt=" " width="512" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP solves this by introducing a single, secure, and open protocol.&lt;/strong&gt; Instead of building N×M custom integrations (N AI platforms × M data sources), you build M MCP servers that work with any MCP-compatible AI platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Model Context Protocol?
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol is an open standard that enables LLMs to securely connect to external data sources and tools through a unified interface. Think of it as &lt;strong&gt;USB for AI&lt;/strong&gt;—a universal connector that lets any AI model plug into any tool or data source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Capabilities
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Standardized Interface&lt;/strong&gt;&lt;br&gt;
A unified way to expose tools and resources that works across all AI platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secure by Design&lt;/strong&gt;&lt;br&gt;
Explicit permissions with human oversight for every action. The LLM cannot do anything without proper authorization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-Platform Compatible&lt;/strong&gt;&lt;br&gt;
Write an MCP server once, use it with Claude Desktop, Cursor, custom AI applications, or any other MCP-compatible client.&lt;/p&gt;
&lt;h2&gt;
  
  
  A Real Example: The Database Query Problem
&lt;/h2&gt;

&lt;p&gt;Let's look at a concrete example that demonstrates the difference MCP makes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: You ask your AI assistant, &lt;em&gt;"How many tables do I have in my Postgres database?"&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Before MCP
&lt;/h3&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%2Fv6k4zm53zavyg47ltobb.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%2Fv6k4zm53zavyg47ltobb.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without MCP, the AI cannot access your database directly. Instead, it provides instructions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suggests using &lt;code&gt;psql&lt;/code&gt; command-line tool&lt;/li&gt;
&lt;li&gt;Provides SQL query examples you need to run manually&lt;/li&gt;
&lt;li&gt;Explains different approaches to check table counts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: You get helpful advice, but you still have to do the work yourself.&lt;/p&gt;
&lt;h3&gt;
  
  
  After MCP
&lt;/h3&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%2F3i08o82jcnd9yk3ohgiq.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%2F3i08o82jcnd9yk3ohgiq.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With an MCP server connected to your Postgres database, the AI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Directly queries your database using the MCP tools&lt;/li&gt;
&lt;li&gt;Retrieves the actual table count and names&lt;/li&gt;
&lt;li&gt;Returns the real answer: "You have &lt;strong&gt;34 tables&lt;/strong&gt; in your Postgres database"&lt;/li&gt;
&lt;li&gt;Lists all table names: &lt;code&gt;admin_calendar_notifications&lt;/code&gt;, &lt;code&gt;approval_requests&lt;/code&gt;, &lt;code&gt;articles&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: You get the actual answer immediately, without lifting a finger.&lt;/p&gt;
&lt;h2&gt;
  
  
  How MCP Works: The Architecture
&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%2Fuploads%2Farticles%2F5n0h76afp030l01e7a0l.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%2F5n0h76afp030l01e7a0l.png" alt=" " width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MCP operates through a five-step workflow:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Request and Tool Discovery
&lt;/h3&gt;

&lt;p&gt;The LLM identifies that it needs external tools to answer your request. It queries available MCP servers to discover what tools are accessible.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Tool Invocation
&lt;/h3&gt;

&lt;p&gt;The LLM sends structured requests to invoke specific tools (e.g., "query database" or "read file").&lt;/p&gt;
&lt;h3&gt;
  
  
  3. External Action and Data Return
&lt;/h3&gt;

&lt;p&gt;The MCP server executes the action on the external system and returns the data to the LLM.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Second Action and Response Generation
&lt;/h3&gt;

&lt;p&gt;If needed, the LLM can invoke additional tools or use the data to generate a comprehensive response.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Final Confirmation
&lt;/h3&gt;

&lt;p&gt;The LLM presents the result to the user, often with a confirmation step for sensitive actions.&lt;/p&gt;
&lt;h2&gt;
  
  
  MCP Architecture Components
&lt;/h2&gt;
&lt;h3&gt;
  
  
  MCP Host
&lt;/h3&gt;

&lt;p&gt;The environment where the LLM operates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conversational assistants (Claude Desktop, ChatGPT)&lt;/li&gt;
&lt;li&gt;IDEs (Cursor, VS Code)&lt;/li&gt;
&lt;li&gt;Custom agent runtimes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  MCP Client
&lt;/h3&gt;

&lt;p&gt;Lives inside the host and acts as a bridge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discovers available MCP servers and their capabilities&lt;/li&gt;
&lt;li&gt;Translates LLM requests into MCP protocol messages&lt;/li&gt;
&lt;li&gt;Handles responses and passes data back to the LLM&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  MCP Server
&lt;/h3&gt;

&lt;p&gt;Connects to external systems and exposes capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database connections (Postgres, MySQL, MongoDB)&lt;/li&gt;
&lt;li&gt;File system access&lt;/li&gt;
&lt;li&gt;API integrations (GitHub, Slack, Linear)&lt;/li&gt;
&lt;li&gt;Browser automation (Chrome DevTools)&lt;/li&gt;
&lt;li&gt;Custom business logic&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Transport Layer
&lt;/h3&gt;

&lt;p&gt;Communication happens via JSON-RPC 2.0 over two transport mechanisms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stdio transport&lt;/strong&gt;: Local communication via standard input/output (for local tools)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP with Server-Sent Events&lt;/strong&gt;: Remote communication with streaming support (for cloud services)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  MCP Primitives: The Building Blocks
&lt;/h2&gt;

&lt;p&gt;MCP servers expose three types of primitives to LLMs:&lt;/p&gt;
&lt;h3&gt;
  
  
  Tools
&lt;/h3&gt;

&lt;p&gt;Functions with side effects that the LLM can invoke to perform actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ListToolsRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query_database&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Execute a SQL query on the Postgres database&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SQL query to execute&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&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;query&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="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;strong&gt;Examples&lt;/strong&gt;: Query database, send email, create file, call API&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;Read-only data sources that provide context without side effects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ListResourcesRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;postgres://tables&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Database Tables&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;List of all tables in the database&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Configuration files, documentation, database schemas, API responses&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompts
&lt;/h3&gt;

&lt;p&gt;Reusable templates that guide the LLM's behavior for specific tasks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ListPromptsRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prompts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;analyze_database&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Analyze database structure and suggest optimizations&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;table_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Name of the table to analyze&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;: "Review this PR", "Analyze performance", "Generate test cases"&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Your First MCP Server
&lt;/h2&gt;

&lt;p&gt;Here's a simple example of an MCP server that provides weather information:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Server&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/index.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StdioServerTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/stdio.js&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;server&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;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;weather-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Define a tool&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CallToolRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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="o"&gt;=&amp;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="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;location&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;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Fetch actual weather data (simplified)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weather&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;fetchWeatherData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;weather&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unknown tool&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Start the server&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transport&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;StdioServerTransport&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;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This server can now be used by any MCP client to fetch weather information!&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Apps: Beyond Text Interactions
&lt;/h2&gt;

&lt;p&gt;While MCP servers enable LLMs to access tools and data, &lt;strong&gt;MCP Apps&lt;/strong&gt; take this further by adding custom user interfaces. They provide rich, visual interactions beyond simple text chat.&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%2Fcsru5hn3lzpojhvrgsla.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%2Fcsru5hn3lzpojhvrgsla.png" alt=" " width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Wordly MCP App
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/arifszn/wordly-mcp-app" rel="noopener noreferrer"&gt;Wordly MCP App&lt;/a&gt; demonstrates how MCP Apps enhance user experience. Instead of getting grammar corrections as plain text, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive corrections&lt;/strong&gt;: Visual highlighting of grammar issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple formality levels&lt;/strong&gt;: Choose between Standard, Formal, Very Formal, or Casual&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time suggestions&lt;/strong&gt;: See corrections as you type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich formatting&lt;/strong&gt;: Better readability with styled components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Benefits of MCP Apps&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom UI components tailored to specific use cases&lt;/li&gt;
&lt;li&gt;Interactive data visualizations (charts, tables, graphs)&lt;/li&gt;
&lt;li&gt;Better user experience for complex workflows&lt;/li&gt;
&lt;li&gt;Seamless integration with MCP tools&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MCP vs. Other Approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  MCP vs. RAG (Retrieval-Augmented Generation)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;RAG&lt;/strong&gt; is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grounding responses in specific knowledge bases&lt;/li&gt;
&lt;li&gt;Semantic search across documents&lt;/li&gt;
&lt;li&gt;Providing relevant context from text corpora&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MCP&lt;/strong&gt; is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Executing actions with side effects&lt;/li&gt;
&lt;li&gt;Real-time data access and manipulation&lt;/li&gt;
&lt;li&gt;Interacting with structured systems (databases, APIs)&lt;/li&gt;
&lt;li&gt;Tool invocation and workflow orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Think of it this way&lt;/strong&gt;: RAG is like giving the AI a library card to read books. MCP is like giving the AI hands to build things.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP vs. Agent Skills
&lt;/h3&gt;

&lt;p&gt;Many AI platforms have proprietary "skills" or "plugins" systems. MCP standardizes this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional Agent Skills&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Platform-specific implementations&lt;/li&gt;
&lt;li&gt;Limited portability between systems&lt;/li&gt;
&lt;li&gt;Proprietary APIs and formats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MCP&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open standard that works everywhere&lt;/li&gt;
&lt;li&gt;Write once, use with any MCP client&lt;/li&gt;
&lt;li&gt;Community-driven ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future of MCP
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol represents a paradigm shift in how AI systems interact with the world. As the ecosystem matures, we can expect:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standardization&lt;/strong&gt;: MCP becoming the universal protocol for AI-tool interactions, similar to how HTTP standardized web communication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ecosystem Growth&lt;/strong&gt;: Thousands of MCP servers providing access to every tool and data source imaginable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enterprise Adoption&lt;/strong&gt;: Organizations building internal MCP servers to safely expose their systems to AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhanced Capabilities&lt;/strong&gt;: Advanced features like streaming responses, multi-modal tools, and complex workflow orchestration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore MCP in Action
&lt;/h2&gt;

&lt;p&gt;Ready to dive deeper? Check out these resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/arifszn/reminder-mcp" rel="noopener noreferrer"&gt;Reminder MCP&lt;/a&gt;&lt;/strong&gt; - See a practical MCP server implementation for task management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/arifszn/wordly-mcp-app" rel="noopener noreferrer"&gt;Wordly MCP App&lt;/a&gt;&lt;/strong&gt; - Explore an MCP App with interactive UI for grammar checking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Official MCP Documentation&lt;/a&gt;&lt;/strong&gt; - Start building your first MCP server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/modelcontextprotocol" rel="noopener noreferrer"&gt;MCP GitHub Organization&lt;/a&gt;&lt;/strong&gt; - Browse the source code and community servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The future of AI is not just about smarter models—it's about models that can actually get things done. MCP is making that future a reality.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>mcp</category>
      <category>programming</category>
    </item>
    <item>
      <title>Git Worktrees: The Power Behind Cursor’s Parallel Agents</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Fri, 07 Nov 2025 13:11:32 +0000</pubDate>
      <link>https://dev.to/arifszn/git-worktrees-the-power-behind-cursors-parallel-agents-19j1</link>
      <guid>https://dev.to/arifszn/git-worktrees-the-power-behind-cursors-parallel-agents-19j1</guid>
      <description>&lt;p&gt;Cursor just shipped Parallel Agents, a way to run multiple agents on different tasks at the same time. Under the hood, this relies on Git worktrees so that each agent can safely operate on its own branch and working directory without stepping on the others. If you’re new to worktrees, this guide is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Git worktree?
&lt;/h2&gt;

&lt;p&gt;In Git, a “worktree” is an additional working directory attached to the same repository. Each worktree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has its own working directory, index, and &lt;code&gt;HEAD&lt;/code&gt; pointing at a branch or commit&lt;/li&gt;
&lt;li&gt;Shares the repository’s object database (no duplicate history)&lt;/li&gt;
&lt;li&gt;Can be used simultaneously with other worktrees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means you can open &lt;code&gt;repo/&lt;/code&gt; for &lt;code&gt;main&lt;/code&gt;, and &lt;code&gt;repo-feature/&lt;/code&gt; for &lt;code&gt;feature/login&lt;/code&gt;, both fully editable, both real directories, both backed by the same &lt;code&gt;.git&lt;/code&gt; object store.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not just clone twice?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clones duplicate the entire repository data and configuration&lt;/li&gt;
&lt;li&gt;Worktrees are much faster to create and take far less disk space&lt;/li&gt;
&lt;li&gt;Worktrees keep remotes, hooks, and config shared, reducing drift&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How worktrees are structured (under the hood)
&lt;/h2&gt;

&lt;p&gt;When you add a worktree, Git creates metadata in the primary repo’s &lt;code&gt;.git/worktrees/&amp;lt;name&amp;gt;&lt;/code&gt; and a small &lt;code&gt;.git&lt;/code&gt; file inside the new working directory that points back to the main repo. Objects and refs live centrally; each worktree has its own &lt;code&gt;HEAD&lt;/code&gt; and index state.&lt;/p&gt;

&lt;p&gt;Key consequence: operations that depend on repository objects (fetch, gc, hooks, config) are shared; operations that depend on the working directory (add, commit, checkout) are isolated per worktree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core commands (cheat sheet)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List active worktrees&lt;/span&gt;
git worktree list

&lt;span class="c"&gt;# Add a new worktree at ./../feature-abc, checking out branch feature/abc&lt;/span&gt;
git worktree add ../feature-abc feature/abc

&lt;span class="c"&gt;# Create a new branch and worktree in one go&lt;/span&gt;
git worktree add ../hotfix-1.2 &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix/1.2

&lt;span class="c"&gt;# Add a detached worktree at a specific commit (read-only is typical)&lt;/span&gt;
git worktree add &lt;span class="nt"&gt;--detach&lt;/span&gt; ../investigate abc1234

&lt;span class="c"&gt;# Prune (remove metadata for missing worktree directories)&lt;/span&gt;
git worktree prune

&lt;span class="c"&gt;# Remove a worktree safely (directory must be clean or use --force)&lt;/span&gt;
git worktree remove ../feature-abc
git worktree remove &lt;span class="nt"&gt;--force&lt;/span&gt; ../feature-abc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pro tips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;-b &amp;lt;new-branch&amp;gt;&lt;/code&gt; to create a branch when adding the worktree.&lt;/li&gt;
&lt;li&gt;Keep directory names short and descriptive, e.g. &lt;code&gt;../feat-reporting&lt;/code&gt; or &lt;code&gt;../bug-2174&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Cursor Parallel Agents use worktrees
&lt;/h2&gt;

&lt;p&gt;Cursor’s Parallel Agents run multiple agents side-by-side. Each agent operates in an isolated Git worktree and typically on its own branch. This provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Isolation&lt;/strong&gt;: File edits and indexes are separate, so agents don’t clobber each other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: Creating worktrees is fast and space-efficient compared to full clones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceability&lt;/strong&gt;: Each agent’s branch records its history and diffs cleanly.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Read the product documentation for configuration details and tips: &lt;a href="https://cursor.com/docs/configuration/worktrees" rel="noopener noreferrer"&gt;Cursor Worktrees documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: parallel feature + hotfix
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You’re on main in the primary directory&lt;/span&gt;
git pull &lt;span class="nt"&gt;--ff-only&lt;/span&gt;

&lt;span class="c"&gt;# Start a feature in its own worktree&lt;/span&gt;
git worktree add ../feat-reporting &lt;span class="nt"&gt;-b&lt;/span&gt; feature/reporting

&lt;span class="c"&gt;# Meanwhile, a production bug appears; cut a hotfix worktree&lt;/span&gt;
git worktree add ../hotfix-2174 &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix/2174 origin/release/1.2

&lt;span class="c"&gt;# In ../hotfix-2174, implement the fix, test, and ship&lt;/span&gt;
git commit &lt;span class="nt"&gt;-am&lt;/span&gt; &lt;span class="s2"&gt;"Fix NPE in invoice total"&lt;/span&gt;
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin hotfix/2174

&lt;span class="c"&gt;# Back in ../feat-reporting, continue development uninterrupted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cleanup checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Merge or push branches you want to keep.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git worktree remove &amp;lt;path&amp;gt;&lt;/code&gt; for each finished worktree.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git worktree prune&lt;/code&gt; to clear any stale metadata.&lt;/li&gt;
&lt;li&gt;Optionally delete remote branches after merging.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to choose worktrees vs. alternatives
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Worktrees&lt;/strong&gt;: Best for fast, space‑efficient, parallel workflows in the same repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate clones&lt;/strong&gt;: Useful when you need different remotes, radically different config, or to isolate heavyweight tooling state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stashing / single checkout&lt;/strong&gt;: Fine for quick context switches, but becomes fragile for serious parallelism.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re trying out Cursor’s Parallel Agents, learning Git worktrees will pay immediate dividends. They’re simple, fast, and map perfectly to how you want to parallelize real‑world work.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>git</category>
    </item>
    <item>
      <title>Gitflow: Streamlined Branching and Release Management for Teams</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Mon, 25 Aug 2025 06:44:15 +0000</pubDate>
      <link>https://dev.to/arifszn/gitflow-streamlined-branching-and-release-management-for-teams-59dp</link>
      <guid>https://dev.to/arifszn/gitflow-streamlined-branching-and-release-management-for-teams-59dp</guid>
      <description>&lt;p&gt;Modern software teams rarely push code directly to the main branch. As projects grow, a clear branching strategy becomes essential to manage features, fixes, and releases while keeping production stable. Branching strategies minimize conflicts, streamline collaboration, and provide a structured workflow for teams of any size.&lt;/p&gt;

&lt;p&gt;Gitflow, proposed by Vincent Driessen (&lt;a href="https://nvie.com/posts/a-successful-git-branching-model/" rel="noopener noreferrer"&gt;A successful Git branching model&lt;/a&gt;), is one of the most widely adopted models. It defines a hierarchy of branches and merge policies that ensure smooth development, stable production releases, and a way to address urgent issues without disrupting ongoing work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Branches in Gitflow
&lt;/h2&gt;

&lt;p&gt;Gitflow defines &lt;strong&gt;five main branch types&lt;/strong&gt;, each serving a distinct purpose:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;main&lt;/code&gt; (or &lt;code&gt;master&lt;/code&gt;)&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Represents &lt;strong&gt;production-ready code&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Each commit here corresponds to a &lt;strong&gt;stable release&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;All merges into &lt;code&gt;main&lt;/code&gt; should go through &lt;strong&gt;pull requests&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;develop&lt;/code&gt;&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Integration branch for &lt;strong&gt;ongoing development&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;All completed features are merged here via &lt;strong&gt;PRs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;feature/*&lt;/code&gt;&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;new features or tasks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Branch from &lt;code&gt;develop&lt;/code&gt; and merge back via PRs.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;feature/user-authentication&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;release/*&lt;/code&gt;&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Prepares a &lt;strong&gt;new version release&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Only bug fixes, documentation updates, or minor tweaks are allowed.&lt;/li&gt;
&lt;li&gt;Merge into both &lt;code&gt;main&lt;/code&gt; (production) and &lt;code&gt;develop&lt;/code&gt; via PRs.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;release/1.2.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;hotfix/*&lt;/code&gt;&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;urgent production fixes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Branch from &lt;code&gt;main&lt;/code&gt; and merge back into both &lt;code&gt;main&lt;/code&gt; and &lt;code&gt;develop&lt;/code&gt; using PRs.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;hotfix/payment-bug&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Gitflow in Action
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Creating a Feature Branch
&lt;/h3&gt;

&lt;p&gt;Imagine implementing &lt;strong&gt;user authentication&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start from develop&lt;/span&gt;
git checkout develop

&lt;span class="c"&gt;# Create feature branch&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/user-authentication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Work on your feature and commit frequently. Once ready, push to the remote and open a &lt;strong&gt;pull request into &lt;code&gt;develop&lt;/code&gt;&lt;/strong&gt;. After code review:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Merge PR&lt;/span&gt;

&lt;span class="c"&gt;# Delete feature branch after merge&lt;/span&gt;
git branch &lt;span class="nt"&gt;-d&lt;/span&gt; feature/user-authentication
git push origin &lt;span class="nt"&gt;--delete&lt;/span&gt; feature/user-authentication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Feature integrated into &lt;code&gt;develop&lt;/code&gt; safely.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Preparing a Release
&lt;/h3&gt;

&lt;p&gt;When development is stable and ready for &lt;strong&gt;v1.2.0&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Branch from develop&lt;/span&gt;
git checkout develop
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; release/1.2.0
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin release/1.2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Perform final bug fixes, update version numbers, and tweak docs.&lt;/li&gt;
&lt;li&gt;Open a &lt;strong&gt;PR to merge &lt;code&gt;release/1.2.0&lt;/code&gt; into &lt;code&gt;main&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tag the release after merge:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
git tag &lt;span class="nt"&gt;-a&lt;/span&gt; v1.2.0 &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Release 1.2.0"&lt;/span&gt;
git push origin v1.2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Merge &lt;strong&gt;release back into develop via PR&lt;/strong&gt; to sync changes.&lt;/li&gt;
&lt;li&gt;Delete the release branch after merging.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Handling Hotfixes
&lt;/h3&gt;

&lt;p&gt;Suppose a &lt;strong&gt;critical production bug&lt;/strong&gt; is discovered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Branch from main&lt;/span&gt;
git checkout main
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix/payment-bug
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin hotfix/payment-bug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Fix the issue and commit.&lt;/li&gt;
&lt;li&gt;Open a &lt;strong&gt;PR to merge &lt;code&gt;hotfix/payment-bug&lt;/code&gt; into main&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tag the hotfix release:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
git tag &lt;span class="nt"&gt;-a&lt;/span&gt; v1.2.1 &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Hotfix: Payment bug fixed"&lt;/span&gt;
git push origin v1.2.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Open a &lt;strong&gt;PR to merge hotfix into develop&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Delete the hotfix branch after merging.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Visualizing Gitflow
&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%2Fuploads%2Farticles%2Fruw6rwuof708pfk4z9b6.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%2Fruw6rwuof708pfk4z9b6.png" alt="Visualizing Gitflow" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feature branches&lt;/strong&gt; → merge into &lt;code&gt;develop&lt;/code&gt; via PRs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release branches&lt;/strong&gt; → merge into &lt;code&gt;main&lt;/code&gt; via PRs, then back to &lt;code&gt;develop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hotfix branches&lt;/strong&gt; → merge into both &lt;code&gt;main&lt;/code&gt; and &lt;code&gt;develop&lt;/code&gt; via PRs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use descriptive names&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feature/&amp;lt;task-name&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;release/&amp;lt;version&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hotfix/&amp;lt;issue&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Always &lt;strong&gt;use pull requests&lt;/strong&gt; for merges.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Delete branches&lt;/strong&gt; after merging.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Tag releases&lt;/strong&gt; for traceability.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Automate release process&lt;/strong&gt; using CI/CD pipelines.&lt;/li&gt;

&lt;/ul&gt;

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

&lt;p&gt;Gitflow provides a structured, safe, and collaborative workflow for modern development teams. By isolating features, releases, and hotfixes, it ensures &lt;strong&gt;code stability&lt;/strong&gt; while allowing &lt;strong&gt;parallel development&lt;/strong&gt;. For teams that need speed over structure, a simpler workflow may suffice, but for &lt;strong&gt;enterprise-grade software&lt;/strong&gt;, Gitflow remains a proven approach.&lt;/p&gt;

</description>
      <category>git</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Prevent API Overload: A Comprehensive Guide to Rate Limiting with Bottleneck</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Mon, 13 May 2024 17:01:28 +0000</pubDate>
      <link>https://dev.to/arifszn/prevent-api-overload-a-comprehensive-guide-to-rate-limiting-with-bottleneck-c2p</link>
      <guid>https://dev.to/arifszn/prevent-api-overload-a-comprehensive-guide-to-rate-limiting-with-bottleneck-c2p</guid>
      <description>&lt;p&gt;In the realm of modern web development, APIs have become the lifeblood of our applications. They enable us to tap into a vast array of external services and data sources, empowering us to build rich and powerful experiences. However, with great power comes great responsibility – and in this case, that responsibility lies in respecting the rate limits imposed by API providers.&lt;/p&gt;

&lt;p&gt;Rate limits are necessary measures put in place to prevent abuse and maintain the performance of APIs. Exceeding these limits can lead to rate limit errors, which can bring your application to a screeching halt, disrupting functionality and leaving your users high and dry. To address this challenge, there is a powerful solution at our disposal: the Bottleneck package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Bottleneck: Your Rate Limiting Gatekeeper
&lt;/h2&gt;

&lt;p&gt;The Bottleneck package is a rate limiter that enforces a maximum number of operations within a given time period. It acts as a gatekeeper, ensuring that your application does not overwhelm the target API with too many requests, thereby preventing rate limit errors and maintaining a smooth and reliable experience for your users.&lt;/p&gt;

&lt;p&gt;Installing Bottleneck is as simple as running &lt;code&gt;npm install bottleneck&lt;/code&gt; in your project directory. Once installed, you can create a new limiter instance like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Bottleneck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bottleneck&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create a new limiter with a maximum of 1 concurrent requests&lt;/span&gt;
&lt;span class="c1"&gt;// and a limit of 10 requests per minute&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;limiter&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;Bottleneck&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;maxConcurrent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;minTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6000&lt;/span&gt; &lt;span class="c1"&gt;// 6000ms = 1 minute / 10 requests&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we've created a limiter that allows a maximum of 1 concurrent requests and enforces a limit of 10 requests per minute. The &lt;code&gt;maxConcurrent&lt;/code&gt; option specifies the maximum number of concurrent requests allowed, while the &lt;code&gt;minTime&lt;/code&gt; option defines the minimum time (in milliseconds) between requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduling API Requests with Bottleneck
&lt;/h2&gt;

&lt;p&gt;With your limiter configured, you can start scheduling API requests using the &lt;code&gt;schedule&lt;/code&gt; method. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;makeRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="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="nx"&gt;axios&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="s1"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Schedule 20 requests&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;limiter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;makeRequest&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;In this case, we've defined a &lt;code&gt;makeRequest&lt;/code&gt; function that simulates an API request. We then schedule 20 requests using the &lt;code&gt;limiter.schedule&lt;/code&gt; method. Bottleneck will automatically queue and execute these requests according to the specified rate limit, ensuring that we stay within the boundaries set by the API provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizing Rate Limiting Behavior
&lt;/h2&gt;

&lt;p&gt;One of the significant advantages of the Bottleneck package is its flexibility. It provides various options to customize the rate limiting behavior according to your application's needs. For instance, you can configure different rate limits based on priorities, handle errors gracefully, and even implement dynamic rate limiting strategies.&lt;/p&gt;

&lt;p&gt;Here's an example of how you can handle errors and configure different rate limits based on priorities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Bottleneck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bottleneck&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create a new limiter with various options&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;limiter&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;Bottleneck&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;maxConcurrent&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="na"&gt;minTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;reservoir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Initial reservoir size&lt;/span&gt;
  &lt;span class="na"&gt;reservoirRefreshAmount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Number of tokens to add to the reservoir&lt;/span&gt;
  &lt;span class="na"&gt;reservoirRefreshInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="c1"&gt;// Interval to refill the reservoir (1 minute)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Configure error handling&lt;/span&gt;
&lt;span class="nx"&gt;limiter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jobInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Handle failed requests&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Request failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Define priority levels&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;priorities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;high&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="na"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;low&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Schedule a high-priority request&lt;/span&gt;
&lt;span class="nx"&gt;limiter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;priorities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;high&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;makeRequest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Schedule a normal-priority request&lt;/span&gt;
&lt;span class="nx"&gt;limiter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;priorities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;normal&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;makeRequest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we've configured the limiter with an initial reservoir size of 10 requests, refilling 10 tokens every minute. We've also set up error handling by listening to the &lt;code&gt;failed&lt;/code&gt; event, which allows us to handle failed requests gracefully.&lt;/p&gt;

&lt;p&gt;Additionally, we've defined priority levels (&lt;code&gt;high&lt;/code&gt;, &lt;code&gt;normal&lt;/code&gt;, and &lt;code&gt;low&lt;/code&gt;) and scheduled requests with different priorities using the &lt;code&gt;limiter.schedule&lt;/code&gt; method. The Bottleneck package will prioritize higher-priority requests over lower-priority ones, ensuring that critical requests are processed first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices and Final Thoughts
&lt;/h2&gt;

&lt;p&gt;When working with the Bottleneck package, it's essential to follow best practices to ensure optimal performance and reliability. Here are a few tips:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor your rate limit usage and adjust your limiter settings accordingly to avoid hitting rate limits.&lt;/li&gt;
&lt;li&gt;Implement retry strategies for failed requests to improve resilience.&lt;/li&gt;
&lt;li&gt;Cache API responses when possible to reduce the number of requests made.&lt;/li&gt;
&lt;li&gt;Consider implementing circuit breakers to prevent cascading failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By leveraging the power of the Bottleneck package, you can effectively manage API rate limits, prevent rate limit errors, and maintain a reliable and performant application. Its flexibility and extensive configuration options make it a valuable tool in any Node.js developer's arsenal.&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Git Rebase vs Git Merge: A Comprehensive Guide</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Thu, 04 Jan 2024 16:22:42 +0000</pubDate>
      <link>https://dev.to/arifszn/git-rebase-vs-git-merge-a-comprehensive-guide-3jlk</link>
      <guid>https://dev.to/arifszn/git-rebase-vs-git-merge-a-comprehensive-guide-3jlk</guid>
      <description>&lt;p&gt;Git, a distributed version control system, offers a variety of ways developers can integrate changes from one branch into another: &lt;code&gt;git merge&lt;/code&gt; and &lt;code&gt;git rebase&lt;/code&gt; being two of the most commonly used strategies. Understanding the differences, benefits, and best practices of both can greatly enhance your Git workflow efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Git Merge
&lt;/h2&gt;

&lt;p&gt;Think of &lt;code&gt;git merge&lt;/code&gt; as a handshake between two branches. The &lt;code&gt;git merge&lt;/code&gt; command integrates changes from one branch into another. It takes the contents of a source branch and integrates it with the target branch. If the histories of both branches have diverged, Git creates a new merge commit to combine the histories, preserving the history as it happened.&lt;/p&gt;

&lt;p&gt;Consider two branches, &lt;code&gt;feature&lt;/code&gt; and &lt;code&gt;master&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C feature
 /
D---E---F---G master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Merging &lt;code&gt;feature&lt;/code&gt; into &lt;code&gt;master&lt;/code&gt; would result in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C feature
 /         \
D---E---F---G---H master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The master branch now includes a new commit &lt;code&gt;H&lt;/code&gt; that represents the merge commit, preserving the history of both branches as they happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Git Rebase
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git rebase&lt;/code&gt; is a command that allows you to integrate changes from one branch into another, similar to &lt;code&gt;git merge&lt;/code&gt;. But it works in a different way. Let's consider &lt;code&gt;git rebase&lt;/code&gt; as a painting process. Imagine the &lt;code&gt;master&lt;/code&gt; branch as a wall and the &lt;code&gt;feature&lt;/code&gt; branch as an artist. Initially, the &lt;code&gt;master&lt;/code&gt; branch (the wall) is painted first. The &lt;code&gt;feature&lt;/code&gt; branch (the artist) then comes in and adds their work on top of the &lt;code&gt;master&lt;/code&gt; branch's work.&lt;/p&gt;

&lt;p&gt;However, if the original painting (the &lt;code&gt;master&lt;/code&gt; branch) is updated, the artist (the &lt;code&gt;feature&lt;/code&gt; branch) would temporarily remove their painting, allow the wall to be updated, and then add their painting back on top of the updated wall. This is essentially what happens in &lt;code&gt;git rebase&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git rebase&lt;/code&gt; takes the changes made in the feature branch and reapplies them onto the &lt;code&gt;master&lt;/code&gt; branch, effectively creating a new base for the &lt;code&gt;feature&lt;/code&gt; branch and rewriting history. This results in a more linear and clean commit history.&lt;/p&gt;

&lt;p&gt;Consider again two branches, feature and master:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A---B---C feature
 /
D---E---F---G master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rebasing &lt;code&gt;feature&lt;/code&gt; onto &lt;code&gt;master&lt;/code&gt; would give:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;D---E---F---G master
             \
              A'---B'---C' feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commits &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt;, and &lt;code&gt;C&lt;/code&gt; are reapplied onto &lt;code&gt;master&lt;/code&gt;, creating new commits &lt;code&gt;A'&lt;/code&gt;, &lt;code&gt;B'&lt;/code&gt;, and &lt;code&gt;C'&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing Git Merge and Git Rebase
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Benefits and Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Preserving History:&lt;/strong&gt; Git merge preserves history as it happened, including the time and order of all commits, while Git rebase can rewrite and clean up history, making it more linear and comprehensible. This can be beneficial when you want to understand the development process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflict Resolution:&lt;/strong&gt; When merging, conflicts need to be resolved once during the merge commit. However, during a rebase, you may have to resolve conflicts for each commit being reapplied. This can become tedious if many commits have similar conflicts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rebase for Local Cleanup:&lt;/strong&gt; Rebase can be used to clean up local, in-progress features. By periodically performing an interactive rebase, you can ensure each commit in your feature is focused and meaningful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge for Public Commits:&lt;/strong&gt; Once you have shared your branch with others, it is best practice to use merge. Rebase could potentially rewrite the commit history and create confusion for other developers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid Rebasing Public Branches:&lt;/strong&gt; Rebasing a public branch that others have based work on is a bad practice as it alters the commit history. This can cause confusion and further conflicts for other developers.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Both &lt;code&gt;git merge&lt;/code&gt; and &lt;code&gt;git rebase&lt;/code&gt; are powerful tools for integrating changes from one branch into another. They serve different purposes and are used in different scenarios. It's essential to understand the implications of each and choose the right tool for the right situation.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git merge&lt;/code&gt; is great for combining code from two different branches and preserving the exact historical timeline of commits. On the other hand, &lt;code&gt;git rebase&lt;/code&gt; is excellent for making your feature branch up to date with the latest code from the master branch, keeping the history of your feature branch clean and making it appear as if the work happened sequentially.&lt;/p&gt;

&lt;p&gt;In both cases, conflicts can arise and need to be resolved manually. But remember, once you've shared your branch with others, it's a best practice to use git merge to avoid rewriting public commit history.&lt;/p&gt;

</description>
      <category>git</category>
      <category>programming</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>LocalStack - Mock AWS in local development</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Wed, 11 Oct 2023 04:42:48 +0000</pubDate>
      <link>https://dev.to/arifszn/localstack-mock-aws-in-local-development-2an1</link>
      <guid>https://dev.to/arifszn/localstack-mock-aws-in-local-development-2an1</guid>
      <description>&lt;p&gt;Most of us are familiar with Amazon Web Services (AWS) and have probably used their cloud computing services at some point in our careers. AWS is a go-to solution for many developers when it comes to building and deploying applications on the cloud.&lt;/p&gt;

&lt;p&gt;However, working with AWS can come with its challenges, particularly when it comes to testing and development. While AWS offers a wide range of powerful services and tools, navigating through the vast array of options and configuring them correctly can be complex and costly. As AWS provides a pay-as-you-go pricing model, the costs can quickly escalate if resources are not managed effectively while developing and testing. Herein lies the role of LocalStack.&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%2Fe0b4c7vk61sn9yulles8.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%2Fe0b4c7vk61sn9yulles8.png" alt="AWS Services" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;LocalStack is an open-source project that provides a fully functional local AWS cloud stack. It allows developers to test and develop their applications offline without needing an internet connection or any cloud resources. LocalStack allows developers to emulate the behavior of AWS services such as S3, Lambda, DynamoDB, and more, all within a local environment, eliminating the need for an AWS account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features and Capabilities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simulation of entire AWS Services:&lt;/strong&gt; LocalStack enables developers to simulate the entire AWS ecosystem within its local environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Development:&lt;/strong&gt; With LocalStack, developers can work offline without relying on an internet connection or AWS account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Savings:&lt;/strong&gt; By simulating AWS services locally, LocalStack eliminates the costs associated with running resources in the cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Setup and Configuration:&lt;/strong&gt; LocalStack simplifies the setup process with a user-friendly command-line interface (CLI) and APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realistic Testing Scenarios:&lt;/strong&gt; By emulating the actual behavior of AWS services, LocalStack allows developers to create realistic testing scenarios. This early identification and resolution of potential issues lead to the development of more robust and reliable applications.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Installation &amp;amp; Setup
&lt;/h2&gt;

&lt;p&gt;There are several ways to install LocalStack on our local machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.localstack.cloud/getting-started/installation/#localstack-cli" rel="noopener noreferrer"&gt;LocalStack CLI&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.localstack.cloud/getting-started/installation/#localstack-cockpit" rel="noopener noreferrer"&gt;LocalStack Cockpit&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.localstack.cloud/getting-started/installation/#docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.localstack.cloud/getting-started/installation/#docker-compose" rel="noopener noreferrer"&gt;Docker-Compose&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://docs.localstack.cloud/getting-started/installation/#helm" rel="noopener noreferrer"&gt;Helm&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will use the &lt;code&gt;Docker-Compose&lt;/code&gt; method in this article. Docker and docker-compose should be installed on our machine as a prerequisite.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;code&gt;docker-compose.yml&lt;/code&gt; file and paste the following contents.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;

    &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;localstack&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localstack/localstack&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:4566:4566"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:4510-4559:4510-4559"&lt;/span&gt;
        &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DEBUG=${DEBUG-}&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DOCKER_HOST=unix:///var/run/docker.sock&lt;/span&gt;
        &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/var/run/docker.sock:/var/run/docker.sock"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Start the container by running &lt;code&gt;docker-compose up&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LocalStack should be started at &lt;a href="http://localhost:4566/" rel="noopener noreferrer"&gt;&lt;code&gt;http://localhost:4566&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To check it’s running properly, check the health by visiting &lt;a href="https://localhost:4566/health" rel="noopener noreferrer"&gt;&lt;code&gt;https://localhost:4566/health&lt;/code&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%2Fuploads%2Farticles%2Fx312xeiz9wojsas74yq7.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%2Fx312xeiz9wojsas74yq7.png" alt="health" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitation
&lt;/h2&gt;

&lt;p&gt;Before continuing the article, we should also know about the limitations of LocalStack. One of the major limitations of LocalStack is that the data are not persistent in the free/community version. Meaning, that every time we stop LocalStack, the data including the configuration we ran via command, the buckets, and the databases, all will be removed and it will start fresh on the next start.&lt;/p&gt;

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

&lt;p&gt;We are going to create a Lambda function and configure a trigger for Amazon S3 to demonstrate how LocalStack can be used for AWS mocking. When a new image is uploaded to the S3 bucket, the Lambda function should create a thumbnail of that image in the same bucket.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install AWS CLI
&lt;/h3&gt;

&lt;p&gt;As we are mocking AWS, the official AWS CLI should be installed on our machine. If it’s not installed, follow &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" rel="noopener noreferrer"&gt;this guide&lt;/a&gt; to install it first. After installing it, we will need to configure it as a first-time user by running &lt;code&gt;aws configure&lt;/code&gt;. Set any value as &lt;em&gt;Access Key ID&lt;/em&gt; and &lt;em&gt;Secret Access Key&lt;/em&gt; and set a &lt;em&gt;Default Region&lt;/em&gt; (e.g. ap-northeast-2). If you use your original Access key and secret, it’s okay too, as LocalStack will ignore it ultimately.&lt;/p&gt;

&lt;h4&gt;
  
  
  How will the AWS CLI communicate with LocalStack?
&lt;/h4&gt;

&lt;p&gt;By default, when we run a command in AWS CLI, it will try to communicate with AWS API. But here, we want to communicate with LocalStack instead AWS API. &lt;/p&gt;

&lt;p&gt;When running any AWS command, if we specify the endpoint, it will send the requests to that endpoint instead of the default endpoint.&lt;/p&gt;

&lt;p&gt;For example, let’s run a command &lt;code&gt;aws s3api list-buckets --endpoint-url=http://localhost:4566&lt;/code&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%2Fuploads%2Farticles%2Ftp6msmncrg6guph4gkbr.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%2Ftp6msmncrg6guph4gkbr.png" alt="Bucket List" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It displays the bucket list from LocalStack and does not throw any error even though we used dummy data as the AWS configuration.&lt;/p&gt;

&lt;h4&gt;
  
  
  How will the AWS SDK communicate with LocalStack?
&lt;/h4&gt;

&lt;p&gt;We can also use LocalStack in our AWS SDKs. We just have to point to the endpoint while initilizting the SDK. Here’s an example of JavaScript &lt;code&gt;aws-sdk&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-sdk&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;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;S3&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:4566&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Only needed for localstack&lt;/span&gt;
  &lt;span class="na"&gt;s3ForcePathStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Only needed for localstack&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we can use the &lt;strong&gt;&lt;code&gt;s3&lt;/code&gt;&lt;/strong&gt; object to interact with the S3 service locally through LocalStack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the Lambda function
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open a new terminal and create a directory by running &lt;code&gt;mkdir lambda-src&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the directory by running &lt;code&gt;cd lambda-src&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new file &lt;code&gt;package.json&lt;/code&gt; and paste the following code:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aws-sdk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.1376.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sharp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.32.1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run &lt;code&gt;npm install&lt;/code&gt; to install the dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new file &lt;code&gt;index.js&lt;/code&gt; and paste the following code:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-sdk&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;sharp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sharp&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;WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;64&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;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;S3&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`http://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LOCALSTACK_HOSTNAME&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="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EDGE_PORT&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="c1"&gt;// Only needed for localstack&lt;/span&gt;
  &lt;span class="na"&gt;s3ForcePathStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Only needed for localstack&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&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;srcBucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Records&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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;srcKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;decodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Records&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&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;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;srcKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&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="nx"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;x&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;WIDTH&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="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Skipping processed image.&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="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;destinationKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;srcKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&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;.&lt;/span&gt;&lt;span class="se"&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;$/&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="nx"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;x&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;$1`&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// output will be name-200x200.png&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;typeMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;srcKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&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;.&lt;/span&gt;&lt;span class="se"&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;$/&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="nx"&gt;typeMatch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Could not determine the image type.&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="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;imageType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;typeMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageType&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jpg&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;imageType&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;png&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;imageType&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jpeg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Unsupported image type: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;imageType&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="k"&gt;return&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;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;srcBucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;srcKey&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;originalImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;promise&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;buffer&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;sharp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;originalImage&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="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBuffer&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;destinationParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;srcBucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;destinationKey&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;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;ContentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;destinationParams&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Successfully resized &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;srcBucket&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;srcKey&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; and uploaded to &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;srcBucket&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;destinationKey&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&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;/li&gt;
&lt;li&gt;
&lt;p&gt;Then zip the directory. If you have &lt;code&gt;zip&lt;/code&gt; installed, you can run:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zip &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;.zip &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By running &lt;code&gt;cd ..&lt;/code&gt; return to the root directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create the Lambda function by running:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 &lt;span class="se"&gt;\&lt;/span&gt;
lambda create-function &lt;span class="nt"&gt;--function-name&lt;/span&gt; CreateThumbnail &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://lambda-src/function.zip &lt;span class="nt"&gt;--handler&lt;/span&gt; index.handler &lt;span class="nt"&gt;--runtime&lt;/span&gt; nodejs16.x &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--role&lt;/span&gt; arn:aws:iam::000000000000:role/lambda-s3-role
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a S3 bucket:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 s3 mb s3://avatar-bucket
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a file &lt;code&gt;notification-configuration.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"LambdaFunctionConfigurations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"LambdaFunctionArn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:lambda:ap-northeast-2:000000000000:function:CreateThumbnail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Events"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"s3:ObjectCreated:*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure Amazon S3 to publish events:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 &lt;span class="se"&gt;\&lt;/span&gt;
s3api put-bucket-notification-configuration &lt;span class="nt"&gt;--bucket&lt;/span&gt; avatar-bucket &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--notification-configuration&lt;/span&gt; file://notification-configuration.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy an image to the directory and upload the image to the S3 bucket:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 &lt;span class="se"&gt;\&lt;/span&gt;
s3api put-object &lt;span class="nt"&gt;--bucket&lt;/span&gt; avatar-bucket &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--key&lt;/span&gt; test-image.png &lt;span class="nt"&gt;--body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;test-image.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the log:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 logs &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="s1"&gt;'/aws/lambda/CreateThumbnail'&lt;/span&gt; &lt;span class="nt"&gt;--follow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To update the code:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 lambda update-function-code &lt;span class="nt"&gt;--function-name&lt;/span&gt; CreateThumbnail &lt;span class="nt"&gt;--zip-file&lt;/span&gt; fileb://lambda-src/function.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, a thumbnail will be created in the same bucket whenever a new image is uploaded. Once our development and testing phase is complete, proceed to replicate these actions in the production environment. Do remember to remove the &lt;code&gt;endpoint&lt;/code&gt; and &lt;code&gt;s3ForcePathStyle&lt;/code&gt; from the code as they are only needed to communicate with LocalStack.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://localstack.cloud" rel="noopener noreferrer"&gt;https://localstack.cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.localstack.cloud" rel="noopener noreferrer"&gt;https://docs.localstack.cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cover image from &lt;a href="https://localstack.cloud" rel="noopener noreferrer"&gt;https://localstack.cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS Services image from &lt;a href="https://allcode.com/top-aws-services" rel="noopener noreferrer"&gt;https://allcode.com/top-aws-services&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>cloud</category>
      <category>backend</category>
      <category>aws</category>
    </item>
    <item>
      <title>MinIO - Mock S3 in local development</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Wed, 07 Dec 2022 15:49:59 +0000</pubDate>
      <link>https://dev.to/arifszn/minio-mock-s3-in-local-development-4ke6</link>
      <guid>https://dev.to/arifszn/minio-mock-s3-in-local-development-4ke6</guid>
      <description>&lt;p&gt;Amazon S3 or Amazon Simple Storage Service is a service offered by Amazon Web Services that provides object storage through a web service interface. Amazon S3 is undoubtedly one of the popular storage services around. Most of the developers have worked with it either in their professional projects or pet projects to store files. But to work with it, we must need an AWS account, set up the buckets, etc. If you work on a company project, you would have to wait for the credentials from the infrastructure before developing and testing the functionalities. That's where MinIO comes to help.&lt;/p&gt;

&lt;p&gt;Minio is an open source distributed object storage server written in Go, designed for Private Cloud infrastructure providing S3 storage functionality. As it implements the same API as amazon S3, any application which can communicate with S3, also can communicate with MinIO. In simple terms, &lt;strong&gt;it’s like Amazon S3 but hosted locally&lt;/strong&gt;. MinIO is a high performance object storage solution that provides an Amazon Web Services S3-compatible API and supports all core S3 features.&lt;/p&gt;

&lt;p&gt;Why we are talking about MinIO because you can create S3 storage functionality locally, develop and test your API without needing any actual S3 bucket or account. Later at production, you can just change the credential from MinIO to S3 without changing any internal code.&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%2Fscw2idykhhbqni32bydc.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%2Fscw2idykhhbqni32bydc.png" alt="MinIO" width="473" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;S3 can serve many purposes including replacing S3 in production but we will talk about from a developer perspective where we will only use it for development, testing and mocking S3 functionalities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;MinIO has three major components.&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%2F37g9l618tsbkgghmn350.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%2F37g9l618tsbkgghmn350.PNG" alt="Architecture" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MinIO Server:&lt;/strong&gt; MinIO Server serves as the root component.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MinIO Client:&lt;/strong&gt; Referred to as mc provides a modern alternative to UNIX commands like ls, cat, cp, mirror, diff, find etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MinIO Client SDK:&lt;/strong&gt; MinIO Client SDK provides an API to access any Amazon S3 compatible object storage server. These are the available SDK:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.min.io/docs/java-client-quickstart-guide.html" rel="noopener noreferrer"&gt;Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.min.io/docs/golang-client-quickstart-guide.html" rel="noopener noreferrer"&gt;Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.min.io/docs/python-client-quickstart-guide.html" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.min.io/docs/javascript-client-quickstart-guide.html" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.min.io/docs/dotnet-client-quickstart-guide.html" rel="noopener noreferrer"&gt;.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.min.io/docs/haskell-client-quickstart-guide.html" rel="noopener noreferrer"&gt;Haskell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this article, we will learn how to setup a MinIO server in our localhost (which ideally can be replaced with S3 server in production). But we will not use the MinIo client. Rather we will use the existing amazon S3 client SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation &amp;amp; Setup
&lt;/h2&gt;

&lt;p&gt;We will now start the installation of the MinIO Server. The best and fastest way to run a instance of MinIO server locally is to use Docker (read more about &lt;a href="https://docs.docker.com" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;). You can use either &lt;strong&gt;Docker Run&lt;/strong&gt; or &lt;strong&gt;Docker Composer&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker Run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/minio/data

docker run &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-p&lt;/span&gt; 9000:9000 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-p&lt;/span&gt; 9090:9090 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; minio &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-v&lt;/span&gt; ~/minio/data:/data &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MINIO_ROOT_USER=root"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MINIO_ROOT_PASSWORD=password"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    quay.io/minio/minio server /data &lt;span class="nt"&gt;--console-address&lt;/span&gt; &lt;span class="s2"&gt;":9090"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mkdir&lt;/code&gt; creates a new local directory at &lt;code&gt;~/minio/data&lt;/code&gt; in your home directory.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker run&lt;/code&gt; starts the MinIO container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p&lt;/code&gt; binds a local port to a container port.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-name&lt;/code&gt; creates a name for the container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-v&lt;/code&gt; sets a file path as a persistent volume location for the container to use. When MinIO writes data to &lt;code&gt;/data&lt;/code&gt;, that data mirrors to the local path &lt;code&gt;~/minio/data&lt;/code&gt;, allowing it to persist between container restarts. You can replace &lt;code&gt;~/minio/data&lt;/code&gt; with another local file location to which the user has read, write, and delete access.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt; sets the environment variables &lt;a href="https://min.io/docs/minio/linux/reference/minio-server/minio-server.html#envvar.MINIO_ROOT_USER" rel="noopener noreferrer"&gt;&lt;code&gt;MINIO_ROOT_USER&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://min.io/docs/minio/linux/reference/minio-server/minio-server.html#envvar.MINIO_ROOT_PASSWORD" rel="noopener noreferrer"&gt;&lt;code&gt;MINIO_ROOT_PASSWORD&lt;/code&gt;&lt;/a&gt;, respectively. These set the &lt;a href="https://min.io/docs/minio/container/administration/identity-access-management/minio-user-management.html#minio-users-root" rel="noopener noreferrer"&gt;root user credentials&lt;/a&gt;. Change the example values to use for your container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, access the MinIO Console by going to a browser and visiting &lt;code&gt;http://127.0.0.1:9000&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker Compose
&lt;/h3&gt;

&lt;p&gt;In the &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;minio&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;minio/minio:latest'&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;${FORWARD_MINIO_PORT:-9000}:9000'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;${FORWARD_MINIO_CONSOLE_PORT:-9090}:9090'&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MINIO_ROOT_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;root'&lt;/span&gt;
      &lt;span class="na"&gt;MINIO_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;minio:/data/minio'&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;minio server /data/minio --console-address ":9090"&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;minio&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can access the MinIO Console at &lt;code&gt;http://127.0.0.1:9000&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  MinIO Play
&lt;/h3&gt;

&lt;p&gt;You can get started exploring MinIO features using their play server at &lt;a href="https://play.min.io" rel="noopener noreferrer"&gt;https://play.min.io&lt;/a&gt;. Any file uploaded to play should be considered public and non-protected.&lt;/p&gt;

&lt;p&gt;Credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Username: Q3AM3UQ867SPQQA43P2F

Password: zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Native Install
&lt;/h3&gt;

&lt;p&gt;If you do not want use Docker, you can install MinIO server natively in your machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://min.io/docs/minio/linux/index.html" rel="noopener noreferrer"&gt;For Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://min.io/docs/minio/macos/index.html" rel="noopener noreferrer"&gt;For MacOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://min.io/docs/minio/windows/index.html" rel="noopener noreferrer"&gt;For Windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Now that you have installed MinIO server, let's use it on your project. I will be using the official &lt;a href="https://github.com/aws/aws-sdk-js" rel="noopener noreferrer"&gt;S3 JavaScript SDK&lt;/a&gt; as example. But should be applicable for all other S3 SDKs.&lt;/p&gt;

&lt;p&gt;We will instruct the SDK to use the endpoint of our locally hosted MinIO server. Find the the initialization point of the SDK in your code. Modify the config as follows.&lt;/p&gt;

&lt;p&gt;For JavaScript SDK:&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;config&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;S3&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:9000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// for docker, http://minio:9000&lt;/span&gt;
  &lt;span class="na"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;accessKeyId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// MINIO_ROOT_USER&lt;/span&gt;
    &lt;span class="na"&gt;secretAccessKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// MINIO_ROOT_PASSWORD&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;s3ForcePathStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// important&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are using &lt;code&gt;MinIO Play&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&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;S3&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://play.min.io:9000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;accessKeyId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Q3AM3UQ867SPQQA43P2F&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;secretAccessKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;s3ForcePathStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Laravel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root
&lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password
&lt;span class="nv"&gt;AWS_DEFAULT_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1
&lt;span class="nv"&gt;AWS_BUCKET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:9000 &lt;span class="c"&gt;# for docker, http://minio:9000&lt;/span&gt;
&lt;span class="nv"&gt;AWS_USE_PATH_STYLE_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As simple as that. You do not need to change anything else. With these modifications, you now have a working connection with your client and the local server that you can use to mimic S3 functionalities without needing actual S3 configuration and access.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cloud</category>
      <category>opensource</category>
      <category>aws</category>
    </item>
    <item>
      <title>OneClick: navigate to your favorite actions on the websites you love with just one click</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Sat, 23 Jul 2022 09:52:00 +0000</pubDate>
      <link>https://dev.to/arifszn/awesome-shortcuts-navigate-to-your-favorite-actions-on-the-websites-you-love-with-just-one-click-aen</link>
      <guid>https://dev.to/arifszn/awesome-shortcuts-navigate-to-your-favorite-actions-on-the-websites-you-love-with-just-one-click-aen</guid>
      <description>&lt;p&gt;Let's introduce a simple productivity extension that has been recently featured on Chrome Web Store.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/arifszn" rel="noopener noreferrer"&gt;
        arifszn
      &lt;/a&gt; / &lt;a href="https://github.com/arifszn/OneClick" rel="noopener noreferrer"&gt;
        OneClick
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Navigate to your favorite actions on the websites you love with just one click.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;br&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/45073703/214260079-7a9b0c84-287a-4567-833f-a7b836f6eae3.gif"&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%2F45073703%2F214260079-7a9b0c84-287a-4567-833f-a7b836f6eae3.gif" width="5%"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;OneClick&lt;/h1&gt;
&lt;/div&gt;
  &lt;p&gt;
    &lt;a href="https://chrome.google.com/webstore/detail/oneclick/laonciagkijmeofonnbjlifmjingahok" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/fe8ef98cc755f7fac15e275c92b1d8a9375e641a88d1785a09cfcace64b16189/68747470733a2f2f696d672e736869656c64732e696f2f6368726f6d652d7765622d73746f72652f762f6c616f6e636961676b696a6d656f666f6e6e626a6c69666d6a696e6761686f6b"&gt;
    &lt;/a&gt;
    &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/oneclick/" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/988de4b2c12ecbac85c87dc4ee378f44752a4bdb8f38d51182a71880a18b6e19/68747470733a2f2f696d672e736869656c64732e696f2f616d6f2f762f6f6e65636c69636b"&gt;
    &lt;/a&gt;
    &lt;a href="https://chrome.google.com/webstore/detail/oneclick/laonciagkijmeofonnbjlifmjingahok" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/f866cbaac3423140444a657decf6197a9d00f011b7711b4b33277848016fe8f0/68747470733a2f2f696d672e736869656c64732e696f2f6368726f6d652d7765622d73746f72652f726174696e672f6c616f6e636961676b696a6d656f666f6e6e626a6c69666d6a696e6761686f6b"&gt;
    &lt;/a&gt;
    &lt;a href="https://codeclimate.com/github/arifszn/oneclick/maintainability" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/413af022584391ab96e70f4ef645fb4e72f269619247c0d2b87ad60960703f00/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f31653936616535643234396533366531636534342f6d61696e7461696e6162696c697479"&gt;
    &lt;/a&gt;
    &lt;a href="https://github.com/arifszn/oneclick/blob/main/LICENSE" rel="noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/3a9b04a8b6c39b37840982250f95d457ba1e06288c92b129694a022fbcd8e00a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f61726966737a6e2f6f6e65636c69636b"&gt;
    &lt;/a&gt;
    &lt;a href="https://github.com/arifszn/oneclick/issues" rel="noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/fff33c3ece40ecbc43a4d8248b383c4bf3a86cd63ff02f503c392defd7fdc1b5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f61726966737a6e2f6f6e65636c69636b"&gt;
    &lt;/a&gt;
    &lt;a href="https://github.com/arifszn/oneclick/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/a93286920599112849c7c2af9d239294be27738b440248e434813b1bd0ffb368/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f6e747269627574696f6e732d77656c636f6d652d627269676874677265656e2e7376673f7374796c653d666c6174"&gt;
    &lt;/a&gt;
    &lt;a href="https://www.buymeacoffee.com/arifszn" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/591d58e6a8627db2b315bb84e3f4b6e360dddcf7849028c12dd280d2f008d818/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73706f6e736f722d6275792532306d6525323061253230636f666665652d79656c6c6f773f6c6f676f3d6275796d6561636f66666565"&gt;
    &lt;/a&gt;
    &lt;a href="https://twitter.com/intent/tweet?text=Navigate%20to%20your%20favorite%20actions%20on%20the%20websites%20you%20love%20with%20just%20one%20click.&amp;amp;url=https://github.com/arifszn/oneclick&amp;amp;hashtags=javascript,opensource,js,webdev,developers" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/0a8d761fb872917a67c3a03c55d13da48213c49d32241ed866ef98786ccb6f66/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f75726c3f7374796c653d736f6369616c2675726c3d68747470732533412532462532466769746875622e636f6d25324661726966737a6e2532466f6e65636c69636b"&gt;
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;a href="https://oneclickweb.netlify.app" rel="nofollow noopener noreferrer"&gt;Home&lt;/a&gt;
    ·
    &lt;a href="https://github.com/arifszn/oneclick/issues" rel="noopener noreferrer"&gt;Report Bug&lt;/a&gt;
    ·
    &lt;a href="https://github.com/arifszn/oneclick/discussions" rel="noopener noreferrer"&gt;Request Feature&lt;/a&gt;
  &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Description&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;OneClick&lt;/strong&gt; is the ultimate productivity tool for your browser. With just one click, access a wide variety of actions and shortcuts, including creating a meeting on Google Meet, editing photos, creating new projects with popular frameworks, or taking notes. The extension includes 88 shortcuts, 29 customizable themes, and a clean, minimalist UI. Plus, it's open-source and free of ads. OneClick is available as a web app, Chrome extension, and Firefox add-on, making it easy to use across all your devices. Upgrade your browsing experience with OneClick today!&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;
  &lt;a href="https://oneclickweb.netlify.app" rel="nofollow noopener noreferrer"&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%2F45073703%2F215089263-a676c8fa-f49b-4614-bdcc-cf7beeb3e651.png" alt="Preview" width="60%"&gt;
  &lt;/a&gt;
  &lt;br&gt;
  &lt;a href="https://github.com/arifszn/OneClick#arifszn" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F45073703%2F463520461-54106eb3-70dd-422a-9243-45cf8e65c17b.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTY0ODg5OTAsIm5iZiI6MTc1NjQ4ODY5MCwicGF0aCI6Ii80NTA3MzcwMy80NjM1MjA0NjEtNTQxMDZlYjMtNzBkZC00MjJhLTkyNDMtNDVjZjhlNjVjMTdiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwODI5VDE3MzEzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE5MDc1OTI4NmQ5ZTM5ZmE4MmMyYjgwODQyYjQ4ZjEzNDhhMGY2ZjdlYjNiNmVlNmI2NTA3NGNiODY5NDRiMjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.mV_V_lhpZfs7voIT73j2cOeIlnnTo1O9CDMAK507K_M" width="50%" alt="Shadow"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Links&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/oneclick/laonciagkijmeofonnbjlifmjingahok" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Chrome Extension&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/oneclick" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Firefox Add-on&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://oneclickweb.netlify.app" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Web App&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;One-click navigation to frequently used actions on websites.&lt;/li&gt;
&lt;li&gt;Convenient shortcuts for creating new documents, presentations, notes, and more.&lt;/li&gt;
&lt;li&gt;Mark and quickly access frequently used shortcuts in a separate "favorites" section.&lt;/li&gt;
&lt;li&gt;Time-saving solution for managing and organizing links.&lt;/li&gt;
&lt;li&gt;Integrations with popular online services, such as Google, Bitly…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/arifszn/OneClick" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;In my daily life, I need to perform various activities like creating a google meeting, taking a note, creating a GitHub repo or sharing a code block. If I want to create a new google meeting, I need to perform &lt;strong&gt;5&lt;/strong&gt; steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for google meet in google.&lt;/li&gt;
&lt;li&gt;Click on the search result.&lt;/li&gt;
&lt;li&gt;Click on the 'New Meeting' button.&lt;/li&gt;
&lt;li&gt;A popup would appear saying if I want to create a meeting for now or later. I would click the 'Start an instant meeting'.&lt;/li&gt;
&lt;li&gt;I would have to wait depending on the internet speed in each step.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From that, I had the idea If I could create an extension that would increase my productivity by doing these activities in fewer steps. So I created this extension where I can create a meeting in &lt;strong&gt;2&lt;/strong&gt; steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the extension.&lt;/li&gt;
&lt;li&gt;A window will appear. Click the google meet icon.&lt;/li&gt;
&lt;/ol&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%2Fghn3qkadgld9u5b5n1lh.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%2Fghn3qkadgld9u5b5n1lh.png" alt="Home" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This extension has 88 useful website shortcuts that are also searchable from the top bar. You can choose from 29 themes to your liking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://oneclickweb.netlify.app" rel="noopener noreferrer"&gt;Web + PWA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/oneclick/laonciagkijmeofonnbjlifmjingahok" rel="noopener noreferrer"&gt;Chrome Extension (Featured)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/oneclick/" rel="noopener noreferrer"&gt;Firefox Extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/arifszn/OneClick" rel="noopener noreferrer"&gt;Source code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>react</category>
    </item>
    <item>
      <title>Get recent blog posts from popular blogging platforms with PHP</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Thu, 07 Jul 2022 07:17:00 +0000</pubDate>
      <link>https://dev.to/arifszn/get-recent-blog-posts-from-popular-blogging-platforms-with-php-3gd8</link>
      <guid>https://dev.to/arifszn/get-recent-blog-posts-from-popular-blogging-platforms-with-php-3gd8</guid>
      <description>&lt;p&gt;&lt;strong&gt;PHP Blog Client&lt;/strong&gt; is a PHP package to get recent blog posts from popular blogging platforms by just providing your username and showcase them on your portfolio or website.&lt;/p&gt;

&lt;p&gt;Currently available platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dev&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;/ul&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/arifszn" rel="noopener noreferrer"&gt;
        arifszn
      &lt;/a&gt; / &lt;a href="https://github.com/arifszn/php-blog-client" rel="noopener noreferrer"&gt;
        php-blog-client
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      PHP client to get recent blog posts from popular blogging platforms.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;br&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/45073703/174469932-d3cbf8a0-b6ba-4c64-ab77-456ea4408f87.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%2F45073703%2F174469932-d3cbf8a0-b6ba-4c64-ab77-456ea4408f87.png" width="50%"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;PHP client to get recent blog posts from popular blogging platforms&lt;/h4&gt;
&lt;/div&gt;
  &lt;p&gt;
    &lt;a href="https://packagist.org/packages/arifszn/blog-client" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/a2d95efe257ca62dbcc0512b49659268bad36c83486b61c849a06b1bf5191120/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f61726966737a6e2f626c6f672d636c69656e74"&gt;
    &lt;/a&gt;
    &lt;a href="https://github.com/arifszn/php-blog-client/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;
      &lt;img src="https://github.com/arifszn/php-blog-client/actions/workflows/ci.yml/badge.svg"&gt;
    &lt;/a&gt;
    &lt;a href="https://codeclimate.com/github/arifszn/php-blog-client/maintainability" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/8206051404a0a2b16f71ce499ebbdde4ef5687e783d27445e9a9cf34be3c900b/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f39626534616566316439666237383464333939392f6d61696e7461696e6162696c697479"&gt;
    &lt;/a&gt;
    &lt;a href="https://codeclimate.com/github/arifszn/php-blog-client/test_coverage" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/ef4239ff79b98f979ea85e1259cbe2811c724cc5acf02dfcf195d9066884bc19/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f39626534616566316439666237383464333939392f746573745f636f766572616765"&gt;
    &lt;/a&gt;
    &lt;a href="https://github.com/arifszn/php-blog-client/blob/main/LICENSE" rel="noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/42cd8dc0d33c90a3e2daf3e1680e493e5420c1194d4430c8f56ba45b0ad22d60/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f61726966737a6e2f7068702d626c6f672d636c69656e74"&gt;
    &lt;/a&gt;
    &lt;a href="https://github.com/arifszn/php-blog-client/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/a93286920599112849c7c2af9d239294be27738b440248e434813b1bd0ffb368/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f6e747269627574696f6e732d77656c636f6d652d627269676874677265656e2e7376673f7374796c653d666c6174"&gt;
    &lt;/a&gt;
    &lt;a href="https://www.buymeacoffee.com/arifszn" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/591d58e6a8627db2b315bb84e3f4b6e360dddcf7849028c12dd280d2f008d818/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73706f6e736f722d6275792532306d6525323061253230636f666665652d79656c6c6f773f6c6f676f3d6275796d6561636f66666565"&gt;
    &lt;/a&gt;
    &lt;a href="https://twitter.com/intent/tweet?text=PHP%20client%20to%20get%20recent%20blog%20posts%20from%20popular%20blogging%20platforms:&amp;amp;url=https%3A%2F%2Fgithub.com%2Farifszn%2Fphp-blog-client&amp;amp;hashtags=php,opensource,blog,webdev,developers" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/7a5d11b0e6368beb62a7a0d19a0af622ac7635317ad8c6429cdbb970a13ece4c/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f75726c3f75726c3d68747470732533412532462532466769746875622e636f6d25324661726966737a6e2532467068702d626c6f672d636c69656e74"&gt;
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;a href="https://packagist.org/packages/arifszn/blog-client" rel="nofollow noopener noreferrer"&gt;Packagist&lt;/a&gt;
    ·
    &lt;a href="https://github.com/arifszn/php-blog-client/issues" rel="noopener noreferrer"&gt;Report Bug&lt;/a&gt;
    ·
    &lt;a href="https://github.com/arifszn/php-blog-client/discussions" rel="noopener noreferrer"&gt;Request Feature&lt;/a&gt;
  &lt;/p&gt;
&lt;br&gt;
&lt;p&gt;Get recent blog posts from popular blogging platforms by just providing your username and showcase them on your portfolio or website.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JavaScript version: &lt;a href="https://github.com/arifszn/blog.js" rel="noopener noreferrer"&gt;blog.js&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Install via &lt;a href="https://packagist.org/packages/arifszn/blog-client" 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 arifszn/blog-client&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;getDevPost()&lt;/code&gt;:&lt;/strong&gt; Get 10 recent posts from &lt;a href="https://dev.to" rel="nofollow"&gt;dev&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight highlight-text-html-php notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;use&lt;/span&gt; &lt;span class="pl-v"&gt;Arifszn&lt;/span&gt;\&lt;span class="pl-v"&gt;Blog&lt;/span&gt;\&lt;span class="pl-smi"&gt;Client&lt;/span&gt;;

&lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;client&lt;/span&gt; = &lt;span class="pl-k"&gt;new&lt;/span&gt; &lt;span class="pl-v"&gt;Client&lt;/span&gt;();
&lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;result&lt;/span&gt; = &lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;client&lt;/span&gt;-&amp;gt;&lt;span class="pl-en"&gt;getDevPost&lt;/span&gt;(&lt;span class="pl-s"&gt;'&lt;span class="pl-s"&gt;yourusername&lt;/span&gt;'&lt;/span&gt;);&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;getMediumPost()&lt;/code&gt;:&lt;/strong&gt; Get 10 recent posts from &lt;a href="https://medium.com" rel="nofollow noopener noreferrer"&gt;medium&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight highlight-text-html-php notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;use&lt;/span&gt; &lt;span class="pl-v"&gt;Arifszn&lt;/span&gt;\&lt;span class="pl-v"&gt;Blog&lt;/span&gt;\&lt;span class="pl-smi"&gt;Client&lt;/span&gt;;

&lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;client&lt;/span&gt; = &lt;span class="pl-k"&gt;new&lt;/span&gt; &lt;span class="pl-v"&gt;Client&lt;/span&gt;();
&lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;result&lt;/span&gt; = &lt;span class="pl-s1"&gt;&lt;span class="pl-c1"&gt;$&lt;/span&gt;client&lt;/span&gt;-&amp;gt;&lt;span class="pl-en"&gt;getMediumPost&lt;/span&gt;(&lt;span class="pl-s"&gt;'&lt;span class="pl-s"&gt;yourusername&lt;/span&gt;'&lt;/span&gt;);&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Sample Response&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-text-html-php notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;array:&lt;span class="pl-c1"&gt;2&lt;/span&gt; [▼
  &lt;span class="pl-c1"&gt;0&lt;/span&gt; =&amp;gt; array:&lt;span class="pl-c1"&gt;6&lt;/span&gt; [▼
    &lt;span class="pl-s"&gt;"&lt;span class="pl-s"&gt;title&lt;/span&gt;"&lt;/span&gt; =&amp;gt; &lt;span class="pl-s"&gt;"&lt;span class="pl-s"&gt;Why Enhancing Virtual Reality is Important&lt;/span&gt;"&lt;/span&gt;
    &lt;span class="pl-s"&gt;"&lt;span class="pl-s"&gt;description&lt;/span&gt;"&lt;/span&gt; =&amp;gt; &lt;span class="pl-s"&gt;"&lt;span class="pl-s"&gt;Virtual reality is seen&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/arifszn/php-blog-client" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Step 1
&lt;/h2&gt;

&lt;p&gt;To get started, install via composer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require arifszn/blog-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2
&lt;/h2&gt;

&lt;p&gt;Import it.&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="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Arifszn\Blog\Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3
&lt;/h2&gt;

&lt;p&gt;Use it.&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;$client&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;Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$devPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getDevPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'yourusername'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$mediumPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMediumPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'yourusername'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will return 10 most recent posts. Here is a sample response:&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="k"&gt;array&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;▼&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;▼&lt;/span&gt;
    &lt;span class="s2"&gt;"title"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Why Enhancing Virtual Reality is Important"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"description"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"Virtual reality is seen as a “fun” technology to some without much..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"thumbnail"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"https://cdn-images-1.medium.com/max/2600/0*kz30LOdXT8CyOymh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"link"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"https://medium.com/p/ac19dd21c728"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"categories"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;▼&lt;/span&gt;
      &lt;span class="s2"&gt;"vr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"technology"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"virtual-reality"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"engineering"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"artificial-intelligence"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"publishedAt"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"2020-11-08 18:43:34"&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;▼&lt;/span&gt;
    &lt;span class="s2"&gt;"title"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"How to Get Started With Data Science: a Brief Guide"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"description"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"You’ve heard about data science and machine learning, and you want to get started. Maybe you hear..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"thumbnail"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"https://cdn-images-1.medium.com/max/2600/0*Ah0vLtsvxqUvRWuS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"link"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"https://medium.com/p/88ec244f2fee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"categories"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;▼&lt;/span&gt;
      &lt;span class="s2"&gt;"beginner-coding"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"data-science-training"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"machine-learning-course"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s2"&gt;"publishedAt"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"2020-26-07 22:55:26"&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;Now, showcase them on your website like this &lt;a href="https://arifszn.github.io/gitprofile" rel="noopener noreferrer"&gt;example&lt;/a&gt;.&lt;br&gt;
NPM package is also available &lt;a href="https://github.com/arifszn/blog.js" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/arifszn/php-blog-client" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;&lt;br&gt;
&lt;a href="https://packagist.org/packages/arifszn/blog-client" rel="noopener noreferrer"&gt;Packagist&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>showdev</category>
      <category>php</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Create Personal Portfolio Using Github Api with Blog</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Fri, 27 Aug 2021 13:26:56 +0000</pubDate>
      <link>https://dev.to/arifszn/create-personal-portfolio-using-github-api-with-blog-1a57</link>
      <guid>https://dev.to/arifszn/create-personal-portfolio-using-github-api-with-blog-1a57</guid>
      <description>&lt;p&gt;For a developer, a personal portfolio plays an important role to showcase his/her works, reach to potential clients or land a job. But making it requires a tremendous amount of works and time. Also maintaining it manually with the latest project is a pain.&lt;/p&gt;

&lt;p&gt;What if you could create your portfolio in 5 minutes just by providing your Github username and even host it without any cost? Do you want to display your skills, job history, education history, or even dev.to posts to your website? Then you are in right place.&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%2Fpifvgpaeqwmltjgyhehl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpifvgpaeqwmltjgyhehl.gif" alt="Preview" width="600" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Introducing &lt;strong&gt;GitProfile&lt;/strong&gt; to kickstart your personal portfolio with Github Api and blog.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/arifszn" rel="noopener noreferrer"&gt;
        arifszn
      &lt;/a&gt; / &lt;a href="https://github.com/arifszn/gitprofile" rel="noopener noreferrer"&gt;
        gitprofile
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🚀 Create and publish a dynamic portfolio by just providing your GitHub username.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;br&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/45073703/177566625-9b84e793-4559-4475-ba54-8d3d5f4123d4.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%2F45073703%2F177566625-9b84e793-4559-4475-ba54-8d3d5f4123d4.png" width="35%"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Easy to use automatic portfolio builder for every GitHub user!&lt;/h4&gt;
&lt;/div&gt;
  &lt;p&gt;
    &lt;a href="https://codeclimate.com/github/arifszn/gitprofile/maintainability" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a737ca6bd687b974b5f6bca9449c1b400b74cfad883a55ef0d0d65f75e071711/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f63363066343264376430623631626433336539382f6d61696e7461696e6162696c697479"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/arifszn/gitprofile/actions/workflows/deploy.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/arifszn/gitprofile/actions/workflows/deploy.yml/badge.svg"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/arifszn/gitprofile/issues" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a01658070be8ad7dafb10d36bc73ce8f7c3a192f11badca6e3fbb0bb9d4cd185/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f61726966737a6e2f67697470726f66696c65"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/arifszn/gitprofile/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/adc2e5b7bc1e1412a2af3c10944c669fa0f3fad07a2c43b61f216e430c5bb312/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f61726966737a6e2f67697470726f66696c65"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/arifszn/gitprofile/network/members" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3431f907c3cbede1de8ebbb3ec18c0f8db1652bb62c8004e3a27c4a2f372e17c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f61726966737a6e2f67697470726f66696c65"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/arifszn/gitprofile/commits/main" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9f7bca4c756d41894121a96c1c32fe59418d683b641c7ba019ee2e2cf87b343b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f61726966737a6e2f67697470726f66696c652f6d61696e"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/arifszn/gitprofile/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a93286920599112849c7c2af9d239294be27738b440248e434813b1bd0ffb368/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f6e747269627574696f6e732d77656c636f6d652d627269676874677265656e2e7376673f7374796c653d666c6174"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/arifszn/gitprofile/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/702cbdd205a83b6af6d448ddff7f377a766397883c8349bbc6c9137af49620e2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f61726966737a6e2f67697470726f66696c65"&gt;&lt;/a&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;a href="https://arifszn.github.io/gitprofile" rel="nofollow noopener noreferrer"&gt;View Demo&lt;/a&gt;
    ·
    &lt;a href="https://github.com/arifszn/gitprofile/issues" rel="noopener noreferrer"&gt;Report Bug&lt;/a&gt;
    ·
    &lt;a href="https://github.com/arifszn/gitprofile/discussions" rel="noopener noreferrer"&gt;Request Feature&lt;/a&gt;
  &lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://arifszn.github.io/gitprofile" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F45073703%2F298285679-eb6c38a4-ac92-4006-869b-e4e24f6f5cf6.gif%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTY0ODg5ODYsIm5iZiI6MTc1NjQ4ODY4NiwicGF0aCI6Ii80NTA3MzcwMy8yOTgyODU2NzktZWI2YzM4YTQtYWM5Mi00MDA2LTg2OWItZTRlMjRmNmY1Y2Y2LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwODI5VDE3MzEyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMxOTNkNDMxOTFmZmYwYjgyOTlmYjQ2NjI5ZDY0ODY4MmE2YjY2MmNjN2VhNzk2M2IzOGViNDIzOGVlNThmMzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.biQ8t37fV3OgeoQae4TBLMJns-Cj-UD-0fkVKas-OZo" alt="Preview" width="60%"&gt;
  &lt;/a&gt;
  &lt;br&gt;
  &lt;a href="https://github.com/arifszn/gitprofile#arifszn" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F45073703%2F298285713-4d2ccd45-e566-4743-bf61-cadc03ece54c.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTY0ODg5ODYsIm5iZiI6MTc1NjQ4ODY4NiwicGF0aCI6Ii80NTA3MzcwMy8yOTgyODU3MTMtNGQyY2NkNDUtZTU2Ni00NzQzLWJmNjEtY2FkYzAzZWNlNTRjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwODI5VDE3MzEyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE1N2I5Y2E0MWZjMzkzZjg3MjE0NDczODQ3MTBiNDZlYzY2ZDdmZTBhZTVjZTA3ZTdjYzg2NTJiNjRjNWEyMTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.URni5LjJvbk_hSH2EGv_Fg6dLyN29_SHnb57UqzdMIg" width="50%" alt="Shadow"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitProfile&lt;/strong&gt; is a powerful portfolio builder that allows you to create a stunning and personalized portfolio site in minutes, even if you have no coding experience. Simply provide your GitHub username, and GitProfile will automatically generate a portfolio. Best of all, you can easily deploy your portfolio to GitHub Pages with just a few clicks, making it accessible to the world in no time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✓ &lt;a href="https://github.com/arifszn/gitprofile#-installation--setup" rel="noopener noreferrer"&gt;Easy to Setup&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#themes" rel="noopener noreferrer"&gt;37 Themes&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#google-analytics" rel="noopener noreferrer"&gt;Google Analytics&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#hotjar" rel="noopener noreferrer"&gt;Hotjar&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#seo" rel="noopener noreferrer"&gt;SEO&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#pwa" rel="noopener noreferrer"&gt;PWA&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#avatar-and-bio" rel="noopener noreferrer"&gt;Avatar and Bio&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#social-links" rel="noopener noreferrer"&gt;Social Links&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#skills" rel="noopener noreferrer"&gt;Skill Section&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#experience" rel="noopener noreferrer"&gt;Experience Section&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#certifications" rel="noopener noreferrer"&gt;Certification Section&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#education" rel="noopener noreferrer"&gt;Education Section&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#projects" rel="noopener noreferrer"&gt;Projects Section&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#publications" rel="noopener noreferrer"&gt;Publication Section&lt;/a&gt;&lt;br&gt;
✓ &lt;a href="https://github.com/arifszn/gitprofile#blog-posts" rel="noopener noreferrer"&gt;Blog Posts Section&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To view a live example, &lt;strong&gt;&lt;a href="https://arifszn.github.io/gitprofile" rel="nofollow noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/45073703/298285738-406e8368-415a-42ef-89c5-d43cc8bbeb19.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTY0ODg5ODYsIm5iZiI6MTc1NjQ4ODY4NiwicGF0aCI6Ii80NTA3MzcwMy8yOTgyODU3MzgtNDA2ZTgzNjgtNDE1YS00MmVmLTg5YzUtZDQzY2M4YmJlYjE5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwODI5VDE3MzEyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWJhODgzZWQyNDI4YjdlNWI4Y2ZiNjI1YTJiOWUwNWRiYmE0YzAzY2YwMDljNDExYzI2NzlhMWY2NDU0MGVkNjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.dhUANxvvBaNWEB9lx2XQkKjUOhs6IQeipgopZsvB_uU"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F45073703%2F298285738-406e8368-415a-42ef-89c5-d43cc8bbeb19.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTY0ODg5ODYsIm5iZiI6MTc1NjQ4ODY4NiwicGF0aCI6Ii80NTA3MzcwMy8yOTgyODU3MzgtNDA2ZTgzNjgtNDE1YS00MmVmLTg5YzUtZDQzY2M4YmJlYjE5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwODI5VDE3MzEyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWJhODgzZWQyNDI4YjdlNWI4Y2ZiNjI1YTJiOWUwNWRiYmE0YzAzY2YwMDljNDExYzI2NzlhMWY2NDU0MGVkNjMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.dhUANxvvBaNWEB9lx2XQkKjUOhs6IQeipgopZsvB_uU" alt="Themes"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠 Installation &amp;amp; Setup&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;There are two ways to use &lt;strong&gt;GitProfile&lt;/strong&gt;. Use any.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;…&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/arifszn/gitprofile" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;GitProfile is an easy-to-customize personal dev portfolio template that is created with React.js. When you manage the code in a GitHub repository, it will automatically render a webpage with the owner's profile information, including a photo, bio, and repositories. Also, it includes space to highlight your details, job history, education history, skills, and recent blog posts.&lt;/p&gt;

&lt;p&gt;It's all possible using &lt;a href="https://developer.github.com/v3/" rel="noopener noreferrer"&gt;GitHub API&lt;/a&gt; (for automatically populating your website with content) and &lt;a href="https://github.com/arifszn/article-api" rel="noopener noreferrer"&gt;Article-api&lt;/a&gt; (for fetching recent blog posts).&lt;/p&gt;

&lt;p&gt;✓ 21 Themes&lt;br&gt;
✓ Google Analytics&lt;br&gt;
✓ Meta Tags&lt;br&gt;
✓ Avatar and Bio&lt;br&gt;
✓ Social Links&lt;br&gt;
✓ Skills&lt;br&gt;
✓ Experience&lt;br&gt;
✓ Education&lt;br&gt;
✓ Projects&lt;br&gt;
✓ Blog Posts&lt;/p&gt;

&lt;p&gt;To view a live example, &lt;strong&gt;&lt;a href="https://arifszn.github.io/gitprofile" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  🛠 Installation &amp;amp; Set Up
&lt;/h2&gt;

&lt;p&gt;These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.&lt;/p&gt;

&lt;p&gt;You'll need &lt;a href="https://git-scm.com" rel="noopener noreferrer"&gt;Git&lt;/a&gt; and &lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; (which comes with &lt;a href="http://npmjs.com" rel="noopener noreferrer"&gt;npm&lt;/a&gt;) installed on your computer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.github.com/en/get-started/quickstart/fork-a-repo" rel="noopener noreferrer"&gt;Fork&lt;/a&gt;&lt;/strong&gt; the repo so you have your own project to customize. A "fork" is a copy of a repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once you've found a home for your forked repository, &lt;strong&gt;&lt;a href="https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository-from-github/cloning-a-repository" rel="noopener noreferrer"&gt;clone&lt;/a&gt;&lt;/strong&gt; it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change into your new directory.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;gitprofile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Install dependencies&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Start the development server&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  🎨 Customization
&lt;/h2&gt;

&lt;p&gt;All the magic happens in the file &lt;code&gt;src/config&lt;/code&gt;. Open it and modify it according to your preference.&lt;/p&gt;

&lt;p&gt;These are the default values:&lt;/p&gt;

&lt;p&gt;
  config.js
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arifszn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Your GitHub org/user name. (Required)&lt;/span&gt;
    &lt;span class="na"&gt;sortBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// stars | updated&lt;/span&gt;
    &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// How many projects to display.&lt;/span&gt;
    &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;forks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Forked projects will not be displayed if set to true.&lt;/span&gt;
      &lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="c1"&gt;// These projects will not be displayed. example: ['my-project1', 'my-project2']&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;social&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;linkedin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;twitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;facebook&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;dribbble&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;behance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;medium&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;devto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;website&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;React.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;experiences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Company name 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;July 2019&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Present&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Company name 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jr. Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;January 2019&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; June 2019&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;education&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;institution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Institution name 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bachelor of Science&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2015&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2019&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;institution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Institution name 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Higher Secondary Certificate (HSC)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2012&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2014&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Display blog posts from your medium or dev.to account. (Optional)&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dev.to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// medium | dev.to&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arifszn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;// How many posts to display. Max is 10.&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;googleAnalytics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// GA3 tracking id/GA4 tag id&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="c1"&gt;// UA-XXXXXXXXX-X | G-XXXXXXXXXX&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;themeConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Hides the theme change switch&lt;/span&gt;
    &lt;span class="c1"&gt;// Useful if you want to support a single color mode&lt;/span&gt;
    &lt;span class="na"&gt;disableSwitch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Should we use the prefers-color-scheme media-query,&lt;/span&gt;
    &lt;span class="c1"&gt;// using user system preferences, instead of the hardcoded default&lt;/span&gt;
    &lt;span class="na"&gt;respectPrefersColorScheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;// Available themes. To remove any theme, exclude from here.&lt;/span&gt;
    &lt;span class="na"&gt;themes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cupcake&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bumblebee&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;emerald&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;corporate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;synthwave&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;retro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cyberpunk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;valentine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;halloween&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;garden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;forest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aqua&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lofi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pastel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fantasy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wireframe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;black&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;luxury&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dracula&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;
&lt;h3&gt;
  
  
  Themes
&lt;/h3&gt;

&lt;p&gt;There are 21 themes available that can be selected from the dropdown. &lt;/p&gt;

&lt;p&gt;The default theme can be specified.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;themeConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&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;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-1.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-1.png" alt="Theme Dropdown" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are some screenshots of different themes.&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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-2.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-2.png" alt="Themes" width="800" height="400"&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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-3.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-3.png" alt="Themes" width="800" height="400"&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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-4.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-4.png" alt="Themes" width="800" height="400"&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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-5.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-5.png" alt="Themes" width="800" height="400"&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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-6.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-6.png" alt="Themes" width="800" height="400"&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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-7.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fthemes-7.png" alt="Themes" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Google Analytics
&lt;/h3&gt;

&lt;p&gt;GitProfile supports both GA3 and GA4. If you do not want to use Google Analytics, keep the &lt;code&gt;id&lt;/code&gt; empty.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;googleAnalytics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Besides tracking visitors, GitProfile will track click events on projects and blog posts, and send them to Google Analytics.&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%2Fwww.arifszn.com%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fevent.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%2Fwww.arifszn.com%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fevent.png" alt="Google Analytics" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Meta Tags
&lt;/h3&gt;

&lt;p&gt;Meta tags will be auto-generated from configs dynamically. However, you can also manually add meta tags in &lt;code&gt;public\index.html&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Avatar and Bio
&lt;/h3&gt;

&lt;p&gt;Your github avatar and bio will be displayed here.&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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Favatar-card.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Favatar-card.png" alt="Avatar Bio" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Social Links
&lt;/h3&gt;

&lt;p&gt;GitProfile supports linking your social media services you're using, including LinkedIn, Twitter, Facebook, Dribbble, Behance, Medium, dev.to, personal website, and email.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;social&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;linkedin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ariful-alam&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;twitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arif_swozon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;facebook&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;dribbble&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;behance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;medium&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;devto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;website&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://arifszn.github.io&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Skills
&lt;/h3&gt;

&lt;p&gt;To showcase your skills provide them here.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;React.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Empty array will hide the skills section.&lt;/p&gt;
&lt;h3&gt;
  
  
  Experience
&lt;/h3&gt;

&lt;p&gt;Provide your job history in &lt;code&gt;experiences&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;experiences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Company name 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;July 2019&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Present&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Company name 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jr. Software Engineer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;January 2019&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; June 2019&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Empty array will hide the experience section.&lt;/p&gt;
&lt;h3&gt;
  
  
  Education
&lt;/h3&gt;

&lt;p&gt;Provide your education history in &lt;code&gt;education&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;education&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;institution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Institution name 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bachelor of Science&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2015&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2019&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;institution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Institution name 2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Higher Secondary Certificate (HSC)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2012&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2014&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="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;Empty array will hide the education section.&lt;/p&gt;
&lt;h3&gt;
  
  
  Projects
&lt;/h3&gt;

&lt;p&gt;Your public repo from github will be displayed here automatically. You can limit how many projects do you want to be displayed. Also, you can hide forked or specific repo.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arifszn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sortBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stars&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;forks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-project1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-project2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Blog Posts
&lt;/h3&gt;

&lt;p&gt;If you have &lt;a href="https://medium.com" rel="noopener noreferrer"&gt;medium&lt;/a&gt; or &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; account, you can show your recent blog posts in here just by providing your medium/dev.to username. You can limit how many posts to display (Max is 10).&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="na"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dev.to&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arifszn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;limit&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="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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fblog.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%2Farifszn.github.io%2Fassets%2Fimg%2Fhosted%2Fgitprofile%2Fblog.png" alt="Blog" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The posts are fetched by &lt;a href="https://github.com/arifszn/article-api" rel="noopener noreferrer"&gt;Article-api&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Deploy
&lt;/h2&gt;

&lt;p&gt;Once you are done with your setup and have completed all steps above, you need to put your website online! The fastest approach is to use &lt;a href="https://pages.github.com" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt; which is completely free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Github Pages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rename your forked repository to &lt;code&gt;username.github.io&lt;/code&gt;, where &lt;code&gt;username&lt;/code&gt; is your GitHub username (or organization name).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open &lt;code&gt;package.json&lt;/code&gt;, and change &lt;code&gt;homepage&lt;/code&gt;'s value to &lt;code&gt;username.github.io&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// package.json&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;homepage&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;username.github.io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run &lt;code&gt;npm run deploy&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you see &lt;code&gt;README.md&lt;/code&gt; at &lt;code&gt;username.github.io&lt;/code&gt;, be sure to change your GitHub Page's source to &lt;code&gt;gh-pages&lt;/code&gt; branch. See &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site" rel="noopener noreferrer"&gt;how to&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your personal portfolio will be live at &lt;code&gt;username.github.io&lt;/code&gt;. For more info, visit &lt;a href="https://create-react-app.dev/docs/deployment/#github-pages" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;2. Other:&lt;/strong&gt; You can also host your website to Netlify, Vercel, Heroku, or other popular services. Please refer to this &lt;a href="https://create-react-app.dev/docs/deployment" rel="noopener noreferrer"&gt;doc&lt;/a&gt; for a detailed deployment guide.&lt;/p&gt;




&lt;p&gt;&lt;sup&gt;&lt;em&gt;&lt;strong&gt;Repo: &lt;a href="https://github.com/arifszn/gitprofile" rel="noopener noreferrer"&gt;https://github.com/arifszn/gitprofile&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/sup&gt;&lt;br&gt;
&lt;sup&gt;&lt;em&gt;&lt;strong&gt;Demo: &lt;a href="https://arifszn.github.io/gitprofile" rel="noopener noreferrer"&gt;https://arifszn.github.io/gitprofile&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/sup&gt;&lt;br&gt;
&lt;sup&gt;&lt;em&gt;&lt;strong&gt;Check out my other works: &lt;a href="https://github.com/arifszn" rel="noopener noreferrer"&gt;https://github.com/arifszn&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>github</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Reactive Button: 3D animated react button component with progress bar</title>
      <dc:creator>Ariful Alam</dc:creator>
      <pubDate>Thu, 25 Mar 2021 13:48:15 +0000</pubDate>
      <link>https://dev.to/arifszn/reactive-button-3d-animated-react-button-component-with-progress-bar-2dm6</link>
      <guid>https://dev.to/arifszn/reactive-button-3d-animated-react-button-component-with-progress-bar-2dm6</guid>
      <description>&lt;p&gt;I was looking for an animated button library with progress bar for react. I didn't want to add any UI framework for that. The closest thing I found was &lt;a href="https://github.com/rcaferati/react-awesome-button" rel="noopener noreferrer"&gt;react-awesome-button&lt;/a&gt;. It is pretty good but didn't have many options like adding icons in loading text, rounded shape, outlined shape or shadow effect. Then I decided that I will make a library myself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/arifszn/reactive-button" rel="noopener noreferrer"&gt;𝐑𝐞𝐚𝐜𝐭𝐢𝐯𝐞 𝐁𝐮𝐭𝐭𝐨𝐧&lt;/a&gt; is a 3D animated react button component with progress bar. It is very lightweight and has zero dependency. You can add any icons in it and the fun part is, if you don't want to add any third party icon library in your project then it has default loading, success and error icons. It also serves the purpose of notification. So you might not need to install a bunch of libraries for that.&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%2Fttmksc5ujm9otu13l2b5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttmksc5ujm9otu13l2b5.gif" alt="Alt Text" width="622" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will be glad if you give it a try in your project. Also, please leave a ⭐️. Stars encourage us to contribute more and It costs you nothing.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/arifszn/reactive-button" rel="noopener noreferrer"&gt;https://github.com/arifszn/reactive-button&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Playground: &lt;a href="https://arifszn.github.io/reactive-button/docs/playground" rel="noopener noreferrer"&gt;https://arifszn.github.io/reactive-button/docs/playground&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The goal of the library is to show progress. Below example demonstrates an asynchronous task. When clicking the button, an asynchronous task (e.g. Data fetch, form submit) will be processed and after processing, a success or error message will be displayed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initialize a state with string value &lt;code&gt;'idle'&lt;/code&gt; and assign it as &lt;strong&gt;'buttonState'&lt;/strong&gt; prop. Now it will render an idle text.&lt;/li&gt;
&lt;li&gt;When the button is clicked, set state's value to &lt;code&gt;'loading'&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;When the task is completed, set state to &lt;code&gt;'success'&lt;/code&gt;, &lt;code&gt;'error'&lt;/code&gt; or &lt;code&gt;'idle'&lt;/code&gt; according to your need.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Basic Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactiveButton&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reactive-button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&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;onClickHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2000&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="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt;
         &lt;span class="na"&gt;buttonState&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClickHandler&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Full Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactiveButton&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reactive-button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&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;onClickHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2000&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="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt;
         &lt;span class="na"&gt;buttonState&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClickHandler&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;idleText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;loadingText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Loading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;successText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;errorText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class1 class2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;normal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;messageDuration&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;buttonRef&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
         &lt;span class="na"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For non asynchronous task, state management is not needed. Use as like normal button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Usage
&lt;/h2&gt;

&lt;p&gt;Reactive Button has all the functionalities of a normal button.&lt;/p&gt;

&lt;h3&gt;
  
  
  Color
&lt;/h3&gt;

&lt;p&gt;Reactive Button comes with 10 default color options.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"secondary"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"teal"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"green"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"red"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"violet"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"blue"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"yellow"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"dark"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"light"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Size
&lt;/h3&gt;

&lt;p&gt;There are 4 sizes available.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"tiny"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"small"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"large"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Style
&lt;/h3&gt;

&lt;p&gt;Make the buttons more beautiful with these customization options.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Existing State
&lt;/h3&gt;

&lt;p&gt;In your project, There might be existing state for loading indicator which accepts boolean value only. If you don't want to define new state for Reactive Button, then utilize the existing state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt;
      &lt;span class="na"&gt;buttonState&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;idleText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;loadingText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Loading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Without State
&lt;/h3&gt;

&lt;p&gt;You are not limited to use state always.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt;
   &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;doSomething&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
   &lt;span class="na"&gt;idleText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Some Text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Icons
&lt;/h3&gt;

&lt;p&gt;You can use your own icons. Don't forget to wrap them with a parent element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt;
   &lt;span class="na"&gt;idleText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FontAwesomeIcon&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;faReply&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt; Send&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Form Submit
&lt;/h3&gt;

&lt;p&gt;If you need to submit form by button clicking, set the &lt;code&gt;type&lt;/code&gt; prop as '&lt;strong&gt;submit&lt;/strong&gt;'.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;idleText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Submit"&lt;/span&gt;
   &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Anchor Tag
&lt;/h3&gt;

&lt;p&gt;To use Reactive button as anchor tag, simply wrap it with an anchor tag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://github.com/"&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReactiveButton&lt;/span&gt; &lt;span class="na"&gt;idleText&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Visit Github"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;My other works:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/arifszn/reddit-image-fetcher" rel="noopener noreferrer"&gt;Reddit Image Fetcher&lt;/a&gt;: A JavaScript package for fetching reddit images, memes, wallpapers and more.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>react</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
