Galago is a comprehensive laboratory automation platform that orchestrates and manages laboratory equipment through a unified interface. It provides protocol execution, device management, and real-time monitoring for automated laboratory workflows.
Galago consists of several distinct modules:
- Controller: A Next.js + tRPC web application that provides the user interface, manages device orchestration, protocol execution, and scheduling
- Tool Drivers: Separate repository containing gRPC-based drivers for laboratory equipment
- 🔬 Multi-device orchestration - Coordinate multiple laboratory instruments simultaneously
- 📋 Protocol management - Create, edit, and execute complex laboratory protocols
- 📊 Real-time monitoring - Live status updates and logging of all device operations
- 🗄️ Inventory tracking - Manage labware, samples, and consumables
- 📈 Run analytics - Detailed execution reports
- 🔧 Extensible architecture - Easy integration of new laboratory equipment
- Node.js 22.11
- Docker and Docker Compose (recommended for development)
- Redis (for queue management)
If you plan to contribute or customize Galago, start by forking the repository:
-
Fork on GitHub: Click the "Fork" button at the top right of the repository page, or use this direct link:
-
Clone your fork (replace
your-usernamewith your GitHub username):
git clone https://github.com/your-username/galago-core.git
cd galago-core- Add upstream remote (to keep your fork updated):
git remote add upstream https://github.com/your-org/galago-core.git- Launch development environment
docker-compose -f docker-compose.dev.yml up --build- Access the application
- Web Interface:
http://localhost:3010
- Web Interface:
- Install grpcio dependencies on a local environment (for proto files, testing, linting, etc)
bin/make deps- Initialize and update submodules (pulls the latest proto definitions from galago-tools):
git submodule update --init --recursiveNote: Run
git submodule update --remote vendor/galago-toolsanytime you need to pull the latest proto updates.
- Generate proto files
bin/make protoFor production deployment:
# Launch production stack
docker-compose up -d#Stop containters
docker-compose -f docker-compose.dev.yml down
#remove existing images
docker-compose -f docker-compose.dev.yml down --rmi all
#Remove orphans
docker compose -f docker-compose.dev.yml down --rmi all --remove-orphans
#rebuild a specific service
docker-compose up -d --force-recreate --no-deps --build service_name
#e.g
docker-compose -f docker-compose.dev.yml up --build db
#add npm deps to dev environment
docker exec -it galago-web-dev npm install <package name>#See all tables
sqlite3 data/app.db ".tables"
#See schema for a specific table
sqlite3 data/app.db ".schema workcells"
#See all table schemas
sqlite3 data/app.db ".schema"
#Interactive mode.
sqlite3 data/app.db
#Query a table
SELECT * FROM logs LIMIT 5;We are starting to move all CRUD operations to Drizzle ORM. After updating the schemas files,
run npx drizzle-kit generate to generate the migration files.
conda create -n galago
conda activate galago #mac
source activate galago #windowsbin/make deps
bin/make protoWe welcome contributions to Galago! Please follow these guidelines:
- Fork the repository and create a feature branch
- Set up development environment using Docker Compose
- Make your changes following the existing code style
- Test your changes thoroughly
- Submit a pull request with a clear description
- TypeScript/JavaScript: Follow existing patterns, use Prettier for formatting
- Commit messages: Use conventional commit format
To integrate a new laboratory instrument:
- Implement the gRPC interface in the galago-tools repository
- Add the tool type to
interfaces/controller.proto - Update the controller to recognize the new tool type
- Add appropriate UI components for tool-specific operations
- Never commit sensitive information (API keys, passwords, etc.)
- Use environment variables for configuration
- Keep dependencies updated regularly
- Report security issues privately to the maintainers
Galago stores Secrets (Slack webhook/bot token, SMTP password) encrypted at rest in SQLite.
To enable this, you must set the environment variable GALAGO_SECRETS_KEY for the controller
server process.
- Required format: a 32-byte key provided as either:
- hex: 64 hex characters (recommended), e.g. output of
openssl rand -hex 32 - base64: standard base64 encoding of 32 bytes
- hex: 64 hex characters (recommended), e.g. output of
Generate a key:
# Recommended (hex)
export GALAGO_SECRETS_KEY="$(openssl rand -hex 32)"
# Alternative (hex, via node)
export GALAGO_SECRETS_KEY="$(node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\")"Set it for Docker Compose (dev/prod):
services:
galago-web-dev:
environment:
- GALAGO_SECRETS_KEY=your_64_char_hex_keyAfter setting it, open Settings → Secrets and save a secret. If the key is missing/invalid, the UI will show “Secrets encryption is not configured”.
Container fails to start:
# Check logs
docker-compose logs galago-web-dev
docker-compose logs galago-db-dev
# Rebuild containers
docker-compose -f docker-compose.dev.yml down --rmi all
docker-compose -f docker-compose.dev.yml up --buildPort conflicts:
- App runs at http://localhost:3010 by default.
- Modify port mappings in docker-compose files if needed
- User Interface (Next.js) → tRPC calls → Database Service
- User Interface -> tRPC calls → gRPC calls → Tool Drivers
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
- Documentation: See the Galago Documentation
- Issues: Report bugs and feature requests via GitHub Issues
- Discussions: Use GitHub Discussions for questions and community support