Get the code
Clone the official repository, or add a Git worktree, and create a branch for your change. Write down the commit you start from.
git clone https://github.com/test-intelligence/testlookup.gitcd testlookupgit switch -c your-name/focused-changeRead the development guide on GitHub before you start the services.
Run one copy at a time
A separate checkout keeps your code changes apart from other work. But the Compose files use fixed container names, ports, networks and volumes. So run one TestLookup copy at a time, unless you’ve written a Compose override for every one of them.
The services publish these ports on your machine:
| Port | Service |
|---|---|
| 3000 | Dashboard (the web app) |
| 8000 | API |
| 5433 | PostgreSQL |
| 27017 | MongoDB |
| 6379 | Redis |
| 9000 | File storage (S3-compatible) |
| 5555 | Flower, the Celery monitor |
| 8002 | MCP server |
| 11434 | Ollama, added by make dev-llm |
| 8001 | ChromaDB, added by make dev-llm |
Never point database migrations or cleanup commands at another contributor’s copy, or at a shared environment.
Tool prerequisites
For container-based development, you need Git, Docker with Compose v2, GNU Make and Bash. The Makefile uses Bash, so on Windows run it from Git Bash or WSL. The contribution guide asks for 8 GB of RAM for the core services, and 16 GB with the local AI model.
To run the backend and the web app directly on your machine instead, you also need Python 3.11 or newer. You need Node 20 or newer too, which is the contribution guide’s minimum for the web app. The development guide uses these commands, run from the repository root unless noted:
python -m venv .venvsource .venv/bin/activate # PowerShell: .venv\Scripts\Activate.ps1python -m pip install -r backend/requirements.txtpython -m pip install -e ./cli
cd frontend && npm ci && npm run dev # in one terminal, from the repository root
cd backend # in a second terminal, from the repository root, with the venv activealembic upgrade headuvicorn app.main:app --host 127.0.0.1 --port 8000 --reloadVite, the web app’s development server, forwards API calls to your local backend. Full flows still need the databases, the message broker, file storage and the workers. So give the backend the addresses and secrets of services that you own.
Read scripts before you run them. Keep the .env settings file out of Git, and use throwaway local passwords and keys. The Makefile writes matching local secrets into .env only when that file doesn’t exist yet. If Bash isn’t available, it copies .env.example instead, and you must fill in the secrets yourself.
Core setup
To start the core services with demo data, run:
make quickstartThe command starts the core services and waits until the readiness check answers. It then uploads the sample JUnit reports from samples/junit/, while a setup task loads the demo projects. When it prints Demo ready!, open the dashboard and choose Admin in the quick-login panel on the sign-in page. You don’t need a password.
| What | Address |
|---|---|
| Dashboard | http://localhost:3000 |
| Interactive API reference (Swagger) | http://localhost:8000/api-docs |
| Readiness check | http://localhost:8000/health/ready |
Quick login works only because the generated .env runs TestLookup in development mode. Never carry that setting beyond a throwaway machine.
If something looks wrong, check the containers and the recent logs:
docker compose psdocker compose logs --tail=100 backend worker worker-children beat seed-initThere are other ways to start:
- To start the core services without the demo uploads, run
make dev. It prints the local addresses, including the Flower monitor for Celery at port 5555. Flower uses the basic-auth username and password in.env. To follow the demo data loader on a first run, usemake dev-logs-seed. - For machines with less memory,
make dev-litestarts a smaller set of services. - To add the optional local AI services and download their models, run
make dev-llm. See Configure local AI.
Database schema changes go through Alembic, which runs inside the backend container:
| Command | What it does |
|---|---|
make migrate | Applies pending migrations |
make migrate-status | Shows the current revision |
make migrate-create MSG="..." | Generates a new revision for you to review |
make migrate-down | Rolls back the last migration |
Run them only against your own throwaway copy. The Makefile on GitHub lists every command.
Check that it works
Running containers don’t prove that TestLookup works. Start with these two checks:
make smokecurl -f http://localhost:8000/health/readyThe smoke test checks the running services. It ends with a non-zero exit code when a core check fails. The API’s health checks each answer a different question:
| Address | What it tells you |
|---|---|
/health/live | Whether the API process is alive |
/health/ready | Whether its critical dependencies are working |
/health/version | Which build is running |
/health/details | The state of each component. It can return HTTP 200 while some components are only partly working, so read what it says. |
Next, check that the latest database migration and the component versions match. Then check that a worker reads every configured queue. In the development Compose file, two services read the queues:
| Compose service | Queues it reads |
|---|---|
worker | default, critical, ingestion and ai_analysis |
worker-children | agent_children, one task at a time |
A log or health check that leaves out worker-children never shows that queue. Before you call a change ready for release, send one report all the way through: saving, analysis, review and the final report.
Follow one report through the code
To learn the code, follow one report through it:
- Read
backend/app/bootstrap.py, where the API routers are mounted. - Find
POST /api/v1/ingestin the API reference. - Follow the upload guide on GitHub from the upload to the finished run, and on to the follow-up work queued after it.
- Find the run page in the frontend that shows the result.
Then send a small report to your own copy. Watch these happen as separate events: TestLookup accepting the upload, saving the run, running the analysis and setting the review state.
Make your first change a small change to how something looks, and run its focused frontend test. Do that before you touch storage, permissions, queues or state changes. The codebase map gives the full reading order, from API route to screen.
Cleanup
To shut down, run make stop. It stops the main services and the optional local AI services, and keeps the data volumes.
The clean command deletes data. It removes the named volumes for:
- PostgreSQL;
- MongoDB;
- the Valkey message broker, which runs as the
redisservice; - the S3-compatible file store, which runs as the
minioservice; - Ollama models;
- Chroma data.
make clean CONFIRM=yesUse it only on a copy you mean to throw away. Back up any data you need before an upgrade, or before a cleanup like this.