The world's most popular open-source dating app.
Duolicious is a personality-based dating app for meeting like-minded people. There's no swiping; people connect by starting a conversation. The client and the servers behind it both live in this repo under the AGPL-3.0, so you're welcome to read how it works, run your own copy, or send a patch.
Try it now in your browser at web.duolicious.app, or grab it on Google Play and the App Store.
- Matching on answers, not just photos. The question bank has over 2,000 questions covering values, faith, politics, sexual compatibility and more. You don't have to answer them all — Duolicious surfaces matches after your first answer, and refines them as you answer more.
- Psychometric traits. Alongside familiar frameworks like the MBTI, Duolicious shows how you compare to others on traits such as attachment style and thriftiness.
- No swiping. There's no liking or swiping. People introduce themselves by sending a message, and the app discourages low-effort openers like "hey" and "sup".
- Open source. The app, API, chat, and infrastructure are all in this repo. Anyone can read the code, run their own instance, file an issue, or send a fix.
- Funding. Duolicious runs on an optional subscription that covers the servers and keeps the project going. The core experience is free to use.
This monorepo contains both halves of Duolicious:
| Directory | What it is |
|---|---|
backend/ |
The API, chat, cron and supporting services (Python + Postgres). See its README and DEVELOPER.md. |
frontend/ |
The cross-platform app (Expo / React Native, with a web build). See its README and DEVELOPER.md. |
Requirements: Docker (with Compose v2.20+).
git clone https://github.com/duolicious/duolicious
cd duolicious
docker compose upThat single command builds and starts the entire backend stack and the frontend web app. Once it's up:
- Frontend (web): http://localhost:8081
- API health: http://localhost:5000/health
- MailHog (test email UI): http://localhost:8025
- Mock S3: http://localhost:9090
- Status page: http://localhost:8080
The frontend's default API URLs already point at the backend's published localhost ports, so the web app talks to your local backend with no extra configuration.
The local docker compose up stack runs without any secrets — it mocks the
OpenAI-backed features (account verification and club SEO descriptions), so you
don't need a key for development.
A real deployment requires OPENAI_API_KEY: the cron container won't start
without it, so a misconfigured deploy fails fast instead of silently shipping
broken verification. See backend/DEVELOPER.md for the
full list of environment variables.
To seed a test user once the API is healthy:
(cd backend && ./test/util/create-user.sh alice 30 1 true)You can develop each side on its own — see the per-directory READMEs and
DEVELOPER.md files linked in the table above. The root docker compose up is
still the easiest way to get everything running at once.
CI runs the full test suite for both halves on every push and pull request to
main (see .github/workflows/):
- Backend: mypy, unit tests, and functionality suites 1–6.
- Frontend: ESLint, Jest, Playwright, and TypeScript type checks.
There are a few ways to help:
- Send a pull request. Pick up an open issue
or fix something that bugs you.
docker compose upgets you a full local environment in one step, and developer instructions live in each half'sDEVELOPER.md. - Read the
CONTRIBUTING.md(backend · frontend) for coding standards, how to run the tests, and what makes a good PR. - Spread the word. Telling people and sharing Duolicious helps the app grow.
- Subscribe. A subscription helps cover the servers and keep the project sustainable.
New contributors are welcome. If you're not sure where to start, open an issue and say hello.







