A high-performance Rust implementation of OpenProject, the open-source project management software.
OpenProject RS is a complete rewrite of OpenProject's backend in Rust, designed for:
- Performance: 10x+ faster API responses than Ruby
- Memory Efficiency: <50% memory usage compared to Rails
- Compatibility: Drop-in replacement for OpenProject API v3
- Reliability: Strong type system prevents entire classes of bugs
| Feature | Status | Description |
|---|---|---|
| Work Packages | ✅ | Full CRUD with filters, sorting, pagination |
| Projects | ✅ | Hierarchical projects with permissions |
| Users | ✅ | User management with roles |
| Queries | ✅ | Saved views with complex filters |
| Authentication | ✅ | JWT, API keys, session auth |
| Notifications | ✅ | Email, in-app, webhooks |
| Attachments | ✅ | Local and S3 storage |
| Journals | ✅ | Full audit logging |
| Health Checks | ✅ | Kubernetes-ready probes |
| Metrics | ✅ | Prometheus-compatible |
# Clone the repository
git clone https://github.com/AdaWorldAPI/openproject-rs.git
cd openproject-rs
# Start the stack
docker-compose up -d
# Verify it's running
curl http://localhost:8080/health
curl http://localhost:8080/api/v3# Prerequisites: Rust 1.75+, PostgreSQL 15+
# Clone and build
git clone https://github.com/AdaWorldAPI/openproject-rs.git
cd openproject-rs
cargo build --release
# Set environment variables
export DATABASE_URL="postgres://user:pass@localhost/openproject"
export SECRET_KEY_BASE="your-64-char-secret-key"
# Run
./target/release/openproject-serveropenproject-rs/
├── crates/
│ ├── op-core/ # Core types, traits, error handling
│ ├── op-models/ # Domain models (Project, User, WorkPackage, etc.)
│ ├── op-contracts/ # Validation contracts
│ ├── op-auth/ # Authentication & authorization
│ ├── op-services/ # Business logic layer
│ ├── op-db/ # Database layer (SQLx)
│ ├── op-queries/ # Query system (filters, sorts)
│ ├── op-api/ # REST API handlers
│ ├── op-notifications/ # Background jobs & notifications
│ ├── op-attachments/ # File storage
│ ├── op-journals/ # Audit logging
│ └── op-server/ # HTTP server binary
├── Dockerfile # Production container
├── docker-compose.yml # Local development stack
└── railway.toml # Railway deployment config
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | Simple health check |
/health/live |
GET | Kubernetes liveness probe |
/health/ready |
GET | Kubernetes readiness probe |
/health/full |
GET | Detailed health report |
/metrics |
GET | Prometheus metrics |
/metrics.json |
GET | JSON metrics |
| Endpoint | Method | Description |
|---|---|---|
/api/v3 |
GET | API root with links |
/api/v3/configuration |
GET | Instance configuration |
/api/v3/users/me |
GET | Current user |
/api/v3/projects |
GET | List projects |
/api/v3/work_packages |
GET | List work packages |
/api/v3/queries |
GET | List saved queries |
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
- | PostgreSQL connection string |
SECRET_KEY_BASE |
- | JWT signing secret (64+ chars) |
HOST |
0.0.0.0 |
Server bind address |
PORT |
8080 |
Server port |
RUST_LOG |
info |
Log level |
DATABASE_POOL_SIZE |
10 |
DB connection pool size |
| Variable | Default | Description |
|---|---|---|
OPENPROJECT_ATTACHMENTS_STORAGE_PATH |
/var/openproject/assets |
Local storage path |
S3_BUCKET |
- | S3 bucket name |
S3_REGION |
us-east-1 |
S3 region |
S3_ACCESS_KEY_ID |
- | S3 access key |
S3_SECRET_ACCESS_KEY |
- | S3 secret key |
S3_ENDPOINT |
- | Custom S3 endpoint (MinIO) |
| Variable | Default | Description |
|---|---|---|
SMTP_HOST |
- | SMTP server |
SMTP_PORT |
587 |
SMTP port |
SMTP_USERNAME |
- | SMTP username |
SMTP_PASSWORD |
- | SMTP password |
SMTP_FROM |
- | From address |
# Using Railway CLI
railway init
railway up
# Or connect GitHub repo in Railway dashboard# Build
docker build -t openproject-rs .
# Run
docker run -d \
-p 8080:8080 \
-e DATABASE_URL="postgres://..." \
-e SECRET_KEY_BASE="..." \
openproject-rsapiVersion: apps/v1
kind: Deployment
metadata:
name: openproject-rs
spec:
replicas: 3
template:
spec:
containers:
- name: openproject-rs
image: openproject-rs:latest
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /health/live
port: 8080
readinessProbe:
httpGet:
path: /health/ready
port: 8080
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: openproject-secrets
key: database-url# Run all tests
cargo test --workspace
# Run specific crate tests
cargo test -p op-services
# Run with logging
RUST_LOG=debug cargo testEach crate follows a consistent pattern:
crates/op-{name}/
├── Cargo.toml
└── src/
├── lib.rs # Module exports
├── {feature}.rs # Feature implementation
└── tests (inline) # Unit tests
OpenProject RS maintains API compatibility with OpenProject:
- API Version: v3
- Response Format: HAL+JSON
- Authentication: API keys, JWT, sessions
- Database: PostgreSQL (schema-compatible)
- Deploy OpenProject RS alongside existing instance
- Point to same PostgreSQL database
- Gradually route traffic to Rust server
- Monitor performance and errors
Benchmarks compared to Ruby OpenProject (Rails):
| Metric | Ruby | Rust | Improvement |
|---|---|---|---|
| API Response (p50) | 120ms | 8ms | 15x faster |
| API Response (p99) | 800ms | 45ms | 18x faster |
| Memory Usage | 1.2GB | 180MB | 6.7x less |
| Startup Time | 45s | 2s | 22x faster |
- Fork the repository
- Create a feature branch
- Write tests for new functionality
- Ensure all tests pass:
cargo test --workspace - Submit a pull request
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
- OpenProject - The original project management software
- Axum - Web framework
- SQLx - Async SQL toolkit
- Tokio - Async runtime
298 tests passing | Built with Rust