Testfuel is an open source test case management system for software development teams. Organize test suites, track releases, and collaborate with your team in workspaces and projects.
- Workspaces — Team spaces with member access and multiple projects
- Projects — Group test suites and releases by product or service
- Releases — Define releases and associate test suites for test runs
- Suites — Organize test cases into suites; support for archiving
- Test cases — Create and manage individual test cases within suites
- Authentication — JWT-based auth with email verification
- Multi-tenant — Workspace-based isolation and access control
| Package | Description |
|---|---|
| client | React web app — main application UI |
| server | NestJS API — REST API, PostgreSQL, TypeORM |
| landing | Next.js marketing/landing site |
- Client: React 18, TypeScript, Redux Toolkit, TanStack Query, React Router, Ant Design, Tailwind CSS
- Server: NestJS 8, TypeScript, TypeORM, PostgreSQL, Passport JWT, Nodemailer
- Landing: Next.js, React, SASS, Framer Motion
- Node.js (v16+)
- PostgreSQL (for the API)
- npm or yarn
Start PostgreSQL separately (lives outside this repo at ~/Projects/postgres), then run the app:
~/Projects/postgres/start.sh
docker compose --env-file .env up --buildCopy .env.example to .env and set your database credentials.
Services:
| Service | URL |
|---|---|
| Client app | http://localhost:3000 |
| Landing site | http://localhost:3001 |
| API server | http://localhost:8000 |
PostgreSQL is managed in a separate project (~/Projects/postgres). Each app connects with its own database/user on that shared instance.
PostgreSQL must already be running on the server (see ~/Projects/postgres).
Manual deploy from the revamp branch (no merge to main required yet):
-
One-time server setup
git clone -b revamp https://github.com/<org>/testfuel.git ~/testfuel cd ~/testfuel cp .env.production.example .env.production # Edit .env.production with production secrets (DB, SECRET_KEY, etc.)
-
GitHub repository secrets (Settings → Secrets and variables → Actions)
Secret Example PRODUCTION_HOST155.133.27.10PRODUCTION_USERrootPRODUCTION_SSH_PRIVATE_KEYContents of your SSH private key PRODUCTION_APP_DIR~/testfuel(optional) -
Run deploy — Actions → Deploy to Production → Run workflow
- Use workflow from: branch that contains this workflow (e.g.
revamp) - Git branch to deploy to production: any branch you want on the server (e.g.
revamp,main, or a feature branch)
- Use workflow from: branch that contains this workflow (e.g.
The workflow SSHs into the production server, runs git fetch + git reset to the branch you chose, then builds and starts Docker containers on the server.
SSH_PASSWORD=your-password ./scripts/deploy.shCreate .env.production from .env.production.example before first deploy.
git clone https://github.com/your-org/testfuel.git
cd testfuelcd server
cp .env.example .env
# Edit .env: set SECRET_KEY, DB_STRING (or DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME), CLIENT_URL, SMTP if needed
npm install
npm run start:devAPI runs at http://localhost:3000 (or the port in your config).
cd client
npm install
# Create .env with REACT_APP_API_URL pointing to your server (e.g. http://localhost:3000)
npm run devApp runs at http://localhost:3000 (or the port React assigns).
cd landing
npm install
npm run devLanding runs at http://localhost:3001 by default.
| Variable | Description |
|---|---|
SECRET_KEY |
JWT signing secret |
DB_STRING |
Full PostgreSQL connection string (alternative to below) |
DB_HOST |
PostgreSQL host (default: localhost) |
DB_PORT |
PostgreSQL port (default: 5432) |
DB_USERNAME |
DB user |
DB_PASSWORD |
DB password |
DB_NAME |
Database name (e.g. testfuel) |
CLIENT_URL |
Frontend origin for CORS (e.g. https://app.testfuel.io) |
SERVER_ENV |
Set when running server (e.g. true) |
SMTP_USER / SMTP_PASSWORD |
For email (e.g. verification emails) |
| Variable | Description |
|---|---|
REACT_APP_SERVICE_URL |
Base URL of the Testfuel API |
Contributions are welcome. Please open an issue or pull request on the repository.
See LICENSE in the repository.