<?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: Michael Crump</title>
    <description>The latest articles on DEV Community by Michael Crump (@mbcrump).</description>
    <link>https://dev.to/mbcrump</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F149332%2F7f1171d7-a05b-4d15-909f-ae3b2b3b8d1f.jpeg</url>
      <title>DEV Community: Michael Crump</title>
      <link>https://dev.to/mbcrump</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mbcrump"/>
    <language>en</language>
    <item>
      <title>Send Personalized SMS Messages from a Spreadsheet Using Claude Cowork and Vonage</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Tue, 14 Jul 2026 19:25:48 +0000</pubDate>
      <link>https://dev.to/vonagedev/send-personalized-sms-messages-from-a-spreadsheet-using-claude-cowork-and-vonage-3b46</link>
      <guid>https://dev.to/vonagedev/send-personalized-sms-messages-from-a-spreadsheet-using-claude-cowork-and-vonage-3b46</guid>
      <description>&lt;p&gt;AI assistants are no longer just answering questions - they're taking action. Claude Cowork is a great example of this shift: it can access your local environment, read and write files, and automate tasks that would otherwise eat up your time. Pair it with the &lt;strong&gt;Vonage Tooling MCP Server&lt;/strong&gt;, and you can send real SMS messages to real people, all from a plain-English prompt.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll walk through exactly how to do that. We'll use Claude Cowork to read customer feedback from a local spreadsheet, generate personalized responses using AI, and automatically send each one as an SMS via Vonage.&lt;/p&gt;

&lt;p&gt;🎬 &lt;strong&gt;Watch the full video walkthrough here:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=keMjIjOAkxk" rel="noopener noreferrer"&gt;Send a Text in Claude Cowork&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Build
&lt;/h2&gt;

&lt;p&gt;Imagine you run a restaurant. After each visit, customers text you their feedback, and you save their name, phone number, feedback, and a status column (&lt;code&gt;Pending&lt;/code&gt; / &lt;code&gt;Sent&lt;/code&gt;) in a spreadsheet called &lt;code&gt;restaurant_feedback.xlsx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Using Claude Cowork, you'll create a task that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads the spreadsheet and finds all rows with a &lt;code&gt;Pending&lt;/code&gt; status&lt;/li&gt;
&lt;li&gt;Uses AI to determine the sentiment of each message and generate a personalized response&lt;/li&gt;
&lt;li&gt;Sends each response as an SMS using the Vonage Tooling MCP Server&lt;/li&gt;
&lt;li&gt;Updates the status column to &lt;code&gt;Sent&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you get started, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://claude.ai/download" rel="noopener noreferrer"&gt;Claude Desktop&lt;/a&gt; (latest version)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://dashboard.vonage.com/" rel="noopener noreferrer"&gt;Vonage Developer account&lt;/a&gt; (free to sign up)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Install the Vonage Tooling MCP Server
&lt;/h2&gt;

&lt;p&gt;Open Claude Desktop, click the &lt;strong&gt;Claude&lt;/strong&gt; menu in your computer's menu bar, then go to &lt;strong&gt;Settings → Developer → Edit Config&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This opens (or creates) a file called &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS:&lt;/strong&gt; &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Paste in the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&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;"mcpServers"&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;"vonage-mcp-server-api-bindings"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@vonage/vonage-mcp-server-api-bindings"&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;"env"&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;"VONAGE_APPLICATION_ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;YOUR_VONAGE_APPLICATION_ID&amp;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;"VONAGE_PRIVATE_KEY64"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;YOUR_VONAGE_PRIVATE_KEY64&amp;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;"VONAGE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;YOUR_VONAGE_API_KEY&amp;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;"VONAGE_API_SECRET"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;YOUR_VONAGE_API_SECRET&amp;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;"VONAGE_VIRTUAL_NUMBER"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;YOUR_VONAGE_VIRTUAL_NUMBER&amp;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;"VONAGE_WHATSAPP_NUMBER"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;YOUR_VONAGE_WHATSAPP_NUMBER&amp;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;"RCS_SENDER_ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;YOUR_RCS_SENDER_ID&amp;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;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Get Your Vonage Credentials
&lt;/h2&gt;

&lt;p&gt;Log in to the &lt;a href="https://dashboard.vonage.com/" rel="noopener noreferrer"&gt;Vonage Developer Dashboard&lt;/a&gt; and grab the following:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Key &amp;amp; Secret&lt;/strong&gt;&lt;br&gt;
From your homepage, click &lt;strong&gt;API Secret Management&lt;/strong&gt; to copy your API key and secret.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application ID &amp;amp; Private Key&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Build → Applications → Create a new application&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Give it a name and click &lt;strong&gt;Generate public and private key&lt;/strong&gt; - the private key will download automatically&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Capabilities&lt;/strong&gt;, toggle on &lt;strong&gt;Messages&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Generate new application&lt;/strong&gt; to get your Application ID&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before pasting the private key into the config file, you'll need to base64 encode it. Use the encoder linked in the &lt;a href="https://github.com/Vonage-Community/vonage-mcp-server-api-bindings" rel="noopener noreferrer"&gt;Vonage MCP Server readme&lt;/a&gt; or run:&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="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; private.key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Virtual Number&lt;/strong&gt;&lt;br&gt;
Go to &lt;strong&gt;Build → Phone Numbers&lt;/strong&gt; to find or purchase a virtual number. Link it to your application, and if you're in the US, make sure it's &lt;a href="https://developer.vonage.com/" rel="noopener noreferrer"&gt;10DLC compliant&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once your config is saved, &lt;strong&gt;restart Claude Desktop&lt;/strong&gt;. To confirm the server is connected, open a new chat and ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Do you have access to Vonage's tooling server?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude should confirm and list its available capabilities.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Set Up Your Spreadsheet
&lt;/h2&gt;

&lt;p&gt;For this demo, create a file called &lt;code&gt;restaurant_feedback.xlsx&lt;/code&gt; in a folder called &lt;code&gt;operations&lt;/code&gt;. It should have columns for:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Phone&lt;/th&gt;
&lt;th&gt;Feedback&lt;/th&gt;
&lt;th&gt;Response&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jane&lt;/td&gt;
&lt;td&gt;+1...&lt;/td&gt;
&lt;td&gt;"Great food!"&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bob&lt;/td&gt;
&lt;td&gt;+1...&lt;/td&gt;
&lt;td&gt;"Service was slow."&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;Status&lt;/code&gt; column is what Claude will use to know which messages need to be addressed.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Create a &lt;code&gt;claude.md&lt;/code&gt; Instructions File
&lt;/h2&gt;

&lt;p&gt;To avoid re-prompting Claude every time, create a file called &lt;code&gt;claude.md&lt;/code&gt; in your &lt;code&gt;operations&lt;/code&gt; folder. This is a plain-text markdown file where you store persistent instructions for Claude Cowork.&lt;/p&gt;

&lt;p&gt;Here's an example of what to put in it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Restaurant Feedback Automation&lt;/span&gt;

When prompted with &lt;span class="sb"&gt;`generate_responses`&lt;/span&gt;:
&lt;span class="p"&gt;-&lt;/span&gt; Read &lt;span class="sb"&gt;`restaurant_feedback.xlsx`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Find all rows where Status = "Pending"
&lt;span class="p"&gt;-&lt;/span&gt; Analyze the sentiment of each feedback message
&lt;span class="p"&gt;-&lt;/span&gt; If positive: set Response to "We're glad you had a positive experience!"
&lt;span class="p"&gt;-&lt;/span&gt; If negative: set Response to "We're sorry you had a negative experience!"
&lt;span class="p"&gt;-&lt;/span&gt; Save the responses back to the spreadsheet

When prompted with &lt;span class="sb"&gt;`send_responses`&lt;/span&gt;:
&lt;span class="p"&gt;-&lt;/span&gt; Read &lt;span class="sb"&gt;`restaurant_feedback.xlsx`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; For each row where Status = "Pending" and a Response exists:
&lt;span class="p"&gt;  -&lt;/span&gt; Send the Response as an SMS to the customer's Phone number using the Vonage Tooling MCP Server
&lt;span class="p"&gt;  -&lt;/span&gt; Update the Status to "Sent"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 Tip: You can ask Claude itself to help you write your &lt;code&gt;claude.md&lt;/code&gt; file!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 5: Run It in Claude Cowork
&lt;/h2&gt;

&lt;p&gt;Switch to &lt;strong&gt;Cowork mode&lt;/strong&gt; in Claude Desktop. Create a new task and click &lt;strong&gt;"Work in a project"&lt;/strong&gt; in the bottom-left corner of the prompt box. Select your &lt;code&gt;operations&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;Now run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generate_responses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude will scan the spreadsheet, find the &lt;code&gt;Pending&lt;/code&gt; rows, analyze sentiment, and write personalized responses back to the file.&lt;/p&gt;

&lt;p&gt;When you're ready to send, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;send_responses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude will use the Vonage Tooling MCP Server to send each SMS and update the status to &lt;code&gt;Sent&lt;/code&gt;. Open your spreadsheet to confirm - the status column should now show &lt;code&gt;Sent&lt;/code&gt; for each row.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;This is just the beginning of what you can do with the Vonage Tooling MCP Server. Beyond SMS, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Send WhatsApp or RCS messages&lt;/strong&gt; by populating the corresponding fields in your config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger automated voice calls&lt;/strong&gt; instead of (or in addition to) texts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track delivery status&lt;/strong&gt; by saving read/delivered receipts back to your spreadsheet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build multi-channel workflows&lt;/strong&gt; that escalate from SMS to voice if a message goes unread&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;📺 &lt;a href="https://www.youtube.com/watch?v=keMjIjOAkxk" rel="noopener noreferrer"&gt;Video: Send a Text in Claude Cowork&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="https://github.com/Vonage-Community/vonage-mcp-server-api-bindings" rel="noopener noreferrer"&gt;Vonage Tooling MCP Server on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://modelcontextprotocol.io/docs/develop/connect-local-servers" rel="noopener noreferrer"&gt;Claude MCP Setup Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🛠️ &lt;a href="https://dashboard.vonage.com/" rel="noopener noreferrer"&gt;Vonage Developer Dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;a href="https://developer.vonage.com/en/blog" rel="noopener noreferrer"&gt;Vonage Developer Blog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Have questions or something cool you built with this? Drop a comment below or connect with us on the &lt;a href="https://developer.vonage.com/en/community/slack" rel="noopener noreferrer"&gt;Vonage Community Slack&lt;/a&gt;. We'd love to see what you create!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>vonage</category>
      <category>sms</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Wed, 13 May 2026 22:13:34 +0000</pubDate>
      <link>https://dev.to/mbcrump/-193h</link>
      <guid>https://dev.to/mbcrump/-193h</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-defining-what-an-api-is-3806" class="crayons-story__hidden-navigation-link"&gt;The Vonage Dev Discussion: Defining what an API is&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/vonagedev"&gt;
            &lt;img alt="Vonage Developers logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F378%2F555ac53a-0535-46ae-8d35-c875f44eb774.jpg" class="crayons-logo__image" width="800" height="800"&gt;
          &lt;/a&gt;

          &lt;a href="/lizzzzz" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F520299%2F38de40f4-43b2-4a0d-a7cc-2fa6494ac4b3.png" alt="lizzzzz profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lizzzzz" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Liz Acosta
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Liz Acosta
                
              
              &lt;div id="story-author-preview-content-3665936" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/lizzzzz" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F520299%2F38de40f4-43b2-4a0d-a7cc-2fa6494ac4b3.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Liz Acosta&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/vonagedev" class="crayons-story__secondary fw-medium"&gt;Vonage Developers&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-defining-what-an-api-is-3806" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 13&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-defining-what-an-api-is-3806" id="article-link-3665936"&gt;
          The Vonage Dev Discussion: Defining what an API is
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vonage"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vonage&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-defining-what-an-api-is-3806" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-defining-what-an-api-is-3806#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Tue, 07 Apr 2026 17:24:25 +0000</pubDate>
      <link>https://dev.to/mbcrump/-505m</link>
      <guid>https://dev.to/mbcrump/-505m</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-builder-pattern-1f45" class="crayons-story__hidden-navigation-link"&gt;The Vonage Dev Discussion: Builder pattern&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/vonagedev"&gt;
            &lt;img alt="Vonage Developers logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F378%2F555ac53a-0535-46ae-8d35-c875f44eb774.jpg" class="crayons-logo__image" width="800" height="800"&gt;
          &lt;/a&gt;

          &lt;a href="/lizzzzz" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F520299%2F38de40f4-43b2-4a0d-a7cc-2fa6494ac4b3.png" alt="lizzzzz profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/lizzzzz" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Liz Acosta
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Liz Acosta
                
              
              &lt;div id="story-author-preview-content-3467240" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/lizzzzz" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F520299%2F38de40f4-43b2-4a0d-a7cc-2fa6494ac4b3.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Liz Acosta&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/vonagedev" class="crayons-story__secondary fw-medium"&gt;Vonage Developers&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-builder-pattern-1f45" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 7&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-builder-pattern-1f45" id="article-link-3467240"&gt;
          The Vonage Dev Discussion: Builder pattern
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/dotnet"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;dotnet&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-builder-pattern-1f45" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/vonagedev/the-vonage-dev-discussion-builder-pattern-1f45#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How to Write a GREAT Git Commit Message</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Fri, 02 Aug 2024 13:02:09 +0000</pubDate>
      <link>https://dev.to/vonagedev/how-to-write-a-great-git-commit-message-1a54</link>
      <guid>https://dev.to/vonagedev/how-to-write-a-great-git-commit-message-1a54</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Crafting effective Git commit messages can significantly enhance collaboration, code readability, and project maintainability for years. Yet, it's often overlooked or treated as an afterthought in the development process. In this blog post, I'll cut straight to the chase and outline the key principles for writing outstanding Git commit messages that every developer should follow!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with a Capitalized Imperative Verb for the Subject Line
&lt;/h2&gt;

&lt;p&gt;A commit message should clearly state what this commit does. Use a capitalized imperative verb at the start for easier readability and maintainability.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Add new feature for user login&lt;/li&gt;
&lt;li&gt;Fix bug in payment processing&lt;/li&gt;
&lt;li&gt;Update documentation for API endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Keep the Subject Line Concise
&lt;/h2&gt;

&lt;p&gt;Your commit message should be descriptive enough to convey the purpose of the commit but concise enough to be quickly scanned. Aim for around 50 characters for the subject line and use the body for additional details.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good Commit Message: Refactor user authentication module&lt;/li&gt;
&lt;li&gt;Bad Commit Message: Refactored the user authentication module to improve performance and readability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Separate the Summary from the Body with a Blank Line
&lt;/h2&gt;

&lt;p&gt;If your commit message needs more detail, add a body. Make sure to add a blank line between the summary and the body to make it more readable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add local caching to improve application performance

This change implements a local caching mechanism to reduce database load
and improve overall response times over the network. The cache invalidates every ten minutes to ensure data freshness.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Use the Imperative Mood
&lt;/h2&gt;

&lt;p&gt;Keeping in mind the standard convention, write commit messages in the imperative mood, a tense typically associated with commands and actions. This is instructing about what is being done when the commit is applied.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct: Add user authentication&lt;/li&gt;
&lt;li&gt;Incorrect: Added user authentication&lt;/li&gt;
&lt;li&gt;Correct: Fix user authentication&lt;/li&gt;
&lt;li&gt;Incorrect: Fixed user authentication&lt;/li&gt;
&lt;li&gt;Correct: Update user authentication&lt;/li&gt;
&lt;li&gt;Incorrect: Updated user authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Explain the "What" and "Why" in the Body
&lt;/h2&gt;

&lt;p&gt;Use the body to give more detail about the commit: explain what was done and why it was done. This makes it easier for others—and your future self—to understand the context and reason for the change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What: Refactor authentication logic&lt;/li&gt;
&lt;li&gt;Why: Improve performance and reduce code duplication&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Refactor authentication logic

Extracted the authentication logic from a class into a separate module to improve performance and reduce code duplication. This change
will also make future enhancements easier to implement.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Use Bullet Points for Lists
&lt;/h2&gt;

&lt;p&gt;If the commit includes several changes, then list them in bullet points. This makes it easier to read and understand each change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Improve error handling in payment processing

- Add validation for payment input fields
- Handle API errors with retry mechanism
- Log detailed error messages for debugging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Reference Relevant Issues or Tickets
&lt;/h2&gt;

&lt;p&gt;If your commit resolves or is related to a specific issue or task, reference it in your project management system—e.g., GitHub Issues, Jira. This helps keep the issues' status up to date, and the context would be quite helpful for readers later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix incorrect total calculation (#4342)

Corrected the calculation logic for order totals, ensuring
taxes and discounts are applied.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Review and Revise
&lt;/h2&gt;

&lt;p&gt;Before committing and pushing it to the repository, take a moment to review your message. Check for spelling errors, grammar mistakes, and clarity. A well-written commit message reflects professionalism and attention to detail, which can save time and headaches downstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Capitalize: Did you start your subject line with a capital letter?&lt;/li&gt;
&lt;li&gt;Concise: Is your subject line 50 characters or less?&lt;/li&gt;
&lt;li&gt;Blank Line: Did you add a blank line after the summary if there’s a body?&lt;/li&gt;
&lt;li&gt;Imperative Mood: Is the message in the imperative mood?&lt;/li&gt;
&lt;li&gt;Detail: Does the body (if present) explain the what, why, and how?&lt;/li&gt;
&lt;li&gt;Lists: Did you use Bullet Points for your list? &lt;/li&gt;
&lt;li&gt;References: Did you reference any relevant issues or PRs?&lt;/li&gt;
&lt;li&gt;Proofread: Did you check for clarity and typos?&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Writing great Git commit messages enhances collaboration and project maintainability. By following these simple guidelines—using imperative verbs, keeping the subject concise, explaining the "what" and "why," and referencing relevant issues—you'll create a valuable project history that's easy to navigate and understand. We also have another post titled "&lt;a href="https://developer.vonage.com/en/blog/3-reasons-why-you-should-use-conventional-commits" rel="noopener noreferrer"&gt;3 Reasons Why You Should Use Conventional Commits&lt;/a&gt;" if you're eager to learn more. &lt;/p&gt;

&lt;p&gt;We’d also love to have you join us on the &lt;a href="https://developer.vonage.com/en/community/slack" rel="noopener noreferrer"&gt;Vonage Community Slack&lt;/a&gt; or send us a Post on &lt;a href="https://twitter.com/VonageDev" rel="noopener noreferrer"&gt;X&lt;/a&gt; and we will get back to you. Thanks again for reading, and I will catch up with you on the next one!&lt;/p&gt;

&lt;p&gt;Happy committing!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Vonage Welcomes Twilio Programmable Video Customers</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Thu, 09 May 2024 10:30:40 +0000</pubDate>
      <link>https://dev.to/vonagedev/vonage-welcomes-twilio-programmable-video-customers-2edp</link>
      <guid>https://dev.to/vonagedev/vonage-welcomes-twilio-programmable-video-customers-2edp</guid>
      <description>&lt;p&gt;Hello Video Enthusiasts!&lt;/p&gt;

&lt;p&gt;At Vonage, we welcome all developers looking for a programmable video solution. As a &lt;a href="https://www.vonage.com/about-us/awards/gartner-magic-quadrant-cpaas/" rel="noopener noreferrer"&gt;recognized API leader&lt;/a&gt;, we want to help you discover the possibilities with our Video API and our long-time commitment to video innovation.&lt;/p&gt;

&lt;p&gt;Twilio recently announced that its &lt;a href="https://www.twilio.com/en-us/changelog/programmable-video-eol-notice" rel="noopener noreferrer"&gt;Programmable Video product&lt;/a&gt; has reached end-of-life and customers have a year to migrate to other solutions. We know that change is always tough - especially when it wasn't part of your plan, hence we want you to know how Vonage can help with your future video plans by providing a Twilio video alternative*.&lt;/p&gt;

&lt;p&gt;So let's dive into the most mature and versatile programmable video solution in the industry.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;* Vonage is not a Twilio partner, but is an independent provider of a leading programmable Video API.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test-Drive the Vonage Video API Right Now
&lt;/h2&gt;

&lt;p&gt;We've developed a &lt;a href="https://developer.vonage.com/en/cloud-runtime/1dc909c1-e04c-4cab-92d8-8866fa97a953_vonage-video-learning-server-node-js" rel="noopener noreferrer"&gt;Vonage Video sample app&lt;/a&gt; that gets you up and running fast, no server required! With almost no setup, you can create Vonage sessions, generate tokens for those sessions, archive (or record) sessions, and download those archives, all in a serverless infrastructure.&lt;/p&gt;

&lt;p&gt;Another great resource for your project are these &lt;a href="https://developer.vonage.com/en/blog/migration-from-twilio-to-vonage-video-guides-for-web-ios-android" rel="noopener noreferrer"&gt;migration guides for Web (JavaScript), Android, and iOS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also jump straight into the &lt;a href="https://developer.vonage.com/video" rel="noopener noreferrer"&gt;developer docs&lt;/a&gt; or &lt;a href="https://www.vonage.com/communications-apis/contact-api/" rel="noopener noreferrer"&gt;contact us&lt;/a&gt; if you have a burning question.   &lt;/p&gt;

&lt;p&gt;&lt;a href="/content/blog/vonage-welcomes-twilio-programmable-video-customers/codehub-video-sample.png" class="article-body-image-wrapper"&gt;&lt;img src="/content/blog/vonage-welcomes-twilio-programmable-video-customers/codehub-video-sample.png" title="Sample Vonage Video NodeJS Server App" alt="Vonage Video Learning Server (Node.js)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.vonage.com/en/cloud-runtime/1dc909c1-e04c-4cab-92d8-8866fa97a953_vonage-video-learning-server-node-js" rel="noopener noreferrer"&gt;Get Started with the Sample Application&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;We've got Video Sample Apps in a few different flavors on Github: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Vonage-Community/sample-video-node-learning_server" rel="noopener noreferrer"&gt;Video Sample App in NodeJs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Vonage-Community/sample-video-php-learning_server" rel="noopener noreferrer"&gt;Video Sample App in PHP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our sample apps can go way beyond the basics! Check out the &lt;a href="https://github.com/Vonage-Community/video-api-web-samples" rel="noopener noreferrer"&gt;Video API Web Samples&lt;/a&gt; to see powerful from background blur to advanced topics on how to apply custom grayscale, sepia, and invert filters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need Further Proof? Here Are Some Highlights of Vonage Video API
&lt;/h2&gt;

&lt;p&gt;The Vonage Video API has been leading video innovation since way back in &lt;strong&gt;2007&lt;/strong&gt;! We were one of the first to build on WebRTC when it debuted in 2012 and introduced the very first WebRTC mobile SDKs on the market.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More Powerful Video Rooms:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More participants:&lt;/strong&gt; Rooms (we call them sessions) can scale up 15,000 participants (depending on the number of publishers), ideal for webinars and mid-sized broadcasts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full HD:&lt;/strong&gt; Support for 1080p video resolution within sessions, and most importantly for recordings and broadcast streams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-Based Dynamic Recording:&lt;/strong&gt; Recording layouts and selections can be fully controlled during the session so that the properly composed result is immediately available without further work, shortly after the session ends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Tooling:&lt;/strong&gt; Our award-winning &lt;strong&gt;&lt;a href="https://www.vonage.com/communications-apis/video/features/experience-composer/" rel="noopener noreferrer"&gt;Experience Composer&lt;/a&gt;&lt;/strong&gt; allows all web elements of your application to be captured for both recording and broadcast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Low-code Choices:&lt;/strong&gt; The powerful Vonage Video API gives you complete flexibility in how you design your applications. Building on our core API, our low-code &lt;a href="https://developer.vonage.com/en/video/vonage-video-express/guide?source=video" rel="noopener noreferrer"&gt;Video Express package&lt;/a&gt; allows web-level developers to quickly build multi-party applications with all the video optimizations taken care of automatically as room sizes and layouts dynamically change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scalable Awesomeness and Global Reach:&lt;/strong&gt; Whether you're a startup or an enterprise, we've got your back! Our global platform scales effortlessly, ensuring that your video applications can grow and evolve with your business needs. Vonage Video brings your video applications to a global stage, breaking down geographical barriers and making your reach truly international.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance and Security:&lt;/strong&gt; We take security seriously. Over a decade of investment ensures our video platform is designed to meet the highest compliance standards, giving you the peace of mind to focus on creating exceptional video applications. Here are a couple of highlights: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Certifications:&lt;/strong&gt; Vonage Video complies with HIPAA, SOC 2 Type II, GDPR, and CCPA standards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-to-End Encryption:&lt;/strong&gt; Following WebRTC standards, all traffic is transport encrypted. We also support full end-to-end encryption when needed for incoming and outgoing  traffic (including through our media servers), ensuring even greater privacy and security.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypted Recordings&lt;/strong&gt;: Your recordings can be encrypted at rest, as they are created so that they are secure even within your own application. All recordings are quickly transferred to your S3, Azure, or Google Cloud storage and Vonage does not retain them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regional Media Isolation:&lt;/strong&gt; allows you to meet different regional compliance needs by isolating all media traffic to selected regions around the world. 
&lt;strong&gt;AI-enabled:&lt;/strong&gt; Vonage Video Media Processor provides access to WebRTC client media streams (publisher and subscriber) and easy use of standard ML transformer libraries for video interpretation and manipulation. The API has Blur and Background Replace built-in, but developers can build what they want! Audio Connector is a server-side feature that allows any selection of audio streams to be sent to external AI engines for processing. Vonage has an add-on Captions capability using this, and again, developers have full flexibility in how they process session audio in real time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oh, and one more thing…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broadcast&lt;/strong&gt;: All the capabilities you were hoping for in the former &lt;strong&gt;Twilio Live&lt;/strong&gt; have been built-in to the Vonage Video API since 2016 and are continuously enhanced. This includes easy stream composition with either our dynamic video composer or full Experience Composer, and broadcast up to 1080p to RTMP (any social platform and others), HLS, and LL-HLS. Our large rooms (sessions) up to 15,000 participants allow broadcasts of this size to be delivered all over WebRTC, plus allowing these audiences to easily be “brought on stage.”&lt;/p&gt;

&lt;p&gt;Read more about our &lt;a href="https://www.vonage.com/communications-apis/video/features/" rel="noopener noreferrer"&gt;extensive video features&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to Embark on Your Video Adventure?
&lt;/h2&gt;

&lt;p&gt;Vonage has deep video expertise and provides rich support and services to help organizations migrate from Twilio to Vonage Video, including architecture consulting and code review through to full professional services to add skills to any part of your migration work. Please &lt;a href="https://www.vonage.com/communications-apis/contact-api/" rel="noopener noreferrer"&gt;contact us&lt;/a&gt; to discuss your needs and set up a technical review of how we can support your migration.&lt;/p&gt;

&lt;p&gt;If you have questions, see our &lt;a href="https://www.vonage.com/communications-apis/video/" rel="noopener noreferrer"&gt;Video API Product page&lt;/a&gt;, &lt;a href="https://developer.vonage.com/en/video/overview" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, and &lt;a href="https://developer.vonage.com/en/video/twilio-vonage-video-migration-guide?source=video" rel="noopener noreferrer"&gt;Migration Guide&lt;/a&gt;. Join us on the &lt;a href="https://developer.vonage.com/community/slack" rel="noopener noreferrer"&gt;Vonage Developer Slack&lt;/a&gt; or send us a post on &lt;a href="https://twitter.com/VonageDev" rel="noopener noreferrer"&gt;X&lt;/a&gt;, and we will get back to you. You may also leave our team some &lt;a href="https://forms.gle/ioSER1qBoAS3i9J98" rel="noopener noreferrer"&gt;feedback&lt;/a&gt;&lt;span&gt; &lt;/span&gt;on your experience. Join our community of WebRTC enthusiasts which values reliability and innovation, making your video experiences seamless and worry-free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Come for Video, Stay for Communication APIs
&lt;/h2&gt;

&lt;p&gt;Vonage empowers developers with a robust suite of Communication APIs designed to enable you to communicate with your customers using your preferred channels. From &lt;a href="https://www.vonage.com/communications-apis/messages/" rel="noopener noreferrer"&gt;Messaging &lt;/a&gt;and &lt;a href="https://www.vonage.com/communications-apis/programmable-voice/" rel="noopener noreferrer"&gt;Voice &lt;/a&gt;to &lt;a href="https://www.vonage.com/communications-apis/video/" rel="noopener noreferrer"&gt;Video&lt;/a&gt;, &lt;a href="https://www.vonage.com/communications-apis/protection-suite/" rel="noopener noreferrer"&gt;Authentication&lt;/a&gt;, and &lt;a href="https://www.vonage.com/communications-apis/ai-studio/" rel="noopener noreferrer"&gt;AI&lt;/a&gt;, Vonage APIs provide a versatile toolkit that developers can seamlessly integrate into their applications. The APIs offer extensive customization options, allowing developers to tailor communication solutions to their specific needs. Whether it's &lt;strong&gt;sending or receiving programmable SMS&lt;/strong&gt;, leveraging AI, facilitating voice interactions, or implementing real-time video capabilities, Vonage APIs provide the building blocks for you to create engaging communication experiences for your customers.&lt;/p&gt;

&lt;p&gt;Vonage is also part of Ericsson, giving us long-term stability while also expanding our APIs with new 5G network-based capabilities (see announcements &lt;a href="https://www.ericsson.com/en/press-releases/2022/7/ericsson-completes-acquisition-of-vonage" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://www.ericsson.com/en/press-releases/2023/9/ericsson-executes-on-strategy-to-build-platform-business-with-strategic-partnership-to-provide-access-to-network-apis?adobe_mc=MCMID%3D57042663416617738262563603632588574783%7CMCORGID%3DA8833BC75245AF9E0A490D4D%2540AdobeOrg%7CTS%3D1701899339" rel="noopener noreferrer"&gt;here&lt;/a&gt;) - such as upcoming Quality-on-Demand APIs for boosting network performance for mission-critical video apps!&lt;/p&gt;

&lt;p&gt;Thanks again for reading, and you can look forward to further blogs on how Vonage can provide you with a great Twilio video alternative!&lt;/p&gt;

</description>
      <category>video</category>
      <category>api</category>
    </item>
    <item>
      <title>How to Use Environment Variables in Node.js</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Fri, 23 Feb 2024 15:17:24 +0000</pubDate>
      <link>https://dev.to/vonagedev/how-to-use-environment-variables-in-nodejs-1h12</link>
      <guid>https://dev.to/vonagedev/how-to-use-environment-variables-in-nodejs-1h12</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Environment variables play a crucial role in configuring and securing Node.js applications. They allow developers to store sensitive information, configuration settings, and other variables outside the codebase, making it easier to manage different deployment environments (development, testing, production) without exposing sensitive information.&lt;/p&gt;

&lt;p&gt;In this blog post, we will explore how to use environment variables in Node.js, covering topics such as setting, accessing, and managing them in your applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Environment Variables
&lt;/h2&gt;

&lt;p&gt;Environment variables are dynamic values that can affect the behavior of a running process. In Node.js, you can access environment variables using the &lt;code&gt;process.env&lt;/code&gt; object. These variables are set outside your application and read by your application during runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Environment Variables
&lt;/h2&gt;

&lt;p&gt;To set environment variables, you can use various methods depending on your operating system or deployment platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt; (Command Prompt) - &lt;code&gt;set VAR_NAME=value&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux and macOS&lt;/strong&gt; (Bash Shell) - &lt;code&gt;export VAR_NAME=value&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using a &lt;code&gt;.env&lt;/code&gt; File
&lt;/h2&gt;

&lt;p&gt;In many Node.js projects, developers use a &lt;code&gt;.env&lt;/code&gt; file to store and manage environment variables. &lt;/p&gt;

&lt;p&gt;Create a file named &lt;code&gt;.env&lt;/code&gt; in the root of your project and define your variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DB_HOST=localhost
DB_PORT=5432
SECRET_KEY=mysecretkey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file &lt;strong&gt;should not&lt;/strong&gt; be committed to the version control system to ensure sensitive information always remains on your local computer.&lt;/p&gt;

&lt;p&gt;Add &lt;code&gt;.env&lt;/code&gt; to your &lt;code&gt;.gitignore&lt;/code&gt; file to prevent it from being committed. Here's an &lt;a href="https://github.com/github/gitignore/blob/main/Node.gitignore" rel="noopener noreferrer"&gt;example file&lt;/a&gt; with it already added. You may also use &lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;dotenv&lt;/a&gt; for advanced configuration and it will automatically load environment variables from a &lt;code&gt;.env&lt;/code&gt; file into &lt;code&gt;process.env&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Accessing Environment Variables in Node.js
&lt;/h2&gt;

&lt;p&gt;Once you've set your environment variables, you can access them in your Node.js application using &lt;code&gt;process.env&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;const dbHost = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
const secretKey = process.env.SECRET_KEY;

console.log(`Database Host: ${dbHost}`);
console.log(`Database Port: ${dbPort}`);
console.log(`Secret Key: ${secretKey}`);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using a Module for Environment Variables
&lt;/h2&gt;

&lt;p&gt;For better organization, consider creating a module to centralize environment variable access. Create a file named &lt;code&gt;config.js&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;module.exports = {
  dbHost: process.env.DB_HOST,
  dbPort: process.env.DB_PORT,
  secretKey: process.env.SECRET_KEY,
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can easily import and use these variables in other parts of your application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const config = require('./config');

console.log(`Database Host: ${config.dbHost}`);
console.log(`Database Port: ${config.dbPort}`);
console.log(`Secret Key: ${config.secretKey}`);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Handling Default Values
&lt;/h2&gt;

&lt;p&gt;Sometimes, you can provide default values for environment variables if they are not set. You can achieve this using the &lt;code&gt;||&lt;/code&gt; operator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const dbHost = process.env.DB_HOST || 'localhost';
const dbPort = process.env.DB_PORT || 5432;
const secretKey = process.env.SECRET_KEY || 'defaultsecret';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;Effectively using environment variables in your Node.js applications is crucial for maintaining security and configurability. By keeping sensitive information outside your codebase and using a standardized approach, you can easily manage different deployment environments and ensure a more secure application.&lt;/p&gt;

&lt;p&gt;Remember to exercise caution with sensitive information and follow best practices for securing your environment variables, especially in production environments.&lt;/p&gt;

&lt;p&gt;If you have questions, join us on the &lt;a href="https://developer.vonage.com/community/slack" rel="noopener noreferrer"&gt;Vonage Developer Slack&lt;/a&gt; or send us a Post on &lt;a href="https://twitter.com/VonageDev" rel="noopener noreferrer"&gt;X&lt;/a&gt;, and we will get back to you. Thanks again for reading, and I will catch up with you on the next one!&lt;/p&gt;

</description>
      <category>node</category>
      <category>programming</category>
      <category>http</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>5 Ways to Make HTTP Requests in Node.js</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Tue, 20 Feb 2024 13:10:25 +0000</pubDate>
      <link>https://dev.to/vonagedev/5-ways-to-make-http-requests-in-nodejs-404m</link>
      <guid>https://dev.to/vonagedev/5-ways-to-make-http-requests-in-nodejs-404m</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Learning how to make HTTP requests in Node.js can feel overwhelming as dozens of libraries are available, with each solution claiming to be more efficient than the last. Some libraries offer cross-platform support, while others focus on bundle size or developer experience. &lt;/p&gt;

&lt;p&gt;In this post, we’ll explore five of the most popular ways to make HTTP requests in Node.js, with step-by-step instructions for each method. &lt;/p&gt;

&lt;p&gt;First, we’ll cover HTTP requests and HTTPS requests using the standard library. After that, we’ll show you how to use alternatives like Node Fetch, Axios, and SuperAgent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin, make sure you have the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.npmjs.com/cli/v8/commands/npm-install" rel="noopener noreferrer"&gt;Node Package Manager (NPM)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Make HTTP Requests in Node.js (5 Methods)
&lt;/h2&gt;

&lt;p&gt;Below, we’ll show you how to make HTTP requests in Node.js via the following five methods:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Standard Library (HTTP Module)&lt;/li&gt;
&lt;li&gt;Standard Library (HTTPS Module)&lt;/li&gt;
&lt;li&gt;Axios&lt;/li&gt;
&lt;li&gt;Node Fetch&lt;/li&gt;
&lt;li&gt;SuperAgent&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Standard Library (HTTP Module)
&lt;/h3&gt;

&lt;p&gt;The standard library in Node.js comes equipped with the default &lt;code&gt;http&lt;/code&gt; module. It can make an HTTP request without adding bulk with external packages. However, as the module is low-level, it could be more developer-friendly.&lt;/p&gt;

&lt;p&gt;Additionally, you would need to use &lt;a href="https://nodejs.org/api/stream.html#stream_streams_compatibility_with_async_generators_and_async_iterators" rel="noopener noreferrer"&gt;asynchronous streams&lt;/a&gt; for chunking data as the async/await feature for HTTP requests can't be used with this library. The response data would then need to be parsed manually.&lt;/p&gt;

&lt;p&gt;Typically, you'd use the HTTP Module for testing or demonstration purposes as it is not secure. &lt;/p&gt;

&lt;p&gt;Here's a simple example of making a &lt;code&gt;GET&lt;/code&gt; request using the &lt;code&gt;http&lt;/code&gt; module:&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;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;path&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&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;req&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;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&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;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;res&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="s1"&gt;data&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;chunk&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;data&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;res&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="s1"&gt;end&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="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;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Standard Library (HTTPS Module)
&lt;/h3&gt;

&lt;p&gt;If you need to make secure HTTPS requests in Node.js, you can use the &lt;code&gt;https&lt;/code&gt; module, which is also built into the standard library. The usage is quite similar to the &lt;code&gt;http&lt;/code&gt; module but with added security. Here's 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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;https&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;https&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;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;path&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&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;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&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;let&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;res&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="s1"&gt;data&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;chunk&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;data&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;res&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="s1"&gt;end&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="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;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Axios
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/axios/axios" rel="noopener noreferrer"&gt;Axios&lt;/a&gt; is a popular HTTP client library for Node.js that provides a more user-friendly and feature-rich way to make HTTP requests. Axios simplifies error handling and supports features like automatic JSON parsing and request/response interceptors, making it a great choice for many HTTP request scenarios.&lt;/p&gt;

&lt;p&gt;Enter the following command in your terminal to install Axios from npm:&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;axios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following code snippet showcases how to use Axios to make a &lt;code&gt;GET&lt;/code&gt; request:&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;axios&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;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&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://example.com&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="nf"&gt;then&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="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;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="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="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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Node Fetch
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/node-fetch" rel="noopener noreferrer"&gt;Node Fetch&lt;/a&gt; is a JavaScript library tailored for Node.js that simplifies making HTTP requests. It offers a straightforward and Promise-based approach for fetching resources from the internet or server, such as GET, POST, PUT, and DELETE requests. Designed for server-side applications, it's compatible with the Fetch API, allowing easy code transition between client-side and server-side environments. &lt;/p&gt;

&lt;p&gt;Additionally, note that &lt;a href="https://github.com/node-fetch/node-fetch" rel="noopener noreferrer"&gt;useful extensions&lt;/a&gt; such as redirect limit, response size limit, and &lt;a href="https://github.com/node-fetch/node-fetch/blob/main/docs/ERROR-HANDLING.md" rel="noopener noreferrer"&gt;explicit errors for troubleshooting&lt;/a&gt; are available to use with Node Fetch.&lt;/p&gt;

&lt;p&gt;Enter the following command in your terminal to install Node Fetch from npm:&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;node-fetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following code snippet showcases how to use Node Fetch to make a request:&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;fetch&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;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;fetch&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://example.com&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="nf"&gt;then&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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;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="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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. SuperAgent
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/superagent" rel="noopener noreferrer"&gt;SuperAgent&lt;/a&gt; is a lightweight and flexible HTTP client that supports promises and callback-style syntax. It is known for its simplicity and ease of use.&lt;/p&gt;

&lt;p&gt;Enter the following command in your terminal to install SuperAgent from npm:&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;superagent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following code snippet showcases how to use SuperAgent to make a request:&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;request&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;superagent&lt;/span&gt;&lt;span class="dl"&gt;'&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="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://example.com&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="nf"&gt;then&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="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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;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="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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;This post demonstrated how to achieve HTTP request functionality using some of what are currently considered to be the most popular libraries in Node.js.&lt;/p&gt;

&lt;p&gt;Other languages also have a myriad of libraries to tackle HTTP requests. What language do you want us to write about next? Let us know! We'd love to hear your thoughts or answer any questions on &lt;a href="https://twitter.com/VonageDev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or the Vonage &lt;a href="https://developer.vonage.com/community/slack" rel="noopener noreferrer"&gt;Developer Community Slack&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.vonage.com/en/blog/3-ways-to-make-http-calls-with-python-requests-beginner-to-advanced" rel="noopener noreferrer"&gt;3 Ways to Make HTTP Requests in Python (Beginner to Advanced)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>node</category>
      <category>http</category>
    </item>
    <item>
      <title>Send an SMS Message From an Excel Spreadsheet</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Thu, 02 Feb 2023 19:03:41 +0000</pubDate>
      <link>https://dev.to/mbcrump/send-an-sms-message-from-an-excel-spreadsheet-144c</link>
      <guid>https://dev.to/mbcrump/send-an-sms-message-from-an-excel-spreadsheet-144c</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Microsoft offers a way to add new functionality to Office applications such as Microsoft Excel to prompt and interact with the user in ways specific to your business needs. You can perform these tasks and accomplish more by using Visual Basic for Applications (VBA). It is a simple but powerful programming language that you can use to do such things as get your contacts from Microsoft Outlook into a Microsoft Excel spreadsheet.&lt;/p&gt;

&lt;p&gt;In this blog post, we'll use VBA in Microsoft Excel to send an SMS Message. Just enter the cell phone number and text to be sent and press a button to send it! You could modify the code to add additional functionality your business may require, such as scheduling. Let's get started!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To continue reading the full article, please &lt;a href="https://mcrump.me/excel" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;If you have questions or feedback, join us on the &lt;a href="https://developer.vonage.com/community/slack" rel="noopener noreferrer"&gt;Vonage Developer Slack&lt;/a&gt; or send me a Tweet on &lt;a href="https://twitter.com/mbcrump" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, and I will get back to you. Thanks again for reading, and I will catch you on the next one!&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>Send and Receive SMS Messages With Node.js and Express</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Thu, 05 Jan 2023 19:26:36 +0000</pubDate>
      <link>https://dev.to/mbcrump/send-and-receive-sms-messages-with-nodejs-and-express-46p0</link>
      <guid>https://dev.to/mbcrump/send-and-receive-sms-messages-with-nodejs-and-express-46p0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://developer.vonage.com/messages/overview" rel="noopener noreferrer"&gt;Vonage Messages API&lt;/a&gt; allows you to send and receive messages over SMS, MMS, Facebook Messenger, Viber, and WhatsApp. So you can communicate with your customers on whichever channel they love most. In this article, we'll focus on how to send and receive SMS messages with &lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; and &lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;Express&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To begin, we'll perform the most straightforward implementation of the API and send an SMS message with Node.js and the &lt;a href="https://developer.vonage.com/messages/overview" rel="noopener noreferrer"&gt;Vonage Messages API&lt;/a&gt;. Next, we'll build a Webhook that can receive SMS messages (sent from your phone) using Express and perform an action once the message has been received. Finally, we'll wrap up a couple of steps that you can take to extend the application.&lt;br&gt;
Prerequisites&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To continue reading the full article, please &lt;a href="https://mcrump.me/node" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;If you have questions or feedback, join us on the &lt;a href="https://developer.vonage.com/community/slack" rel="noopener noreferrer"&gt;Vonage Developer Slack&lt;/a&gt; or send me a Tweet on &lt;a href="https://twitter.com/mbcrump" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, and I will get back to you. Thanks again for reading, and I will catch you on the next one!&lt;/p&gt;

</description>
      <category>database</category>
      <category>postgres</category>
      <category>mongodb</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Low-Code and No-Code: What Option Is Best for You?</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Tue, 06 Dec 2022 19:58:06 +0000</pubDate>
      <link>https://dev.to/mbcrump/low-code-and-no-code-what-option-is-best-for-you-3b5o</link>
      <guid>https://dev.to/mbcrump/low-code-and-no-code-what-option-is-best-for-you-3b5o</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I started my journey into computer science as a software developer for a Fortune 500 company many years ago. Throughout the years, I was able to experience the good (and the bad) of relying on a software development team to build and update apps. Fast forward to today, I've been hearing more and more about Low-Code and No-Code development platforms, such as Vonage's own AI Studio, and decided that it was time to take a closer look. In this post, you'll learn about the pros and cons of Low-Code and No-Code development platforms and why Vonage decided to go down that route with their latest conversational AI platform called AI Studio. This tool handles complex interactions between businesses and customers, lowering operational costs and significantly improving service levels.&lt;/p&gt;

&lt;p&gt;Let's break this down. &lt;/p&gt;

&lt;h2&gt;
  
  
  What are Low-Code and No-Code development platforms?
&lt;/h2&gt;

&lt;p&gt;Low-Code and No-Code development platforms are visual software development environments that allow business and traditionally non-technical users to drag and drop application components to build an app without writing any code. They typically have little to no coding knowledge. In contrast, a professional software developer might use an Integrated Development Environment (IDE) (such as Visual Studio) or an Editor (such as Visual Studio Code) to build an application with code and a solid understanding of computer science programming concepts. Keep in mind that both approaches allow you to create an application of various complexities, and both should be considered equal as it all depends on your business use case.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To continue reading the full article, please &lt;a href="https://mcrump.me/lowcode" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;If you have questions or feedback, join us on the &lt;a href="https://developer.vonage.com/community/slack" rel="noopener noreferrer"&gt;Vonage Developer Slack&lt;/a&gt; or send me a Tweet on &lt;a href="https://twitter.com/mbcrump" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, and I will get back to you. Thanks again for reading, and I will catch you on the next one!&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>Create a Static Site using VitePress for Beautiful Help Documentation</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Tue, 06 Dec 2022 19:40:20 +0000</pubDate>
      <link>https://dev.to/mbcrump/create-a-static-site-using-vitepress-for-beautiful-help-documentation-d3</link>
      <guid>https://dev.to/mbcrump/create-a-static-site-using-vitepress-for-beautiful-help-documentation-d3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I've always been a fan of static site generators as a way to create a fully static HTML website based on data (typically in Markdown) with theming support. I've found that more of your time is focused on writing the content vs. the time spent managing the infrastrucutre for something such as a content managment system (CMS) like WordPress, which requires a database and a front-end UI to enter content. If I could sum up my three reasons why I like static site generators, it would be: Performance (pages are pre-rendered), Ability to Customize (Themes are typically baked in), and they don't require code to run on the server side. Let's jump into a popular one called, &lt;a href="https://vitepress.vuejs.org/" rel="noopener noreferrer"&gt;VitePress&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Primer on VitePress
&lt;/h2&gt;

&lt;p&gt;VitePress is listed in the documents as &lt;a href="https://vuepress.vuejs.org/" rel="noopener noreferrer"&gt;VuePress'&lt;/a&gt; little brother, and it is built on top of &lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;Vite&lt;/a&gt;. For those that don't know Vite is a build tool that aims to provide a faster and leaner development experience for modern web projects so it might sense to pair it with a static site generator such as VitePress. One of the original problems with VuePress was that it was a Webpack app and it took a lot of time to spin up a dev server for just a simple doc. VitePress solves these problems with nearly instant server start, an on-demand compilation that only compiles the page being served, and lightning-fast HMR. Let's get started! &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To continue reading the full article, please &lt;a href="https://mcrump.me/vitepress" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;If you have questions or feedback, join us on the &lt;a href="https://developer.vonage.com/community/slack" rel="noopener noreferrer"&gt;Vonage Developer Slack&lt;/a&gt; or send me a Tweet on &lt;a href="https://twitter.com/mbcrump" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, and I will get back to you. Thanks again for reading, and I will catch you on the next one!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>aws</category>
    </item>
    <item>
      <title>Send and Request Data With Webhooks With AI Studio</title>
      <dc:creator>Michael Crump</dc:creator>
      <pubDate>Tue, 29 Nov 2022 17:55:17 +0000</pubDate>
      <link>https://dev.to/mbcrump/send-and-request-data-with-webhooks-with-ai-studio-156a</link>
      <guid>https://dev.to/mbcrump/send-and-request-data-with-webhooks-with-ai-studio-156a</guid>
      <description>&lt;p&gt;&lt;a href="https://www.vonage.com/communications-apis/ai-studio/?icmp=l3nav%7Cl3nav_gototheaistudiooverviewpage_novalue" rel="noopener noreferrer"&gt;Vonage AI Studio&lt;/a&gt; is a Low-Code / No-Code conversational AI platform that helps businesses handle complex customer interactions through voice and text. As you begin to create virtual agents with AI Studio, it won't take long before you'll need to retrieve data from a third-party source such as a Webhook. In this blog post, you'll learn: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to retrieve data from a Webhook in AI Studio from a REST Endpoint&lt;/li&gt;
&lt;li&gt;How to store the data as a parameter (for later use)&lt;/li&gt;
&lt;li&gt;Examples of conditional statements to perform operations with the data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In order to understand how to interact with a Webhook in AI Studio, we'll use a scenario in which a bank would like to validate a customer's identity by matching a pin number with the number retrieved from a Webhook. The payload might look like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&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="err"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"michael.crump@vonage.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14259999999"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Michael Crump"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cc_balance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"76.31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1234"&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;/div&gt;



&lt;p&gt;Once the customer dials the Bank's phone number, we'll use the &lt;strong&gt;phone&lt;/strong&gt; number to look up the correct value for the &lt;strong&gt;pin&lt;/strong&gt; via this Webhook. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To continue reading the full article, please &lt;a href="https://developer.vonage.com/blog/22/11/29/send-and-request-data-with-webhooks-with-ai-studio" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;If you have questions or feedback, join us on the &lt;a href="https://developer.vonage.com/community/slack" rel="noopener noreferrer"&gt;Vonage Developer Slack&lt;/a&gt; or send me a Tweet on &lt;a href="https://twitter.com/mbcrump" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, and I will get back to you. Thanks again for reading, and I will catch you on the next one!&lt;/p&gt;

</description>
      <category>lowcode</category>
      <category>nocode</category>
      <category>aistudio</category>
      <category>webhooks</category>
    </item>
  </channel>
</rss>
