<?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: Alexander Samuel</title>
    <description>The latest articles on DEV Community by Alexander Samuel (@alexsam986).</description>
    <link>https://dev.to/alexsam986</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F322693%2F8c2d804f-267f-4efb-a828-a6e7b2d4ec45.jpg</url>
      <title>DEV Community: Alexander Samuel</title>
      <link>https://dev.to/alexsam986</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexsam986"/>
    <language>en</language>
    <item>
      <title>5 Best AI Collaboration Software For Enterprise Teams</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Wed, 18 Mar 2026 12:17:30 +0000</pubDate>
      <link>https://dev.to/alexsam986/5-best-ai-collaboration-software-for-enterprise-teams-2il7</link>
      <guid>https://dev.to/alexsam986/5-best-ai-collaboration-software-for-enterprise-teams-2il7</guid>
      <description>&lt;p&gt;You've got to trust me on this topic that AI (Artificial Intelligence) is shaping the way internal teams connect and collaborate with their peers at work. Because, when you look at them, collaboration has shifted from document sharing to the use of intelligent systems that enable smarter decisions and effectively align product goals.&lt;/p&gt;

&lt;p&gt;If you think this is a myth, a recent study, according to McKinsey, suggests that 78% of businesses now use at least one AI tool in their operations. This means they bid goodbye to error-prone tools and manual processes, moving towards AI collaboration tools to automate tasks and keep work moving forward.&lt;/p&gt;

&lt;p&gt;Therefore, in this post, we will explore some of the platforms that utilize AI for team communication, their key features, and the benefits of incorporating artificial intelligence into their instant messaging solutions. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Role of AI in Field Communication Software
&lt;/h2&gt;

&lt;p&gt;Most collaboration software utilizes pre-built AI features to accelerate work and introduce a detailed structure to their processes. Additionally, it is used to minimize friction that may arise from improper information transfer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other reasons why enterprise teams are using AI in their field are:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Routing tasks between departments&lt;/strong&gt; - It is standard that AI collaboration tools operate based on the capacity of teams or priority of tasks and route work automatically across departments, so work is not disturbed at any cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Meeting summaries&lt;/strong&gt; - AI-powered team collaboration software makes note of key objectives, decisions, and even action items, so that employees can align with the project goals faster without needing to rewatch recordings or take manual notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Automatic updates&lt;/strong&gt; - The AI tools handle all weekly updates and prompt users to give their inputs, so time is not wasted on chasing the status of each employee. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Content generation&lt;/strong&gt; - Take names of some of the best AI team collaboration tools, which would help employees to create project outlines, plans, and even drafts for a specific marketing strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Identifying deadlines&lt;/strong&gt; - If there is any spot delay, then AI tools can instantly identify those bottlenecks and flag them to help teams adjust to deadlines beforehand. &lt;/p&gt;

&lt;p&gt;Although their usage has been proven beneficial, there is still room for improvement, and the actual benefits of these practices remain unknown to many businesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top AI-Integrated Team Internal Collaboration Software
&lt;/h2&gt;

&lt;p&gt;Listed below are some of the best internal collaboration tools that offer AI capabilities for creating tasks, forecasting, messaging, file sharing, and more. Plus, these platforms help enterprise teams to stay focused and alleviate stress.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://www.mirrorfly.com/enterprise-instant-messaging-software.php" rel="noopener noreferrer"&gt;MirrorFly AI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;MirrorFly is one of the most renowned providers of in-app communication SDKs for video, voice, and chat, thus helping developers build exceptional communication apps with user-loving features. And as they have achieved the success milestone in building enterprise messaging apps in minutes, their next offering is the conversational AI features that are slowly gaining attraction in the market. Be it automating chats and calls on any app or transcribing voice to text with 99% accuracy or creating chatbots to automate routines, you can do anything with their APIs and SDKs.&lt;/p&gt;

&lt;p&gt;Not just this, they offer self-hosted solutions that enable businesses to take complete control of their source codes, build white-label apps reflecting brand identity, and even offer SIP/VoIP-based APIs. Simply the best, right?&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;AI voice agents&lt;/li&gt;
&lt;li&gt;AI chatbots&lt;/li&gt;
&lt;li&gt;Whitelabeling&lt;/li&gt;
&lt;li&gt;Real-time transcription&lt;/li&gt;
&lt;li&gt;Sentiment analysis and intent detection&lt;/li&gt;
&lt;li&gt;Personalized interactions&lt;/li&gt;
&lt;li&gt;Speech-to-text&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://www.rocket.chat/" rel="noopener noreferrer"&gt;Rocket.chat&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Rocket. Chat is one of the secure, stable, and open-source instant messaging software that is known to boost internal team communication. They have now launched Rocket.Chat AI, an AI solution that helps businesses deploy their preferred LLM and add features to automate tasks and generate accurate responses.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Data control&lt;/li&gt;
&lt;li&gt;Enhanced responses&lt;/li&gt;
&lt;li&gt;Operational efficiency&lt;/li&gt;
&lt;li&gt;Real-time messaging&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Zoom AI Companion
&lt;/h3&gt;

&lt;p&gt;Who does not know Zoom, a popular video conferencing app that gained momentum especially after the pandemic? And now, they have incorporated AI features like automated transcriptions and real-time translation features to engage participants well, break language barriers, and improve collaboration. Additionally, the platform makes use of generative AI to automatically draft messages based on the context of the chat and the user persona. &lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Meeting summary&lt;/li&gt;
&lt;li&gt;Team chat&lt;/li&gt;
&lt;li&gt;Email composing&lt;/li&gt;
&lt;li&gt;Thread summaries&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4. &lt;a href="https://trello.com/" rel="noopener noreferrer"&gt;Trello AI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Trello AI is known to significantly boost collaboration as it combines visual task management features with AI. This enables employees to receive suggestions on how to optimize their workflows and project requirements, thereby enhancing their productivity. Additionally, their artificial intelligence imports and organizes tasks from notes and prioritizes them based on deadlines.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Action item organization&lt;/li&gt;
&lt;li&gt;Predictive analysis&lt;/li&gt;
&lt;li&gt;Smart automation&lt;/li&gt;
&lt;li&gt;AI teammates&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5. &lt;a href="https://slack.com/intl/en-in/" rel="noopener noreferrer"&gt;Slack AI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We are all familiar with Slack and its benefits as an internal chat messenger for teams. With the launch of AI features, it has become even more sought after for enhancing team communication. As the platform's AI now helps employees capture key meeting points that are accessible to all employees. Additionally, Slack AI provides informative answers from files and other apps, such as Google and Microsoft. &lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Huddle notes&lt;/li&gt;
&lt;li&gt;Automated workflows&lt;/li&gt;
&lt;li&gt;Channel and thread summaries&lt;/li&gt;
&lt;li&gt;Enhanced search capability&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Advantages of AI-Driven Chat Software
&lt;/h2&gt;

&lt;p&gt;The AI tools for collaboration and team communication are offering a myriad of benefits to businesses, which is making them want to use it for all their internal operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Faster execution&lt;/strong&gt; - AI tools help teams to quickly make strategic decisions and streamline project management as they provide relevant insights in real time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Optimized allocation of resources&lt;/strong&gt; - With the help of analytics, businesses can correct their workload imbalances and distribute their resources efficiently and effectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Minimal manual effort&lt;/strong&gt; - Tasks such as status update, reminder notification, and other routine tasks can be automated so that teams can focus on high-value work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Better teams&lt;/strong&gt; - As automated workflows give teams a more detailed dashboard and a view of their goals, priorities, and blockers, they can stay focused on what matters the most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Improved security&lt;/strong&gt; -  Most of the AI collaboration software is built with high-end security in mind that comes with role-based access, audit trails, and E2E encryption mechanisms, helping organizations to stay compliant at all times. &lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Before concluding, let us reconsider how AI collaboration tools are enhancing team collaboration and workflow, ultimately improving employee productivity and streamlining internal operations.  &lt;/p&gt;

&lt;p&gt;Along with this, as companies adopt hybrid work scenarios, their search for the best collaboration platform remains ongoing. In that case, as a business, you can either custom build team chat apps with features you require or use APIs and SDKs to add exquisite AI features into your existing chat system, all while taking complete control of third-party providers' source codes. &lt;/p&gt;

&lt;p&gt;So, what do you say? Ready to take charge of intelligent solutions for the future-proof success of your operations? &lt;/p&gt;

</description>
      <category>news</category>
      <category>webrtc</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Build A Custom AI Voice Agent Using MirrorFly (RAG)</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Fri, 20 Feb 2026 10:43:53 +0000</pubDate>
      <link>https://dev.to/alexsam986/build-a-custom-ai-voice-agent-using-mirrorfly-rag-393</link>
      <guid>https://dev.to/alexsam986/build-a-custom-ai-voice-agent-using-mirrorfly-rag-393</guid>
      <description>&lt;p&gt;This guide provides instructions for building and integrating a custom AI voice agent using the MirrorFly AI-RAG dashboard and SDK into your platform. &lt;/p&gt;

&lt;p&gt;The solution supports real-time audio streaming, a workflow builder, and an external knowledge base training (Retrieval-Augmented Generation). As a result, you can ensure it aligns with the brand and offers context-aware user experiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;We have divided the implementation steps into two sections:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Building Custom AI Voice Agent:&lt;/strong&gt; Configure the agent's personality, train it with datasets, and design conversational flows in the MirrorFly dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice Agent Integration:&lt;/strong&gt; Embed the agent into your web app using the MirrorFly AI SDK.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Section I: 07 Steps to Building A Custom AI Voice Agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Initial Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;**Get Access: **You have to get the developer credentials from the MirrorFly team and log in to the MirrorFly AI Dashboard.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent Creation:&lt;/strong&gt; Click 'Create Agents' and then select 'Voice Agent'.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hywbpq54pwktkfe59cq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hywbpq54pwktkfe59cq.png" alt="select your agentic ai type" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configuration:&lt;/strong&gt; Now, enter an agent name, add a description, and define the initial System Prompt to set the voice agent's core behavior. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby9xbvzgtgwk8ts4rved.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby9xbvzgtgwk8ts4rved.png" alt="Ai agent Configuration" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Personality &amp;amp; Model Settings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personality:&lt;/strong&gt; Set the welcome message, fallback responses, and adjust the formality and tone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Selection:&lt;/strong&gt; Choose from multiple LLM models to enhance your agent. There is no single vendor lock-in.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  3. RAG Training
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Datasets:&lt;/strong&gt; Upload knowledge bases in PDF or CSV format (Maximum file size is 5MB/10 files) for a domain-specific agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website Sync:&lt;/strong&gt; Alternatively, you can also sync information directly from a URL to keep the agent updated with your website.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  4. Workflow Builder
&lt;/h3&gt;

&lt;p&gt;Use the visual drag-and-drop canvas to define the overall conversation logic. What you can define are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conversational paths and decision logic.&lt;/li&gt;
&lt;li&gt;API calls and form collection.&lt;/li&gt;
&lt;li&gt;Email triggers and message nodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Speech &amp;amp; Functions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;STT/TTS:&lt;/strong&gt; Proceed with configuring Speech-to-Text and Text-to-Speech providers with your API keys. Deepgram, ElevenLabs, and custom modals are available. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call Handling:&lt;/strong&gt; Enable 'end call' and 'transfer to human' functions (via SIP or Conference). Adjust the "interruption sensitivity" of how AI can interrupt human speech.&lt;/li&gt;
&lt;li&gt;Outbound Calling: Additionally, you can configure outbound call capabilities. You can select a single call for individual call initiation or batch calls by uploading a CSV file with contact records. You have the option to enable Post-Call Analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Custom Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Webhook:&lt;/strong&gt; Configure webhooks for sending real-time event notifications to the app's backend for automation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Server:&lt;/strong&gt; Manage external tools and APIs using MCP servers (connect Gmail, Google Calendar, Google Drive, and more). This enables actions such as email triggers, meeting scheduling, file access, and other event flows within the conversation.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsz9oyqxs5ffet9ogznub.png" alt="Build a custom ai agent with custom tool" width="800" height="418"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Customize Widget
&lt;/h3&gt;

&lt;p&gt;Brand Personalization &amp;amp; Live Preview: Here, upload chatbot avatar image, set the agent name, define primary theme colors, and message bubble colors. Test the widget’s appearance and interaction flow before deploying it to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section II: Agent Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Valid Agent ID from the dashboard.&lt;/li&gt;
&lt;li&gt;Make sure the website runs on HTTPS for microphone access.&lt;/li&gt;
&lt;li&gt;Browsers: Chrome, Edge, and Safari. (latest version)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Install the SDK
&lt;/h3&gt;

&lt;p&gt;Add the SDK to your HTML file using a single script tag:&lt;br&gt;
&lt;code&gt;&amp;lt;script src="https://d1nzh49hhug3.cloudfront.net/aiVoiceScript/uat/mirrofly/mirror-fly-ai.v1.1.1.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Initialize the Agent
&lt;/h3&gt;

&lt;p&gt;Define a container element and initialize the SDK:&lt;br&gt;
`// HTML Container&lt;/p&gt;

&lt;p&gt;// Initialization&lt;br&gt;
MirrorFlyAi.init({&lt;br&gt;
  container: "#widget",&lt;br&gt;
  agentId: "",&lt;br&gt;
  title: "Voice Assistant",&lt;br&gt;
  theme: "dark",&lt;br&gt;
  triggerStartCall: true,&lt;br&gt;
  transcriptionEnable: true,&lt;br&gt;
  transcriptionInUi: true,&lt;br&gt;
  chatEnable: true,&lt;br&gt;
  agentConnectionTimeout: 500&lt;br&gt;
});`&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Handle Callbacks
&lt;/h3&gt;

&lt;p&gt;Monitor the agent's status and capture transcriptions:&lt;br&gt;
&lt;code&gt;const callbacks = {&lt;br&gt;
  onTranscription: (data) =&amp;gt; console.log("Transcription:", data),&lt;br&gt;
  onAgentConnectionState: (state) =&amp;gt; console.log("Connection:", state),&lt;br&gt;
  onError: (error) =&amp;gt; console.error("SDK Error:", error)&lt;br&gt;
};&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Dynamic Agent Switching
&lt;/h3&gt;

&lt;p&gt;If your platform uses multiple agents (e.g., Sales vs. Support), use the following to switch contexts:&lt;br&gt;
&lt;code&gt;function switchAgent(newAgentId) {&lt;br&gt;
  MirrorFlyAi.destroy();&lt;br&gt;
  document.querySelector("#widget").innerHTML = "";&lt;br&gt;
  MirrorFlyAi.init({&lt;br&gt;
    container: "#widget",&lt;br&gt;
    agentId: newAgentId,&lt;br&gt;
    triggerStartCall: true&lt;br&gt;
  });&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Security &amp;amp; Permissions
&lt;/h3&gt;

&lt;p&gt;Now the browser will prompt the user for microphone permission once initialized. Ensure you handle potential errors via the onError callback (permission denials or network issues).&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In this guide, we have demonstrated how to build, train, and &lt;a href="https://www.mirrorfly.com/conversational-ai/voice-agent/" rel="noopener noreferrer"&gt;deploy a custom AI Voice Agent&lt;/a&gt; using MirrorFly’s AI-RAG dashboard and SDK.&lt;/p&gt;

&lt;p&gt;You get full control over behavior, integrations, and deployment through RAG-based knowledge integration, real-time voice streaming, SDK embedding, and workflow orchestration.&lt;/p&gt;

&lt;p&gt;You can extend the voice agent’s capabilities using webhooks, MCP tools, and external APIs without modifying the core voice infrastructure.&lt;/p&gt;

&lt;p&gt;The solution allows you to adapt multiple business workflows, such as support, sales, or internal automation. It supports dynamic agent switching, transcription handling, and call control features.&lt;/p&gt;

&lt;p&gt;You can ensure predictable performance across environments by properly configuring datasets, speech providers, and SDK callbacks.&lt;/p&gt;

&lt;p&gt;Why wait? Start building your own AI voice agents on MirrorFly now. Use &lt;a href="https://github.com/MirrorFly/Custom-AI-Voice-Agent" rel="noopener noreferrer"&gt;our GitHub custom AI voice agent&lt;/a&gt; repository and have your first agent running in hours.&lt;/p&gt;

</description>
      <category>aivoice</category>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Integrate Audio &amp; Video Calls using WebRTC &amp; Javascript</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Wed, 26 Mar 2025 10:38:59 +0000</pubDate>
      <link>https://dev.to/alexsam986/how-to-integrate-audio-video-calls-using-webrtc-javascript-4ecn</link>
      <guid>https://dev.to/alexsam986/how-to-integrate-audio-video-calls-using-webrtc-javascript-4ecn</guid>
      <description>&lt;p&gt;WebRTC allows real-time, peer-to-peer, media exchange between two devices. A connection is established through a discovery and negotiation process called signaling. This tutorial will guide you through building a two-way video call.&lt;/p&gt;

&lt;p&gt;WebRTC is a fully peer-to-peer technology for the real-time exchange of audio, video, and data, with one central caveat. A form of discovery and media format negotiation must take place, as discussed elsewhere, in order for two devices on different networks to locate one another.&lt;/p&gt;

&lt;p&gt;This process is called signaling and involves both devices connecting to a third, mutually agreed-upon server. Through this third server, the two devices can locate one another, and exchange negotiation messages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Things You Need to Know&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Signaling&lt;/li&gt;
&lt;li&gt;SDP – Session Description Protocol&lt;/li&gt;
&lt;li&gt;ICE Candidates&lt;/li&gt;
&lt;li&gt;STUN &amp;amp; TURN&lt;/li&gt;
&lt;li&gt;Peer Connection&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Signaling Using Signal Server
&lt;/h2&gt;

&lt;p&gt;Establishing a WebRTC connection between two devices requires the use of a signaling server to resolve how to connect them over the internet. A signaling server’s job is to serve as an intermediary to let two peers find and establish a connection while minimizing exposure of potentially private information as much as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do We Create this Server and How Does the Signaling Process Actually Work?
&lt;/h2&gt;

&lt;p&gt;First, we need the signaling server itself. WebRTC doesn’t specify a transport mechanism for the signaling information. &lt;/p&gt;

&lt;p&gt;You can use anything you like, from WebSocket to XMLHttpRequest to carrier pigeons to exchange the signaling information between the two peers.&lt;br&gt;
It’s important to note that the server doesn’t need to understand or interpret the signaling data content. Although it’s SDP, even this doesn’t matter so much: the content of the message going through the signaling server is, in effect, a black box. &lt;/p&gt;

&lt;p&gt;What does matter is when the ICE subsystem instructs you to send signaling data to the other peer, you do so, and the other peer knows how to receive this information and deliver it to its own ICE subsystem. All you have to do is channel the information back and forth. The contents don’t matter at all to the signaling server.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Session Description Protocol
&lt;/h2&gt;

&lt;p&gt;The signaling mechanism (methods, protocols, etc.) is not specified by WebRTC. We need to build it ourselves. (Although this seems to be a complicated task, believe us — it is not. In this series, we will use Socket.IO for signaling, but there are many alternatives).&lt;/p&gt;

&lt;p&gt;WebRTC only requires the exchange of the media metadata mentioned above between peers as offers and answers. Offers and answers are communicated in Session Description Protocol (SDP)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;format which looks like the following:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=0
o=- 7614219274584779017 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS
m=audio 1 RTP/SAVPF 111 103 104 0 8 107 106 105 13 126
c=IN IP4 0.0.0.0
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are wondering what each line means in the above format, don’t worry. WebRTC creates this automatically according to the audio/video device present on your laptop/PC.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. ICE Candidates
&lt;/h2&gt;

&lt;p&gt;As well as exchanging information about the media (discussed above in Offer/Answer and SDP), peers must exchange information about the network connection. This is known as an ICE candidate and details the available methods the peer is able to communicate (directly or through a TURN server). &lt;/p&gt;

&lt;p&gt;Typically, each peer will propose its best candidates first, making their way down the line toward their worse candidates. &lt;/p&gt;

&lt;p&gt;Ideally, candidates are UDP (since it’s faster, and media streams are able to recover from interruptions relatively easily), but the ICE standard does allow TCP candidates as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. STUN &amp;amp; TURN Server
&lt;/h2&gt;

&lt;p&gt;STUN(Session Traversal Utilities for NAT(Network Address Translator)) server: returns the IP address, port, and connectivity status of a networked device behind a NAT.&lt;/p&gt;

&lt;p&gt;The STUN server  simply provides a meeting space for computers to exchange contact information. Once the information is exchanged, a connection is established between the peer computers and then the STUN server is left out of the rest of the conversation.&lt;/p&gt;

&lt;p&gt;Connections established via STUN servers are the most ideal and cost-effective type of &lt;a href="https://www.mirrorfly.com/blog/webrtc-encryption-and-security/" rel="noopener noreferrer"&gt;WebRTC communication&lt;/a&gt;. There’s hardly any running cost incurred by the users. &lt;/p&gt;

&lt;p&gt;Unfortunately, the connection may fail to establish for some users due to the type of NAT device each peer is using.&lt;/p&gt;

&lt;p&gt;In such a situation, the ICE protocol requires you to provide a fallback, which is a different type of signaling server known as a TURN server.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;TURN(Traversal Using Relays around NAT) server:&lt;/strong&gt; a protocol that enables devices to receive and send data from behind a NAT or firewall.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7gxv0jduo3s9t8arurr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7gxv0jduo3s9t8arurr.png" alt="integrate stun video call server " width="740" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A TURN server is an extension of the STUN server:&lt;/strong&gt; Where it differs from its predecessor is that it handles the entire communication session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgorxe9ppnzyy69l0lkpr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgorxe9ppnzyy69l0lkpr.png" alt="turn server for webrtc video call" width="740" height="444"&gt;&lt;/a&gt;&lt;br&gt;
Basically, after establishing a connection between the peers, it receives streams from one peer and relays it to the other, and vice versa.&lt;/p&gt;

&lt;p&gt;This type of communication is more expensive and the host has to pay for the processing and bandwidth load required to operate a TURN server.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Peer Connection
&lt;/h2&gt;

&lt;p&gt;The RTCPeerConnection interface represents a WebRTC connection between the local computer and a remote peer. &lt;/p&gt;

&lt;p&gt;It provides methods to connect to a remote peer, maintain and monitor the connection, and close the connection once it’s no longer needed.&lt;/p&gt;

&lt;p&gt;EventTarget  ← RTCPeerConnection&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Integration Workflow
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Exchanging session descriptions
&lt;/h3&gt;

&lt;p&gt;When starting the signaling process, an offer is created by the user initiating the call. This offer includes a session description, in SDP format, and needs to be delivered to the receiving user, which we’ll call the callee. The caller responds to the offer with an answer message, also containing an SDP description. &lt;/p&gt;

&lt;p&gt;Our signaling server will use WebSocket to transmit offer messages with the type &lt;strong&gt;“video-offer”&lt;/strong&gt;, and answer messages with the type &lt;strong&gt;“video-answer”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4zwffmddyw634rjxx1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4zwffmddyw634rjxx1v.png" alt="integrate video call to website" width="512" height="168"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Exchanging ICE candidates
&lt;/h3&gt;

&lt;p&gt;Two peers need to exchange ICE candidates to negotiate the actual connection between them. Every ICE candidate describes a method that the sending peer is able to use to communicate. Each peer sends candidates in the order they’re discovered, and keeps sending candidates until it runs out of suggestions, even if media has already started streaming.&lt;/p&gt;

&lt;p&gt;An icecandidate event is sent to the RTCPeerConnection to complete the process of adding a local description using &lt;strong&gt;pc.setLocalDescription(offer)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once the two peers agree upon a mutually-compatible candidate, that candidate’s SDP is used by each peer to construct and open a connection, through which media then begins to flow. If they later agree on a better (usually higher-performance) candidate, the stream may change formats as needed.&lt;/p&gt;

&lt;p&gt;Though not currently supported, a candidate received after media is already flowing could theoretically also be used to downgrade to a lower-bandwidth connection if needed.&lt;/p&gt;

&lt;p&gt;Each ICE candidate is sent to the other peer by sending a JSON message of type &lt;strong&gt;“new-ice-candidate”&lt;/strong&gt; over the signaling server to the remote peer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsbcznf3g14xeekysozi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsbcznf3g14xeekysozi.png" alt="add video call to android app" width="512" height="352"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Making a call
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;invite()&lt;/strong&gt; function can be invoked as the calle clicks on another user whom they are trying to connect for the list of users they have.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var mediaConstraints = {
  audio: true, // We want an audio track
  video: true // ...and we want a video track
};

function invite(evt) {
  if (myPeerConnection) {
    alert("You are already in another call.");
  } else {
    var clickedUsername = evt.target.textContent;

    targetUsername = clickedUsername;
    createPeerConnection();

    navigator.mediaDevices.getUserMedia(mediaConstraints)
    .then(function(localStream) {
      document.getElementById("local_video").srcObject = localStream;
      localStream.getTracks().forEach(track =&amp;gt; myPeerConnection.addTrack(track, localStream));
    })
    .catch(handleGetUserMediaError);
  }
}

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating the peer connection
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;createPeerConnection()&lt;/strong&gt; function is used by both the caller and the callee to construct their RTCPeerConnection objects, their respective ends of the WebRTC connection. It’s invoked by invite() when the caller tries to start a call, and by &lt;strong&gt;handleVideoOfferMsg()&lt;/strong&gt; when the callee receives an offer message from the caller.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function createPeerConnection() {
  myPeerConnection = new RTCPeerConnection({
      iceServers: [     // Information about ICE servers - Use your own!
        {
          urls: "stun:stun.stunprotocol.org"
        }
      ]
  });

handleNegotiationNeededEvent;
  myPeerConnection.onremovetrack = handleRemoveTrackEvent;
  myPeerConnection.oniceconnectionstatechange = handleICEConnectionStateChangeEvent;
  myPeerConnection.onicegatheringstatechange = handleICEGatheringStateChangeEvent;
  myPeerConnection.onsignalingstatechange = handleSignalingStateChangeEvent;
}  myPeerConnection.onicecandidate = handleICECandidateEvent;
  myPeerConnection.ontrack = handleTrackEvent;
  myPeerConnection.onnegotiationneeded = 

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

&lt;/div&gt;



&lt;p&gt;When using the &lt;strong&gt;RTCPeerConnection()&lt;/strong&gt; constructor, we will specify an object providing configuration parameters for the connection. We use only one of these in this example: iceServers. This is an array of objects describing STUN and/or TURN servers for the ICE layer to use when attempting to establish a route between the caller and the callee. These servers are used to determine the best route and protocols to use when communicating between the peers, even if they’re behind a firewall or using NAT.&lt;/p&gt;

&lt;h3&gt;
  
  
  Starting negotiation
&lt;/h3&gt;

&lt;p&gt;Once the caller has created its RTCPeerConnection, created a media stream, and added its tracks to the connection as shown in Starting a call, the browser will deliver a negotiationneeded event to the RTCPeerConnection to indicate that it’s ready to begin negotiation with the other peer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here’s our code for handling the negotiation needed event:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function handleNegotiationNeededEvent() {
  myPeerConnection.createOffer().then(function(offer) {
    return myPeerConnection.setLocalDescription(offer);
  })
  .then(function() {
    sendToServer({
      name: myUsername,
      target: targetUsername,
      type: "video-offer",
      sdp: myPeerConnection.localDescription
    });
  })
  .catch(reportError);
}

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

&lt;/div&gt;



&lt;p&gt;To start the negotiation process, we need to create and send an SDP offer to the peer we want to connect to. This offer includes a list of supported configurations for the connection, including information about the media stream we’ve added to the connection locally (that is, the video we want to send to the other end of the call), and any ICE candidates gathered by the ICE layer already.&lt;/p&gt;

&lt;h3&gt;
  
  
  Session Negotiation
&lt;/h3&gt;

&lt;p&gt;Now that we’ve started negotiation with the other peer and have transmitted an offer, let’s look at what happens on the callee’s side of the connection for a while. The callee receives the offer and calls &lt;strong&gt;handleVideoOfferMsg()&lt;/strong&gt; function to process it. Let’s see how the callee handles the “video-offer” message.&lt;/p&gt;

&lt;h3&gt;
  
  
  Receiving Incoming call
&lt;/h3&gt;

&lt;p&gt;When the offer arrives, the callee’s &lt;strong&gt;handleVideoOfferMsg()&lt;/strong&gt; function is called with the “video-offer” message that was received. This function needs to do two things. First, it needs to create its own RTCPeerConnection and add the tracks containing the audio and video from its microphone and webcam to that. Second, it needs to process the received offer, constructing and sending its answer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function handleVideoOfferMsg(msg) {
  var localStream = null;

  targetUsername = msg.name;
  createPeerConnection();

  var desc = new RTCSessionDescription(msg.sdp);

  myPeerConnection.setRemoteDescription(desc).then(function () {
    return navigator.mediaDevices.getUserMedia(mediaConstraints);
  })
  .then(function(stream) {
    localStream = stream;
    document.getElementById("local_video").srcObject = localStream;

    localStream.getTracks().forEach(track =&amp;gt; myPeerConnection.addTrack(track, localStream));
  })
  .then(function() {
    return myPeerConnection.createAnswer();
  })
  .then(function(answer) {
    return myPeerConnection.setLocalDescription(answer);
  })
  .then(function() {
    var msg = {
      name: myUsername,
      target: targetUsername,
      type: "video-answer",
      sdp: myPeerConnection.localDescription
    };

    sendToServer(msg);
  })
  .catch(handleGetUserMediaError);
}

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

&lt;/div&gt;



&lt;p&gt;This code is very similar to what we did in the invite() function back in Starting a call. It starts by creating and configuring an RTCPeerConnection using our &lt;strong&gt;createPeerConnection()&lt;/strong&gt; function. Then it takes the SDP offer from the received “video-offer” message and uses it to create a new RTCSessionDescription object representing the caller’s session description.&lt;/p&gt;

&lt;h2&gt;
  
  
  ICE candidates exchange
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sending ICE Candidates
&lt;/h3&gt;

&lt;p&gt;The ICE negotiation process involves each peer sending candidates to the other, repeatedly, until it runs out of potential ways it can support the RTCPeerConnection’s media transport needs. Since ICE doesn’t know about your signaling server, your code handles transmission of each candidate in your handler for the icecandidate event.&lt;/p&gt;

&lt;p&gt;Your onicecandidate handler receives an event whose candidate property is the SDP describing the candidate (or is null to indicate that the ICE layer has run out of potential configurations to suggest). The contents of candidate are what you need to transmit using your signaling server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here’s our example’s implementation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function handleICECandidateEvent(event) {
  if (event.candidate) {
    sendToServer({
      type: "new-ice-candidate",
      target: targetUsername,
      candidate: event.candidate
    });
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This builds an object containing the candidate, then sends it to the other peer using the sendToServer() function previously described in Sending messages to the signaling server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Receiving ICE candidates
&lt;/h3&gt;

&lt;p&gt;The signaling server delivers each ICE candidate to the destination peer using whatever method it chooses; in our example this is as JSON objects, with a type property containing the string &lt;strong&gt;“new-ice-candidate”&lt;/strong&gt;. Our &lt;strong&gt;handleNewICECandidateMsg()&lt;/strong&gt; function is called by our main WebSocket incoming message code to handle these messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function handleNewICECandidateMsg(msg) {
  var candidate = new RTCIceCandidate(msg.candidate);

  myPeerConnection.addIceCandidate(candidate)
    .catch(reportError);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function constructs an RTCIceCandidate object by passing the received SDP into its constructor, then delivers the candidate to the ICE layer by passing it into &lt;strong&gt;myPeerConnection.addIceCandidate()&lt;/strong&gt;. This hands the fresh ICE candidate to the local ICE layer, and finally, our role in the process of handling this candidate is complete.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;To conclude, I hope this post has given you a full understanding of how WebRTC works on audio/ video calling apps. WebRTC is in a boom and adapting to the technology in any business app you build will be an absolutely wise investment. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mirrorfly.com/webrtc-video-chat.php" rel="noopener noreferrer"&gt;MirrorFly&lt;/a&gt; is an industry-leading video call API provider that offers more than 1000+ video, voice and chat features that supports WebRTC for building real-time communication apps. It offers both cloud and self-hosted video call solution, so that developers can build modern voice/ video calling apps quickly and deploy flexibly on-premise or on-cloud. &lt;/p&gt;

</description>
      <category>webrtc</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Build a VoIP Calling App? [2025 Guide]</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Wed, 26 Feb 2025 12:59:28 +0000</pubDate>
      <link>https://dev.to/alexsam986/how-to-build-a-voip-calling-app-3oi5</link>
      <guid>https://dev.to/alexsam986/how-to-build-a-voip-calling-app-3oi5</guid>
      <description>&lt;p&gt;Businesses are saving a lot of money with VoIP. Do you know how? &lt;/p&gt;

&lt;p&gt;Small businesses especially save nearly 40% on local calls and 90% on international calls by using VoIP calling apps.&lt;/p&gt;

&lt;p&gt;This article will take you through the steps you need to follow to build a VoIP app. &lt;strong&gt;Let’s get started!&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a VoIP App?
&lt;/h2&gt;

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

&lt;p&gt;We’re well aware that VoIP applications help us make calls online using the internet connection. But how does it work? &lt;/p&gt;

&lt;p&gt;To put it in simple terms, a VoIP app is a calling app that uses VoIP technology to convert voice signals into digital data. It is a software that runs on the internet and enables communication in real-time. &lt;/p&gt;

&lt;p&gt;At the backend of the app, the VoIP app uses protocols like SIP (Session Initiation Protocol), RTP (Real-Time Transport Protocol), and WebRTC serve as the backbone for establishing and maintaining these connections.&lt;/p&gt;

&lt;p&gt;Sounds like a reliable choice? Let’s look into the steps to build a VoIP calling app in the next 4 mins. &lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Guide To Building Your Own VoIP Calling App
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Below are the 5 steps you need to follow:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Determine Your Use Cases
&lt;/h3&gt;

&lt;p&gt;Start your VoIP app building journey by asking, “Why do I want to create a custom VoIP app?” Define your objectives and functionalities that you want from the app. You may use it as a robust communication tool or just a calling option to fulfill your business needs. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Budgeting &amp;amp; Resource Allocation
&lt;/h3&gt;

&lt;p&gt;Once you have defined the use cases, outline the development timelines and infrastructure investments and decide whether you want to outsource the project to a white-label VoIP voice calling app provider or go for in-house development. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Knowing Essential Features &amp;amp; Functionalities
&lt;/h3&gt;

&lt;p&gt;Knowing what features to add will help you get a comprehensive app that delivers the best results. Important features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-definition voice and video calling&lt;/li&gt;
&lt;li&gt;Conference calling&lt;/li&gt;
&lt;li&gt;Instant messaging&lt;/li&gt;
&lt;li&gt;End-to-end encryption &lt;/li&gt;
&lt;li&gt;Multi-factor authentication&lt;/li&gt;
&lt;li&gt;Smart integrations&lt;/li&gt;
&lt;li&gt;AI-powered call optimization&lt;/li&gt;
&lt;li&gt;Real-time translation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Selecting Technology Stack and Architecture
&lt;/h3&gt;

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

&lt;p&gt;A smooth functioning of your VoIP call app depends on what technology and framework you choose. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For robust and reliable call handling, ensure protocols such as, SIP, WebRTC, and RTP are integrated correctly. &lt;/li&gt;
&lt;li&gt;For a responsive front end, utilize frameworks like Node.js, React, or Flutter. &lt;/li&gt;
&lt;li&gt;Protect data in transit with TLS and SRTP.&lt;/li&gt;
&lt;li&gt;Cloud platform recommendations: Azure, Google Cloud, or AWS.&lt;/li&gt;
&lt;li&gt;Integrate emerging technologies such as AI, machine learning, and edge computing. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 5: Developing VoIP Calling App
&lt;/h3&gt;

&lt;p&gt;Having set the objectives, budget, and technology, it’s time to work on the development process. Start by developing a MVP (Minimum Viable Product) to test core functionalities and continuously improve features along the process. &lt;/p&gt;

&lt;p&gt;Never compromise on the security of your app. Follow secure coding practices and regularly analyze potential risks to implement countermeasures. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next move on to testing and quality assurance by asking the following questions:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can your VoIP calling app handle high volume and traffic?&lt;/li&gt;
&lt;li&gt;Do you use automated tools to continuously monitor weaknesses?&lt;/li&gt;
&lt;li&gt;How often do you gather feedback from real users to fine-tune the experience?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eventually, Automate deployment processes to streamline updates and rollbacks. After launching the app, set up your systems to monitor performance and security, ensuring swift responses to any issues. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should Your Business Have a Custom VoIP Calling App?
&lt;/h2&gt;

&lt;p&gt;VoIP isn’t just a necessary tech upgrade, it’s more than that. Look at it as a strategic investment in your business’s future. &lt;strong&gt;Here are the reasons:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Save More Money:&lt;/strong&gt; VoIP can help cut down your communication expenses by 50% when compared to traditional landlines. &lt;br&gt;
&lt;strong&gt;2. Indispensable Technology:&lt;/strong&gt;  With an increasing adoption of cloud-driven communication and a demand for a flexible solution, VoIP calling apps have become an unavoidable solution in the market. &lt;br&gt;
&lt;strong&gt;3. Every Industry Covered:&lt;/strong&gt; From call centres and educational sectors to healthcare and e-commerce industries, nearly 80% of enterprises have already integrated VoIP solutions into their operations.&lt;br&gt;
&lt;strong&gt;4. Flexible &amp;amp; Scalable Solution:&lt;/strong&gt; Over 70% of businesses report implementing VoIP has dramatically improved their business operations. Why do business owners love it? Because, you can tailor the application to meet your unique needs. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should You Choose MirrorFly To Build a Secure &amp;amp; Custom VoIP App?
&lt;/h2&gt;

&lt;p&gt;MirrorFly is a &lt;a href="https://www.mirrorfly.com/sip-voip-solution.php" rel="noopener noreferrer"&gt;white-label VoIP Software provider&lt;/a&gt; that lets you create a stunning application under your own brand. Here are the reasons why MirrorFly stands out from the competition. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. 100% Customizable:&lt;/strong&gt; MirrorFly’s VoIP calling solution lets you customize any part of your app, without any limitations. You’ll launch an app that looks and performs like it’s built with your own in-house experts. &lt;br&gt;
&lt;strong&gt;2. Full data ownership:&lt;/strong&gt; Your data is all yours. MirrorFly or any associated integrations does not store your data. Rather, you get to manage and control them all. &lt;br&gt;
&lt;strong&gt;3. Self-hosting options:&lt;/strong&gt; Deploy your audio calling app at your convenience. Host on premise, on your own data centers or on hardwares, just as you want it. Remember, if you need a backup option, MirrorFly offers multi-tenant cloud hosting as well.&lt;br&gt;
&lt;strong&gt;4. Unlimited calls &amp;amp; chats:&lt;/strong&gt; Make and receive calls as much as your business needs. Whether it is national or international, there are no charges like you had to pay for your PSTNs. &lt;br&gt;
&lt;strong&gt;5. 1000+ features:&lt;/strong&gt; MirrorFly does not stop only with calling features. You get to integrate 1000s of instant messaging and calling features plus 100s of third-party integrations. &lt;/p&gt;

&lt;p&gt;What are you waiting for? Take your business to the next level by replacing your traditional phone systems with a custom VoIP app.&lt;/p&gt;

</description>
      <category>sip</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Implement Read Receipts On Your Android Chat App?</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Tue, 18 Feb 2025 07:31:15 +0000</pubDate>
      <link>https://dev.to/alexsam986/how-to-implement-read-receipts-on-your-android-chat-app-894</link>
      <guid>https://dev.to/alexsam986/how-to-implement-read-receipts-on-your-android-chat-app-894</guid>
      <description>&lt;p&gt;In this tutorial, you will learn how to implement the read receipt feature on your Android app with the help of &lt;a href="https://www.mirrorfly.com/sdk.php" rel="noopener noreferrer"&gt;MirrorFly SDKs&lt;/a&gt;. This entire tutorial is coded in Java, and the steps are illustrated to develop apps in Android Studio.&lt;/p&gt;

&lt;p&gt;Please note that this guide assumes that you have a basic familiarity with Javascript. With no further ado, &lt;strong&gt;Let’s begin!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Read receipts is a chat app feature that lets senders know when the message they’ve sent is opened or read by the recipient. To implement this feature, you’ll need a ready-to-integrate SDK, which is available to download instantly from MirrorFly. &lt;/p&gt;

&lt;p&gt;Let’s take a closer look into the steps to build read receipts into Android apps:&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Downloading The Chat SDKs
&lt;/h2&gt;

&lt;p&gt;Go to the &lt;a href="https://console.mirrorfly.com/" rel="noopener noreferrer"&gt;Signup Page&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Sign up using your Google or LinkedIn account or,&lt;/li&gt;
&lt;li&gt;Fill in the sign up details. An account confirmation link will be sent to your email.&lt;/li&gt;
&lt;li&gt;Click the link and verify your account.&lt;/li&gt;
&lt;li&gt;On confirmation, you will be taken to the Account Dashboard&lt;/li&gt;
&lt;li&gt;From the Overview page, download the Android SDKs&lt;/li&gt;
&lt;li&gt;Extract the dependencies from the ZIP folder. We’ll use these files in Step 2&lt;/li&gt;
&lt;li&gt;Next, scroll down to find the License Key&lt;/li&gt;
&lt;li&gt;You’ll need this License key in Step 3&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Setting Up The New App Project in Android Studio
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Note &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This Tutorial uses Android Studio for explanation purposes. However, MirrorFly’s SDKs can be used on any IDEs of your choice to build Android apps. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In this step, we’ll create a New Android App project.&lt;/strong&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Open the Android Studio IDE&lt;/li&gt;
&lt;li&gt;Fill in the details of your project on the Welcome Page&lt;/li&gt;
&lt;li&gt;Select the programming language as Java&lt;/li&gt;
&lt;li&gt;The project dashboard will open. On this page, go to the project menu on the left side&lt;/li&gt;
&lt;li&gt;Select the App folder&lt;/li&gt;
&lt;li&gt;Import all the dependencies downloaded in Step 1&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 3: Integrating The Chat SDK With The App
&lt;/h2&gt;

&lt;p&gt;Once the dependencies are added to the project,&lt;/p&gt;

&lt;p&gt;Add the below code to the build gradle of your app folder&lt;br&gt;
`plugins {&lt;br&gt;
    ...&lt;br&gt;
    id 'kotlin-android'&lt;br&gt;
    id 'kotlin-kapt'&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;android {&lt;br&gt;
    compileOptions {&lt;br&gt;
        sourceCompatibility JavaVersion.VERSION_1_8&lt;br&gt;
        targetCompatibility JavaVersion.VERSION_1_8&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kotlinOptions {
    jvmTarget = '1.8'
}

packagingOptions {
    exclude 'META-INF/AL2.0'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/ASL2.0'
    exclude 'META-INF/LGPL2.1'
    exclude("META-INF/*.kotlin_module")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
`&lt;br&gt;
Next, add the dependencies to the app/build.gradle file&lt;/p&gt;

&lt;p&gt;`dependencies {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ... // your app dependencies

 implementation files('libs/appbase.aar')
 implementation files('libs/flycommons.aar')
 implementation files('libs/flynetwork.aar')
 implementation files('libs/flydatabase.aar')
 implementation files('libs/videocompression.aar')
 implementation files('libs/xmpp.aar')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;Add the below modules to the app/build.gradle file&lt;/p&gt;

&lt;p&gt;dependencies {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ... // your app dependencies

 configurations {
     all {
         exclude group: 'org.json', module: 'json'
         exclude group: 'xpp3', module: 'xpp3'
     }
 }

 //For lifecycle listener
 implementation 'android.arch.lifecycle:extensions:1.1.1'
 annotationProcessor 'android.arch.lifecycle:compiler:1.1.1'

 //For GreenDao
 implementation 'de.greenrobot:greendao:2.1.0'

 //For gson parsing
 implementation 'com.google.code.gson:gson:2.8.1'

 //for smack implementation
 implementation 'org.igniterealtime.smack:smack-android:4.4.4'
 implementation 'org.igniterealtime.smack:smack-tcp:4.4.4'
 implementation 'org.igniterealtime.smack:smack-im:4.4.4'
 implementation 'org.igniterealtime.smack:smack-extensions:4.4.4'
 implementation 'org.igniterealtime.smack:smack-sasl-provided:4.4.4'

 implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
 implementation 'androidx.multidex:multidex:2.0.1'
 implementation 'com.google.android.gms:play-services-location:17.0.0'

 //Dagger Dependencies
 api 'com.google.dagger:dagger:2.40.5'
 kapt 'com.google.dagger:dagger-compiler:2.40.5'
 api 'com.google.dagger:dagger-android:2.40.5'
 api 'com.google.dagger:dagger-android-support:2.40.5'
 kapt 'com.google.dagger:dagger-android-processor:2.40.5'

 //coroutines
 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8'
 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.8'

 //apicalls
 implementation 'com.squareup.retrofit2:retrofit:2.6.1'
 implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
 implementation 'com.squareup.okhttp3:okhttp:4.2.0'
 implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'

 //stetho interceptor
 implementation 'com.facebook.stetho:stetho-okhttp3:1.3.1'

 //okhttp interceptor
 implementation 'com.squareup.okhttp3:logging-interceptor:3.14.3'

 //shared preference encryption
 implementation 'androidx.security:security-crypto:1.1.0-alpha03'

 //for mobile number formatting
 implementation 'io.michaelrocks:libphonenumber-android:8.10.1'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
`&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In order to refrain from conflict among the imported library files, we’ll need to add the below code to the gradle.properties file.&lt;br&gt;
&lt;code&gt;android.enableJetifier=true&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next, add the permissions to AndroidManifest.xml &lt;br&gt;
&lt;code&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET" /&amp;gt;&lt;br&gt;
&amp;lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now, we need to add the License key to the app/build.gradle file&lt;br&gt;
&lt;code&gt;buildTypes {&lt;br&gt;
debug {&lt;br&gt;
buildConfigField 'String', 'SDK_BASE_URL', '"https://api-preprod-sandbox.mirrorfly.com/api/v1/"'&lt;br&gt;
buildConfigField 'String', 'LICENSE', '"xxxxxxxxxxxxxxxxxxxxxxxxx"'&lt;br&gt;
buildConfigField 'String', 'WEB_CHAT_LOGIN', '"https://webchat-preprod-sandbox.mirrorfly.com/"'&lt;br&gt;
buildConfigField "String", "SUPPORT_MAIL", '"contussupport@gmail.com"'&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 4: Initializing The Chat SDK
&lt;/h2&gt;

&lt;p&gt;This step will collect all the essential data like client and server details to start the data exchange between user devices. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To kickstart, add the below code to the onCreate() method of the Application class&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;`//For chat logging&lt;br&gt;
LogMessage.enableDebugLogging(BuildConfig.DEBUG);&lt;/p&gt;

&lt;p&gt;new ChatSDK.Builder()&lt;br&gt;
    .setDomainBaseUrl(BuildConfig.SDK_BASE_URL)&lt;br&gt;
    .setLicenseKey(BuildConfig.LICENSE)&lt;br&gt;
    .setIsTrialLicenceKey(true)&lt;br&gt;
    .build(); &lt;br&gt;
`&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Registering The App User
&lt;/h2&gt;

&lt;p&gt;This step is used to register the user in the sandbox or live mode. The below code will check if the license key is on trial and register the user&lt;br&gt;
&lt;code&gt;FlyCore.registerUser(USER_IDENTIFIER, (isSuccess, throwable, data ) -&amp;gt; {&lt;br&gt;
        if(isSuccess) {&lt;br&gt;
            Boolean isNewUser = (Boolean) data.get("is_new_user");&lt;br&gt;
            JSONObject responseObject = (JSONObject) data.get("data");&lt;br&gt;
           // Get Username and password from the object&lt;br&gt;
        } else {&lt;br&gt;
           // Register user failed print throwable to find the exception details.&lt;br&gt;
        }&lt;br&gt;
   });&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Connecting To Chat Server
&lt;/h2&gt;

&lt;p&gt;To connect the client-side apps, we’ll need a central server that can execute data exchange between the devices. The below SDK method will set up the server connection and start receiving and sending the data on client requests from user devices. &lt;br&gt;
` ChatManager.connect(new ChatConnectionListener() {&lt;br&gt;
         &lt;a class="mentioned-user" href="https://dev.to/override"&gt;@override&lt;/a&gt;&lt;br&gt;
         public void onConnected() {&lt;br&gt;
             // Write your success logic here to navigate Profile Page or&lt;br&gt;
             // To Start your one-one chat with your friends&lt;br&gt;
         }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;     @Override
     public void onDisconnected() {
        // Connection disconnected
        //No need implementations
     }

    @Override
     public void onConnectionNotAuthorized() {
        // Connection Not authorized
        //No need implementations
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;h2&gt;
  
  
  Step 7: Sending Messages
&lt;/h2&gt;

&lt;p&gt;Once, the server connection is established, you can start sending messages from a device through the SDK by implementing the following method&lt;/p&gt;

&lt;p&gt;&lt;code&gt;FlyMessenger.sendTextMessage(TO_JID, TEXT, new SendMessageListener() {&lt;br&gt;
            @Override&lt;br&gt;
            public void onResponse(boolean isSuccess, @Nullable ChatMessage chatMessage) {&lt;br&gt;
                // you will get the message sent success response&lt;br&gt;
            }&lt;br&gt;
        });&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Receiving Messages
&lt;/h2&gt;

&lt;p&gt;This method will be used to notify the user device when new incoming messages are received on the user device.&lt;br&gt;
&lt;code&gt;@Override&lt;br&gt;
    public void onMessageReceived(@NonNull ChatMessage message) {&lt;br&gt;
        super.onMessageReceived(message);&lt;br&gt;
        // received message object&lt;br&gt;
    }&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9 : Adding The Read Receipt Feature
&lt;/h2&gt;

&lt;p&gt;Once the app can send and receive messages, the user needs the status of the message delivery on the UI. The below method will notify the user when the recipient has opened the sent message.&lt;/p&gt;

&lt;p&gt;Before setting this up, we’ll need to make a few configurations with the user jid. Here are the steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We’ll need to set the user jid as ongoing chat user in the activity/fragment onResume&lt;br&gt;
&lt;code&gt;@Override&lt;br&gt;
public void onResume() {&lt;br&gt;
    super.onResume();&lt;br&gt;
    ChatManager.setOnGoingChatUser(JID);&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next, we’ll need to clear the ongoing chat user in the activity/fragment onPause&lt;br&gt;
&lt;code&gt;@Override&lt;br&gt;
public void onPause() {&lt;br&gt;
    super.onPause();&lt;br&gt;
    ChatManager.setOnGoingChatUser("");&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now, when the chat window is opened, the recipient jid will be passed to the below method&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The SDK will start using the user jid set by the&lt;br&gt;
ChatManager.setOnGoingChatUser(jid: String)&lt;br&gt;
&lt;code&gt;ChatManager.markAsRead(JID)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 10: Observing The Message Events
&lt;/h2&gt;

&lt;p&gt;Using the below method, we can register a listener to update the user UI immediately on any message related events. When a message is sent via the SDK, the message status events will give the respective callbacks. &lt;br&gt;
`ChatEventsManager.setupMessageEventListener(new MessageEventsListener() {&lt;br&gt;
            &lt;a class="mentioned-user" href="https://dev.to/override"&gt;@override&lt;/a&gt;&lt;br&gt;
            public void onMessageReceived(@NotNull ChatMessage message) {&lt;br&gt;
              //called when the new message is received&lt;br&gt;
            }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        @Override
        public void onMessageStatusUpdated(@NotNull String messageId) {
           //called when the message status is updated
           //find the index of message object in list using messageId
           //then fetch message object from db using `FlyMessenger.getMessageOfId(messageId)` and notify the item in list
        }

        @Override
        public void onMediaStatusUpdated(@NotNull ChatMessage message) {
          //called when the message status is updated
          //find the index of message object in list using messageId
          //then fetch message object from db using `FlyMessenger.getMessageOfId(messageId)` and notify the item in list
        }

        @Override
        public void onUploadDownloadProgressChanged(@NotNull String messageId, int progressPercentage) {
         //called when the media message progress is updated
        }

        @Override
        public void onMessagesClearedOrDeleted(@NotNull ArrayList&amp;lt;String&amp;gt; messageIds) {
         //called when the message is deleted
        }
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

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

&lt;p&gt;Through this tutorial, we have seen the steps to implement read receipts in an Android chat app, including the respective code samples.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>android</category>
    </item>
    <item>
      <title>How to Create Your Own IPTV Channel?</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Mon, 23 Sep 2024 12:07:59 +0000</pubDate>
      <link>https://dev.to/alexsam986/how-to-create-your-own-iptv-channel-3a8</link>
      <guid>https://dev.to/alexsam986/how-to-create-your-own-iptv-channel-3a8</guid>
      <description>&lt;p&gt;*&lt;em&gt;Provider's custom channels, or playlists &lt;br&gt;
*&lt;/em&gt; IPTV drivers can produce custom playlists on the garçon and distribute videotape lines and aqueducts through these playlists. &lt;/p&gt;

&lt;p&gt;For illustration, you can produce an information channel( word channel) – a special channel where you distribute important information to your subscribers and announce new services. Or it can be a channel that broadcasts pictures. &lt;/p&gt;

&lt;p&gt;Technically, a custom channel is a playlist that contains links to sources( similar to lines and aqueducts) that are located on the Flussonic Media Garçon. A custom playlist can run on a schedule and it plays the sources on a circle. &lt;/p&gt;

&lt;p&gt;We'll show an illustration of a channel that broadcasts-prepared videotape lines. &lt;/p&gt;

&lt;p&gt;** To start broadcasting, you need to ** &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;prepare content( videotape lines) &lt;/li&gt;
&lt;li&gt;produce a playlist for the broadcast &lt;/li&gt;
&lt;li&gt;produce a stream that will broadcast the playlist. &lt;/li&gt;
&lt;li&gt; also, you can set up how to &lt;/li&gt;
&lt;li&gt;Add a totem &lt;/li&gt;
&lt;li&gt;Start the videotape on a schedule &lt;/li&gt;
&lt;li&gt;Distribute your channel via UDP Multicast&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Playlist creation&lt;/strong&gt; &lt;br&gt;
We will use lines in our playlist. still, adding aqueducts to a playlist is relatively analogous, related to Garçon- Side Playlists. &lt;/p&gt;

&lt;p&gt;Important. lines and other sources must be identical in their characteristics codecs, resolution, and bitrate. &lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1. Set up a file storage location
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1) Specify the path to a directory with video files (a VOD location).
&lt;/h3&gt;

&lt;p&gt;The default directory for files is /opt/flussonic/priv, and it is already available in the configuration file /etc/flussonic/flussonic.conf.&lt;br&gt;
Example of the default path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# VOD locations:
vod vod { storage /opt/flussonic/priv;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# VOD locations: vod vod { storage priv;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We'll use the directory that is specified in vod. If you want to use another directory, you can create another VOD location or just change the path in vod.&lt;/p&gt;

&lt;p&gt;Alternatively, you can use the Flussonic UI to specify storage for the playlist's files.&lt;/p&gt;

&lt;p&gt;2) Place the files in the specified directory. In the example, we'll use bunny.mp4 and beepbop.mp4, which already exist in /opt/flussonic/priv/.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2. Create a playlist
&lt;/h3&gt;

&lt;p&gt;The playlist is a text file including a list of links to sources. To edit the playlist, we'll use  nano, a text editor for Linux systems.&lt;/p&gt;

&lt;p&gt;1) To install nano, run these commands:&lt;br&gt;
apt-get update&lt;br&gt;
and then&lt;br&gt;
apt-get install nano&lt;/p&gt;

&lt;p&gt;2) Create a new file playlist.txt in the directory /opt/flussonic/priv/ by using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano /opt/flussonic/priv/playlist.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file immediately will open in the editor. Now add links to all the video files that we are going to broadcast:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vod/bunny.mp4
vod/beepbop.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To exit and save the changes, press CTRL + X and agree to save the changes by pressing y.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3. Create a stream
&lt;/h3&gt;

&lt;p&gt;1) Add to the configuration file /etc/flussonic/flussonic.conf the directive stream NAME:&lt;/p&gt;

&lt;p&gt;stream info channel { input playlist:///opt/flussonic/priv/playlist.txt;}&lt;/p&gt;

&lt;p&gt;Alternatively, you can create a static stream in the UI: Media &amp;gt; click add next to Streams. Specify the stream name (info channel) and URL (playlist:///opt/flussonic/priv/playlist.txt).&lt;/p&gt;

&lt;p&gt;For information about static streams, see live streaming.&lt;/p&gt;

&lt;p&gt;2) Reload the server configuration by running this command in Linux command line:&lt;/p&gt;

&lt;p&gt;service flussonic reload&lt;/p&gt;

&lt;p&gt;A new stream will appear in the list of streams in the web interface (Media &amp;gt; Streams) and it will play the specified files on a loop. You can play it and check how it works.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Add a logo and Set up the schedule?
&lt;/h3&gt;

&lt;p&gt;Our example of creating a logo uses transcoding and is considered resource-intensive. This method burns a logo image into the video track. It is suitable for channels distributed on IPTV networks.&lt;/p&gt;

&lt;p&gt;To add a logo, you need an image file in PNG format. An example can be found on the server in /opt/flussonic/wwwroot/flu/images/erly-small.png. Let's use it as a logo in your video stream.&lt;/p&gt;

&lt;p&gt;Add the transcoder directive to the info channel stream settings and specify early-small.png as the logo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stream info channel {
  input playlist:///opt/flussonic/priv/playlist.txt;
  transcoder vb=2048k logo=/opt/flussonic/wwwroot/flu/images/early-small.png@10:10 ab=128k;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload the server configuration, and the logo appears in the upper left corner of the screen.&lt;/p&gt;

&lt;p&gt;Learn more about overlaying a logo&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the schedule
&lt;/h3&gt;

&lt;p&gt;Open playlist.txt that you have earlier.&lt;br&gt;
With the #EXTINF tag (control command), you can set the playback duration for each of the playlisted items For example, broadcast the first 30 seconds of the 1st file and the first 60 seconds of the second file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#EXTINF:30
vod/bunny.mp4
#EXTINF:60
vod/beepbop.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the tag #EXT-X-UTC, you can set the Unix Timestamp of the time when you want to play the playlist item:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#EXT-X-UTC:1522839600
vod/bunny.mp4
#EXT-X-UTC:1522843200
vod/beepbop.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the #EXT-X-PROGRAM-DATE-TIME tag, you can set  the start time of the playlist item, in the ISO 8601 format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#EXT-X-PROGRAM-DATE-TIME:2018-04-04T11:00:00Z
vod/bunny.mp4
#EXT-X-PROGRAM-DATE-TIME:2018-02-04T12:00:00Z
vod/beepbop.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Distribute your channel over UDP multicast
&lt;/h3&gt;

&lt;p&gt;Add the push directive to the stream's configuration and here specify a multicast address for the distribution in a local network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stream info channel {
  input playlist:///opt/flussonic/priv/playlist.txt;
  transcoder vb=2048k logo=/opt/flussonic/wwwroot/flu/images/early-small.png@10:10 ab=128k;
  push udp://239.0.0.1:1234;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>React Native State Management: The Ultimate Guide [2024]</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Thu, 01 Aug 2024 05:37:28 +0000</pubDate>
      <link>https://dev.to/alexsam986/react-native-state-management-the-ultimate-guide-2df6</link>
      <guid>https://dev.to/alexsam986/react-native-state-management-the-ultimate-guide-2df6</guid>
      <description>&lt;p&gt;Building an app with big ideas, multiple users and screens with React Native. You must look into a very important factor - State Management. &lt;/p&gt;

&lt;p&gt;You’ll handle data across several components. You will need tools to make it easier to display, share, and update those data throughout the app, right? This is where state management comes into play. &lt;/p&gt;

&lt;p&gt;This article is aimed at educating business owners and developers on the importance of State Management to create powerful enterprise apps. &lt;/p&gt;

&lt;h2&gt;
  
  
  React Native State Management: An Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0u5bcrn02moee2lxc25.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0u5bcrn02moee2lxc25.jpg" alt="React Native State Managemen" width="760" height="386"&gt;&lt;/a&gt;&lt;br&gt;
For people new to React Native, managing state can be tricky at first. But don't worry! Good state management takes care of how your app looks, how data is managed and most importantly, it prevents losing important data when developing complex apps.  &lt;/p&gt;

&lt;p&gt;Now, there are many tools out there that help developers share data between different parts of their apps. &lt;/p&gt;

&lt;p&gt;Some of the popular ones are Redux, Recoil, and Hooks, in the npm registry. &lt;/p&gt;

&lt;p&gt;Each of these tools is quite unique and when picking one of them, you must clearly think about what your project needs are. Typically, your choice should depend on what you want your app to do.&lt;/p&gt;
&lt;h2&gt;
  
  
  React Native State Management Libraries
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnieq77wup77ugab46tzu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnieq77wup77ugab46tzu.png" alt="React Native State Management Libraries" width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
State management libraries are really helpful for big, and complex React Native apps. &lt;/p&gt;

&lt;p&gt;Here’s how these libraries become a big plus when you are building apps:&lt;br&gt;
Your app will have many parts. These libraries will help these parts work together. &lt;/p&gt;

&lt;p&gt;It’s easy to fetch data from different parts of the app, with these tools.&lt;/p&gt;

&lt;p&gt;They are particularly very helpful when building complex apps. &lt;br&gt;
Now, let’s quickly look into these libraries and how they are actually helpful for your app.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.Context API
&lt;/h3&gt;

&lt;p&gt;React usually passes data from parent to child components using props. Sometimes, you need to send data to deeply nested components, which can be tedious. The Context API solves this problem by creating a kind of "global" state for a part of your app. &lt;/p&gt;

&lt;p&gt;It's like setting up a direct line of communication between distant components. You create a "context" which holds the data you want to share. A "Provider" component wraps the part of your app that needs access to this data. Any component inside the Provider can then access this data directly, without passing props. This makes it easier to share data across many components without extra code.&lt;/p&gt;

&lt;p&gt;Let's use a simple example to illustrate how the Context API works:&lt;/p&gt;

&lt;p&gt;Imagine we're building a small app that has a theme (light or dark) that needs to be accessed by multiple components. Here's how we might set this up using the Context API:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. First, we create a context:&lt;/strong&gt;&lt;br&gt;
Let’s create a context ThemeContext with a default value of 'light'.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';

const ThemeContext = React.createContext('light');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Then, we create a provider component:&lt;/strong&gt;&lt;br&gt;
In our App component, we wrap Toolbar with ThemeContext.Provider, setting the value to 'dark'.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;ThemeContext.Provider value="dark"&amp;gt;
      &amp;lt;Toolbar /&amp;gt;
    &amp;lt;/ThemeContext.Provider&amp;gt;
  );
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Now, we can use this context in a deeply nested component:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Button component, which is nested inside Toolbar, can now access this theme value directly using ThemeContext.Consumer. We didn't need to pass the theme as a prop through the Toolbar to get it to Button.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Button() {
  return (
    &amp;lt;ThemeContext.Consumer&amp;gt;
      {theme =&amp;gt; &amp;lt;button className={theme}&amp;gt;I'm a {theme} theme button&amp;lt;/button&amp;gt;}
    &amp;lt;/ThemeContext.Consumer&amp;gt;
  );
}

function Toolbar() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;Button /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a simple example, but it demonstrates how Context can be used to avoid "prop drilling" (passing props through multiple levels) and make certain data available to many components at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's what you should know about Context API:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It lets you share data without passing it through every level of your app.&lt;/li&gt;
&lt;li&gt;Context API makes your code cleaner and easier to read.&lt;/li&gt;
&lt;li&gt;It's great for sharing information that many parts of your app need, like user details or app settings.&lt;/li&gt;
&lt;li&gt;You can use it to create variables that work everywhere in your app.&lt;/li&gt;
&lt;li&gt;It's especially helpful when you need to send data to parts of your app that are deeply nested.&lt;/li&gt;
&lt;li&gt;Context API is simpler to use compared to some other state management tools.&lt;/li&gt;
&lt;li&gt;It's good for managing state in big business apps.&lt;/li&gt;
&lt;li&gt;You can use it to share things like the current user, the app's theme, or language settings.
Overall, Context API is a user-friendly way to manage state in React Native, especially for larger apps.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Easy-peasy
&lt;/h2&gt;

&lt;p&gt;Easy-Peasy is a tool for managing state in React Native apps. Just like its name, It's designed to be simpler to use than other state management libraries. Believe me, you'll write less code with Easy-Peasy compared to other methods.&lt;/p&gt;

&lt;p&gt;Easy-Peasy works well with React hooks, which are a modern way to use state in React. It also supports Redux middleware, allowing for more advanced features, which helps developers to create and expand their app's data store. Under the hood, Easy-Peasy uses Redux to handle the state.&lt;/p&gt;

&lt;p&gt;I'll use the same theme example we discussed earlier for the Context API, but this time I'll explain how Easy-Peasy works here.&lt;/p&gt;

&lt;p&gt;First, let's set up our store with Easy-Peasy:&lt;/p&gt;

&lt;p&gt;We create a store with a theme state and a setTheme action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createStore, action } from 'easy-peasy';

const store = createStore({
  theme: 'light',
  setTheme: action((state, payload) =&amp;gt; {
    state.theme = payload;
  }),
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now, let's create our components:&lt;/strong&gt;&lt;br&gt;
The App component wraps everything in a StoreProvider, giving all &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;components access to the store.&lt;/li&gt;
&lt;li&gt;The Button component uses useStoreState to access the current theme directly.&lt;/li&gt;
&lt;li&gt;The Toolbar component also accesses the theme, and uses useStoreActions to get the setTheme function.&lt;/li&gt;
&lt;li&gt;We add a "Toggle Theme" button in the Toolbar that switches between light and dark themes.&lt;/li&gt;
&lt;li&gt;When you press the toggle button, it calls the setTheme action to update the state.&lt;/li&gt;
&lt;li&gt;All components using the theme automatically update when it changes.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import { View, Text, Button } from 'react-native';
import { StoreProvider, useStoreState, useStoreActions } from 'easy-peasy';

function Button() {
  const theme = useStoreState(state =&amp;gt; state.theme);
  return (
    &amp;lt;Button 
      title={`I'm a ${theme} theme button`}
      color={theme === 'light' ? 'black' : 'white'}
    /&amp;gt;
  );
}

function Toolbar() {
  const theme = useStoreState(state =&amp;gt; state.theme);
  const setTheme = useStoreActions(actions =&amp;gt; actions.setTheme);

  const toggleTheme = () =&amp;gt; {
    setTheme(theme === 'light' ? 'dark' : 'light');
  };

  return (
    &amp;lt;View&amp;gt;
      &amp;lt;Button /&amp;gt;
      &amp;lt;Button title="Toggle Theme" onPress={toggleTheme} /&amp;gt;
    &amp;lt;/View&amp;gt;
  );
}

function App() {
  return (
    &amp;lt;StoreProvider store={store}&amp;gt;
      &amp;lt;Toolbar /&amp;gt;
    &amp;lt;/StoreProvider&amp;gt;
  );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Compared to the Context, this is how Easy peasy differs:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We don't need to create separate Provider and Consumer components.&lt;/li&gt;
&lt;li&gt;State and actions are defined in one place (the store).&lt;/li&gt;
&lt;li&gt;Components can easily access and modify the state using hooks.&lt;/li&gt;
&lt;li&gt;We get built-in state management features like actions and computed properties.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Wrapping up, here’s what you should know about Easy Peasy&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Easy-Peasy makes managing states simple in React Native.&lt;/li&gt;
&lt;li&gt;It requires less code than other libraries.&lt;/li&gt;
&lt;li&gt;It combines different state management methods.&lt;/li&gt;
&lt;li&gt;Easy-Peasy works well with React Hooks and Redux.&lt;/li&gt;
&lt;li&gt;It's good for making your app's store better.&lt;/li&gt;
&lt;li&gt;It simplifies the state management process.&lt;/li&gt;
&lt;li&gt;Easy-Peasy is easy to understand and use&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Mobx
&lt;/h2&gt;

&lt;p&gt;MobX is a tool for managing state in applications. Its main goal is to keep your app's data consistent at all times. MobX works by automatically updating everything that depends on your app's state.&lt;/p&gt;

&lt;p&gt;When you change some data, MobX figures out what else needs to change as a result. It does this updating for you, so you don't have to write code to update every part manually. This means your app's state (data) and what's shown on screen stay in sync automatically.&lt;/p&gt;

&lt;p&gt;Now, let me explain Mobx with the same example, &lt;/p&gt;

&lt;p&gt;Here's how we might implement our theme switcher using MobX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import { View, Text, Button } from 'react-native';
import { makeAutoObservable } from 'mobx';
import { observer } from 'mobx-react-lite';

// Create a store
class ThemeStore {
  theme = 'light';

  constructor() {
    makeAutoObservable(this);
  }

  toggleTheme() {
    this.theme = this.theme === 'light' ? 'dark' : 'light';
  }
}

const themeStore = new ThemeStore();

// Create components
const ThemedButton = observer(() =&amp;gt; {
  return (
    &amp;lt;Button 
      title={`I'm a ${themeStore.theme} theme button`}
      color={themeStore.theme === 'light' ? 'black' : 'white'}
    /&amp;gt;
  );
});

const Toolbar = observer(() =&amp;gt; {
  return (
    &amp;lt;View&amp;gt;
      &amp;lt;ThemedButton /&amp;gt;
      &amp;lt;Button title="Toggle Theme" onPress={() =&amp;gt; themeStore.toggleTheme()} /&amp;gt;
    &amp;lt;/View&amp;gt;
  );
});

function App() {
  return &amp;lt;Toolbar /&amp;gt;;
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Here's how this MobX works in this example:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We create a ThemeStore class to manage our theme state.&lt;/li&gt;
&lt;li&gt;makeAutoObservable tells MobX to track all properties and methods in this class.&lt;/li&gt;
&lt;li&gt;The theme property holds our current theme state.&lt;/li&gt;
&lt;li&gt;toggleTheme is a method that switches the theme.&lt;/li&gt;
&lt;li&gt;We create a single instance of ThemeStore called themeStore.&lt;/li&gt;
&lt;li&gt;Components are wrapped with observer, which makes them react to changes in observed data.&lt;/li&gt;
&lt;li&gt;ThemedButton and Toolbar components directly use themeStore to access the current theme.&lt;/li&gt;
&lt;li&gt;When the "Toggle Theme" button is pressed, it calls themeStore.toggleTheme().&lt;/li&gt;
&lt;li&gt;MobX automatically updates all components that depend on the theme when it changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How does Mobx differ from the above explained tools?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;With MobX, we don't need to wrap our app in a provider component.&lt;/li&gt;
&lt;li&gt;State is encapsulated in a class, which can include both data and methods to modify that data.&lt;/li&gt;
&lt;li&gt;Components become reactive automatically when wrapped with an observer.&lt;/li&gt;
&lt;li&gt;MobX handles all the updates behind the scenes, so we don't need to manually trigger re-renders.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;In a nutshell, there are some of the key information you need to know about Mobx&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mobx uses simple code for state management.&lt;/li&gt;
&lt;li&gt;It's similar to regular JavaScript, so it's familiar.&lt;/li&gt;
&lt;li&gt;You don't need to learn a new system like with Redux.&lt;/li&gt;
&lt;li&gt;Mobx helps manage state across your whole app.&lt;/li&gt;
&lt;li&gt;It can update the state quietly when needed.&lt;/li&gt;
&lt;li&gt;Mobx is good for big, complex apps.&lt;/li&gt;
&lt;li&gt;It makes writing and testing code easier.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Recoil
&lt;/h2&gt;

&lt;p&gt;Recoil is a new tool for managing state in React apps, especially larger ones. It aims to solve problems that developers face when using React's built-in Context API. &lt;/p&gt;

&lt;p&gt;Recoil has two main parts: atoms and selectors. &lt;/p&gt;

&lt;p&gt;Atoms are the basic units of state in Recoil. They can be updated and the components can subscribe to atoms. When an atom changes, all components using it update automatically&lt;/p&gt;

&lt;p&gt;Selectors are nothing but the functions that can compute values. They can use atoms or other selectors as inputs. They recalculate when their inputs change and can subscribe to selectors too. When a selector changes, components using it update automatically. This can be effective immediately or after a brief delay.&lt;/p&gt;

&lt;p&gt;Now, let’s get into the example:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Imports:
&lt;/h3&gt;

&lt;p&gt;We import the necessary components from React Native and Recoil. RecoilRoot, atom, and useRecoilState are Recoil-specific imports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import { View, Text, Button } from 'react-native';
import { RecoilRoot, atom, useRecoilState } from 'recoil';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.Creating an atom:
&lt;/h3&gt;

&lt;p&gt;An atom is Recoil's unit of state. It's similar to a store in MobX. The key must be unique, and default sets the initial value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const themeState = atom({
  key: 'themeState',
  default: 'light',
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.ThemedButton component:
&lt;/h3&gt;

&lt;p&gt;This component uses useRecoilState to read the current theme. It only needs to read, so we destructure just the first element of the returned array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const ThemedButton = () =&amp;gt; {
  const [theme] = useRecoilState(themeState);
  // ...
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Toolbar component:
&lt;/h3&gt;

&lt;p&gt;This component uses useRecoilState to both read and write the theme state. The toggleTheme function uses a functional update to switch the theme based on its current value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Toolbar = () =&amp;gt; {
  const [theme, setTheme] = useRecoilState(themeState);

  const toggleTheme = () =&amp;gt; {
    setTheme(currentTheme =&amp;gt; currentTheme === 'light' ? 'dark' : 'light');
  };
  // ...
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.App component and RecoilRoot:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;RecoilRoot&amp;gt;
      &amp;lt;Toolbar /&amp;gt;
    &amp;lt;/RecoilRoot&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The RecoilRoot component must wrap any part of the app that uses Recoil state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now, how does Key differences from MobX:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Recoil, we define atomic units of state using atoms, whereas in MobX we create a class with observable properties.&lt;/li&gt;
&lt;li&gt;We use the setter function returned by useRecoilState to update state. In MobX, we define methods in the store to modify state.&lt;/li&gt;
&lt;li&gt;Recoil uses hooks like useRecoilState to connect components to state, while MobX uses the observer higher-order component.&lt;/li&gt;
&lt;li&gt;Recoil requires wrapping the app in a RecoilRoot, while MobX doesn't require this kind of setup.&lt;/li&gt;
&lt;li&gt;Both provide automatic updates when state changes, but they achieve this in different ways under the hood.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Now, there are other interesting things to know about Recoil. Here are some of the key info about this library.&lt;/strong&gt; &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Recoil uses a simple, hooks-based API for state management.&lt;/li&gt;
&lt;li&gt;It's designed specifically for React, aligning well with React's principles.&lt;/li&gt;
&lt;li&gt;Recoil introduces concepts like atoms and selectors, which are intuitive for React developers.&lt;/li&gt;
&lt;li&gt;It allows for efficient, granular updates to your app's state.&lt;/li&gt;
&lt;li&gt;Recoil handles asynchronous and derived state with ease.&lt;/li&gt;
&lt;li&gt;It's particularly good for apps with complex, interdependent states.&lt;/li&gt;
&lt;li&gt;Recoil supports code splitting and lazy loading of state, beneficial for large applications.&lt;/li&gt;
&lt;li&gt;It provides built-in dev tools for easier debugging and state visualization.&lt;/li&gt;
&lt;li&gt;Recoil makes it simple to share state across components without prop drilling.&lt;/li&gt;
&lt;li&gt;It integrates well with React Suspense for handling loading states.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  That’s a Wrap!
&lt;/h2&gt;

&lt;p&gt;And now we are here. That’s one deep round up about the state management libraries for React Native app development. Unlike other tech stacks, React Native is highly preferred for complex apps, just because its state management is so good. I hope this gives you a clear picture of the libraries and how exactly they work on your apps. &lt;/p&gt;

&lt;p&gt;Now, if you have any queries on this, do feel free to post them in the comments below. My team and I will be more than happy to help you out. Until I meet you with yet another interesting article, stay tuned to my blogs. &lt;/p&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>How to Build Chat App Like WhatsApp, Telegram &amp; Slack?</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Wed, 15 May 2024 07:36:57 +0000</pubDate>
      <link>https://dev.to/alexsam986/build-chat-apps-like-whatsapp-telegram-slack-2jn2</link>
      <guid>https://dev.to/alexsam986/build-chat-apps-like-whatsapp-telegram-slack-2jn2</guid>
      <description>&lt;p&gt;Let’s be honest: which is the first app that pops into your mind if I say, &lt;strong&gt;“Text me now?”&lt;/strong&gt; Will it be: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hey, what’s up on WhatsApp or&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are my bulk messages for you on Telegram or @me on Slack.&lt;/p&gt;

&lt;p&gt;Do you think it’s absolutely based on the app's convenient features and requirements? Welcome to our guide, where you can learn how to create an app like WhatsApp, Telegram, or Slack, but tailored to your specific needs!&lt;/p&gt;

&lt;p&gt;Since the above-mentioned messaging apps are playing a huge role (almost 3 billion people using) in communication, the quest to look for one feature in another is still undeniable.&lt;/p&gt;

&lt;p&gt;Of course, we all love the ease of WhatsApp, the file-sharing of Telegram, and the work-friendly features of Slack. But how about the one that combines all and creates based on your IDEA? &lt;br&gt;
Let’s get started with the guide to learn how to build the best chat app, like WhatsApp and the other two. &lt;/p&gt;

&lt;h2&gt;
  
  
  What are the Key Features to Build Chat Apps to Make that Sky High?
&lt;/h2&gt;

&lt;p&gt;In many ways, the success of the apps mentioned above is simple. Those are to support users' needs once and for all. &lt;/p&gt;

&lt;p&gt;We all know that chat apps like WhatsApp and Telegram have been around for a long time. Actually, we might not have noticed this in our Play Store in the early days. Some people actually barely noticed the Play Store!&lt;/p&gt;

&lt;p&gt;But the thing that you should know before you start to build a messaging app is consistent Updates. To keep the users hooked on the features. &lt;/p&gt;

&lt;p&gt;Even if it is for your business communication, you have to list the features of how you want to send and receive the messages. &lt;/p&gt;

&lt;p&gt;Here, we list down some of the essential features that are considered competitive and necessary before starting to build a chat app like Slack. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bt1pylim0oj78qgjqv0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bt1pylim0oj78qgjqv0.png" alt="Key Features to Make messaging App like WhatsApp, Telegram &amp;amp; Slack" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.Low Latency Messaging
&lt;/h3&gt;

&lt;p&gt;Low-latency messaging is the key for any chat app to build real-time conversations. Apps like WhatsApp provide low latency as one of their primary features to ensure stability and connection between their users. &lt;/p&gt;

&lt;p&gt;If your user faces any lag in their communication, they will quickly switch to the other. Considering the quality of chat app development, the platform and architecture can make all the difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.Authentication and Registration
&lt;/h3&gt;

&lt;p&gt;Registration and authentication is the first step of your app, where your user can register their account. &lt;/p&gt;

&lt;p&gt;Authentication using a mobile number, email address, or other social media account can help them register easily to experience the full potential of your app.&lt;/p&gt;

&lt;p&gt;Messaging apps like Telegram and WhatsApp use two-factor authentication to ensure their accounts are safe. These are the further steps of the process in registration and authentication; we covered that, too. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Type Indicators
&lt;/h3&gt;

&lt;p&gt;Well, apart from some anxiety and pressure while seeing the typing indicators in messaging apps like Slack and Telegram, it’s actually so influential.&lt;/p&gt;

&lt;p&gt;Since people are looking for quick turnaround replies, adding type indicators features makes them rich in expectations. At last, they should be there until they receive it (ultimately they won’t leave your chat app).&lt;/p&gt;

&lt;p&gt;The same applies to the business environment; the type indicators play a vital role in business communication.&lt;br&gt;
You know, mixing psychology with technology is the best way to pull users. &lt;/p&gt;

&lt;h3&gt;
  
  
  4.Read Receipts
&lt;/h3&gt;

&lt;p&gt;We felt so bad for knowing how much you love this guide on how to build a chat app like WhatsApp, Telegram, and Slack! &lt;/p&gt;

&lt;p&gt;But don’t leave room for this on your chat app. Let your users know the exact status of the messages to understand whether to follow up or wait for the response. &lt;/p&gt;

&lt;p&gt;Chat apps like WhatsApp, Telegram, and Slack have these three standard features: sent, received, and read, for users to know their exact stand. &lt;/p&gt;

&lt;h3&gt;
  
  
  5.File Sharing
&lt;/h3&gt;

&lt;p&gt;The chat is not only about words, emotions, and information. People nowadays use chat apps to share images, videos, documents, and more. &lt;/p&gt;

&lt;p&gt;Even if you’re looking to build a chat app for your organization, you must consider multimedia file-sharing features enabled. &lt;/p&gt;

&lt;p&gt;But the main challenge is storage. Multimedia file sharing requires more storage than text-based counterparts. Think wisely to ensure the latency, too. &lt;/p&gt;

&lt;h3&gt;
  
  
  5.Channels and Direct Messages
&lt;/h3&gt;

&lt;p&gt;“Someone added you into the chat,” “2 new messages from the boss”, “When can we plan for the trip, guys?!” So, which one will you open first? It might be the first because you want to know who added you to the chat. If that’s the case, your users will expect the same. &lt;/p&gt;

&lt;p&gt;Your goal should put your users in control and charge by giving them the tools to choose from the various channels easily. &lt;/p&gt;

&lt;h3&gt;
  
  
  6.Live Voice &amp;amp; Video Calls
&lt;/h3&gt;

&lt;p&gt;Another of the most demandable features of chat apps is voice and video calling. WhatsApp-like apps have a major user acquisition for their calls. &lt;/p&gt;

&lt;p&gt;According to Cooby, WhatsApp users spend almost 2 billion minutes each day on other forms of communication than chats.&lt;/p&gt;

&lt;p&gt;Here’s a motivation: If you think of building chat apps like WhatsApp, Telegram, and Slack in 2024, you’re more likely to join the club. &lt;/p&gt;

&lt;p&gt;Because the number of people using chat apps is huge, they’re waiting to experience whole new features like yours! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other Features of the Chat apps can Include&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emojis and reactions&lt;/li&gt;
&lt;li&gt;Contact management&lt;/li&gt;
&lt;li&gt;Push notifications&lt;/li&gt;
&lt;li&gt;Offline functionality.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technology Stacks to Build a Messaging App Like Discord &amp;amp; WhatsApp
&lt;/h2&gt;

&lt;p&gt;Next, let’s move on to the building blocks of codes and departed areas of platforms. Since we spoke a lot about the features of creating messaging apps like WhatsApp and Telegram, technology stacks are the coordinates that make a way. &lt;/p&gt;

&lt;h2&gt;
  
  
  There are Technological Stacks Available to Build a Chat App like Discord &amp;amp; Google
&lt;/h2&gt;

&lt;p&gt;As a developer or business owner, of course, you know that the options make the decision worse. That’s why we have come up with the best technology stacks to make your chat app even more functional than WhatsApp, Telegram, and Slack. &lt;/p&gt;

&lt;p&gt;The list of possible technology stacks to build a chat app with dynamic chat experience are:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5u2jmnsu1si2zgn9iwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5u2jmnsu1si2zgn9iwg.png" alt="technology stacks to build a messaging app like WhatsApp, Zoom, Discord" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Front-end technologies&lt;/li&gt;
&lt;li&gt;Back-end technologies&lt;/li&gt;
&lt;li&gt;Database technologies&lt;/li&gt;
&lt;li&gt;Cloud storage technologies&lt;/li&gt;
&lt;li&gt;Chat app protocols&lt;/li&gt;
&lt;li&gt;Messaging APIs&lt;/li&gt;
&lt;li&gt;Authentication and Authorization APIs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;1.&lt;strong&gt;Front End Technologies:&lt;/strong&gt; HTML, CSS, JavaScript, Reactive Native (cross platform development), Flutter, Swift, Kotlin.&lt;br&gt;
2.&lt;strong&gt;Back End Technologies:&lt;/strong&gt; Node.js, JavaScript, Ruby on Rails, Python&lt;br&gt;
3.&lt;strong&gt;Database Technologies:&lt;/strong&gt; MongoDB for storing applications’ data, scalable storage. MySQL, PostgreSQL.&lt;br&gt;
4.&lt;strong&gt;Cloud Storage Servers:&lt;/strong&gt; Google Cloud Storage, Amazon S3, Microsoft Azure for storing user generate data (images and videos)&lt;br&gt;
5.&lt;strong&gt;Messaging APIs:&lt;/strong&gt; MirrorFly, Firebase Cloud Messaging, Pusher&lt;br&gt;
6.&lt;strong&gt;Chat App Protocols:&lt;/strong&gt; XMPP, WebSocket, WebRTC, MQTT.&lt;br&gt;
7.&lt;strong&gt;Payment Gateways:&lt;/strong&gt; Paypal, Stripe, or Braintree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges that will shape or Break Your Chat app development
&lt;/h2&gt;

&lt;p&gt;You know what? Messaging apps like Telegram, WhatsApp, and Slack are so complex and simultaneously so simple. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;_Seems confused?! _&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s up to you. Chat app development includes numerous challenges that could change one’s perspective on the limits of software engineering. &lt;/p&gt;

&lt;p&gt;Here, we listed the challenges in chat app development like WhatsApp, which you can fix and eliminate before you start building to avoid unexpected roadblocks and extra spending. &lt;/p&gt;

&lt;p&gt;Moreover, the challenges might change based on your app’s current status, the number of users downloading and chatting, and the purpose your app is going to provide. &lt;/p&gt;

&lt;h3&gt;
  
  
  1.Reliable Connection
&lt;/h3&gt;

&lt;p&gt;When you’re planning to build a large-scale chat app, whether it’s for business or communication, the first thing you have to consider is a reliable connection. As we mentioned above, users won’t wait long to receive chats. &lt;/p&gt;

&lt;p&gt;Messaging chats like WhatsApp, Telegram, and Slack handle thousands of millions of connections per node. &lt;/p&gt;

&lt;p&gt;Furthermore, this isn’t easy to achieve because of the system limitations, latency, and network issues between server and client. &lt;/p&gt;

&lt;p&gt;When it comes to mobile devices, temporary connections happen. Network fluctuations will happen, and it’ll lead TCP to fall half open and end with the connection failure. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Fix or Handle:&lt;/strong&gt; Establishing a geolocations to connect with the nearest data center to avoid or minimize the latencies. &lt;/p&gt;

&lt;h3&gt;
  
  
  2. Message Fanout
&lt;/h3&gt;

&lt;p&gt;Next, it’ll start from the backend, which is the foremost thing to consider in chat app development, such as WhatsApp and others. The primary responsibility of the chat app backend is sending, presences, and notifications between sender and receiver. &lt;/p&gt;

&lt;p&gt;This could be one-on-one messages, group chats, or broadcasts. This also contains message status too. &lt;/p&gt;

&lt;p&gt;For instance, we can take one of the chat app giants; an app like WhatsApp, which handles 20 billion inbound messages and 40 billion outbound messages in a single day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Fix or Handle:&lt;/strong&gt; Choose cluster topology based on your needs! Full mesh doesn't scale well; use meta-clustering or brokers for large deployments.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Right Database
&lt;/h3&gt;

&lt;p&gt;Data storage. The major constraints and challenges in building chat apps like Slack. Large chat apps like WhatsApp handle billions of messages daily, and each of them is stored and replicated globally to offer the chat history if the user wants. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Fix or Handle:&lt;/strong&gt; When selecting a database, consider requirements like linear scalability, automatic failover, low maintenance and easy distribution around the cluster. &lt;/p&gt;

&lt;h2&gt;
  
  
  Steps to build messaging app like WhatsApp, Telegram, Slack
&lt;/h2&gt;

&lt;p&gt;All the blockhead features are to be determined, and the steps to eliminate the iterations are created as a draft in the chat. What next…Hit send to build a messaging app similar to WhatsApp. &lt;/p&gt;

&lt;h3&gt;
  
  
  1.Determine the scope of your chat app
&lt;/h3&gt;

&lt;p&gt;Begin your development process by determining your chat app’s scope in the first place. So, how do you find your scope? List the following things first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who are you building this app for?&lt;/li&gt;
&lt;li&gt;What problem will your app solve?&lt;/li&gt;
&lt;li&gt;If it’s for organization or business, determine the features&lt;/li&gt;
&lt;li&gt;What is the future growth of your app that you anticipate?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Try answering these questions to determine the scope of your chat app and build a similar app like Slack, Telegram, and WhatsApp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“No Audience, No Results”&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.Decide the platform to use
&lt;/h3&gt;

&lt;p&gt;Here we go again. Decide the platform based on your features to develop. Choose the platform that suits your actual needs. Consider the following questions to determine the platform to &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build your chat app:&lt;/li&gt;
&lt;li&gt;Complexity of feature&lt;/li&gt;
&lt;li&gt;Development cost and time&lt;/li&gt;
&lt;li&gt;Time to hit the market&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re not clear choosing the platform, you can consult any white label in-app chat solution to make it clear before creating a messaging app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Don’t build blind, dive in to solution”&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.Build User Interface
&lt;/h3&gt;

&lt;p&gt;The next step will be the visual appearance of your messaging app. Apps similar to WhatsApp strategically spend their time and investment to make their app’s visual interface look clean, clear, and easy to navigate. &lt;/p&gt;

&lt;p&gt;An easy user interface of the app can determine the user’s understanding of the chat application. So, what to consider first to build an intuitive user interface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Determine your chat app’s font, color&lt;/li&gt;
&lt;li&gt;Determine your message app’s visual design (Prototype or Wireframe)&lt;/li&gt;
&lt;li&gt;List the features to be fitted on the screen along with the navigation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;“UI design shapes how users interact with your app.”&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.Build Your Chat Application’s Backend
&lt;/h3&gt;

&lt;p&gt;The powerhouse of your messaging app, the backend. This step determines the features, functionality, and technical capabilities of your messaging apps. &lt;/p&gt;

&lt;p&gt;This covers sever side logics using programming languages and frameworks and creating database schema. The steps that need to be followed at this stage are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User research&lt;/li&gt;
&lt;li&gt;Information Architecture&lt;/li&gt;
&lt;li&gt;User flows&lt;/li&gt;
&lt;li&gt;User testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;“The invisible engine powering your chat app's features and functionality.”&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5.Integrate Third Party APIs
&lt;/h3&gt;

&lt;p&gt;Considering APIs for your chat app is another good option to make it more powerful and efficient. &lt;/p&gt;

&lt;p&gt;Integrating third-party APIs and SDKs can let you have control over in-app messaging with handy features that will benefit you and your user. Steps to consider in this stage include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Research and evaluate APIs&lt;/li&gt;
&lt;li&gt;Security and privacy &lt;/li&gt;
&lt;li&gt;API integration and development&lt;/li&gt;
&lt;li&gt;Cost and service of third party APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;“Super charge your chat app with features and efficiency.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;** 6.Test Your Chat App**&lt;br&gt;
For what exactly? Is the testing mandatory for the MVP version of your chat app?! You know what? If you plan to create a chat application in Android, you should consider the testing as it is. &lt;/p&gt;

&lt;p&gt;Before launching your app, thoroughly check your chat app’s functionality, as in the wireframe or your plan. Let’s look at the steps to ensure the perfect testing model for your chat app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Functionality testing&lt;/li&gt;
&lt;li&gt;Performance testing&lt;/li&gt;
&lt;li&gt;Usability testing&lt;/li&gt;
&lt;li&gt;Security testing&lt;/li&gt;
&lt;li&gt;Compatibility testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;“Test, test, Launch!”&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7.Launch Your Chat App
&lt;/h3&gt;

&lt;p&gt;The most anticipated step of this whole chat app development process is to LAUNCH. Launching the chatting app is just an easy process, and that’s it from your side; you’re done. Seriously?! Definitely not. &lt;/p&gt;

&lt;p&gt;Chat apps similar to WhatsApp and Slack have followed the strategy of regularly updating their features and functionality to stand out from the competition. The same followed for your messaging apps, which include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publish it on relevant app stores&lt;/li&gt;
&lt;li&gt;Promote with relevant marketing&lt;/li&gt;
&lt;li&gt;Monitor performance&lt;/li&gt;
&lt;li&gt;Monitor user feedback and review to improve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;“Launch is the start, not the finish. Enhance, promote, and iterate for chat app success.”&lt;/strong&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. What is database architecture?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09yajcyc85igje79ccyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09yajcyc85igje79ccyv.png" alt="database architecture to create a messaging like Whatsapp &amp;amp; Discord" width="" height=""&gt;&lt;/a&gt;&lt;br&gt;
To put it simply, database architecture manages all your chat app’s sending and receiving messages. The responsibility added with the manages and stores messages with the user authorization and authentication. This architecture is also responsible for distributing messages to the respective receivers. &lt;/p&gt;

&lt;h3&gt;
  
  
  2.Challenges in messaging app’s architecture backend
&lt;/h3&gt;

&lt;p&gt;Let’s consider a simple instance with simple context in a chat app like Telegram. Think that your customer base is using your messaging app as a starting point. So, here we go, the list of challenges that will shape your initial architecture at this stage. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The evolution of app (Future growth)&lt;/li&gt;
&lt;li&gt;Should able to handle 10k concurrent users&lt;/li&gt;
&lt;li&gt;Real-time communication with features&lt;/li&gt;
&lt;li&gt;Get it completely built in 3-6 months&lt;/li&gt;
&lt;li&gt;Chat room should built with enough size and capacity&lt;/li&gt;
&lt;li&gt;Scalable when load is suddenly increased&lt;/li&gt;
&lt;li&gt;Faster retrieval of message history&lt;/li&gt;
&lt;li&gt;Multimedia support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Database Architecture for chat app scalability and performance
&lt;/h2&gt;

&lt;p&gt;The common thing that databases often do is store, find, and retrieve messages for the user. When it comes to messaging apps like WhatsApp and Slack, the algorithms are super fast at retrieval. At the same time, the messaging app database has become huge in size and complexity. Create a scenario where finding, sorting, and updating information becomes difficult. &lt;/p&gt;

&lt;h3&gt;
  
  
  Engineering considerations to fix the quick blue ticks
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;If a user is able to locate the previous 50 messages on his app, they will have a good user experience.&lt;/li&gt;
&lt;li&gt;The user would like to send data to the server as quickly as possible. Nowadays, real-time conversation is standard!&lt;/li&gt;
&lt;li&gt;As putting this data on the same database would be disastrous for your app's performance and scalability, chat rooms would need their datastore.&lt;/li&gt;
&lt;li&gt;If your app had more than 100,000 users, you would post more than 100,000–200,000k messages every day.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Template-based chat architecture for chat app
&lt;/h3&gt;

&lt;p&gt;Chat apps built on custom SDKs are great examples of such architecture. Chat SDKs are a set of preconfigured rules for building your apps. &lt;/p&gt;

&lt;p&gt;You can consider Firebase to be a temple-based chat architecture where you have to work only on the front end. &lt;/p&gt;

&lt;p&gt;Some chat SDKs like MirrorFly come with custom predefined backend logic along with UI kits where you can just integrate the user interface. &lt;/p&gt;

&lt;h3&gt;
  
  
  Decentralized chat architecture for messaging app
&lt;/h3&gt;

&lt;p&gt;Let’s move on from centralized chat architecture to decentralized architecture. These architectures are mainly based on top blockchain ledger to support decentralized, secure chat services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Efficient Way to Build a Chat App like WhatsApp
&lt;/h2&gt;

&lt;p&gt;Hope our guide on building a chat app like WhatsApp helps you to gain knowledge about each step and essential features. &lt;/p&gt;

&lt;p&gt;The process of developing the chat app, as you expected, will take around 6 months to 1 year to ultimately land into the market. &lt;/p&gt;

&lt;p&gt;Here, we listed the tailor-made chat application-building methods to build your product efficiently. The chat SDK and API will revolutionize your messaging app development process by saving you time and money. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's find the best Chat API companies that will save you your efforts.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.MirrorFly
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.mirrorfly.com/self-hosted-chat-solution.php" rel="noopener noreferrer"&gt;MirrorFly&lt;/a&gt; offers a custom Chat SDK and API to build your OWN chat app. Our SDKs and database server convert all your challenges. With the plug-and-play UI kit, you can earn 100+ UI elements and 1000+ chat features. &lt;/p&gt;

&lt;h3&gt;
  
  
  2.Apphitect
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.apphitect.ae/instant-messaging-solution.php" rel="noopener noreferrer"&gt;Apphitect&lt;/a&gt; is another live safe that provides a multifaceted chat API and messaging SDK to support and build your messaging application. It comes with 500+ chat features, from personalization to functionality.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.enablex.io/" rel="noopener noreferrer"&gt;Enablex&lt;/a&gt; is an AI-based platform offering chat API and SDK to help you build your chat app. With Enablex.io, you can enable omnichannel conversations using communication APIs.&lt;/p&gt;

&lt;p&gt;Benefit from the above-mentioned bespoke solutions to build your chat app effortlessly and efficiently.&lt;/p&gt;

</description>
      <category>messaging</category>
      <category>tutorial</category>
      <category>web</category>
    </item>
    <item>
      <title>How to add Flutter In-app Chat to your app? (10 mins)</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Thu, 16 Nov 2023 12:54:20 +0000</pubDate>
      <link>https://dev.to/alexsam986/how-to-add-flutter-in-app-chat-to-your-app-10-mins-2mp4</link>
      <guid>https://dev.to/alexsam986/how-to-add-flutter-in-app-chat-to-your-app-10-mins-2mp4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffow40jhebj4cd8rgneni.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffow40jhebj4cd8rgneni.jpg" alt="Image description" width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
In this tutorial, you’ll learn how to add Fluttter in-app communication to your app in just 10 minutes. Let it be any size of app and deployed on any platform. You can easily add MirrorFly in-app chat, voice, and video SDKs by following the simple protocols in this tutorial.&lt;/p&gt;

&lt;p&gt;Flutter is the most popular cross-platform framework currently being used by more than `&lt;a href="https://www.statista.com/statistics/869224/worldwide-software-developer-working-hours/" rel="noopener noreferrer"&gt;46% of developers across the world&lt;/a&gt;. Make your Flutter app more engaging with in-app communication SDKs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s be clear about all the things covered in this blog
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Getting started with MirrorFly account&lt;/li&gt;
&lt;li&gt;Initializing and Installing the SDKs&lt;/li&gt;
&lt;li&gt;Integrating chat and call SDKs with your Flutter app&lt;/li&gt;
&lt;li&gt;Integrating additional features&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;Android Lolipop 5.0 (API level 21) or above&lt;/li&gt;
&lt;li&gt;Java 7  or higher&lt;/li&gt;
&lt;li&gt;Gradle 4.1.0 or higher&lt;/li&gt;
&lt;li&gt;iOS 12.1 or later&lt;/li&gt;
&lt;li&gt;Xcode 14.1 or later&lt;/li&gt;
&lt;li&gt;Swift 5.0 or later&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Integrate Chat SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initially, you need a MirrorFly account to start with the integration steps. Follow the below method&lt;br&gt;
&lt;strong&gt;Step 1:&lt;/strong&gt; Go to &lt;a href="https://console.mirrorfly.com/register" rel="noopener noreferrer"&gt;MirrorFly console page&lt;/a&gt; and create your account&lt;br&gt;
&lt;strong&gt;Step 2:&lt;/strong&gt; Complete the setup of your account&lt;br&gt;
&lt;strong&gt;Step 3:&lt;/strong&gt; Acquire MirrorFly license key from the overview page&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create Android Dependency&lt;/strong&gt;&lt;br&gt;
In your Android folder, add the following to your root &lt;strong&gt;build.gradle&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;allprojects {&lt;br&gt;
 repositories {&lt;br&gt;
     google()&lt;br&gt;
     mavenCentral()&lt;br&gt;
     jcenter()&lt;br&gt;
     maven {&lt;br&gt;
         url "https://repo.mirrorfly.com/snapshot/"&lt;br&gt;
     }&lt;br&gt;
 }&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Now add the following dependencies in the &lt;strong&gt;app/build.gradle&lt;/strong&gt; file&lt;br&gt;
&lt;code&gt;android {&lt;br&gt;
    packagingOptions {&lt;br&gt;
     exclude 'META-INF/AL2.0'&lt;br&gt;
     exclude 'META-INF/DEPENDENCIES'&lt;br&gt;
     exclude 'META-INF/LICENSE'&lt;br&gt;
     exclude 'META-INF/LICENSE.txt'&lt;br&gt;
     exclude 'META-INF/license.txt'&lt;br&gt;
     exclude 'META-INF/NOTICE'&lt;br&gt;
     exclude 'META-INF/NOTICE.txt'&lt;br&gt;
     exclude 'META-INF/notice.txt'&lt;br&gt;
     exclude 'META-INF/ASL2.0'&lt;br&gt;
     exclude 'META-INF/LGPL2.1'&lt;br&gt;
     exclude("META-INF/*.kotlin_module")&lt;br&gt;
   }&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Step 2: Create iOS Dependency&lt;/strong&gt;&lt;br&gt;
Add the following code in the end of your &lt;strong&gt;ios/podfile&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;post_install do |installer|&lt;br&gt;
  installer.pods_project.targets.each do |target|&lt;br&gt;
    flutter_additional_ios_build_settings(target)&lt;br&gt;
    target.build_configurations.each do |config|&lt;br&gt;
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.1'&lt;br&gt;
      config.build_settings['ENABLE_BITCODE'] = 'NO'&lt;br&gt;
      config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'No'&lt;br&gt;
      config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'&lt;br&gt;
      config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"&lt;br&gt;
     end&lt;br&gt;
  end&lt;br&gt;
end&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Now, enable all the below mentioned capabilities in your project.&lt;br&gt;
&lt;code&gt;Goto Project -&amp;gt; Target -&amp;gt; Signing &amp;amp; Capabilities -&amp;gt; Click + at the top left corner -&amp;gt; Search for the capabilities below&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Step 3: Create Flutter Dependency&lt;/strong&gt;&lt;br&gt;
In your pubspec.yaml, add the below dependencies&lt;br&gt;
&lt;code&gt;dependencies:&lt;br&gt;
  mirrorfly_plugin: ^0.0.12&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Now, run &lt;strong&gt;flutter pub get&lt;/strong&gt; command in your project library. You can also use all classes and methods with the following statement.&lt;br&gt;
&lt;code&gt;import 'package:mirrorfly_plugin/mirrorfly.dart';&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Step 4: Initialize MirrorFly Plugin&lt;/strong&gt;&lt;br&gt;
In order to initalize the plugin, place the below code in your &lt;strong&gt;main.dart&lt;/strong&gt; file - inside the main function - before &lt;strong&gt;runApp()&lt;/strong&gt;.&lt;br&gt;
&lt;code&gt;void main() {&lt;br&gt;
  WidgetsFlutterBinding.ensureInitialized();&lt;br&gt;
  Mirrorfly.init(&lt;br&gt;
      baseUrl: 'https://api-preprod-sandbox.mirrorfly.com/api/v1/',&lt;br&gt;
      licenseKey: 'Your_Mirrorfly_Licence_Key',&lt;br&gt;
      iOSContainerID: 'Your_iOS_app_Group_id');&lt;br&gt;
  runApp(const MyApp());&lt;br&gt;
 }&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Step 5: Register a User&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To register a user, follow the below method.&lt;br&gt;
&lt;code&gt;Mirrorfly.registerUser(userIdentifier).then((value) {&lt;br&gt;
  // you will get the user registration response&lt;br&gt;
  var userData = registerModelFromJson(value);&lt;br&gt;
}).catchError((error) {&lt;br&gt;
    // Register user failed print throwable to find the exception details.&lt;br&gt;
    debugPrint(error.message);&lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; During registration, the above registerUser method will accept the FCM_TOKEN as an optional parameter and pass it across. The connection will be established automatically upon completion of registration and is not required for separate logins.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Send a One-to-one Message&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Call the below method to to start sending message to another user&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: To generate unique user JID by &lt;strong&gt;username&lt;/strong&gt; call the below method&lt;br&gt;
&lt;code&gt;var userJid = await Mirrorfly.getJid(username);&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Mirrorfly.sendTextMessage(message, jid).then((value) {&lt;br&gt;
  // you will get the message sent success response&lt;br&gt;
  var chatMessage = sendMessageModelFromJson(value);&lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Receive a One-to-one Message&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the callbackListeners method to receive a message from another user. This function will be triggered every time a user receives a message.&lt;br&gt;
&lt;code&gt;Mirrorfly.onMessageReceived.listen(result){&lt;br&gt;
  // you will get the new messages&lt;br&gt;
  var chatMessage = sendMessageModelFromJson(result)&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Integrate Call SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To integrate call SDKs with your Flutter app, &lt;strong&gt;repeat the similar steps from Step 1 - Step 5&lt;/strong&gt; with a minor change in &lt;strong&gt;Step 2: Creating iOS Dependencies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating iOS Dependency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add the following code at the end of your ios/podfile&lt;br&gt;
&lt;code&gt;post_install do |installer|&lt;br&gt;
  installer.pods_project.targets.each do |target|&lt;br&gt;
    flutter_additional_ios_build_settings(target)&lt;br&gt;
    target.build_configurations.each do |config|&lt;br&gt;
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.1'&lt;br&gt;
      config.build_settings['ENABLE_BITCODE'] = 'NO'&lt;br&gt;
      config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'No'&lt;br&gt;
      config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'&lt;br&gt;
      config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"      &lt;br&gt;
     end&lt;br&gt;
  end&lt;br&gt;
end&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Now disable the bitcode for your project&lt;br&gt;
&lt;code&gt;Goto Project -&amp;gt; Build Settings -&amp;gt; Filter the term &lt;/code&gt;Bitcode&lt;code&gt; -&amp;gt; and select No from the dropdow&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Now, you can enable all the below mentioned capabilities in your project.&lt;br&gt;
&lt;code&gt;Goto Project -&amp;gt; Target -&amp;gt; Signing &amp;amp; Capabilities -&amp;gt; Click + at the top left corner -&amp;gt; Search for the capabilities below&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conditions and Notes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Note: From Android 12, ensure that android.permission.BLUETOOTH_CONNECT and android.permission  READ_PHONE_STATE runtime permissions are granted for your app for seamless audio routing and GSM call handling. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caution 1:&lt;/strong&gt; If the android.permission.BLUETOOTH_CONNECTpermission is not granted, call audio will not be routed to BT Headset even though it is connected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caution 2:&lt;/strong&gt; If the android.permission.  READ_PHONE_STATE permission is not granted; gsm call related functionalities will not work in SDK.&lt;/p&gt;

&lt;p&gt;Note: From Android 13, CallSDK needs the below permission to show ongoing call notifications.&lt;br&gt;
&lt;code&gt;Manifest.permission.POST_NOTIFICATIONS&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt; To make and receive a voice/video call, microphone and camera usage permissions were required. Make Sure those permissions are granted&lt;/p&gt;

&lt;p&gt;After initiating the previous steps as mentioned in Step 1 - Step 5 follow the below mentioned steps to make use of call SDKs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Make a Voice Call
&lt;/h3&gt;

&lt;p&gt;Run the below method to make a one-to-one voice call&lt;br&gt;
`Mirrorfly.makeVoiceCall(USER_JID).then((response) {&lt;br&gt;
    if (response) {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;}
}).catchError((e) {
  debugPrint("#Mirrorfly Call Exception $e");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;});&lt;br&gt;
`&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Receive a Call
&lt;/h3&gt;

&lt;p&gt;The Call SDK will take care of receiving and processing the received call payload and triggering the CallKit for iOS and Incoming Call Intent for Android if you are connected to the server in foreground state. &lt;/p&gt;

&lt;p&gt;Once the call is presented with the Accept/Reject Call buttons, we can either choose to attend or reject the call. If we attend the call, the below event listener onCallStatusUpdated will be triggered, and the status will be of the case Attended.&lt;br&gt;
&lt;code&gt;Mirrorfly.onCallStatusUpdated.listen((event) {&lt;br&gt;
  var statusUpdateReceived = jsonDecode(event);&lt;br&gt;
  var callMode = statusUpdateReceived["callMode"].toString();&lt;br&gt;
  var userJid = statusUpdateReceived["userJid"].toString();&lt;br&gt;
  var callType = statusUpdateReceived["callType"].toString();&lt;br&gt;
  var callStatus = statusUpdateReceived["callStatus"].toString();&lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Adding Features&lt;/strong&gt;&lt;br&gt;
Now let’s add few more features into our chat and call SDKs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Push Notifications&lt;/strong&gt;&lt;br&gt;
Lets add push notifications to flutter app using firebase integrations&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Integrate Firebase to the Application
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create project in the &lt;strong&gt;&lt;a href="https://console.firebase.google.com/u/0/?pli=1" rel="noopener noreferrer"&gt;Firebase console&lt;/a&gt;&lt;/strong&gt; using your app package name. Ex: com.testapp&lt;/li&gt;
&lt;li&gt;Download the automatically generated files &lt;strong&gt;google-service.json&lt;/strong&gt; and &lt;strong&gt;GoogleService-Info.plist&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Now add &lt;strong&gt;google-service.json&lt;/strong&gt; file to your &lt;strong&gt;android/app&lt;/strong&gt; folder&lt;/li&gt;
&lt;li&gt;Then add &lt;strong&gt;GoogleService-Info.plist&lt;/strong&gt; file to your &lt;strong&gt;iOS/Runner&lt;/strong&gt; folder&lt;/li&gt;
&lt;li&gt;Now add the firebase dependencies in the &lt;strong&gt;pubspec.yaml&lt;/strong&gt; file
&lt;code&gt;dependencies:
firebase_core: ^latest_version
firebase_messaging: ^latest_version
&lt;/code&gt;
6.Finally, run flutter pub get to install the dependencies&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Initialize Firebase in your App
&lt;/h3&gt;

&lt;p&gt;Initialize firebase in the main function of your main.dart file&lt;/p&gt;

&lt;p&gt;&lt;code&gt;void main() async {&lt;br&gt;
  WidgetsFlutterBinding.ensureInitialized();&lt;br&gt;
  await Firebase.initializeApp();&lt;br&gt;
  runApp(MyApp());&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Configure FCM in your app&lt;br&gt;
`void main() async {&lt;br&gt;
  WidgetsFlutterBinding.ensureInitialized();&lt;br&gt;
  await Firebase.initializeApp();&lt;/p&gt;

&lt;p&gt;//Configuring FCM to Handle Incoming Messages&lt;br&gt;
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);&lt;br&gt;
  runApp(MyApp());&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/pragma"&gt;@pragma&lt;/a&gt;('vm:entry-point')&lt;br&gt;
Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async {&lt;br&gt;
  // Handle background messages&lt;/p&gt;

&lt;p&gt;// If you're going to use other Firebase services in the background, such as Firestore,&lt;br&gt;
  // make sure you call &lt;code&gt;initializeApp&lt;/code&gt; before using other Firebase services.&lt;br&gt;
  await Firebase.initializeApp();&lt;br&gt;
  // We are checking the Platform Condition here, because we are handling the push notification in iOS via Notification Extension&lt;br&gt;
  if (Platform.isAndroid) {&lt;br&gt;
    //Handle the push notification as given below&lt;br&gt;
    onMessage(message);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Step 3: Handle Notifications
&lt;/h3&gt;

&lt;p&gt;When you get a Firebase push notification in your Firebase Messaging service, you can utilize this method to get the content of the message before creating and displaying it:&lt;/p&gt;

&lt;p&gt;`static void onMessage(RemoteMessage message) {&lt;br&gt;
  WidgetsFlutterBinding.ensureInitialized();&lt;/p&gt;

&lt;p&gt;await Mirrorfly.handleReceivedMessage(notificationData).then((value) async {&lt;br&gt;
    var data = chatMessageFromJson(value.toString());&lt;br&gt;
    if(data.messageId!=null) {&lt;br&gt;
      //Create and Display the Notification&lt;br&gt;
    }&lt;br&gt;
  });&lt;br&gt;
}&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Note: For push notifications in iOS, certain limitations exist when the app is in the terminated or background state. Therefore, we utilize the Notification Service Extension to handle these push notifications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 4: Additional Configuration for iOS
&lt;/h3&gt;

&lt;p&gt;To enable push notifications on iOS, a certain configuration is needed. To make sure that push notifications are received in the background and in the terminated state, this involves adding specific parameters and a notification extension.&lt;/p&gt;

&lt;p&gt;Note: Please upload your APNS and VoIP certificates to our &lt;a href="https://console.mirrorfly.com/" rel="noopener noreferrer"&gt;console&lt;/a&gt;. To learn more how to generate and upload APNS and VOIP certificates, &lt;a href="https://www.mirrorfly.com/docs/chat/ios/v3/create_notification" rel="noopener noreferrer"&gt;Click Here&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;To receive push notifications in the background or unused state, enable the below capabilities.&lt;/p&gt;

&lt;p&gt;Note: Add the “Push Notifications” capability to your project. This can be done via the "Capability" option on the "Signing &amp;amp; Capabilities" tab:&lt;/p&gt;

&lt;p&gt;Click on the “+ Capabilities” button&lt;br&gt;
Search “Push Notifications.”&lt;/p&gt;

&lt;p&gt;Note: The “Background modes” capability need to be enabled, along with both the “Background fetch” and “Remote notifications” sub-modes.&lt;/p&gt;

&lt;p&gt;Click on the “+Capabilities” button&lt;br&gt;
Search “Background Modes.”&lt;br&gt;
Now ensure that both “Background fetch” and “Remote notifications” sub-modes are enabled:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Add Group ID
&lt;/h3&gt;

&lt;p&gt;It is necessary to activate the app group container ID in order to receive messages in the background or when the app is ended.&lt;/p&gt;

&lt;p&gt;To access user settings and the database in the container, you must enable app grouping in order to access data between the app and the notification extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Notification Extension
&lt;/h3&gt;

&lt;p&gt;The SDK requires you to include the Notification Extension service in your project in order to receive push notifications in the background and in the Killed state.&lt;/p&gt;

&lt;p&gt;1.Open the iOS folder in Xcode to create the NotificationExtension Target.&lt;br&gt;
&lt;code&gt;In  Xcode -&amp;gt; File -&amp;gt; New -&amp;gt; Target -&amp;gt; ' NotificationServiceExtension' -&amp;gt; Next -&amp;gt; TargetName -&amp;gt; Activate Scheme&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2.Include the &lt;strong&gt;Mirrorfly Plugin&lt;/strong&gt; and &lt;strong&gt;Firebase Messaging&lt;/strong&gt; in the newly formed NotificationExtension target in the &lt;strong&gt;podfile&lt;/strong&gt;.&lt;br&gt;
&lt;code&gt;target 'NotificationExtension' do&lt;br&gt;
  use_frameworks!&lt;br&gt;
    pod 'Firebase/Messaging'&lt;br&gt;
    pod 'mirrorfly_plugin', :path =&amp;gt; '.symlinks/plugins/mirrorfly_plugin/ios'&lt;br&gt;
end&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
3.Do &lt;strong&gt;pod install&lt;/strong&gt; from &lt;strong&gt;Terminal&lt;/strong&gt; inside the &lt;strong&gt;iOS&lt;/strong&gt; folder.&lt;br&gt;
4.Open the &lt;strong&gt;Notification Extension&lt;/strong&gt; File and import the Mirrorfly Plugin.&lt;br&gt;
&lt;code&gt;import mirrorfly_plugin&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
5.Add the following code to the notification extension file's didReceive method: This code will handle the incoming push notifications.&lt;br&gt;
`override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -&amp;gt; Void) {&lt;br&gt;
        self.contentHandler = contentHandler&lt;br&gt;
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    MirrorFlyNotification().handleNotification(notificationRequest: request, contentHandler: contentHandler, containerID: APPGROUPS, licenseKey: LICENSEKEY)

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

&lt;/div&gt;

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

&lt;h3&gt;
  
  
  Step 8: Requesting Permission
&lt;/h3&gt;

&lt;p&gt;A straightforward API for seeking authorization through the requestPermission method is offered by the firebase_messaging package.&lt;/p&gt;

&lt;p&gt;`FirebaseMessaging messaging = FirebaseMessaging.instance;&lt;/p&gt;

&lt;p&gt;NotificationSettings settings = await messaging.requestPermission(&lt;br&gt;
  alert: true,&lt;br&gt;
  announcement: false,&lt;br&gt;
  badge: true,&lt;br&gt;
  carPlay: false,&lt;br&gt;
  criticalAlert: false,&lt;br&gt;
  provisional: true,&lt;br&gt;
  sound: true,&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;print('User granted permission: ${settings.authorizationStatus}');&lt;br&gt;
`&lt;/p&gt;

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

&lt;p&gt;Note: On Android, authorization status will return authorized if the user has not disabled notifications for the app via the operating system settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9: Add Runtime Permissions for Push Notifications
&lt;/h3&gt;

&lt;p&gt;Starting with Android 13 We require the following permissions in order to get notifications:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;uses-permission android:name="android.permission.POST_NOTIFICATIONS" /&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Get Last Seen Time of a User&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can use the technique below to find out the chat user's last seen time.&lt;br&gt;
&lt;code&gt;Mirrorfly.getUserLastSeenTime(jid).then((String? value) {        &lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Hide Last Seen Time of a User&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the following way to see if friends can view your last seen status.&lt;br&gt;
`Mirrorfly.isHideLastSeenEnabled().then((bool? value) {&lt;/p&gt;

&lt;p&gt;});&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get User/Group profile Details&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can use the technique below to obtain the chat user's profile information.&lt;br&gt;
&lt;code&gt;Mirrorfly.getProfileDetails(jid, fetchFromServer).then((value) {&lt;br&gt;
    var data = Profile.fromJson(json.decode(value.toString()));&lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Get Recent Chats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To retrieve a user's or group's most recent chat.&lt;br&gt;
&lt;code&gt;var value  = await Mirrorfly.getRecentChatOf(jid);&lt;br&gt;
var data = RecentChatData.fromJson(json.decode(value));&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Get Recent chat List&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the following procedure to obtain the most recent conversation list:&lt;br&gt;
&lt;code&gt;Mirrorfly.getRecentChatList().then((value) {&lt;br&gt;
  var data = recentChatFromJson(value);&lt;br&gt;
}).catchError((error) {&lt;br&gt;
  // Error handling&lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thank you for investing your time in implementing this tutorial. I hope this tutorial helped you add Flutter in-app communication with &lt;a href="https://www.mirrorfly.com/flutter-chat-sdk.php" rel="noopener noreferrer"&gt;MirrorFly SDKs&lt;/a&gt; to your app.&lt;/p&gt;

&lt;p&gt;If you still have any queries, you can get in touch with our tech support team for immediate solutions, or in order to add more chat and call features, you can have a look at our &lt;a href="https://www.mirrorfly.com/docs/chat/flutter-plugin/feature-common/" rel="noopener noreferrer"&gt;documentation page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also find &lt;a href="https://www.mirrorfly.com/docs/uikit/flutter/quick-start/" rel="noopener noreferrer"&gt;Flutter UIKit&lt;/a&gt; to plug and-play chat features in your app on any platform. Good luck with your search. See you soon. Bye.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Secure Instant Messaging Platform - The Importance of Security Algorithm in Chat Apps</title>
      <dc:creator>Alexander Samuel</dc:creator>
      <pubDate>Tue, 18 Feb 2020 14:13:04 +0000</pubDate>
      <link>https://dev.to/alexsam986/secure-instant-messaging-platform-the-importance-of-security-algorithm-in-chat-apps-53ip</link>
      <guid>https://dev.to/alexsam986/secure-instant-messaging-platform-the-importance-of-security-algorithm-in-chat-apps-53ip</guid>
      <description>&lt;p&gt;wUwDPglyJu9LOnkBAf4vxSpQgQZltcz7LWwEquhdm5kSQIkQlZtfxtSTsmawq6gVH8SimlC3W6TDOhhL2FdgvdIC7sDv7G1Z7pCNzFLp0lgB9ACm8r5RZOBiN5ske9cBVjlVfgmQ9VpFzSwzLLODhU7/2THg2iDrW3NGQZfz3SSWviwCe7GmNIvp5jEkGPCGcla4Fgdp/xuyewPk6NDlBewftLtHJVf=PAb3&lt;/p&gt;

&lt;p&gt;Wondering what these jumbled messes of characters mean?&lt;/p&gt;

&lt;p&gt;These are the encrypted messages of a normal message sent by a user in private or group chat. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Hey guys, how many are up to chill out this weekend with Vodka and hot dogs?&lt;/b&gt; &lt;/p&gt;

&lt;p&gt;Once you hit the send button, the messages reach the server and encrypted which becomes a bundle of jumbled characters. &lt;/p&gt;

&lt;p&gt;The encrypted jumbled characters are impossible to decrypt without knowing the passcode. &lt;/p&gt;

&lt;h1&gt;
  
  
  Encryption in Today’s Messaging Platform as an Afterthought
&lt;/h1&gt;

&lt;p&gt;While most of the conversation in businesses and internal organization is carried over instant messaging platforms, securing the interaction is the major priority for businesses and companies to stay away from losing millions of dollars every year. &lt;/p&gt;

&lt;p&gt;Since the increase in security breaches of some global messaging platforms like WhatsApp and Messenger, the need for encryption algorithms is a must for most messaging applications. &lt;/p&gt;

&lt;h2&gt;
  
  
  Encryption of Text Messages in Messaging Platforms May Be Common, But You’ll Have To Know More Than That;
&lt;/h2&gt;

&lt;p&gt;While it’s easy to encrypt text messages, it's a whole different story when it comes to files, videos, images, video/audio calls. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Note: Reading text in video format results in reading thousands of words for just in 1 MB video.&lt;/b&gt;   &lt;/p&gt;

&lt;p&gt;To make sure all your chat, media files, calls and data transmitted over the servers are secure, end-to-end encryption is one of the reliable security technologies followed in most of the instant messaging applications. &lt;/p&gt;

&lt;p&gt;There are several encryption technologies available in the market based on the form of the communication mediums. Before walking you through the different forms of encryption methods, let’s discuss encryption in messaging platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  End-to-end Encryption - What It Is All About and How It Works?
&lt;/h2&gt;

&lt;p&gt;End-to-end encryption is an interesting piece of technology that simply works by scrambling the data communicated to prevent third-party or hackers from accessing the data while it is transmitted from one point to another point (device). &lt;/p&gt;

&lt;p&gt;The entire data (messages) is encrypted on the sender’s device and the recipient is only able to decrypt it. The prime hallmark of this encryption is nobody in the middle (the application provider, Internet service provider or hacker) can decrypt it.  The entire key exchange is explained below. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq6u5n0v6w6ybf4emf9yc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq6u5n0v6w6ybf4emf9yc.png" alt="End to end encryption for instant messaging" width="800" height="1000"&gt;&lt;/a&gt;&lt;br&gt;
Here, the cryptographic keys are used to encrypt and decrypt the messages stored in both the endpoints. In this scenario, Key exchange is considered as unbreakable technology using different algorithms. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftsh87d6enzvigf8a5h15.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftsh87d6enzvigf8a5h15.jpg" alt="secure Enterprise chat applications" width="800" height="550"&gt;&lt;/a&gt;&lt;br&gt;
The End-to-end encryption technology is widely implemented in Enterprise chat applications providers in the market like &lt;a href="https://www.mirrorfly.com/chat-security.php" rel="noopener noreferrer"&gt;MirrorFly&lt;/a&gt;, which is considered as one of the finest security technology to secure every message, image, calls carried over the messaging applications.  &lt;/p&gt;

&lt;p&gt;There are several encryption algorithms used in messaging applications to protect the data transmission between two endpoints. &lt;/p&gt;

&lt;h3&gt;
  
  
  Different Encryption Algorithms in Messaging Platforms
&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;1. Triple DES&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;The purpose of triple-DES was designed to replace the original Data Encryption Standard (DES) algorithm which was easily defeated by hackers. It uses three individual keys with 56 bits each. The total key length adds up to 168 bits, but the experts say that 112-bits in key strength is enough. This encryption is widely used in financial and other industries. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;2. RSA&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;It's a public key-encryption algorithm for messages sent over the internet. The RSA algorithm is considered as an asymmetric algorithm because it uses a pair of keys to encrypt and decrypt. You have your public key, which is used to encrypt the message and a private key to decrypt from another endpoint of the device.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpgw1rst1fkxkh3viu8l8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpgw1rst1fkxkh3viu8l8.png" alt="key-encryption of Instant messaging platform" width="800" height="251"&gt;&lt;/a&gt;&lt;br&gt;
The RSA acts as a mumbo jumbo where the attackers and hackers find it quite it solid to break and time-consuming. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;3. Twofish&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;It’s found that one of the fastest of its kind where the keys used in this algorithm is up to 256 bits of length and as a symmetric technique, In this algorithm, only one key is needed. Twofish is an open-source algorithm available in the market for any software applications. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;4. AES 512 Encryption&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;It’s the successor of the encryption keys 256, 128 and 182 bits. The Advanced Encryption Standard is the algorithm trusted by the U.S Government and other top organizations. It uses numerous keys and the 512-bits key is considered impervious to all attackers.&lt;/p&gt;

&lt;h3&gt;
  
  
  End-to-end Encryption: The Heart of Security for Messaging Platforms
&lt;/h3&gt;

&lt;p&gt;While the end-to-end encryption settles as the heart of the messaging app data security and enables users to feel secure while exchanging their thoughts, it’s not 100% secure to encrypt and decrypt messages until a backdoor is being discovered by the attackers or hackers. &lt;/p&gt;

&lt;p&gt;As the businesses have more chances of getting attacked by hackers, most of the businesses dependent on communication platforms prefer enterprise instant messaging solution providers who offer end-to-end security as the default privacy method to protect the messages relayed. &lt;/p&gt;

</description>
      <category>security</category>
      <category>chatapp</category>
      <category>instantmessaging</category>
      <category>messaging</category>
    </item>
  </channel>
</rss>
