<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Muhammad Arbaz</title>
    <description>The latest articles on Forem by Muhammad Arbaz (@muhammad_arbaz_9c42c67aef).</description>
    <link>https://forem.com/muhammad_arbaz_9c42c67aef</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%2F3644941%2F4b6c6c7d-4ce6-4b30-9dda-c65ea90b7753.jpg</url>
      <title>Forem: Muhammad Arbaz</title>
      <link>https://forem.com/muhammad_arbaz_9c42c67aef</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/muhammad_arbaz_9c42c67aef"/>
    <language>en</language>
    <item>
      <title>Stop Uploading Your Sensitive PDFs to Random Servers: I Built 80+ Client-Side Tools (PDF, Image, Dev) with 0% Server Uploads</title>
      <dc:creator>Muhammad Arbaz</dc:creator>
      <pubDate>Sat, 04 Apr 2026 06:30:42 +0000</pubDate>
      <link>https://forem.com/muhammad_arbaz_9c42c67aef/stop-uploading-your-sensitive-pdfs-to-random-servers-i-built-80-client-side-tools-pdf-image-1798</link>
      <guid>https://forem.com/muhammad_arbaz_9c42c67aef/stop-uploading-your-sensitive-pdfs-to-random-servers-i-built-80-client-side-tools-pdf-image-1798</guid>
      <description>&lt;p&gt;The Issue: Many online converters (such as PDF, Image, JSON) save your data on their servers. Even if they claim to "delete" it, there is always a risk of data breaches.&lt;/p&gt;

&lt;p&gt;The Solution: I developed any2convert.com, a completely private toolset that ensures nothing leaves your device.&lt;/p&gt;

&lt;p&gt;What Sets It Apart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Server Uploads: All processing is done in your browser using WebAssembly and JavaScript.&lt;/li&gt;
&lt;li&gt;80+ Tools Available: Convert PDF to Word, compress images, convert JSON to CSV, decode JWT, and more.&lt;/li&gt;
&lt;li&gt;Fast &amp;amp; Free: No need for accounts, no watermarks, and instant processing on your device.&lt;/li&gt;
&lt;li&gt;Technology Stack: Designed with a focus on client-side performance to keep your data 100% private.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I invite the community to experience the speed and privacy benefits.&lt;/p&gt;

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

</description>
      <category>javascript</category>
      <category>privacy</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Build Video Call in Flutter with ZEGOCLOUD UIKits</title>
      <dc:creator>Muhammad Arbaz</dc:creator>
      <pubDate>Wed, 10 Dec 2025 17:53:31 +0000</pubDate>
      <link>https://forem.com/muhammad_arbaz_9c42c67aef/video-calling-ui-kits-in-flutter-by-zego-cloud-44gn</link>
      <guid>https://forem.com/muhammad_arbaz_9c42c67aef/video-calling-ui-kits-in-flutter-by-zego-cloud-44gn</guid>
      <description>&lt;p&gt;&lt;strong&gt;ZEGOCLOUD&lt;/strong&gt;&lt;br&gt;
First of all, a big thanks to the Flutter community and the ZEGOCLOUD team for making real-time communication so easy for developers. Building video calling features used to be complex, but with tools like ZEGOCLOUD UI Kits, it has become surprisingly simple and developer-friendly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is ZEGOCLOUD&lt;/strong&gt;&lt;br&gt;
ZEGOCLOUD is a real-time communication (RTC) platform that helps developers easily add features like video calling, audio calling, live streaming, and in-app chat into their applications. Instead of building complex communication systems from scratch, ZEGOCLOUD provides ready-made SDKs and UI Kits that work on multiple platforms, including Flutter, Android, iOS, and Web. It handles all the heavy tasks such as media streaming, signaling, and call management, allowing developers to focus on building their app’s core features. With flexible pricing and a free testing tier, ZEGOCLOUD is a practical and developer-friendly solution for real-time communication needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHY I CHOOSE FLUTTER&lt;/strong&gt;&lt;br&gt;
I chose Flutter because it allows me to build high-quality, cross-platform applications using a single codebase. Instead of maintaining separate apps for Android, iOS, web, or desktop, Flutter lets me develop everything from one codebase, which saves time and reduces complexity. It offers excellent performance, a fast development cycle with hot reload, and a rich set of customizable UI widgets that help create smooth and modern user experiences. Flutter also has a strong community and growing ecosystem, making it easier to find support, packages, and best practices while building scalable applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI KITS&lt;/strong&gt;&lt;br&gt;
A UI Kit is a set of ready-made user interface components that developers can easily plug into their apps. It helps save development time by providing prebuilt screens and UI elements, allowing complex features to be added quickly without building everything from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Configuration&lt;/strong&gt;&lt;br&gt;
1:Integrating SDK&lt;br&gt;
First you have to download the package of  zego uikit prebuilt call&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%2Fnoe91x8ekkncqjyeu284.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%2Fnoe91x8ekkncqjyeu284.png" alt=" " width="800" height="61"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your project is built using Flutter 2.x.x, you need to update the Android SDK configuration. Open the your_project/android/app/build.gradle file and set the compileSdkVersion to 33 to ensure compatibility with the latest Android features and ZEGOCLOUD SDK requirements.&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%2Fs21rlt2yppp38bzpfw59.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%2Fs21rlt2yppp38bzpfw59.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and in the same file build.gradle located in your_app_name/android/build.gradle you have to change min sdk version to 21&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%2Fkh9j0xtugaku8w2ltuow.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%2Fkh9j0xtugaku8w2ltuow.png" alt=" " width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To allow video calling features like camera and microphone access, open the file your_project/android/app/src/main/AndroidManifest.xml. Add the required permissions to ensure the app can access the internet, camera, and audio during a call.&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%2Fo2sh27ng3xubaad7daph.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%2Fo2sh27ng3xubaad7daph.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that , Inside your project folder, go to your_project/android/app and create a file named proguard-rules.pro.&lt;/p&gt;

&lt;p&gt;Add this line to that file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-keep class **.zego.** { *; }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures all Zego classes are kept intact during code shrinking/obfuscation.&lt;/p&gt;

&lt;p&gt;Next, open your_project/android/app/build.gradle and in the release section, make sure the ProGuard configuration includes your new rules file like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now lets come to our main code &lt;/p&gt;

&lt;p&gt;The Home Screen has two fields: Call ID and Username. When the user taps the login button, they are taken to the Video Call screen to start a call with another person. The User ID is automatically generated&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Home Screen *&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:video_app/call_page.dart';
import 'dart:math';
import 'package:permission_handler/permission_handler.dart'; 

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State&amp;lt;HomeScreen&amp;gt; createState() =&amp;gt; _HomeScreenState();
}

class _HomeScreenState extends State&amp;lt;HomeScreen&amp;gt; {
  // Controllers
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _callIDController = TextEditingController();

  @override
  void dispose() {
    _nameController.dispose();
    _callIDController.dispose();
    super.dispose();
  }

  Future&amp;lt;bool&amp;gt; requestPermissions() async {
    Map&amp;lt;Permission, PermissionStatus&amp;gt; statuses = await [
      Permission.camera,
      Permission.microphone,
    ].request();

    bool cameraGranted = statuses[Permission.camera] == PermissionStatus.granted;
    bool micGranted = statuses[Permission.microphone] == PermissionStatus.granted;

    return cameraGranted &amp;amp;&amp;amp; micGranted;
  }

  void _joinCall() async {
    // 1. Permissions Request
    if (!await requestPermissions()) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(
            content: Text(
                "Camera and Microphone permission required for video call.")),
      );
      return;
    }


    String userName = _nameController.text.trim();
    String callID = _callIDController.text.trim();



    if (userName.isEmpty) {
      userName = "GuestUser";
    }

    if (callID.isEmpty) {
      callID = "call_${Random().nextInt(100000)}";
    }

    String userID = "user_${Random().nextInt(10000)}";


    // Navigate
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (_) =&amp;gt; CallPage(
          callID: callID,
          userID: userID, // Randomly generated unique userID
          userName: userName,
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Zego Video Call Home")),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: _nameController,
              decoration: const InputDecoration(
                labelText: "Your Name",
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 20),

            TextField(
              controller: _callIDController,
              decoration: const InputDecoration(
                labelText: "Call ID ",
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 30),

            // Button
            ElevatedButton(
              onPressed: _joinCall,
              child: const Text("Start Call"),
            )
          ],
        ),
      ),
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CallPage method uses ZEGOCLOUD UIKit for video calling and requires the following parameters: AppId, AppSign, CallId, UserId, and UserName.&lt;/p&gt;

&lt;p&gt;AppId: Obtain this from your app’s dashboard.&lt;/p&gt;

&lt;p&gt;AppSign: This key is also available on the dashboard for the same app. Ensure that AppId and AppSign belong to the same project.&lt;/p&gt;

&lt;p&gt;CallId: A unique numeric ID that acts like a room identifier. Other users can join the call if they know this CallId.&lt;/p&gt;

&lt;p&gt;The CallPage method is triggered from the Home Screen when the user enters a CallId and click join.&lt;/p&gt;

&lt;p&gt;If the CallId is already associated with an existing channel/room, the user will automatically join that ongoing video call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import 'package:flutter/material.dart';
import 'package:zego_uikit_prebuilt_call/zego_uikit_prebuilt_call.dart';

class CallPage extends StatelessWidget {
  final String callID;
  final String userID;
  final String userName;

  const CallPage({
    Key? key,
    required this.callID,
    required this.userID,
    required this.userName,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ZegoUIKitPrebuiltCall(
      appID: **********, // Fill in the appID that you get from ZEGOCLOUD Admin Console.
      appSign: "*********************************", // Fill in the appSign that you get from ZEGOCLOUD Admin Console.
      userID: userID, 
      userName: userName, 
      callID: callID,

      config: ZegoUIKitPrebuiltCallConfig.oneOnOneVideoCall()
        ..turnOnCameraWhenJoining = true
        ..turnOnMicrophoneWhenJoining = true
        ..useFrontCameraWhenJoining = true
        ..useSpeakerWhenJoining = true,   
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HOME SCREEN&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%2Fev9j1dfm7cfz17no1icz.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%2Fev9j1dfm7cfz17no1icz.jpg" alt=" " width="540" height="1118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VIDEO CALL &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%2Fwwo2qf5uu06v50cdyt83.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%2Fwwo2qf5uu06v50cdyt83.jpg" alt=" " width="540" height="1135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This includes all the code provided so far, but make sure to explore additional SDKs and services offered by ZEGOCLOUD to unlock more features. You can find detailed information and documentation on their official website&lt;br&gt;
to help you get started and extend your app’s capabilities.&lt;/p&gt;

&lt;p&gt;zego cloud flutter ui kit tutorial:&lt;br&gt;
&lt;a href="https://www.zegocloud.com/docs/uikit/callkit-flutter/quick-start" rel="noopener noreferrer"&gt;ZegoCloud UI Kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;zego cloud website:&lt;br&gt;
&lt;a href="https://www.zegocloud.com/" rel="noopener noreferrer"&gt;ZegoCloud website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;call page image:&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%2F8e1tq4iqb2agmzfi5d92.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%2F8e1tq4iqb2agmzfi5d92.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>zegocloud</category>
      <category>app</category>
      <category>development</category>
      <category>videocalling</category>
    </item>
  </channel>
</rss>
