A lightweight, local browser UI for inspecting and managing ChromaDB vector databases. Built with Flask, no external dependencies beyond Python.
- Collection Browser - View all collections with document counts and metadata
- Document Viewer - Browse documents with pagination, view content and metadata
- Semantic Search - Query collections using natural language
- Document Management - Add and delete documents through the UI or API
- Collection Management - Create and delete collections
- REST API - Full API for programmatic access
- Systemd Support - Run as a user service on Linux
- Python 3.10+
- ChromaDB database (local persistent storage)
# Clone the repository
git clone https://github.com/larkins/chromaFLUI.git
cd chromaFLUI
# Create virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Configure
cp .env.example .env
# Edit .env and set CHROMADB_PATH to your ChromaDB location
# Run
python app.pyOpen http://localhost:5012 in your browser.
Run as a background service:
bash systemd/install.sh
systemctl --user start chromafluiCommands:
| Action | Command |
|---|---|
| Start | systemctl --user start chromaflui |
| Stop | systemctl --user stop chromaflui |
| Status | systemctl --user status chromaflui |
| Logs | journalctl --user -u chromaflui -f |
| Uninstall | bash systemd/uninstall.sh |
| Variable | Description | Default |
|---|---|---|
FLASK_SECRET_KEY |
Secret key for sessions | Required |
CHROMADB_PATH |
Path to ChromaDB storage | Required |
app:
name: ChromaDB Flask UI
debug: false
server:
host: "0.0.0.0"
port: 5012
chromadb:
path: "${CHROMADB_PATH}"
tenant: default_tenant
database: default_database
ui:
items_per_page: 50
dark_mode: false
show_scores: true
logging:
level: INFO| Method | Endpoint | Description |
|---|---|---|
| GET | / |
Web UI homepage |
| GET | /api/collections |
List all collections |
| GET | /api/collections/<name> |
Get collection details |
| GET | /api/collections/<name>/documents |
List documents (params: limit, offset) |
| POST | /api/collections/<name>/search |
Semantic search (body: query, n_results, where) |
| POST | /api/collections/<name>/documents |
Add document (body: document, id, metadata) |
| DELETE | /api/collections/<name>/documents/<id> |
Delete document |
| POST | /api/collections |
Create collection (body: name, metadata) |
| DELETE | /api/collections/<name> |
Delete collection |
curl -X POST http://localhost:5012/api/collections/memories/search \
-H "Content-Type: application/json" \
-d '{"query": "python programming", "n_results": 5}'pip install -r requirements.txt
pip install pytest ruff black mypypython -m pytest tests/ -vruff check .
black .
mypy . --ignore-missing-importschromaFLUI/
├── app.py # Flask application
├── chroma_client.py # ChromaDB client wrapper
├── config.yaml # Application config
├── .env # Environment variables
├── requirements.txt # Dependencies
├── templates/ # Jinja2 HTML templates
│ ├── base.html
│ ├── index.html
│ └── collection.html
├── static/ # CSS and JavaScript
│ ├── css/style.css
│ └── js/app.js
├── systemd/ # Systemd service files
│ ├── chromaflui.service
│ ├── install.sh
│ └── uninstall.sh
└── tests/ # Test suite
├── test_api.py
└── test_chroma_client.py
| Issue | Solution |
|---|---|
| ChromaDB locked | Only one process can access ChromaDB at a time. Stop other services using it. |
| Import errors | Ensure virtual environment is activated: source .venv/bin/activate |
| Port 5012 in use | Change port in config.yaml |
| No documents showing | Verify CHROMADB_PATH points to correct directory |
| Permission denied | Ensure user has read/write access to ChromaDB path |
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests and lint (
pytest tests/ -v && ruff check .) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.