abc-virtual-background-maker
abc-virtual-background-maker copied to clipboard
A standalone React application designed for creating and downloading virtual background images enriched with customizable text elements.

ABC Virtual Background Maker
A lightweight frontend app to generate and download virtual background image with text.

✨ Why we created ABC Virtual Background Maker
We recognized the need for a tool that allows teams to personalize their virtual backgrounds with ease, enhancing their professional image and brand identity.
If you've ever found yourself squinting at the screen during a video call, trying to match names to faces as your team grows, or wishing you could make it super easy for partners to spot your name and company, then this app's got your back.
And let's say your company is all about that unified look and drops official backgrounds to keep everyone's vibe on brand – you're going to love this.
💡 Features
- Customizable Text Overlay - Conveniently add your name, company name, or any other information for Zoom or Teams calls.
- Adjustable Fonts and Text Placement - Customize fonts and textfield position according to your preferences.
- Organizable Themes - Create collections of background images, similar to folders, allowing for easy management of virtual backgrounds.
- Image Storage Option - Manage your background images on GitHub repo, or load them from local directory.
- Mirror Image Option - Download a reversed version of the image to accommodate video feeds that flip your background horizontally.
- Image Upload Capability - Beyond using the preloaded backgrounds, users can also upload their own picture to create personalized virtual backgrounds.
- Customizable Appearance - Change the UI with your organization's key color and name for a consistent look across your sites.
- No Fuss App - It's a straightforward React web app that doesn't mess around with backend stuff.
Getting Started
🛠️ How to Build
-
We recommend using Node.js Version 18+ and
pnpmhttps://pnpm.io/installation -
Build path:
dist -
Build Command
pnpm install && pnpm run build
💻 Local Development
-
In the repo folder
pnpm install pnpm run dev -
Dev server will be running at
http://localhost:5173/
🐙 GitHub Pages Deployment
You can deploy directly from your GitHub repository using GitHub Pages at Setting > Pages > Github Actions menu.
Check our deployment workflow with GitHub Actions at .github/workflows/deploy.yml
🐳 Container Deployment
We offer a Dockerfile to help you get started quickly. You can execute the Docker commands as follows. It will allow you to access via 8080 port.
docker build -t abc-virtual-background-maker .
docker run -d -p 8080:80 abc-virtual-background-maker
🧞♂️ How To Customize
Modify app.config.json file.

📷 Backgrounds Uri
You can choose where to load background images from. Currently, we are supporting filesystem, CDN, and GitHub repo. Below json examples shows how to set backgroundsUri value.
- with local images
"backgroundsUri": {
"type": "filesystem",
"path": "./backgrounds"
}
- with CDN images
"backgroundsUri": {
"type": "cdn",
"path": "https://your-cdn-host/backgrounds"
}
- with GitHub repository
You can manage background images using a GitHub repository. Suppose that you created a repository with the following structure:
your-background-repo
├── backgrounds
│ ├── (app.config.json) // Optional. Without this configuration file, themes and background images are sorted alphabetically.
│ ├── your-theme-name
│ │ ├── 01.jpg
│ │ ├── 02.jpg
Rename .env.example file to .env (which will be ignored by Git), and set generated Personal Access Token value.
The app.config.json should be as below;
"backgroundsUri": {
"type": "github",
"path": "https://{your-git-host}/api/v3/repos/{your-repo-owner}/{your-repo-name}/contents/backgrounds"
}
🗂️ Themes
- Add new object value in
app.config.json'sthemes. (Value Typesrc/constants/theme.ts) - Set theme name value in new object. (The theme name should match with the backgrounds subdirectory name.)
Theme |
default | |
|---|---|---|
| name | Theme name should be unique. | |
| backgrounds | Array of images. (Detailed explanation about Image is below) |
|
| inputFields (optional) | Set up an input field group just for this theme | |
| isNew (optional) | If it's true, new icon shows up next to this theme | false |
| isHidden (optional) | If it's true, this theme will be hidden | false |
🌆 Background Images
- with local images
- Prepare 16:9 ratio images
- Set image file name with rgb color with comma
rrr,ggg,bbbbetween two dots, only if you need to set text color. (ex. 01.255,255,255.jpg) - Add background image files into
backgrounds/**/*. (or any other directory and setbackgroundsUrias relative path.) pnpm run buildorpnpm run devoutput.config.json'sthemes'sbackgroundsvalue will be changed automatically.
- with CDN images
- Prepare 16:9 ratio images urls
- Set
backgroundsUriinapp.config.jsonas base url. - Add
themes'sbackgroundsvalues as an object inapp.config.json.
Image |
default | |
|---|---|---|
| src | contains the path to the image you want to embed | |
| fontColor (optional) | Font color in this image | |
| theme (optional) | Which theme does it belong to |
📝 Input Fields
-
Modify default input fields: Change
defaultInputFields's value inapp.config.json(Value Typesrc/constants/input.ts)InputFieldGroupdefault position InputFieldGroup position within the image divided by 3x3 sections. (row-column) fields InputField items direction (optional) Align InputField items in InputFieldGroup. ( column: Items are stacked,row: Items are laid out in a line.)columnoffset (optional) Adjusting detail position from origin point. (Detailed explanation is below) {x: '0', y: '0'}InputFielddefault label Unique label of input (also used as placeholder text) fontSize Font size of input fontStyle Typography of input offset Adjusting detail position from origin point. (Detailed explanation is below) isRequired (optional) falsetext (optional) Default value of input ""tooltip (optional) Allows you to add a description of the input. "" -
Offset
You can locate textfield by adjusting
offsetvalues. The value{"x":"0%", "y": "0%"}starts from Top-Left corner as the origin point.Below table shows reference values according to 1920x1080 or 1280x720 images. Use this table as a guide to approximate the placement of your textfield in pixels.
Pixels 20% 40% 60% 80% 1920 px 384 768 1152 1536 1080 px 216 432 648 864 1280 px 256 512 768 1024 720 px 144 288 432 576 -
Modify input fields for each theme: Add
themes'sinputFields's value inapp.config.json. (It will overwritesdefaultInputFields.)
🪄 Font Styles
To embed 19 Google web fonts (total 20 fonts!),
- Copy the code into the of
index.html
<link
href="https://fonts.googleapis.com/css2?family=Abril+Fatface&family=Alfa+Slab+One&family=Arvo:wght@700&family=Black+Ops+One&family=DM+Sans:opsz,[email protected],800&family=DM+Serif+Text&family=Dosis:wght@800&family=Exo:wght@800&family=Gasoek+One&family=Gloock&family=Hanuman:wght@900&family=Inter:wght@800&family=Kalnia:wght@600&family=Lobster&family=Noto+Serif:wght@800&family=Nunito:wght@900&family=Roboto:wght@900&family=Rubik+Bubbles&family=Ultra&family=Zilla+Slab:wght@700&display=swap"
rel="stylesheet"
/>
- Add
fonts'sstylesinapp.config.json
"styles": [
"LINE Seed",
"Inter",
"Roboto",
"DM Sans",
"Exo",
"Noto Serif",
"Kalnia",
"DM Serif Text",
"Abril Fatface",
"Gloock",
"Zilla Slab",
"Hanuman",
"Dosis",
"Alfa Slab One",
"Arvo",
"Rubik Bubbles",
"Ultra",
"Lobster",
"Gasoek One",
"Black Ops One"
]
To embed local web fonts,
- Add font file (woff2) in
public. - Add
@font-facestyle instyles/_font.scss.
@font-face {
font-weight: 700;
font-family: "LINE Seed";
font-style: normal;
font-stretch: normal;
src: url("/LINESeedJP_OTF_Bd.woff2") format("woff2");
font-display: swap;
}
- Add
fonts'sstylesas that font-family name inapp.config.json
✏️ Font Sizes
Modify fonts's sizes value in app.config.json
🎨 UI Theme Color
To change the color of the UI elements such as toggles and buttons, you can add the keyColor value in rrr,ggg,bbb format in the app.config.json file. It fosters a consistent design identity for your team.
Overriding default values per Theme
You may want to override default values for specific theme. We support this feature by placing another app.config.json file under backgrounds directory.
In app.config.json structure, themes node can be overridden by app.config.json file in backgroundsUri path. It means, you maintain root app.config.json for common values, and you can override values for specific theme by placing another app.config.json under backgrounds directory as below;
your-background-directory
├── backgrounds
│ ├── app.config.json
│ ├── office
│ │ ├── 01.jpg
│ │ ├── 02.jpg
With above structure, let say you want to override themes node for office theme. If you want to override defaultInputFields for specific theme, you can add inputFields value in app.config.json under each theme node as below.
{
"themes": [
{
"name": "office",
"inputFields": [
{
"position": "top-right",
"direction": "column",
"fields": [
{
"label": "name",
"fontSize": "Large",
"fontStyle": "LINE Seed",
"offset": {
"x": "0%",
"y": "0%"
},
"isRequired": true
}
]
},
{
"position": "bottom-left",
"fields": [
{
"label": "Team Name",
"fontSize": "Large",
"fontStyle": "LINE Seed",
"offset": {
"x": "0%",
"y": "0%"
},
"isRequired": true,
"text": "IT Support Team"
}
]
}
]
}
]
}