Open-source project
Ainz-devs/OVL-MD-V2 avatar
Ainz-devs/OVL-MD-V2

OVL-MD-V2's one-click deploy link ships public mode, and its Docker image clones the repo at build time

OVL-MD-V2, développé par Ainz, est un bot WhatsApp multi-device performant, offrant de nombreuses fonctionnalités.

2,182 stars2,671 forksJavaScriptMIT

At a glance

What is it?
OVL-MD-V2 is a multi-device WhatsApp bot written in JavaScript, documented entirely in French, built on a WhatsApp library pinned to a release candidate. Its deployment story is four paths at once, the quickest of which hardcodes the author's owner number and a public mode into the URL, and its container image clones the repository from GitHub rather than copying the build context.
Who is it for?
Read this one as an engineering artefact rather than a product to adopt, because that is what the page describes: a bot whose protocol library is a release candidate, whose documented test workflow is a cron job, and whose fastest install path configures it for you without asking. Three things to check if you are evaluating it anyway.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 20 days ago.
What is it written in?
Mainly JavaScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 3, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The fastest install path configures the bot for you

Three of the four documented deployment routes are one-click template links, and one of them is worth reading before you click it. The Koyeb link is a full query string with the environment variables already filled in: the prefix, an owner name set to the author, an owner number, a mode set to public, an empty session identifier, and the three naming settings for the sticker pack, the sticker author and the bot itself, including the emoji you would see in the WhatsApp identity. Everything else is left to you. So the shortest path to a running bot is also the path on which the public mode has been chosen on your behalf and the owner identity is the maintainer's. The Heroku and Render links do the same job with fewer parameters visible, and the fourth route, a plain server where you add an entry file and start it, is the only one that asks you to make these decisions yourself.

The container clones the repository instead of copying it

The Dockerfile is eight lines and one of them decides what you deploy. It starts from a slim Debian Node image, installs ffmpeg and git, then clones the repository from GitHub into a directory and runs an install inside it. The build context is never copied. That means the contents of your image are decided by whatever the default branch contained at the moment the build ran, not by the commit you checked out, and the reason git is installed into the image at all is that the clone needs it. For a bot whose entry point is a script rather than a library, this works, and it is also why the project has no version pinning at the container level: the image tag you choose is only a label. The port that gets exposed is not the WhatsApp connection, which is outbound, and the container simply runs the package's start script.

The workflow called CI runs the bot every five minutes

The deploy workflow you are told to create is not a test suite and does not run one:

yaml
name: OVL-MD Bot CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  schedule:
    - cron: '0 */5 * * *'

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [20.x]
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - run: |
          sudo apt update
          sudo apt install -y ffmpeg
          npm i
      - run: timeout 18300s npm run Ovl

It triggers on pushes to the main branch, on pull requests to it, and on a schedule that fires every five minutes, which is the line that tells you what it is for: a keep-alive. Each run installs ffmpeg with the system package manager, installs the dependencies, and then starts the bot under a timeout of 18,300 seconds, a little over five hours, which is roughly the interval between one scheduled run and the next. The job is named build and the working directory is a stock runner image with a single Node version in its matrix. The two action versions referenced are both several major releases behind current ones. Nothing here would fail a pull request except a syntax error, because the only command after the install is the thing being kept alive.

Three entry points for one bot

The package metadata names one entry file, and the documentation names two others. The start command in the metadata runs the file called Ovl.js, and that is also the file the package's main field points at. The server route in the deployment section says to add the index.js file or the main.js file, whichever your panel expects, and then start the bot. So there are three names in circulation for the thing you launch, and the repository root contains only one of them, alongside a set.js and a directory of event handlers named after the project. There is also a Heroku configuration file and a Heroku application descriptor at the root, which is a second Heroku route alongside the template link, and a directory whose name suggests the database layer, so the layout mixes application code, deployment metadata and configuration in one place at the top level.

The protocol library is pinned to a release candidate

The dependency that matters most is the WhatsApp library, and it is requested at a specific pre-release build in the seven series rather than a final release. Everything else in the dependency list is a normal versioned package, several of them very recent. That single choice shapes the whole project, because an unofficial library that tracks a proprietary protocol moves when the protocol moves, and a release candidate is the version where behaviour is still settling. The bot also depends on a code obfuscator package as a runtime requirement rather than as a build step, which means obfuscation is part of how the code runs rather than something applied before shipping, and it lists a temporary email service as an ordinary dependency, which is the kind of entry that tells you more about a project's scope than its feature list does.

The container runs a process manager inside itself

There are three run scripts and they express two different models of running a long-lived process. One starts the entry file directly with Node, one starts it under a process manager with the process named and attached, and one stops all processes that manager knows about. The container's default command uses the package start script, which is the process manager version, so the manager is installed and running inside a container that a platform is already supervising. That combination has a known failure mode: when the container is stopped, anything the manager restarted in the meantime is left behind until the next start, and the stop-all script has no notion of which processes belong to this deployment. It is a small thing, and it is the sort of thing that only shows up in production, which is where the template links point.

Three database backends and an example that picks none

The deployment steps ask you to create a database, with the choice left open, and the example configuration file contains no database setting at all. Behind that, the repository supports three: a file-based option through a native module, an object relational mapper that speaks to a networked server, and the same mapper pointed at a hosted service that the steps link to. A directory at the root appears to hold the data layer, and the panel route does not mention a database step at all, so which backend you end up with depends on which of the four deployment paths you took. That is a reasonable amount of flexibility for a bot whose data is mostly session state, and it is also the part of the setup most likely to surprise someone, because the quick deploy links set nothing and the file-based option requires a native module that a slim container has to compile.

Editorial conclusion

Read this one as an engineering artefact rather than a product to adopt, because that is what the page describes: a bot whose protocol library is a release candidate, whose documented test workflow is a cron job, and whose fastest install path configures it for you without asking. Three things to check if you are evaluating it anyway. What the mode variable does, since the one-click link sets it to public and that choice is made for you before you see it. What the container actually contains, since it clones the branch at build time, so two images built a day apart can differ. And what the storage layer is, since three different database backends are supported and the example gives you no indication which one your deployment will end up using. On the licence question there is nothing to untangle: the repository states MIT and ships a licence file, which is the one uncomplicated thing about it.

Frequently asked questions

What is OVL-MD-V2?

A multi-device WhatsApp bot written in JavaScript by Ainz, MIT licensed, with version 2.1.3 in its package metadata and no GitHub releases. The repository documentation is written in French.

Which WhatsApp library does OVL-MD-V2 use?

The Baileys library, requested at a specific 7.0.0 release candidate build rather than a final release. Several other dependencies are ordinary stable versions.

How is OVL-MD-V2 deployed?

Four routes are documented: one-click templates on Heroku, Render and Koyeb, plus a plain server route where you add an entry file and start the bot yourself. The Koyeb link arrives with the environment variables already filled in.

What does npm start do in OVL-MD-V2?

It starts the entry file under the pm2 process manager, attaching to a named process. There is also a plain node entry point and a stop script that stops every process pm2 knows about.

Which environment variables does OVL-MD-V2 read?

Eight, listed in the example file: a command prefix, an owner name, an owner number, a mode, a session identifier, and three naming settings covering the sticker pack, the sticker author and the bot.

Official sources

  1. Ainz-devs/OVL-MD-V2 on GitHub
  2. Issues
  3. License: MIT
  4. Project website
  5. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/ainz-devs-ovl-md-v2.svg)](https://hysenlabs.com/projects/ainz-devs-ovl-md-v2)