Discord is an industry-leading chat application that’s all about helping community join together via open dialogue, whether that be through its instant messaging, live streaming, or video chat capabilities. (With hundreds of millions of monthly users, Discord is anything but a redux of AIM or Skype.) While you might not react with much surprise to learn it’s a platform used mostly by gamers, don’t worry‌ — ‌you can video chat with people all over the world regardless of whether you’ve ever adventured in Minecraft. Meeting new people on your iOS or Android device so you can start building friendships on Discord is as easy as “add friend.”

Learn how to build a community chat app with Bubble's visual web editor. In this post, we’ll walk you through the step-by-step process of building a Discord clone with Bubble. Whether you’re looking to build a chat app or you’re just interested in utilizing some of Discord’s core features, this guide will show you how to start building the underlying workflows for the Discord clone you want to create regardless of your web development experience.

The steps to building a Discord clone with no-code include:

Get Started

Ready to build your Discord clone with this tutorial? Before you start, you’ll need to first create a free Bubble account. Click the button below to get started, then you can follow along as we build our product together.

If you’re new to Bubble, follow along on our introductory videos to get familiar with the basics. This will help you get a running start when building a Discord clone with all the functionality of the original.

When kickstarting your project, you can choose to begin by wireframing your product design, or building the necessary fields within your database. In this case, we’ll start by using Bubble’s visual design tool to shape the user interface of our platform.

We'll build a chat function for our Discord clone app's users.

If you’re replicating a version of Discord, you’ll need to build the following pages:

  • A home page (“home”) – the first page the user will see after logging in, with a friends list and a friend chat window.
  • A profile settings page (“profile”) – to update the user’s profile information.
  • A server page (“server”) – to display channels, navigate between each of them, with a chat window to type.
  • A server settings page (“server_settings”) – to update the information of servers you own.
  • A new server page (“new”) – to create a brand new server.
  • A discover page (“discover”) – to explore and join public servers.

Once you create these pages, your page dropdown should look like this:

Setting up pages for a Discord-like MVP

A major feature within Bubble is the ability to send data between pages. This allows you to create one generic version of a page, then dynamically display the relevant content from your database when it’s required.

In the case of your Discord clone, you’ll only need to create one page for each activity. Then we’ll add unique conditions to display only the relevant content for each of them when it’s needed (we’ll cover this in more detail soon).

Configure your database

Once you’ve wireframed these pages, you can focus on creating the necessary data types and fields to power your application. We’ll rely on these data types to connect the workflows behind your product.

Bubble’s pre-built database makes it easy to create different data types with unique fields. When building Discord as an MVP, we’ll need to create the following data types and fields.

Data type: User

Fields:

  • nickname (type: text)
  • picture (type: image)
  • friends list (type: User. Tick “this field is a list.” Doing so will allow you to add multiple users to this field.)
  • servers joined (type: Server. Tick “this field is a list.” Doing so will allow you to add multiple servers to this field.)
  • servers owned (type: Server. Tick “this field is a list.” Doing so will allow you to add multiple servers to this field.)
Creating the user data type for our Discord clone
Creating the user data type for our Discord clone

Data type: Channel Message

Fields:

  • content (type: text)
  • channel (type: Channel)
Creating the channel message data type for our Discord clone
Creating the channel message data type for our Discord clone

Data type: Direct Message

Fields:

  • content (type: text)
  • friends (type: User. Tick “this field is a list.” Doing so will allow you to add multiple users to this field.)
Creating the direct message data type for our Discord clone
Creating the direct message data type for our Discord clone

Data type: Server

Fields:

  • name (type: text)
  • description (type: text)
  • picture (type: image)
  • banner (type: image)
  • private (type: yes/no)
  • owner (type: User)
  • members (type: User. Tick “this field is a list.” Doing so will allow you to add multiple users to this field.)
  • channels (type: Channel. Tick “this field is a list.” Doing so will allow you to add multiple channels to this field.)
Creating the server data type for our Discord clone
Creating the server data type for our Discord clone

Data type: Channel

  • name (type: text)
  • messages (type: Channel Message. Tick “this field is a list.” Doing so will allow you to add multiple channel messages to this field.)
  • server (type: Server)
Creating the channel data type for our Discord clone
Creating the channel data type for our Discord clone

Prepare your pages

Now that we have all the data types and all the pages we’ll need, we can prepare some pages to hold certain types of data. This will make the process of sending information from page to page much easier once we start building workflows.

Navigate to your “server” page.

Preparing the server page for our Discord clone

Right-click the page background and select “Edit.”

Preparing the server page for our Discord-like MVP

Then, click on the dropdown “Type of content” and choose “Server.”

Preparing the server page for our no-code Discord-like MVP

Repeat the same steps for the “server_settings” page. Edit the “server_settings” page to also have “Server” as the content type.

Now that you’ve structured both the design and database of your application, it’s time to start stitching everything together, making your app functional.

In Bubble, the main way to create functionality in your app is with workflows. Each workflow happens when an event occurs (e.g. a user clicks on a button), and then runs a series of “actions” in response (e.g. “sign the user up,” “make a change to the database,” etc.)

Create a top-level menu

For this Discord clone, we’re going to create a menu to let the user move between each page within our app. The menu needs to be visible at least on the following pages:

  • home
  • server
  • discover

Navigate to the home page, create a new group and add the following buttons to it:

  • a home button,
  • an add new server button,
  • a discover button,
  • a profile settings button,
  • and a repeating group to display shortcut links to the servers the current user has joined so far, so they can navigate to that server easily.

Bubble’s repeating group feature allows you to create dynamic displays of user data. In this tutorial, we are using to display servers the user has joined.

Here’s an example design:

Menu pages for our Discord-like MVP

Let’s set the workflows to make this menu functional, starting with the “Home” button. Follow these steps:

1) Right-click the button element and select “Start/Edit workflow.”

Preparing the menu for our Discord clone

2) Now that we’re on the workflow tab, click to add a new action. In “Navigation,” select “Go to page.”

Preparing the menu for our Discord clone

3) For the Home button, choose “home” as the destination.

Preparing the menu for our Discord clone

Repeat the process for the “add new server” button:

  1. Right click and select Start/Edit Workflow
  2. Select “Click here to add a new action”; in Navigation, add “go to page,”
  3. but this time, select the destination as the “new” page.
Preparing the menu for our Discord clone

Repeat steps 1–3 to do the same for the “discover” button, with the final destination as the “discover” page.

Preparing the menu for our Discord clone

The “profile settings” button workflow (repeat steps 1–3) should take the user to the “profile” page.

Preparing the menu for our Discord clone

Finally, for the repeating group of the user’s servers, change the type of content to “Server” and the data source to “Current User’s servers joined.”

Preparing the list of a user's servers for our Discord clone

Add an image to the first row in the repeating group, and set it to display the “Current cell’s Server’s picture.”

Setting up the servers for our Discord clone

Now, let’s start a workflow when the user clicks the server image. We want to send the user to the appropriate server page. Fill the “Data to send” field with the “Current cell’s Server.”

Setting up the servers for our Discord clone

Once you’re done, right-click the group containing all the menu elements, and select “Convert into a reusable element.” This will enable you to use this menu on other pages within your app without having to completely remake it.

Setting up the menu for our Discord clone

Name the element. Once you do, you’ll be taken to the reusable element’s individual page.

Setting up the menu for our Discord clone

You can access all your reusable elements the same way you access your app's individual pages from the top-left dropdown in the Bubble editor. If you ever need to make changes to this menu element, you can do so on this editor page, and the changes will propagate to all other pages where this reusable element is shown.

Update your profile details

In the initial Bubble training lessons, you learned how to create new user accounts. Now, we’ll create a profile settings page, where users can update their data and preferences.

Setting up user profiles for our Discord-like MVP

After adding all the input fields‌ — ‌in our case, a picture uploader and a text input field — we can start building the workflows to make changes to the current user.

Right-click the save button and choose “Start/Edit workflow.”

Click to add an action. Within “Account,” select “Make changes to current user.”

Setting up user profiles for our Discord clone

The next step is to send the user back to the home page. Click to add another action, but this time choose “Navigation,” followed by “Go to page,” and then set “home” as the destination.

Setting up user profiles for our Discord clone

One last thing: If the user doesn’t want to keep any changes made, we need to set a workflow for the cancel button.

Let’s create that workflow on this page. Add a new event by clicking “Click here to add an event.” Within “Elements,” choose “An element is clicked.”

Setting up user profiles for our no-code Discord MVP

Choose the “cancel” button from the dropdown menu.

Setting up user profiles for our no-code Discord MVP

As we did with the last step in the save button, choose “Navigation,” “Go to page,” and select the home page.

💡
TIP: Did you know you can copy events and workflows? Right-click on any event or workflow and select “Copy.” Once that’s done, right-click the dotted area you want to paste it in. Remember to check if all the details are correct before proceeding.

Add friends (with a popup)

An empty friends list would make anyone react with disappointment, and a friends list is useless if you can’t add new buddies. Let’s build the functionality in our chat app to make that happen.

Create a new popup on your home page, and fill it with a Search Box element, a cancel button, and an add friend button.

Setting up friend search in our no-code Discord-like MVP

We’ll configure the search box to search for other registered users by their nickname. Choose “Dynamic Choices,” and set the “field to search” to “nickname.”

Setting up friend search in our no-code Discord-like MVP

There’s a catch: We shouldn’t let users add themselves to their own friends list. Click on “Modify list of Users.”

Setting up friend search in our no-code Discord-like MVP

Add a new constraint.

Setting up friend search in our no-code Discord-like MVP

Set it to only show users that don’t have the current user’s own unique ID. You can click the default “=” sign to change it to “<>” (does not equal).

Setting up friend search in our no-code Discord-like MVP

Now that the search box is ready, it’s time to set up the workflow for the “add friend” button in the popup. Right-click the button and hit “Start/Edit workflow.”

Click to add a new action. In “Account,” choose “Make changes to Current User.” Set it to add the search box’s value to “friends list.”

Setting up friend search in our no-code Discord-like MVP

Then, add a new action in “Data (Things)” > “Make changes to a thing” > target the user in the search box, and add the current user to that user’s friends list. Now, both users have each other on their respective lists.

Setting up friend search in our no-code Discord-like MVP

Add a “Reset relevant inputs” to clear the search box (“Element Actions” > “Reset inputs”).

Setting up friend search in our no-code Discord-like MVP

And “Hide Popup Find Friends.”

Setting up friend search in our no-code Discord-like MVP

To complete the functionality of the popup, remember to set a workflow for the cancel button to hide the popup without doing anything else.

The last thing we need to do is to place a button on the home interface to open this popup. Once that’s done, start a workflow for that button, and set it to show the popup you just created (“Element Actions” > “Show”).

Setting up friend search in our no-code Discord-like MVP

Chat with friends

Before we begin building the functionality to support chat, we need to create a chat window.

Our chat window will have:

  • a header showing who we’re chatting with
  • a repeating group to show the messages
  • an input field
  • a send direct message button
  • a remove friend icon (that we’ll configure later)

Here’s an example design:

To simplify the process of creating workflows later, select and group all of these elements together and name it “Group Friend Chat.”

Setting up group friend chat in Discord clone.

Set the group’s type of content to be “User,” but leave the data source empty for now. Also, untick “This element is visible on page load.”

Group friend chat visible on page load.

Within our Group Friend Chat, set the Repeating Group’s type of content to Direct Messages. Set the Data source to search for Direct Messages, with the following constraints:

  • “friends contains Current User”
  • “friends contains Parent group’s User”
Direct messages settings in Bubble Discord clone.

Our chat window is now ready. Let’s set up the workflows to send messages. Right-click the “send message” button within the Friend Chat group and start a workflow.

Within “Data (Things),” select “Create a new thing” and fill the fields as shown.

Create a new direct message workflow.

Add a “reset relevant inputs”  (“Element Actions” > “Reset inputs”) after creating a new message, so the user won’t have to manually erase everything to enter the next one.

💡
TIP: If you want the message to submit after hitting the ENTER key, place the input element within the same group as the button that triggers the send message workflow. If they’re not already grouped, you can select both elements using SHIFT, right-click one of them, and select “Group these elements in a group.”

Choose who to chat with

Now that we have a chat window and the workflows to send messages, we need a way to select who we want to chat with.

Set up a Repeating Group to display the user’s friends list.

Display the user's friend list in Discord clone.

In the Repeating Group displaying your friends list, right-click the Text field displaying the friend’s name and create a new workflow.

In the first step, set the Group Friend Chat to show by hovering “Element Actions” > “Show.”

Show group friend chat element in Discord clone.

Then, we need to display the data of the friend we clicked on in our chat window. Do so by hovering “Element Actions” again and selecting “Display data” under the Group section.

In the “Element” field, choose the “Group Friend Chat,” and set the “Data to display” to “Current cell’s User.”

Display data in group friend chat in Discord clone.

Remove friends

Some friendships last forever. Others don’t. To accommodate all possibilities, let’s add a way to remove friends from the friends list so there’s no need to react with frustration later on.

Within the Group Friend Chat, right-click the remove friend icon and start a new workflow.

Add a new action. Hover over “Account” and choose “Make changes to current user.” Remove the Parent Group’s User from the friends list.

Make changes to current user - remove from friends list.

Then, add a new action: On “Data (Things),” choose “Make changes to a thing.” Remove the current user from the other user’s friends list.

Since the chat between these friends was showing, let’s hide the chat window as a way to show that the action was carried out successfully. Add a new action: “Element Actions” > “Hide an element” and choose the Friend Chat group.

Hide group friend chat workflow in Bubble Discord clone builder.

All features related to friends are now implemented. Let’s move on to creating servers and channels.

Create servers

One of Discord’s core features is creating a server for you and your friends to chat in. We’re going to build that functionality now.

Navigate to the “new” page, where we’ll set everything up to let users create their own servers.

Here’s an example design:

Sample New Server page in Discord clone.

Once you have all the input fields in place, start a new workflow for the “create” button.

Create a new action. On “Data (Things),” select “Create new thing.”

Create New Server button in Discord clone on Bubble.

We need to register this new server to its owner, and we want to add it to the servers joined list of the current user. Under “Account,” choose “Make changes to current user,” and add the “Result of step 1” to both the “servers joined” and “servers owned” fields.

Register user to server in Discord clone tutorial.

After this is done, we’ll send the user to the server page. Add another action: In “Navigation,” choose “Go to page,” and remember to fill the “Data to send” with the “Result of step 1.”

Send user to server page in Discord clone built with Bubble.

Invite friends to your server

If your friends don’t know you have a new server (or if your server is private), you need to invite them over.

Navigate to your server page. Remember to put your reusable menu in place. In the Design tab, scroll down the UI Builder list. You’ll find the menu you created under the “Reusable elements” section.

UI Builder in Bubble.io for Discord clone.

Place a new button on this page to invite friends. Let’s set it so that only the owner can invite their friends over. Edit the button, and untick “This element is visible on page load.”

Invite friends button settings in Discord clone.

Click on the “Conditional” tab. Define a new condition. When the current user has the current server on their “servers owned” list, set this button to be visible.

Set invite friends button visibility for server members in Discord clone.

We’ll be using a popup to search for and invite friends. Add a new popup to the page. Remember the one we created for adding new friends to the friends list? This one will have similar functionality.

Invite friends popup in Discord clone built with Bubble.

Add a “Search Box” element to the popup and set it to display dynamic choices, and the field to search to “nickname.”

Invite friend search box input settings.

We also want to keep this search box from displaying yourself. And this time, we also want this search to only display users already on your friends list. Click “Modify list of Users” and add the appropriate constraints. The search will only show:

  • users that don’t have the current user’s unique ID
  • users that are part of the current user’s friends list
Display users already on member list in Discord clone.

Start a workflow for the invite button. Under “Data (Things),” select “Make changes to a thing,” and add the Search Box’s value to the members list.

Add search box value to members list in Discord clone.

We also need to add this server to the list of joined servers of the invitee (“Data (Things)” > “Make changes to a thing”).

Add server to list of joined servers in Discord clone.

Reset the relevant inputs, clearing the Search Box.

Clear search box inputs in Discord clone.

Now that the friend has been added, hide the popup.

Hide invite friend popup after friend is added in Discord clone.

Last step: Add a button to display this popup on your “server” page. Then, set up the workflow as you see below.

Display button on server page in Discord clone.

Allow users to leave the server

Create a confirmation popup element.

Confirmation popup when requesting to leave server.

Start a workflow for the popup leave button. Make changes to the “Current Page Server,” removing the Current User from the list.

Allowing users to leave servers in our no-code Discord-like MVP

Next, remove the server from the Current User’s “servers joined” list.

Allowing users to leave servers in our no-code Discord-like MVP

After this is done, send the user back to the home page.

Allowing users to leave servers in our no-code Discord-like MVP

Before we move on, add a button to open this popup to the server page and set it to show (“Element Actions” > “Show”).

Allowing users to leave servers in our no-code Discord-like MVP

Update server settings

Your community changes over time, and so should your server information. Navigate to your “server_settings” page.

Add the appropriate input fields, picture uploaders, and buttons, and remember to have them display the server data.

Here’s an example design:

Allowing users to update server settings in our no-code Discord-like MVP

Now, it’s time to set everything up. Start a new workflow for the “update” button. In “Data (Things)”, hit “Make changes to a thing.” Match the data fields to the Input elements on the page.

Allowing users to update server settings in our no-code Discord-like MVP

As for the second step, send the user back to the “server” page. To ensure all data moves according to plan, remember to set the data to send to be the “Current Page Server.”

Allowing users to update server settings in our no-code Discord-like MVP

The user can also delete the server from this page. Let’s add a popup to ask for confirmation as a safety measure.

Allowing users to delete servers in our no-code Discord-like MVP

Now, start a workflow for the “delete server” button. This workflow is longer, as we’ll be:

Removing the server from the “servers joined” list of each of the members. From “Data (Things)”, select “Make changes to a list of things”...

Allowing users to leave servers in our no-code Discord-like MVPAllowing users to delete servers in our no-code Discord-like MVP

Removing the server from the “servers owned” and “servers joined” of the Current User (“Account” > “Make changes to the current user”)...

Allowing users to leave servers in our no-code Discord-like MVPAllowing users to delete servers in our no-code Discord-like MVP

Deleting all the channel messages on this server (“Data (Things)” > “Delete a list of things”)...

Allowing users to delete servers in our no-code Discord-like app

Deleting all the server channels…

Allowing users to delete servers in our no-code Discord-like app

And finally deleting the server (“Data (Things)” > “Delete a thing”).

Allowing users to delete servers in our no-code Discord-like app

Once that’s done, let’s send the user back to the “home” page. Add a new action, “Navigation” and “Go to page.”

Allowing users to delete servers in our no-code Discord-like app

The functionality to delete the server is now ready.

Remember to add the workflow to show this confirmation popup before moving on (right-click the appropriate button in your “server_settings” page, start a workflow, “Element Actions” > “Show”).

Create server channels

New channels can only be created and deleted by the server owner. Let’s add a button to the server page that will only show if the current user is the owner.

Create the “new channel” button. Untick “This element is visible on page load.”

Creating channels for the Discord-like app

Click the “Conditional” tab and define a new condition, where the button is only visible when the current user has the server on their “servers owned” list.

Creating channels for the Discord clone app

Let’s set up a new popup to enter the channel name and then create it.

Creating channels for the Discord clone app

Start a workflow for the “add” button on the popup. Add a new action to create a new channel (“Data (Things)” > “Create a thing”).

Creating channels for the Discord clone app

Make changes to the Server to add the new channel to it (“Data (Things)” > “Make changes to a thing”).

Creating channels for the Discord clone app

Time to reset the relevant inputs and hide the popup.

Creating channels for the Discord clone app

Don’t forget to set a workflow to show this popup. Right-click the “new channel” button we created before and set it to show the popup (“Element Actions” > “Show”).

Chat in server channels

Remember how we configured the friend chat window on the “home” page? The process will be similar here, except we’ll be working with Channel Messages this time.

Create a group to contain:

  • a header, showing the name of the channel,
  • a repeating group to show the channel messages,
  • an input field,
  • a send channel message button,
  • and a delete channel button (we’ll configure it later).

Here’s an example design:

Allowing users to chat in channels in the Discord clone app

To simplify the process of creating workflows later, select and group all of these elements together and name it “Group Channel Chat.” Then, set its content type to be “Channel,” and leave the data source empty.

Allowing users to chat in channels in the Discord clone app

Once that’s done, start a workflow for the “send message” button. Set it to create a new Channel Message (“Data (Things)” > “Create new thing”).

Allowing users to chat in channels in the Discord clone app

Time to add this channel message to the channel we’re chatting in (“Data (Things)” > “Make changes to a thing”). Don’t forget to reset the relevant inputs at the end.

Allowing users to chat in channels in the Discord clone app

Delete server channels

In the Group Channel Chat, add a new button to delete the channel. Set it to be visible only to the server owner by unticking “This element is visible on page load.” Set the condition to only show the button when the current user has the server on their “servers owned” list.

Setting up deletion of server channels in the Discord clone app

Start a workflow for this button, and delete a list of the messages within this channel (“Data (Things)” > “Delete a list of things”). On the “List to delete,” do a search for channel messages that belong to this channel.

Setting up deletion of server channels in the Discord clone app

Next, remove the channel from the server (“Data (Things)” > “Make changes to a thing”).

Setting up deletion of server channels in the Discord clone app

Time to delete the channel (“Data (Things)” > “Delete a thing”).

Setting up deletion of server channels in the Discord clone app

To show that the action was carried out successfully, let’s hide the Group Channel Chat.

Setting up deletion of server channels in the Discord clone app

Browse and joining public servers

Let’s work on our “discover” page to show all the available public servers, so users can find, join and chat within them.

Navigate to the “discover” page and add the reusable menu.

Next, add a Repeating Group to display the available servers. Remember to only display the ones that aren’t private.

Browsing and joining public servers in a Discord clone

Style the Repeating Group rows to show the banner image wide at the back, the server profile picture on the top, along with the name, description, owner, and member count. To top it off, add a “join” button.

Start a workflow for the “join” button. Add the Current User as one of the server’s members (“Data (Things)” > “Make changes to a thing”).

Browsing and joining public servers in a Discord clone

Now, add the Server to the “servers joined” field of the Current User (“Data (Things)” > “Make changes to a thing”).

Browsing and joining public servers in a Discord clone

Finally, send the user to the “server” page (“Navigation,” “Go to page”), along with the “Current cell’s Server” data.

Browsing and joining public servers in a Discord clone

Add additional features

Once you’re familiar with creating custom data fields and displaying dynamic content, you can start getting creative with the experiences you build. Additionally, you can:

  • Add video call functionality to the app by exploring the Bubble plugins section so users can video chat with ease,
  • Create a notification system so users can keep track of new messages,
  • Add rich-text support to the chat,
  • And much more!

Add privacy and security

Now that you have the basics of your app, don't forget to set some privacy rules, conditions, and authentications to keep your data secure—starting with roles in the “Privacy” section of your data tab. You can also check if you're unintentionally exposing any data with an API checker.

Launch your Discord clone

Hiring a developer or dev team to build this app would cost thousands, if not tens of thousands of dollars. And come launch day, if users react positively to your app, keeping up as usership grows in real-time can be a struggle. Paid plans allow you to host the app on your own custom domain, and the pricing starts at as low as $29 per month. Some templates and plugins may cost more, but you can build all the functionality of a Discord clone without any additional costs.

Start building

Bubble can help you build a Discord clone or any other product you choose! It’s never been easier to build something that will make others react with awe—all without having to code.

Ready to join the no-code movement with zero prerequisites? Register your free Bubble account and get started today. If you’d like additional help when building your product, join our thriving community forum open to all Bubble users. It’s a fantastic place to source actionable, step-by-step advice and resources. Any maker is encouraged to ask questions within the community to help empower their no-code journey.