<?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: Monawwar Abdullah</title>
    <description>The latest articles on DEV Community by Monawwar Abdullah (@monawwar).</description>
    <link>https://dev.to/monawwar</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%2F79525%2F723753bf-46a5-4471-a969-59992a3a1f32.JPG</url>
      <title>DEV Community: Monawwar Abdullah</title>
      <link>https://dev.to/monawwar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/monawwar"/>
    <language>en</language>
    <item>
      <title>Why I built Drivebase. An open-source unified file manager.</title>
      <dc:creator>Monawwar Abdullah</dc:creator>
      <pubDate>Wed, 04 Mar 2026 10:30:44 +0000</pubDate>
      <link>https://dev.to/monawwar/why-i-built-drivebase-an-open-source-unified-file-manager-1fhl</link>
      <guid>https://dev.to/monawwar/why-i-built-drivebase-an-open-source-unified-file-manager-1fhl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;First of all, a huge thank you to everyone who has starred the repo. 😊&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It started back in 2025 when I wanted to upload files to Telegram. I had many files in Saved Messages, but it was becoming difficult to manage them. I didn’t have a structured way to organize my files. I wanted a place where I could create folders and upload files, while the content would still be saved in Telegram’s Saved Messages. So I built Xile, a file manager specifically for Telegram.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App UI
   ↓
Backend
   ↓
Telegram API
   ↓
Saved Messages storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Website: &lt;a href="https://drivebase.io" rel="noopener noreferrer"&gt;https://drivebase.io&lt;/a&gt;&lt;br&gt;
Source code: &lt;a href="https://github.com/drivebase/drivebase" rel="noopener noreferrer"&gt;https://github.com/drivebase/drivebase&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What Drivebase Can Do Today
&lt;/h2&gt;

&lt;p&gt;Fast forward today, its now been renamed to Drivebase, and supports not only Telegram but major other storage provider, and slowly adding more in the future as the app grows.&lt;/p&gt;

&lt;p&gt;Drivebase evolved from a Telegram file hack into a unified storage layer. Instead of juggling multiple storage apps, Drivebase lets you connect them all in one place and manage them through a single interface.&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;StorageProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;download&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;delete&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;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Run the following command to get started, it creates a folder and downloads the latest Docker compose file and spin up all the services required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://drivebase.io/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Multiple Storage Providers
&lt;/h2&gt;

&lt;p&gt;Today, Drivebase supports several major storage providers.&lt;/p&gt;

&lt;p&gt;You can connect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Drive&lt;/li&gt;
&lt;li&gt;S3 compatible storage (AWS S3, Cloudflare R2, MinIO, etc.)&lt;/li&gt;
&lt;li&gt;Dropbox&lt;/li&gt;
&lt;li&gt;WebDAV servers&lt;/li&gt;
&lt;li&gt;Nextcloud&lt;/li&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Unified File Manager
&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%2F52edmo0yiex96qyx328a.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%2F52edmo0yiex96qyx328a.png" alt="drivebase-dashboard" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of switching between multiple apps, Drivebase gives you a single interface to manage everything.&lt;/p&gt;

&lt;p&gt;From the UI you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browse files&lt;/li&gt;
&lt;li&gt;Create folders&lt;/li&gt;
&lt;li&gt;Upload and download files&lt;/li&gt;
&lt;li&gt;Move files between folders&lt;/li&gt;
&lt;li&gt;Manage multiple drives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The experience is intentionally designed to feel like a normal file manager, even though the data may live across completely different providers.&lt;/p&gt;

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

&lt;p&gt;Beyond simply connecting storage providers, Drivebase adds several layers of functionality that most storage platforms don’t provide out of the box.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. End-to-End Encrypted Vault
&lt;/h3&gt;

&lt;p&gt;Drivebase includes an optional E2EE Vault for storing sensitive files.&lt;/p&gt;

&lt;p&gt;Files placed inside the vault are encrypted on the client before being uploaded to the storage provider. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the storage provider cannot read the file contents&lt;/li&gt;
&lt;li&gt;Drivebase servers cannot read the file contents&lt;/li&gt;
&lt;li&gt;only the user with the vault key can decrypt them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows you to store private data even on third-party storage providers while keeping full control over encryption.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Rule-Based Smart Uploads
&lt;/h3&gt;

&lt;p&gt;Drivebase can automatically decide where files should be stored based on configurable rules.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload videos larger than 500MB → S3 storage
= Documents → Google Drive&lt;/li&gt;
&lt;li&gt;Backups → self-hosted WebDAV&lt;/li&gt;
&lt;li&gt;Temporary files → Telegram storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of manually selecting a destination each time, Drivebase routes uploads automatically using these rules.&lt;/p&gt;

&lt;p&gt;This turns Drivebase into a storage router, not just a file manager.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Smart Search Across Providers
&lt;/h3&gt;

&lt;p&gt;Searching files across multiple storage providers is usually painful.&lt;/p&gt;

&lt;p&gt;Drivebase solves this by building a unified metadata index, allowing you to search files across all connected providers at once.&lt;/p&gt;

&lt;p&gt;You can search by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;file name&lt;/li&gt;
&lt;li&gt;file content&lt;/li&gt;
&lt;li&gt;image text (OCR)&lt;/li&gt;
&lt;li&gt;folder path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of checking five different apps, you can locate any file from a single search bar.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cloud-to-Cloud Transfers
&lt;/h3&gt;

&lt;p&gt;Drivebase supports direct transfers between storage providers.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Drive → S3&lt;/li&gt;
&lt;li&gt;Dropbox → Nextcloud&lt;/li&gt;
&lt;li&gt;Telegram → S3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This removes the need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;download files locally&lt;/li&gt;
&lt;li&gt;re-upload them somewhere else&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drivebase handles the transfer between providers automatically.&lt;br&gt;
This is particularly useful for migrations and backups.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Granular API Keys
&lt;/h3&gt;

&lt;p&gt;Most storage services force you to give third-party tools full account access.&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%2Fmwae1tk8mqag04a4zx5o.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%2Fmwae1tk8mqag04a4zx5o.png" alt="api-keys" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Drivebase introduces granular API keys so you can restrict exactly what an integration is allowed to do.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys can be limited by:&lt;/li&gt;
&lt;li&gt;specific storage providers&lt;/li&gt;
&lt;li&gt;specific folders within a provider&lt;/li&gt;
&lt;li&gt;allowed operations (upload, read, delete, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows safer integrations without exposing your entire storage account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for Self-Hosting
&lt;/h2&gt;

&lt;p&gt;Drivebase is also designed to be easy to run yourself.&lt;/p&gt;

&lt;p&gt;You can deploy it with Docker and connect it to the storage providers you already use.&lt;/p&gt;

&lt;p&gt;This makes it useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;personal file management&lt;/li&gt;
&lt;li&gt;home labs&lt;/li&gt;
&lt;li&gt;teams managing multiple storage systems&lt;/li&gt;
&lt;li&gt;developers building storage workflows&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Restflow: CLI tool for API testing</title>
      <dc:creator>Monawwar Abdullah</dc:creator>
      <pubDate>Mon, 01 Sep 2025 14:01:08 +0000</pubDate>
      <link>https://dev.to/monawwar/restflow-cli-tool-for-api-testing-254f</link>
      <guid>https://dev.to/monawwar/restflow-cli-tool-for-api-testing-254f</guid>
      <description>&lt;h2&gt;
  
  
  What is Restflow?
&lt;/h2&gt;

&lt;p&gt;Restflow is an innovative API testing and workflow automation tool that uses &lt;code&gt;.flow&lt;/code&gt; files to define test scenarios in plain text. With Restflow, you can create comprehensive API test suites that are as easy to read as they are to write.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features at a Glance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌊 Simple DSL&lt;/strong&gt;: Write API tests in human-readable &lt;code&gt;.flow&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔧 Variable Substitution&lt;/strong&gt;: Dynamic values with &lt;code&gt;{{variable}}&lt;/code&gt; syntax&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌍 Environment Support&lt;/strong&gt;: Multi-environment testing with &lt;code&gt;.env&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✅ Powerful Assertions&lt;/strong&gt;: JSONPath and regex-based response validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 Multiple Output Formats&lt;/strong&gt;: Console, JSON, and summary reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔗 Step Dependencies&lt;/strong&gt;: Capture values and chain requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Fast Execution&lt;/strong&gt;: Concurrent processing with timeout support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Built-in Variables&lt;/strong&gt;: UUID, timestamp, random values out of the box&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Restflow Stands Out
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Human-Readable Syntax
&lt;/h3&gt;

&lt;p&gt;Traditional API testing tools often require you to write complex JSON configurations or learn proprietary syntax. Restflow's DSL reads like documentation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Get User Profile
GET https://api.example.com/users/123
Authorization: Bearer {{token}}

&amp;gt; assert status == 200
&amp;gt; assert body.name == "John Doe"
&amp;gt; assert body.email contains "@example.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare this to a typical JSON-based test configuration, and the difference is immediately clear – Restflow flows are self-documenting.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Zero Configuration Setup
&lt;/h3&gt;

&lt;p&gt;Getting started with Restflow is as simple as:&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;# Create a new project with templates&lt;/span&gt;
pnpm create restflow

&lt;span class="c"&gt;# Or add to an existing project&lt;/span&gt;
pnpm add &lt;span class="nt"&gt;-D&lt;/span&gt; @restflow/cli

&lt;span class="c"&gt;# Or install globally&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @restflow/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No complex configuration files, no framework setup – just create a &lt;code&gt;.flow&lt;/code&gt; file and you're ready to test.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Built-in Intelligence
&lt;/h3&gt;

&lt;p&gt;Restflow comes with intelligent built-in variables that generate fresh values on each run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;{{uuid}}&lt;/code&gt; - Generates unique UUIDs for test data&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{timestamp}}&lt;/code&gt; - Current Unix timestamp&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{randomString}}&lt;/code&gt; - Random alphanumeric strings&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{randomNumber}}&lt;/code&gt; - Random numbers for test scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. E-commerce Platform Testing
&lt;/h3&gt;

&lt;p&gt;Let's say you're testing an e-commerce API. Here's how you might test the complete user journey:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Register New Customer
POST https://api.shop.com/auth/register
Content-Type: application/json

{
  "email": "customer-{{uuid}}@test.com",
  "password": "SecurePass123",
  "firstName": "Test",
  "lastName": "Customer"
}

&amp;gt; assert status == 201
&amp;gt; assert body.success == true
&amp;gt; capture customerId = body.customer.id
&amp;gt; capture authToken = body.token

### Login Customer
POST https://api.shop.com/auth/login
Content-Type: application/json

{
  "email": "customer-{{uuid}}@test.com",
  "password": "SecurePass123"
}

&amp;gt; assert status == 200
&amp;gt; assert body.token != null
&amp;gt; capture loginToken = body.token

### Browse Products
GET https://api.shop.com/products?category=electronics
Authorization: Bearer {{loginToken}}

&amp;gt; assert status == 200
&amp;gt; assert body.products.length &amp;gt; 0
&amp;gt; capture firstProductId = body.products[0].id
&amp;gt; capture productPrice = body.products[0].price

### Add to Cart
POST https://api.shop.com/cart/add
Authorization: Bearer {{loginToken}}
Content-Type: application/json

{
  "productId": "{{firstProductId}}",
  "quantity": 2
}

&amp;gt; assert status == 200
&amp;gt; assert body.cart.items.length == 1
&amp;gt; assert body.cart.total == {{productPrice}} * 2

### Checkout Process
POST https://api.shop.com/orders/create
Authorization: Bearer {{loginToken}}
Content-Type: application/json

{
  "paymentMethod": "credit_card",
  "shippingAddress": {
    "street": "123 Test St",
    "city": "Test City",
    "zip": "12345"
  }
}

&amp;gt; assert status == 201
&amp;gt; assert body.order.status == "pending"
&amp;gt; assert body.order.customerId == "{{customerId}}"
&amp;gt; capture orderId = body.order.id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Authentication &amp;amp; Authorization Testing
&lt;/h3&gt;

&lt;p&gt;Testing complex auth flows becomes straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Admin Login
POST https://api.company.com/auth/admin/login
Content-Type: application/json

{
  "username": "{{adminUser}}",
  "password": "{{adminPassword}}"
}

&amp;gt; assert status == 200
&amp;gt; assert body.user.role == "admin"
&amp;gt; assert body.permissions contains "user_management"
&amp;gt; capture adminToken = body.token

### Create Regular User
POST https://api.company.com/users
Authorization: Bearer {{adminToken}}
Content-Type: application/json

{
  "username": "testuser_{{timestamp}}",
  "email": "user{{randomNumber}}@test.com",
  "role": "user"
}

&amp;gt; assert status == 201
&amp;gt; capture newUserId = body.id

### Test Permission Boundaries
DELETE https://api.company.com/users/{{newUserId}}
Authorization: Bearer {{userToken}}

&amp;gt; assert status == 403
&amp;gt; assert body.error == "Insufficient permissions"

### Admin Can Delete User
DELETE https://api.company.com/users/{{newUserId}}
Authorization: Bearer {{adminToken}}

&amp;gt; assert status == 204
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Environment-Specific Testing
&lt;/h3&gt;

&lt;p&gt;Restflow makes multi-environment testing seamless:&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;# Development environment&lt;/span&gt;
restflow run flows/ &lt;span class="nt"&gt;--env&lt;/span&gt; .env.dev

&lt;span class="c"&gt;# Staging environment  &lt;/span&gt;
restflow run flows/ &lt;span class="nt"&gt;--env&lt;/span&gt; .env.staging

&lt;span class="c"&gt;# Production health checks&lt;/span&gt;
restflow run health-checks/ &lt;span class="nt"&gt;--env&lt;/span&gt; .env.prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your &lt;code&gt;.env.staging&lt;/code&gt; file might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BASE_URL=https://staging-api.example.com
API_KEY=staging_key_12345
DATABASE_URL=postgres://staging-db:5432/app
TIMEOUT=30000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multiple Output Formats
&lt;/h3&gt;

&lt;p&gt;Restflow adapts to different needs:&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;# Human-readable console output (default)&lt;/span&gt;
restflow run flows/

&lt;span class="c"&gt;# JSON for CI/CD integration&lt;/span&gt;
restflow run flows/ &lt;span class="nt"&gt;--format&lt;/span&gt; json &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; test-results.json

&lt;span class="c"&gt;# Concise summary for monitoring&lt;/span&gt;
restflow run flows/ &lt;span class="nt"&gt;--format&lt;/span&gt; summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Variable Hierarchy and Overrides
&lt;/h3&gt;

&lt;p&gt;Restflow provides a sophisticated variable system with clear precedence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Built-in variables&lt;/strong&gt; (lowest priority): &lt;code&gt;{{uuid}}&lt;/code&gt;, &lt;code&gt;{{timestamp}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment variables&lt;/strong&gt;: From &lt;code&gt;.env&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Captured variables&lt;/strong&gt;: From previous response steps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI variables&lt;/strong&gt; (highest priority): Passed via command line&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means you can override built-in variables when needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Override for consistent testing
uuid=test-user-12345
timestamp=1640995200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration with CI/CD
&lt;/h2&gt;

&lt;p&gt;Restflow is designed for seamless integration into modern development workflows:&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Actions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API Tests&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api-tests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-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;18'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Restflow&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g @restflow/cli&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API Tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;restflow run tests/api/ --env .env.ci --format json&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload Results&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-test-results&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test-results.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker Integration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18-alpine&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @restflow/cli
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; flows/ /app/flows/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; .env.docker /app/.env&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["restflow", "run", "flows/", "--env", ".env", "--format", "json"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Performance and Scalability
&lt;/h2&gt;

&lt;p&gt;Restflow is built for performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Concurrent Execution&lt;/strong&gt;: Multiple requests run in parallel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurable Timeouts&lt;/strong&gt;: Fine-tune performance for your needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Memory Usage&lt;/strong&gt;: Minimal overhead for large test suites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast Startup&lt;/strong&gt;: No heavy framework initialization
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run with custom timeout and verbose output&lt;/span&gt;
restflow run large-test-suite/ &lt;span class="nt"&gt;--timeout&lt;/span&gt; 60000 &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  1. Modular Flow Design
&lt;/h3&gt;

&lt;p&gt;Organize flows by feature or service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flows/
├── auth/
│   ├── 01-registration.flow
│   ├── 02-login.flow
│   └── 03-password-reset.flow
├── users/
│   ├── 01-profile-crud.flow
│   ├── 02-permissions.flow
│   └── 03-user-search.flow
└── orders/
    ├── 01-create-order.flow
    ├── 02-order-status.flow
    └── 03-order-cancellation.flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Effective Variable Usage
&lt;/h3&gt;

&lt;p&gt;Use descriptive variable names and leverage the hierarchy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Setup Test Data
POST {{BASE_URL}}/test-data/setup
Content-Type: application/json

{
  "scenario": "user_registration_flow",
  "timestamp": "{{timestamp}}"
}

&amp;gt; capture testDataId = body.id

### Use Test Data
GET {{BASE_URL}}/data/{{testDataId}}
X-Test-Run: {{uuid}}

&amp;gt; assert body.scenario == "user_registration_flow"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Comprehensive Error Testing
&lt;/h3&gt;

&lt;p&gt;Don't just test the happy path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### Test Rate Limiting
POST {{BASE_URL}}/api/endpoint
Content-Type: application/json

{"data": "test"}

&amp;gt; assert status == 200

### Trigger Rate Limit
POST {{BASE_URL}}/api/endpoint
POST {{BASE_URL}}/api/endpoint
POST {{BASE_URL}}/api/endpoint
POST {{BASE_URL}}/api/endpoint
POST {{BASE_URL}}/api/endpoint

&amp;gt; assert status == 429
&amp;gt; assert body.error contains "rate limit"
&amp;gt; assert headers["retry-after"] matches "\\d+"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Future of API Testing
&lt;/h2&gt;

&lt;p&gt;Restflow represents a paradigm shift in API testing philosophy. By prioritizing readability, simplicity, and developer experience, it enables teams to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write tests faster&lt;/strong&gt;: No complex setup or learning curve&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintain tests easier&lt;/strong&gt;: Human-readable syntax that doubles as documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaborate better&lt;/strong&gt;: Non-technical team members can understand and contribute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale confidently&lt;/strong&gt;: Robust execution engine handles complex scenarios&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The Restflow roadmap includes exciting developments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GUI Test Builder&lt;/strong&gt;: Visual flow creation for non-technical users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Monitoring&lt;/strong&gt;: Continuous API health monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Reporting&lt;/strong&gt;: Detailed analytics and trend analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin System&lt;/strong&gt;: Extensible architecture for custom functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Integration&lt;/strong&gt;: Hosted execution and collaboration features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/mxvsh/restflow" rel="noopener noreferrer"&gt;https://github.com/mxvsh/restflow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Comprehensive guides in the repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Examples&lt;/strong&gt;: Real-world flows in the &lt;code&gt;examples/&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community&lt;/strong&gt;: Join discussions in GitHub Issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NPM Package&lt;/strong&gt;: &lt;code&gt;@restflow/cli&lt;/code&gt; for global installation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transform your API testing workflow with Restflow – where simplicity meets power, and testing becomes a joy rather than a chore.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>api</category>
      <category>testing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Execute Async Server Function from Client Side</title>
      <dc:creator>Monawwar Abdullah</dc:creator>
      <pubDate>Sun, 12 Sep 2021 05:22:53 +0000</pubDate>
      <link>https://dev.to/monawwar/execute-server-function-from-client-side-3m2l</link>
      <guid>https://dev.to/monawwar/execute-server-function-from-client-side-3m2l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Execute server's asynchronous functions from client-side&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Often it happens while writing web application that you need to make HTTP requests to fetch, create, update or delete data from database.&lt;/p&gt;

&lt;p&gt;With RealSync, you wouldn't have to remember all those HTTP endpoints, and perform actions as if you're executing server functions from client-side.&lt;/p&gt;

&lt;p&gt;RealSync uses web socket to make contact with the server and execute asynchronous function and returns promise which you can await in the client side. Here is an example of a server code, you can connect it with &lt;code&gt;Express&lt;/code&gt; or &lt;code&gt;Koa&lt;/code&gt;, if you want.&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;http&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;http&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&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;RealSync&lt;/span&gt; &lt;span class="p"&gt;}&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;../packages/server/lib&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;realsync&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;RealSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&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="nx"&gt;realsync&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile/setup&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;client&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstName&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile/firstname&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;lastName&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile/lastname&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="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&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="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;8080&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;This will register a service “add” in realsync and accept two parameters, &lt;strong&gt;a&lt;/strong&gt; and &lt;strong&gt;b&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And here is a client demonstration using React:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RealSync&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;@realsync/react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;realsync&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;RealSync&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:8080&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="nf"&gt;useEffect&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;// this will register services&lt;/span&gt;

        &lt;span class="nx"&gt;realsync&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile/firstname&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter first name&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;realsync&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile/lastname&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter last name&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Start&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="o"&gt;=&amp;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;profile&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;realsync&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile/setup&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;profile&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;I would love to have feedback forum you guys. I’ve more to add in this library.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://GitHub.com/xencodes/realsync" rel="noopener noreferrer"&gt;https://GitHub.com/xencodes/realsync&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>socket</category>
      <category>express</category>
      <category>node</category>
    </item>
    <item>
      <title>Realtime connector for Strapi</title>
      <dc:creator>Monawwar Abdullah</dc:creator>
      <pubDate>Wed, 08 Sep 2021 10:10:22 +0000</pubDate>
      <link>https://dev.to/monawwar/realtime-connector-for-strapi-38bm</link>
      <guid>https://dev.to/monawwar/realtime-connector-for-strapi-38bm</guid>
      <description>&lt;p&gt;I've been using Strapi in many of my projects, and I love using it. So, to make it easier for Strapi developer to build awesome apps using React, I've made Floxum which can add an extra layer to Strapi, and that is Realtime. &lt;/p&gt;

&lt;p&gt;Floxum uses Socket.IO in the background to communicate with Strapi server, and from the client side, a user can execute Strapi services. Here is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;floxum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;services&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;todo&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;find&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;_limit&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;then&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="o"&gt;=&amp;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;data&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;This is an async function, which will execute &lt;code&gt;find&lt;/code&gt; method on the Strapi server and returns the output using a Promise. This is just like you're execute a Strapi's server functions directly from React application.&lt;/p&gt;

&lt;p&gt;This way, it's easier to build React apps connected with Strapi without making about HTTP requests, like we use &lt;code&gt;axios&lt;/code&gt; or &lt;code&gt;fetch&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The installation will also work for the projects which are already using Strapi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 1
&lt;/h3&gt;

&lt;p&gt;Install the following module inside your React project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add @floxum/react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2
&lt;/h3&gt;

&lt;p&gt;Install the following module inside your Strapi application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add @floxum/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3
&lt;/h3&gt;

&lt;p&gt;Create a new file inside your React application to setup Floxum at &lt;code&gt;src/providers&lt;/code&gt; (or anywhere you'd want) named &lt;code&gt;floxum.js&lt;/code&gt;, and paste the following code.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Floxum&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;@floxum/react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;floxum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Floxum&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:1337&lt;/span&gt;&lt;span class="dl"&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;floxum&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the host string to your Strapi host.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4
&lt;/h3&gt;

&lt;p&gt;Inside your Strapi applicaiton, go to &lt;code&gt;config/functions/bootstrap.js&lt;/code&gt;, and import Floxum then call it inside the export module with &lt;code&gt;strapi&lt;/code&gt; parameters:&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use strict&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;folxum&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;@floxum/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&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="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="nf"&gt;folxum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;strapi&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;You're now good to go!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5
&lt;/h3&gt;

&lt;p&gt;Inside your Rect project (in any component) import Floxum and and test it by calling ping function, like this:&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="nf"&gt;useEffect&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="nx"&gt;floxum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&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="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;working&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;



</description>
      <category>strapi</category>
      <category>socket</category>
      <category>node</category>
    </item>
    <item>
      <title>CopyDock - Handy VSCode Extension</title>
      <dc:creator>Monawwar Abdullah</dc:creator>
      <pubDate>Wed, 30 Jun 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/monawwar/copydock-handy-vscode-extension-4me4</link>
      <guid>https://dev.to/monawwar/copydock-handy-vscode-extension-4me4</guid>
      <description>&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%2F7c3w2kufk48m0xz736vv.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%2F7c3w2kufk48m0xz736vv.png" alt="1" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I've been working on a project with my friend and while we were coding, we got at some point that I've to write my friend's code to my computer because that code was working or transfer the development environment values to my Workspace, but it's a long way to copy that text or code snippet to my PC; usually via a messaging platform like &lt;strong&gt;Telegram&lt;/strong&gt;, so I decided to develop an extension for &lt;strong&gt;VSCode&lt;/strong&gt; that could do that job easily. And in this post we'll see how we can use &lt;strong&gt;CopyDock&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Open your Visual Studio Code editor and go to extension tab and search for "CopyDock" or you can just visit the link below to install the extension.&lt;/p&gt;

&lt;p&gt;Direct link to the extension: &lt;a href="https://marketplace.visualstudio.com/items?itemName=xencodes.copydock" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=xencodes.copydock&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the installing you will see your &lt;strong&gt;ID&lt;/strong&gt; at the bottom menu of VSCode.&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%2F6xqnqgv6pdj9a00t19nz.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%2F6xqnqgv6pdj9a00t19nz.png" alt="2" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, my ID is &lt;strong&gt;oj&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - Transfer your Code
&lt;/h2&gt;

&lt;p&gt;Now, it's time for you to do a selection of the code snippet or any other text and right-click on it, and then hit "Send Code", next you will be asked to enter &lt;strong&gt;User ID&lt;/strong&gt;; you will have to put your friend ID in the input box and press enter to transfer the selected text into your friend's Workspace.&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%2Fbul2igp1vdkajhy1bqjx.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%2Fbul2igp1vdkajhy1bqjx.png" alt="3" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe39rk6bqrb3lmjcg4hil.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%2Fe39rk6bqrb3lmjcg4hil.png" alt="4" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, I entered &lt;strong&gt;nR&lt;/strong&gt; in the input box as User ID to transfer the selected text to my another Visual Studio Code instance (for the demonstration I used VSCode and VSCode Insiders).&lt;/p&gt;

&lt;p&gt;And soon you hit &lt;code&gt;Enter&lt;/code&gt;, your selected should get copied over to your friend's Workspace.&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%2F17guoue0pnvk1w940duh.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%2F17guoue0pnvk1w940duh.png" alt="5" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>copydock</category>
      <category>development</category>
      <category>extension</category>
      <category>vscode</category>
    </item>
  </channel>
</rss>
