OpenLIMS is an open-source, self-hosted, production-style Laboratory Information Management System for labs that need sample tracking, inventory management, audit trails, custom fields, instrument imports, sequence workflows, and project collaboration without the cost or complexity of traditional enterprise LIMS platforms.
See the codeOpen-source, self-hosted Laboratory Information Management System for practical lab workflows.
Features · Architecture · Local Development
Settings now brings together the existing field, workflow/template, role and sharing editors. Administrators can restrict supported manual sample-status transitions with required audit reasons, revision conflict protection, validation against QC bypasses/dead ends, and a saved-defaults restore flow. Read-only users can inspect the policy. Run backend migrations before upgrading. See the English/Spanish configuration guide.
Update the invitation browser test for the new password-success guidance. Verify the Getting started instructions, sign-in link, removed password form, and cleared invitation token after successful setup.
Getting started guides users through their lab’s real workflow templates, preserves their first experiment across sessions, and shows actual step progress. Account notifications and persistent invitation/password setup status help administrators bring users onboard. Includes English/Spanish guidance and permission, retry, and workflow regressions. Run backend migrations before upgrading the frontend. See the onboarding guide.
OpenLIMS is an open-source, self-hosted Laboratory Information Management System built to support practical lab workflows such as sample tracking, project organization, collaborative experiment notebooks, inventory custody, internal workflow requests, instrument data ingestion, sequence analysis, local BLAST search, mass spectrometry review, legacy data migration, audit trails, reporting, role-based access control, and an assistant with optional OpenAI or local Ollama support that remains read-only unless a user explicitly confirms a supported action.
The project is designed as a lightweight, configurable, production-style foundation for research labs, small biotech teams, core facilities, and developer teams that need more structure than spreadsheets but do not want the cost or complexity of a traditional enterprise LIMS.
Status: OpenLIMS is currently a production-style prototype. It is not yet a fully validated clinical, diagnostic, or regulated production LIMS.
Current development version: v0.38.0 — Lab configuration from Settings.
Hosted deployment addresses and access credentials are intentionally not published in the repository. Authorized users should obtain access details directly from the repository owner.
| Area | Capabilities |
|---|---|
| My Work | Unified assigned-work, workflow-request, experiment, QC, alert, notification, and overdue-work dashboard |
| Samples | Sample lifecycle tracking, aliquots and parent/child lineage, custody, statuses, attachments, custom fields, reason-for-change logging |
| Pipelines | Dependency graphs, parallel and conditional steps, optional work, controlled retries, project/sample-type defaults, assignment by sample/batch/project, failure blocking, QC gates |
| Analyses & procedures | Admin-configurable analysis types, required result schemas, versioned procedures, SOP links, expected duration |
| Projects | Project workspaces, project-scoped visibility, membership, cross-project sample linking, unified sample-to-report workflow view |
| Notebook | Scoped collaborative notebooks, block experiments, immutable revisions, comments, assignments, review/sign-off, locking, cloning, and provenance-rich PDF export |
| Inventory | Site-to-well location hierarchy, generic barcodes, plate maps, reagent/lot metadata, immutable scan ledger, reservations, alerts, and cycle-count reconciliation |
| Workflow Requests | Configurable internal assay forms, triage/approval, SLAs, pipeline assignment, resource reservation, batch/plate grouping, requester messages, execution status, and approved reports |
| Imports | Instrument CSV imports, flexible header detection, direct instrument/API ingestion |
| Migration | Legacy CSV migration profiles, reusable field mappings, preview/dry-run, queued imports, row review |
| External IDs | Preserve legacy sample IDs and aliases from older systems |
| Sequences | FASTA import workflows, sequence workspaces, sequence metadata and features |
| Registry | Configurable biological entity types, immutable versions, aliases, relationships, duplicate detection, review/registration, and physical-material links |
| Molecular Biology | Strict DNA/RNA/protein validation, circular topology, revision diff/restore, biochemical tools, virtual digests, construct assembly, feature libraries, and FASTA/GenBank interchange |
| Alignments | Clustal Omega alignment jobs with downloadable output |
| BLAST | Local BLAST database building and blastn/blastp search |
| Mass Spec | mzML, mzXML, mzData, featureXML, consensusXML, mzID/mzIdentML review using pyOpenMS |
| Audit | Audit events, barcode-scanned custody transfers, reason-for-change tracking, CSV exports |
| Reports | Project summaries, sample inventory, QC review, import summaries, audit activity, comparison and investigation CSV/PDF artifacts |
| Visual analytics | Investigation workbench, multi-sample/project/batch comparisons, result trends, outlier review, workflow bottlenecks, automatic charts |
| Assistant | OpenLIMS Rules, optional OpenAI or Ollama, clarification choices, visible removable context, investigation and comparison follow-ups, confirmed actions with expiring user-bound tokens and audit events |
| Jobs | Celery/Redis background jobs and real-time WebSocket updates |
| Security | HttpOnly browser JWT cookies, CSRF protection, refresh rotation/blacklisting, logout invalidation, role-based permissions, and Bearer JWT support for API clients |
| Localization | Director-controlled, instance-wide English or Spanish UI, including the sign-in screen and workflow pages |
| Shared foundation | Stable public IDs, reusable links and attachments, versioned APIs, OpenAPI documentation, common project permissions and audit payloads, and server-enforced guarded module feature flags |
Samples are the central records in OpenLIMS. A sample can be assigned to a project, placed in a container, linked to results, connected to sequence records, used in BLAST or alignment workflows, associated with mass spectrometry runs, and connected to external IDs from legacy systems.
Supported sample statuses:
| Status |
|---|
RECEIVED |
IN_PROGRESS |
QC |
REPORTED |
ARCHIVED |
OpenLIMS supports controlled status changes with a required reason for change, helping create a stronger chain-of-custody and audit trail.
Projects act as shared workspaces for lab teams. They can contain samples, sequence workspaces, imports, BLAST jobs, alignments, mass spectrometry runs, notes, migration jobs, and project activity.
Project membership controls what non-admin users can see and modify.
A sample has one primary project, but it can also be linked to additional projects. This supports cases where a sample belongs to one study or team but needs to be visible to another project without transferring ownership.
Sample: S-ALPHA-001
Primary Project: PRJ-ALPHA
Linked Projects: PRJ-BETA, PRJ-GAMMA
Linked projects provide visibility, while primary project ownership controls modification and import permissions.
OpenLIMS records directed relationships between source and derived samples for aliquots, splits, derived materials, and pooled components. Lineage links reject self-links and cycles, retain the amount and unit when supplied, and require an audited reason. A derived sample can be created directly from the Traceability workspace while inheriting the source project, linked-project visibility, batch, and applicable default workflow.
Barcode or sample-ID scans can record receipt, check-out, check-in, transfer, storage movement, processing, and disposal. Each custody event preserves the previous and new container and custodian, the operator, scan value, timestamp, and handling reason. Disposal clears physical custody and archives the sample.
OpenLIMS models storage from a physical site down to an individual well:
Site → Building → Laboratory → Room → Freezer → Shelf → Rack → Box → Well
Locations, containers, samples, reagent lots, and registered materials can have generic barcode identities. Scanned operations create immutable transactions for receive, move, transfer, count, consume, adjust, quarantine, disposal, and return. Every quantity transaction records the actor, reason, unit, before and after values, and linked experiment, request, or work item when supplied.
Inventory items and lots retain vendor, catalog, manufacturer, received/opened and expiration dates, cost, storage conditions, chemical identity, hazards, GHS classifications, SDS/COA files, and disposal guidance. Plate maps support well-level placement, while reservations, expiration/reorder alerts, cycle counts, and reconciliation keep available stock auditable.
OpenLIMS supports CSV-based instrument imports and direct API ingestion.
Instrument profiles define:
Some instrument exports include metadata rows before the real CSV header. OpenLIMS can scan for the sample ID column and detect the actual header row.
Instrument,Example Analyzer
Run ID,RUN-001
Operator,Peter
sample_id,result,operator,qc_status
S-ALPHA-001,pass,Peter,PASS
OpenLIMS includes a data migration toolkit for bringing legacy lab database exports into OpenLIMS in a safer, reviewable way.
SISBI / legacy PostgreSQL, MySQL, SQLite, or CSV
↓
Migration profile
↓
Read-only datasets and field mapping
↓
Preview / dry run
↓
Confirm import
↓
Projects, inactive users, samples, metadata, work items, and historical results
The migration toolkit supports:
Database passwords are never stored in OpenLIMS. Configure the password in an
environment variable, enter only that variable's name in the connection, and
use a source account that has SELECT permission only. Remote hosts must also
be listed in MIGRATION_DB_ALLOWED_HOSTS. Each dataset has a row safety limit;
the final commit re-reads and fingerprints the source before writing anything.
Conflict policy is part of that fingerprint. Each committed job records the
objects it created and the original values it changed, allowing a director to
perform a guarded rollback. Rollback is blocked if later related data would be
put at risk.
OpenLIMS can preserve legacy identifiers from older databases or spreadsheets.
Sample: S-UW-001
Source System: UW Legacy DB
Label: legacy_specimen_id
External ID: SP-00921
OpenLIMS includes a read-only assistant for quickly finding and summarizing records inside the system.
The assistant can help users ask questions such as:
The assistant uses safe backend tools as the source of truth. It does not directly modify database records.
The attention summary is permission-filtered and checks samples that have remained in an active status for more than three days, missing sample information, QC review states, aged open work items, failed instrument imports, failed BLAST and alignment jobs, and admin-only system health warnings. Inventory quantity, reservation, reorder, and expiry alerts are also included when they need attention.
| Mode | Description |
|---|---|
| OpenLIMS Rules | Built-in rule-based search and summaries with no external model required |
| OpenAI | Optional external LLM summaries using server-side API configuration |
| Ollama | Optional local LLM summaries using a self-hosted Ollama container |
If an LLM is unavailable, the assistant falls back to OpenLIMS Rules mode.
The rules layer also handles common conversational requests such as greetings, help, the current application date, and the current application time. If a question is unrelated to OpenLIMS but can be answered conversationally, the constrained route classifier can send it to a separate general-conversation prompt. That prompt receives no database records or tool output and cannot run an OpenLIMS action. Requests that appear to require unsupported laboratory data or application operations remain explicit unsupported requests instead of being answered as general chat.
The UI displays the active engine/model, such as:
Using: OpenLIMS Rules
Using: OpenAI · gpt-5
Using: Ollama · llama3.2:1b
Users can:
Sample → FASTA Import → Sequence Workspace → Alignment Job → BLAST Search
OpenLIMS can queue Clustal Omega alignment jobs asynchronously. Alignment jobs store input FASTA, aligned FASTA, sequence count, alignment summary, status, and downloadable output.
OpenLIMS includes local BLAST support using NCBI BLAST+.
Users can:
OpenLIMS includes mass spectrometry support using pyOpenMS and OpenMS-compatible formats.
Supported workflows include:
OpenLIMS records important activity as audit events, including:
For controlled sample status changes, OpenLIMS records actor, before/after state, changed fields, reason for change, and timestamp.
Reports and CSV exports include:
Background jobs run through Celery and Redis. OpenLIMS uses Django Channels and WebSockets to update the frontend when jobs change status.
Supported live-update workflows include:
OpenLIMS uses role-based permissions and project-scoped access control. Browser sessions use HttpOnly JWT cookies with CSRF protection, refresh-token rotation, and logout invalidation. Bearer JWT authentication remains supported for scripts and non-browser API clients.
| Role | Purpose |
|---|---|
| Admin / Director | Full system access |
| Tech | Lab workflow access for assigned projects |
| Viewer | Read-only access |
| Role | Sample Visibility | Modify Samples |
|---|---|---|
| Admin / Director | All samples, including unassigned samples | Yes |
| Tech | Samples in assigned projects, linked project samples, and unassigned samples they created | Only samples they have modification rights for |
| Viewer | Samples in assigned or linked projects | No |
Linked-project access allows a user to see a sample, but it does not automatically grant edit or import permissions.
| Layer | Technology |
|---|---|
| Frontend | React + Vite |
| Production Web | Nginx |
| Backend API | Django REST Framework |
| Database | PostgreSQL |
| Background Jobs | Celery |
| Broker / Cache | Redis |
| Real-Time Updates | Django Channels + Daphne |
| Alignments | Clustal Omega |
| BLAST | NCBI BLAST+ |
| Mass Spec | pyOpenMS |
| Assistant | OpenLIMS Rules, optional OpenAI, optional Ollama |
| Reverse Proxy / TLS Edge | Caddy or another trusted reverse proxy when used |
| Deployment | Docker Compose (development and production) |
High-level architecture:
React Frontend / Production Nginx
↓
Django REST Framework API
↓
PostgreSQL
Redis
↓
Celery Worker
↓
Imports / Migrations / Alignments / BLAST / Mass Spec Jobs
Daphne + Django Channels
↓
WebSocket job updates
OpenLIMS Assistant
↓
Safe read-only backend tools
↓
Optional OpenAI or local Ollama summary
| App | Responsibility |
|---|---|
samples | Sample lifecycle, access control, attachments, transitions |
projects | Projects, membership, project posts |
inventory | Locations and containers |
imports | Instrument profiles, CSV imports, direct instrument ingestion |
migration_toolkit | Legacy CSV migration profiles, field mappings, dry-run previews, imports, and external IDs |
results | Work items and structured results |
events | Audit trail and audit export |
notifications | User notifications |
custom_fields | Configurable fields |
sequences | Sequence records and features |
alignments | Clustal Omega alignment jobs |
blast | BLAST databases, jobs, and hits |
mass_spec | Mass spec uploads, processing, summaries, and comparison |
settings_app | Admin settings |
assistant | Read-only assistant tools, OpenAI/Ollama summaries, and assistant status |
core | Users, roles, permissions, search, shared utilities |
git clone https://github.com/Mokey2002/OpenLIMS.git
cd OpenLIMS
cp deploy/.env.example deploy/.env
Example local environment:
DJANGO_DEBUG=1
DJANGO_SECRET_KEY=dev-secret-key
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1
CSRF_TRUSTED_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
POSTGRES_DB=openlims
POSTGRES_USER=openlims
POSTGRES_PASSWORD=openlims
DB_HOST=db
DB_PORT=5432
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/1
CHANNEL_REDIS_URL=redis://redis:6379/2
INSTRUMENT_API_KEY=my-shared-lab-instrument-key
OPENLIMS_ASSISTANT_LLM_ENABLED=false
OPENLIMS_ASSISTANT_LLM_PROVIDER=ollama
OPENLIMS_ASSISTANT_LLM_ROUTING_ENABLED=true
OPENLIMS_ASSISTANT_LLM_ROUTING_MIN_CONFIDENCE=0.65
OLLAMA_BASE_URL=http://ollama:11434
OLLAMA_MODEL=llama3.2:1b
OLLAMA_TIMEOUT_SECONDS=25
docker compose -p openlims -f deploy/docker-compose.yml up -d --build
docker compose -p openlims -f deploy/docker-compose.yml exec api python manage.py migrate
docker compose -p openlims -f deploy/docker-compose.yml exec api python manage.py seed_demo
The command is idempotent and seeds connected demonstrations for projects, samples, batches, custom metadata, lineage, barcode custody, inventory, reservations, scan transactions, plate maps, cycle counts, workflow requests, notebooks and signed experiments, workflows, results, QC, instrument imports, migration previews and rollback, Registry records, Molecular Biology revisions and assembly plans, BLAST, alignments, mass spectrometry, reports, notifications, audit history, shared links and attachments, and assistant confirmations. The seeder does not create, require, display, or change passwords. Existing account credentials are preserved, while newly created demo identities are non-login accounts used for realistic ownership, assignment, QC, and audit history. Sign in with an existing OpenLIMS administrator account to explore the seeded data.
The Registry and Notebook feature flags are enabled for the comprehensive demo. Studies and Insight remain disabled because those modules are still under development.
| Service | URL |
|---|---|
| Frontend | http://localhost:5173 |
| API | http://localhost:8000 |
| Admin | http://localhost:8000/admin |
| Health | http://localhost:8000/api/health/ |
OpenLIMS can run the assistant with a local Ollama model instead of an external LLM provider.
Enable the assistant in deploy/.env:
OPENLIMS_ASSISTANT_LLM_ENABLED=true
OPENLIMS_ASSISTANT_LLM_PROVIDER=ollama
OPENLIMS_ASSISTANT_LLM_ROUTING_ENABLED=true
OPENLIMS_ASSISTANT_LLM_ROUTING_MIN_CONFIDENCE=0.65
OLLAMA_BASE_URL=http://ollama:11434
OLLAMA_MODEL=llama3.2:1b
OLLAMA_TIMEOUT_SECONDS=25
OpenLIMS first uses normalized deterministic routes. If no route matches, the configured model may return a constrained, confidence-gated route hint from a fixed allowlist. OpenLIMS then runs the normal permission checks, frozen previews, and confirmation requirements. Invalid, low-confidence, or unavailable model classifications fall back to an honest rule-based response.
Start the Ollama container:
docker compose -p openlims -f deploy/docker-compose.yml up -d ollama
Pull a small model:
docker compose -p openlims -f deploy/docker-compose.yml exec ollama ollama pull llama3.2:1b
Restart the API and frontend:
docker compose -p openlims -f deploy/docker-compose.yml restart api frontend
The Assistant page will show which engine is active: OpenLIMS Rules, OpenAI, or Ollama.
Run backend tests:
docker compose -p openlims -f deploy/docker-compose.yml exec api pytest -v
Run Django checks:
docker compose -p openlims -f deploy/docker-compose.yml exec api python manage.py check
Run frontend build:
cd frontend
npm ci
npm run build
Run Playwright browser tests after starting a testable OpenLIMS environment:
cd frontend/e2e
npm ci
npx playwright install chromium
npm test
The CI workflow also validates makemigrations --check, production Compose configuration, the production frontend build, secure-cookie authentication, CSRF behavior, /api/v1/ browser traffic, workflow navigation, logout/session invalidation, and the v0.29 performance/pagination regressions.
OpenLIMS includes a health endpoint:
curl http://localhost:8000/api/health/
The health check verifies:
The frontend footer should use the generated frontend/src/version.js file instead of a hardcoded version string.
Recommended footer source:
OpenLIMS {OPENLIMS_VERSION}
The version file can be generated from the latest Git tag during frontend dev/build so the footer stays aligned with releases.
OpenLIMS can run locally, on a private lab server, on a VM, or on cloud infrastructure.
deploy/docker-compose.prod.yml provides the production-style stack introduced in v0.28.1. v0.29.0 improves runtime efficiency on that stack with reusable PostgreSQL connections, optional Redis-backed Django caching, gzip compression, immutable hashed-asset caching, route-level frontend code splitting, and larger bounded API pages. The production stack runs Django under Daphne, serves the built React frontend through Nginx, keeps PostgreSQL and Redis internal by default, persists database/cache/media/static data, includes health checks, and exposes the web service on ${OPENLIMS_HTTP_PORT:-8080}. Ollama remains optional through the llm Compose profile.
Start from the production environment template:
cp deploy/.env.prod.example deploy/.env
Replace placeholder secrets, configure DJANGO_ALLOWED_HOSTS and CSRF_TRUSTED_ORIGINS for the public hostname, and then start the stack:
docker compose -p openlims -f deploy/docker-compose.prod.yml up -d --build
A typical production-style deployment uses:
Trusted TLS reverse proxy / load balancer (optional when TLS is terminated upstream)
↓
Nginx React frontend
↓
Django API / Daphne ASGI
↓
PostgreSQL
Redis
↓
Celery Worker
For real-time updates, the production web tier forwards WebSocket traffic under /ws/* to the Django/Daphne API service.
The production environment template enables the recommended connection/cache settings:
DB_CONN_MAX_AGE=60
CACHE_URL=redis://redis:6379/3
DB_CONN_MAX_AGE reuses healthy PostgreSQL connections instead of reconnecting for each request. Redis database 3 is reserved for Django application caching; Celery broker/results and Channels continue to use Redis databases 0, 1, and 2 respectively.
Create a backup:
docker compose -p openlims -f deploy/docker-compose.prod.yml exec db pg_dump -U openlims openlims > openlims_backup.sql
Restore a backup:
cat openlims_backup.sql | docker compose -p openlims -f deploy/docker-compose.prod.yml exec -T db psql -U openlims openlims
OpenLIMS is a production-style LIMS prototype with many production-shaped patterns already in place:
/api/v1/ browser traffic with compatibility routesRemaining production-readiness work includes:
Planned and future improvements include:
See docs/performance_scalability_v029.md for the v0.29.0 performance and scalability implementation notes and docs/product_hardening_v0281.md for the v0.28.1 product-hardening notes.
OpenLIMS aims to be:
Eduardo L
LinkedIn: https://www.linkedin.com/in/edlemus/
Copyright © 2026 Eduardo Lemus.
OpenLIMS is open-source software licensed under the Apache License 2.0. You may use, modify, and distribute the source code in accordance with the license terms.
Third-party dependencies and bundled components remain subject to their own
licenses. See docs/licensing_history.md for the
project's licensing history.
Python
66.0%
JavaScript
33.3%
OpenLIMS is an open-source, self-hosted, production-style Laboratory Information Management System for labs that need sample tracking, inventory management, audit trails, custom fields, instrument imports, sequence workflows, and project collaboration without the cost or complexity of traditional enterprise LIMS platforms.
See the codeOpen-source, self-hosted Laboratory Information Management System for practical lab workflows.
Features · Architecture · Local Development
Settings now brings together the existing field, workflow/template, role and sharing editors. Administrators can restrict supported manual sample-status transitions with required audit reasons, revision conflict protection, validation against QC bypasses/dead ends, and a saved-defaults restore flow. Read-only users can inspect the policy. Run backend migrations before upgrading. See the English/Spanish configuration guide.
Update the invitation browser test for the new password-success guidance. Verify the Getting started instructions, sign-in link, removed password form, and cleared invitation token after successful setup.
Getting started guides users through their lab’s real workflow templates, preserves their first experiment across sessions, and shows actual step progress. Account notifications and persistent invitation/password setup status help administrators bring users onboard. Includes English/Spanish guidance and permission, retry, and workflow regressions. Run backend migrations before upgrading the frontend. See the onboarding guide.
OpenLIMS is an open-source, self-hosted Laboratory Information Management System built to support practical lab workflows such as sample tracking, project organization, collaborative experiment notebooks, inventory custody, internal workflow requests, instrument data ingestion, sequence analysis, local BLAST search, mass spectrometry review, legacy data migration, audit trails, reporting, role-based access control, and an assistant with optional OpenAI or local Ollama support that remains read-only unless a user explicitly confirms a supported action.
The project is designed as a lightweight, configurable, production-style foundation for research labs, small biotech teams, core facilities, and developer teams that need more structure than spreadsheets but do not want the cost or complexity of a traditional enterprise LIMS.
Status: OpenLIMS is currently a production-style prototype. It is not yet a fully validated clinical, diagnostic, or regulated production LIMS.
Current development version: v0.38.0 — Lab configuration from Settings.
Hosted deployment addresses and access credentials are intentionally not published in the repository. Authorized users should obtain access details directly from the repository owner.
| Area | Capabilities |
|---|---|
| My Work | Unified assigned-work, workflow-request, experiment, QC, alert, notification, and overdue-work dashboard |
| Samples | Sample lifecycle tracking, aliquots and parent/child lineage, custody, statuses, attachments, custom fields, reason-for-change logging |
| Pipelines | Dependency graphs, parallel and conditional steps, optional work, controlled retries, project/sample-type defaults, assignment by sample/batch/project, failure blocking, QC gates |
| Analyses & procedures | Admin-configurable analysis types, required result schemas, versioned procedures, SOP links, expected duration |
| Projects | Project workspaces, project-scoped visibility, membership, cross-project sample linking, unified sample-to-report workflow view |
| Notebook | Scoped collaborative notebooks, block experiments, immutable revisions, comments, assignments, review/sign-off, locking, cloning, and provenance-rich PDF export |
| Inventory | Site-to-well location hierarchy, generic barcodes, plate maps, reagent/lot metadata, immutable scan ledger, reservations, alerts, and cycle-count reconciliation |
| Workflow Requests | Configurable internal assay forms, triage/approval, SLAs, pipeline assignment, resource reservation, batch/plate grouping, requester messages, execution status, and approved reports |
| Imports | Instrument CSV imports, flexible header detection, direct instrument/API ingestion |
| Migration | Legacy CSV migration profiles, reusable field mappings, preview/dry-run, queued imports, row review |
| External IDs | Preserve legacy sample IDs and aliases from older systems |
| Sequences | FASTA import workflows, sequence workspaces, sequence metadata and features |
| Registry | Configurable biological entity types, immutable versions, aliases, relationships, duplicate detection, review/registration, and physical-material links |
| Molecular Biology | Strict DNA/RNA/protein validation, circular topology, revision diff/restore, biochemical tools, virtual digests, construct assembly, feature libraries, and FASTA/GenBank interchange |
| Alignments | Clustal Omega alignment jobs with downloadable output |
| BLAST | Local BLAST database building and blastn/blastp search |
| Mass Spec | mzML, mzXML, mzData, featureXML, consensusXML, mzID/mzIdentML review using pyOpenMS |
| Audit | Audit events, barcode-scanned custody transfers, reason-for-change tracking, CSV exports |
| Reports | Project summaries, sample inventory, QC review, import summaries, audit activity, comparison and investigation CSV/PDF artifacts |
| Visual analytics | Investigation workbench, multi-sample/project/batch comparisons, result trends, outlier review, workflow bottlenecks, automatic charts |
| Assistant | OpenLIMS Rules, optional OpenAI or Ollama, clarification choices, visible removable context, investigation and comparison follow-ups, confirmed actions with expiring user-bound tokens and audit events |
| Jobs | Celery/Redis background jobs and real-time WebSocket updates |
| Security | HttpOnly browser JWT cookies, CSRF protection, refresh rotation/blacklisting, logout invalidation, role-based permissions, and Bearer JWT support for API clients |
| Localization | Director-controlled, instance-wide English or Spanish UI, including the sign-in screen and workflow pages |
| Shared foundation | Stable public IDs, reusable links and attachments, versioned APIs, OpenAPI documentation, common project permissions and audit payloads, and server-enforced guarded module feature flags |
Samples are the central records in OpenLIMS. A sample can be assigned to a project, placed in a container, linked to results, connected to sequence records, used in BLAST or alignment workflows, associated with mass spectrometry runs, and connected to external IDs from legacy systems.
Supported sample statuses:
| Status |
|---|
RECEIVED |
IN_PROGRESS |
QC |
REPORTED |
ARCHIVED |
OpenLIMS supports controlled status changes with a required reason for change, helping create a stronger chain-of-custody and audit trail.
Projects act as shared workspaces for lab teams. They can contain samples, sequence workspaces, imports, BLAST jobs, alignments, mass spectrometry runs, notes, migration jobs, and project activity.
Project membership controls what non-admin users can see and modify.
A sample has one primary project, but it can also be linked to additional projects. This supports cases where a sample belongs to one study or team but needs to be visible to another project without transferring ownership.
Sample: S-ALPHA-001
Primary Project: PRJ-ALPHA
Linked Projects: PRJ-BETA, PRJ-GAMMA
Linked projects provide visibility, while primary project ownership controls modification and import permissions.
OpenLIMS records directed relationships between source and derived samples for aliquots, splits, derived materials, and pooled components. Lineage links reject self-links and cycles, retain the amount and unit when supplied, and require an audited reason. A derived sample can be created directly from the Traceability workspace while inheriting the source project, linked-project visibility, batch, and applicable default workflow.
Barcode or sample-ID scans can record receipt, check-out, check-in, transfer, storage movement, processing, and disposal. Each custody event preserves the previous and new container and custodian, the operator, scan value, timestamp, and handling reason. Disposal clears physical custody and archives the sample.
OpenLIMS models storage from a physical site down to an individual well:
Site → Building → Laboratory → Room → Freezer → Shelf → Rack → Box → Well
Locations, containers, samples, reagent lots, and registered materials can have generic barcode identities. Scanned operations create immutable transactions for receive, move, transfer, count, consume, adjust, quarantine, disposal, and return. Every quantity transaction records the actor, reason, unit, before and after values, and linked experiment, request, or work item when supplied.
Inventory items and lots retain vendor, catalog, manufacturer, received/opened and expiration dates, cost, storage conditions, chemical identity, hazards, GHS classifications, SDS/COA files, and disposal guidance. Plate maps support well-level placement, while reservations, expiration/reorder alerts, cycle counts, and reconciliation keep available stock auditable.
OpenLIMS supports CSV-based instrument imports and direct API ingestion.
Instrument profiles define:
Some instrument exports include metadata rows before the real CSV header. OpenLIMS can scan for the sample ID column and detect the actual header row.
Instrument,Example Analyzer
Run ID,RUN-001
Operator,Peter
sample_id,result,operator,qc_status
S-ALPHA-001,pass,Peter,PASS
OpenLIMS includes a data migration toolkit for bringing legacy lab database exports into OpenLIMS in a safer, reviewable way.
SISBI / legacy PostgreSQL, MySQL, SQLite, or CSV
↓
Migration profile
↓
Read-only datasets and field mapping
↓
Preview / dry run
↓
Confirm import
↓
Projects, inactive users, samples, metadata, work items, and historical results
The migration toolkit supports:
Database passwords are never stored in OpenLIMS. Configure the password in an
environment variable, enter only that variable's name in the connection, and
use a source account that has SELECT permission only. Remote hosts must also
be listed in MIGRATION_DB_ALLOWED_HOSTS. Each dataset has a row safety limit;
the final commit re-reads and fingerprints the source before writing anything.
Conflict policy is part of that fingerprint. Each committed job records the
objects it created and the original values it changed, allowing a director to
perform a guarded rollback. Rollback is blocked if later related data would be
put at risk.
OpenLIMS can preserve legacy identifiers from older databases or spreadsheets.
Sample: S-UW-001
Source System: UW Legacy DB
Label: legacy_specimen_id
External ID: SP-00921
OpenLIMS includes a read-only assistant for quickly finding and summarizing records inside the system.
The assistant can help users ask questions such as:
The assistant uses safe backend tools as the source of truth. It does not directly modify database records.
The attention summary is permission-filtered and checks samples that have remained in an active status for more than three days, missing sample information, QC review states, aged open work items, failed instrument imports, failed BLAST and alignment jobs, and admin-only system health warnings. Inventory quantity, reservation, reorder, and expiry alerts are also included when they need attention.
| Mode | Description |
|---|---|
| OpenLIMS Rules | Built-in rule-based search and summaries with no external model required |
| OpenAI | Optional external LLM summaries using server-side API configuration |
| Ollama | Optional local LLM summaries using a self-hosted Ollama container |
If an LLM is unavailable, the assistant falls back to OpenLIMS Rules mode.
The rules layer also handles common conversational requests such as greetings, help, the current application date, and the current application time. If a question is unrelated to OpenLIMS but can be answered conversationally, the constrained route classifier can send it to a separate general-conversation prompt. That prompt receives no database records or tool output and cannot run an OpenLIMS action. Requests that appear to require unsupported laboratory data or application operations remain explicit unsupported requests instead of being answered as general chat.
The UI displays the active engine/model, such as:
Using: OpenLIMS Rules
Using: OpenAI · gpt-5
Using: Ollama · llama3.2:1b
Users can:
Sample → FASTA Import → Sequence Workspace → Alignment Job → BLAST Search
OpenLIMS can queue Clustal Omega alignment jobs asynchronously. Alignment jobs store input FASTA, aligned FASTA, sequence count, alignment summary, status, and downloadable output.
OpenLIMS includes local BLAST support using NCBI BLAST+.
Users can:
OpenLIMS includes mass spectrometry support using pyOpenMS and OpenMS-compatible formats.
Supported workflows include:
OpenLIMS records important activity as audit events, including:
For controlled sample status changes, OpenLIMS records actor, before/after state, changed fields, reason for change, and timestamp.
Reports and CSV exports include:
Background jobs run through Celery and Redis. OpenLIMS uses Django Channels and WebSockets to update the frontend when jobs change status.
Supported live-update workflows include:
OpenLIMS uses role-based permissions and project-scoped access control. Browser sessions use HttpOnly JWT cookies with CSRF protection, refresh-token rotation, and logout invalidation. Bearer JWT authentication remains supported for scripts and non-browser API clients.
| Role | Purpose |
|---|---|
| Admin / Director | Full system access |
| Tech | Lab workflow access for assigned projects |
| Viewer | Read-only access |
| Role | Sample Visibility | Modify Samples |
|---|---|---|
| Admin / Director | All samples, including unassigned samples | Yes |
| Tech | Samples in assigned projects, linked project samples, and unassigned samples they created | Only samples they have modification rights for |
| Viewer | Samples in assigned or linked projects | No |
Linked-project access allows a user to see a sample, but it does not automatically grant edit or import permissions.
| Layer | Technology |
|---|---|
| Frontend | React + Vite |
| Production Web | Nginx |
| Backend API | Django REST Framework |
| Database | PostgreSQL |
| Background Jobs | Celery |
| Broker / Cache | Redis |
| Real-Time Updates | Django Channels + Daphne |
| Alignments | Clustal Omega |
| BLAST | NCBI BLAST+ |
| Mass Spec | pyOpenMS |
| Assistant | OpenLIMS Rules, optional OpenAI, optional Ollama |
| Reverse Proxy / TLS Edge | Caddy or another trusted reverse proxy when used |
| Deployment | Docker Compose (development and production) |
High-level architecture:
React Frontend / Production Nginx
↓
Django REST Framework API
↓
PostgreSQL
Redis
↓
Celery Worker
↓
Imports / Migrations / Alignments / BLAST / Mass Spec Jobs
Daphne + Django Channels
↓
WebSocket job updates
OpenLIMS Assistant
↓
Safe read-only backend tools
↓
Optional OpenAI or local Ollama summary
| App | Responsibility |
|---|---|
samples | Sample lifecycle, access control, attachments, transitions |
projects | Projects, membership, project posts |
inventory | Locations and containers |
imports | Instrument profiles, CSV imports, direct instrument ingestion |
migration_toolkit | Legacy CSV migration profiles, field mappings, dry-run previews, imports, and external IDs |
results | Work items and structured results |
events | Audit trail and audit export |
notifications | User notifications |
custom_fields | Configurable fields |
sequences | Sequence records and features |
alignments | Clustal Omega alignment jobs |
blast | BLAST databases, jobs, and hits |
mass_spec | Mass spec uploads, processing, summaries, and comparison |
settings_app | Admin settings |
assistant | Read-only assistant tools, OpenAI/Ollama summaries, and assistant status |
core | Users, roles, permissions, search, shared utilities |
git clone https://github.com/Mokey2002/OpenLIMS.git
cd OpenLIMS
cp deploy/.env.example deploy/.env
Example local environment:
DJANGO_DEBUG=1
DJANGO_SECRET_KEY=dev-secret-key
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1
CSRF_TRUSTED_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
POSTGRES_DB=openlims
POSTGRES_USER=openlims
POSTGRES_PASSWORD=openlims
DB_HOST=db
DB_PORT=5432
CELERY_BROKER_URL=redis://redis:6379/0
CELERY_RESULT_BACKEND=redis://redis:6379/1
CHANNEL_REDIS_URL=redis://redis:6379/2
INSTRUMENT_API_KEY=my-shared-lab-instrument-key
OPENLIMS_ASSISTANT_LLM_ENABLED=false
OPENLIMS_ASSISTANT_LLM_PROVIDER=ollama
OPENLIMS_ASSISTANT_LLM_ROUTING_ENABLED=true
OPENLIMS_ASSISTANT_LLM_ROUTING_MIN_CONFIDENCE=0.65
OLLAMA_BASE_URL=http://ollama:11434
OLLAMA_MODEL=llama3.2:1b
OLLAMA_TIMEOUT_SECONDS=25
docker compose -p openlims -f deploy/docker-compose.yml up -d --build
docker compose -p openlims -f deploy/docker-compose.yml exec api python manage.py migrate
docker compose -p openlims -f deploy/docker-compose.yml exec api python manage.py seed_demo
The command is idempotent and seeds connected demonstrations for projects, samples, batches, custom metadata, lineage, barcode custody, inventory, reservations, scan transactions, plate maps, cycle counts, workflow requests, notebooks and signed experiments, workflows, results, QC, instrument imports, migration previews and rollback, Registry records, Molecular Biology revisions and assembly plans, BLAST, alignments, mass spectrometry, reports, notifications, audit history, shared links and attachments, and assistant confirmations. The seeder does not create, require, display, or change passwords. Existing account credentials are preserved, while newly created demo identities are non-login accounts used for realistic ownership, assignment, QC, and audit history. Sign in with an existing OpenLIMS administrator account to explore the seeded data.
The Registry and Notebook feature flags are enabled for the comprehensive demo. Studies and Insight remain disabled because those modules are still under development.
| Service | URL |
|---|---|
| Frontend | http://localhost:5173 |
| API | http://localhost:8000 |
| Admin | http://localhost:8000/admin |
| Health | http://localhost:8000/api/health/ |
OpenLIMS can run the assistant with a local Ollama model instead of an external LLM provider.
Enable the assistant in deploy/.env:
OPENLIMS_ASSISTANT_LLM_ENABLED=true
OPENLIMS_ASSISTANT_LLM_PROVIDER=ollama
OPENLIMS_ASSISTANT_LLM_ROUTING_ENABLED=true
OPENLIMS_ASSISTANT_LLM_ROUTING_MIN_CONFIDENCE=0.65
OLLAMA_BASE_URL=http://ollama:11434
OLLAMA_MODEL=llama3.2:1b
OLLAMA_TIMEOUT_SECONDS=25
OpenLIMS first uses normalized deterministic routes. If no route matches, the configured model may return a constrained, confidence-gated route hint from a fixed allowlist. OpenLIMS then runs the normal permission checks, frozen previews, and confirmation requirements. Invalid, low-confidence, or unavailable model classifications fall back to an honest rule-based response.
Start the Ollama container:
docker compose -p openlims -f deploy/docker-compose.yml up -d ollama
Pull a small model:
docker compose -p openlims -f deploy/docker-compose.yml exec ollama ollama pull llama3.2:1b
Restart the API and frontend:
docker compose -p openlims -f deploy/docker-compose.yml restart api frontend
The Assistant page will show which engine is active: OpenLIMS Rules, OpenAI, or Ollama.
Run backend tests:
docker compose -p openlims -f deploy/docker-compose.yml exec api pytest -v
Run Django checks:
docker compose -p openlims -f deploy/docker-compose.yml exec api python manage.py check
Run frontend build:
cd frontend
npm ci
npm run build
Run Playwright browser tests after starting a testable OpenLIMS environment:
cd frontend/e2e
npm ci
npx playwright install chromium
npm test
The CI workflow also validates makemigrations --check, production Compose configuration, the production frontend build, secure-cookie authentication, CSRF behavior, /api/v1/ browser traffic, workflow navigation, logout/session invalidation, and the v0.29 performance/pagination regressions.
OpenLIMS includes a health endpoint:
curl http://localhost:8000/api/health/
The health check verifies:
The frontend footer should use the generated frontend/src/version.js file instead of a hardcoded version string.
Recommended footer source:
OpenLIMS {OPENLIMS_VERSION}
The version file can be generated from the latest Git tag during frontend dev/build so the footer stays aligned with releases.
OpenLIMS can run locally, on a private lab server, on a VM, or on cloud infrastructure.
deploy/docker-compose.prod.yml provides the production-style stack introduced in v0.28.1. v0.29.0 improves runtime efficiency on that stack with reusable PostgreSQL connections, optional Redis-backed Django caching, gzip compression, immutable hashed-asset caching, route-level frontend code splitting, and larger bounded API pages. The production stack runs Django under Daphne, serves the built React frontend through Nginx, keeps PostgreSQL and Redis internal by default, persists database/cache/media/static data, includes health checks, and exposes the web service on ${OPENLIMS_HTTP_PORT:-8080}. Ollama remains optional through the llm Compose profile.
Start from the production environment template:
cp deploy/.env.prod.example deploy/.env
Replace placeholder secrets, configure DJANGO_ALLOWED_HOSTS and CSRF_TRUSTED_ORIGINS for the public hostname, and then start the stack:
docker compose -p openlims -f deploy/docker-compose.prod.yml up -d --build
A typical production-style deployment uses:
Trusted TLS reverse proxy / load balancer (optional when TLS is terminated upstream)
↓
Nginx React frontend
↓
Django API / Daphne ASGI
↓
PostgreSQL
Redis
↓
Celery Worker
For real-time updates, the production web tier forwards WebSocket traffic under /ws/* to the Django/Daphne API service.
The production environment template enables the recommended connection/cache settings:
DB_CONN_MAX_AGE=60
CACHE_URL=redis://redis:6379/3
DB_CONN_MAX_AGE reuses healthy PostgreSQL connections instead of reconnecting for each request. Redis database 3 is reserved for Django application caching; Celery broker/results and Channels continue to use Redis databases 0, 1, and 2 respectively.
Create a backup:
docker compose -p openlims -f deploy/docker-compose.prod.yml exec db pg_dump -U openlims openlims > openlims_backup.sql
Restore a backup:
cat openlims_backup.sql | docker compose -p openlims -f deploy/docker-compose.prod.yml exec -T db psql -U openlims openlims
OpenLIMS is a production-style LIMS prototype with many production-shaped patterns already in place:
/api/v1/ browser traffic with compatibility routesRemaining production-readiness work includes:
Planned and future improvements include:
See docs/performance_scalability_v029.md for the v0.29.0 performance and scalability implementation notes and docs/product_hardening_v0281.md for the v0.28.1 product-hardening notes.
OpenLIMS aims to be:
Eduardo L
LinkedIn: https://www.linkedin.com/in/edlemus/
Copyright © 2026 Eduardo Lemus.
OpenLIMS is open-source software licensed under the Apache License 2.0. You may use, modify, and distribute the source code in accordance with the license terms.
Third-party dependencies and bundled components remain subject to their own
licenses. See docs/licensing_history.md for the
project's licensing history.
Python
66.0%
JavaScript
33.3%