Install Cinestar
Follow these quick steps to run Cinestar on your Mac.
macOS
-
Download the latest Cinestar.app from the SourceForge Files section.
-
Move
Cinestar.app
to /Applications
.
-
If macOS blocks the app (Gatekeeper), clear the quarantine attributes:
sudo xattr -c -r /Applications/Cinestar.app
If the app is still in Downloads:
sudo xattr -c -r ~/Downloads/Cinestar.app
-
Right-click the app and choose Open the first time to allow it through Gatekeeper.
Notes: The first run may take longer while models initialize. All processing runs locally.
Build from source (optional)
- Install Node.js 18+ and npm.
- Clone the source repository.
- Inside the project root run:
npm install
npm run dev # start Electron in dev mode
# or
npm run build # produce a packaged app
AI Services Setup
Ollama local install is required for AI services. All processing runs locally on your machine.
Cinestar uses local AI services: Ollama (for BGE embeddings, Moondream vision, and Llama 3.2) for all AI processing.
Ollama Setup (Required)
-
Install Ollama:
# macOS/Linux - Quick install
curl -fsSL https://ollama.com/install.sh | sh
# Windows - Download .exe from ollama.com/download
-
Pull the required AI models:
These models will be downloaded automatically on first pull (~2-4GB total)
# Embedding model for semantic search
ollama pull bge-large
# Vision model for image/video captioning
ollama pull moondream:v2
# Language model for general tasks
ollama pull llama3.2:3b
-
Verify models are ready:
# List installed models
ollama list
# Test a model (optional)
ollama run llama3.2:3b "Hello, are you working?"
-
Launch Cinestar app - Ollama will automatically start as a system service when needed.
✅ Benefits: Better performance, easier model management, direct access to Ollama CLI, faster startup times, automatic model updates.
Health checks
# Check Ollama
ollama list
# Test Ollama API
curl http://localhost:11434/api/tags
Manage Ollama
# Ollama runs as a system service and typically doesn't need manual stopping
# To restart Ollama (if needed):
# macOS: Quit Ollama from menu bar
# Linux: systemctl restart ollama
Docker Compose Configuration
Complete docker-compose.yml
file for running AI services:
# Drillbit AI Services
# Docker Compose setup for the AI services required by Drillbit desktop app
# The Drillbit app itself runs as a native desktop application, not in Docker
version: '3.8'
x-ollama: &ollama
image: ollama/ollama:${OLLAMA_DOCKER_TAG:-latest}
volumes:
- ${OLLAMA_MODELS:-~/.ollama}:/root/.ollama
environment: &env
OLLAMA_KEEP_ALIVE: ${OLLAMA_KEEP_ALIVE:--1}
OLLAMA_LOAD_TIMEOUT: ${OLLAMA_LOAD_TIMEOUT:-5m}
OLLAMA_MAX_LOADED_MODELS: ${OLLAMA_MAX_LOADED_MODELS:-3}
OLLAMA_NUM_PARALLEL: ${OLLAMA_NUM_PARALLEL:-5}
OLLAMA_FLASH_ATTENTION: ${OLLAMA_FLASH_ATTENTION:-0}
OLLAMA_DEBUG: ${OLLAMA_DEBUG:-0}
OLLAMA_HOST: 0.0.0.0
restart: unless-stopped
deploy:
resources:
limits:
memory: 6G
reservations:
memory: 4G
services:
# Primary Ollama instance
ollama-1:
<<: *ollama
container_name: drillbit-ollama-1
environment:
<<: *env
CUDA_VISIBLE_DEVICES: ${CUDA_DEVICE_1:-0}
healthcheck:
test: ["CMD", "ollama", "list"]
interval: 15s
timeout: 10s
retries: 5
start_period: 30s
# Secondary Ollama instance (optional, for load balancing)
ollama-2:
<<: *ollama
container_name: drillbit-ollama-2
environment:
<<: *env
CUDA_VISIBLE_DEVICES: ${CUDA_DEVICE_2:-1}
healthcheck:
test: ["CMD", "ollama", "list"]
interval: 15s
timeout: 10s
retries: 5
start_period: 30s
profiles: ["multi-gpu"] # Only start with --profile multi-gpu
# Load balancer for multiple Ollama instances
ollama-lb:
container_name: drillbit-ollama-lb
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "${OLLAMA_LB_PORT:-9001}:11434"
depends_on:
ollama-1:
condition: service_healthy
ollama-2:
condition: service_healthy
restart: unless-stopped
profiles: ["multi-gpu"] # Only start with --profile multi-gpu
# Main Ollama service (single instance)
ollama:
<<: *ollama
container_name: drillbit-ollama
ports:
- "${OLLAMA_PORT:-11434}:11434"
healthcheck:
test: ["CMD", "ollama", "list"]
interval: 15s
timeout: 10s
retries: 5
start_period: 30s
# Whisper transcription service
whisper:
image: onerahmet/openai-whisper-asr-webservice:latest
container_name: drillbit-whisper
ports:
- "${WHISPER_PORT:-9000}:9000"
environment:
- ASR_MODEL=${WHISPER_MODEL:-base.en}
- ASR_ENGINE=${WHISPER_ENGINE:-faster_whisper}
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/"]
interval: 30s
timeout: 10s
retries: 3
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 2G
volumes:
ollama_models:
driver: local
Nginx Load Balancer Configuration
Complete nginx.conf
file for load balancing AI services:
events {
worker_connections 2048;
}
http {
# Specialized Ollama upstreams for different tasks
# Embedding service (search, BGE-large, llama3.2:3b for text)
upstream embed_backend {
server ollama-embed:11434 max_fails=3 fail_timeout=30s;
}
# Vision/Captioning service (moondream:v2)
upstream caption_backend {
server ollama-caption:11434 max_fails=3 fail_timeout=30s;
}
# Whisper transcription service
upstream whisper_backend {
server whisper:9000 max_fails=3 fail_timeout=30s;
}
# Unified load balancer on port 9001
server {
listen 9001;
listen [::]:9001;
# Embedding service routes (search, BGE-large, tinyllama)
location /embed/ {
proxy_pass http://embed_backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Optimized timeouts for embedding generation
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Handle streaming responses
proxy_buffering off;
proxy_cache off;
}
# Vision/Captioning service routes (moondream:v2)
location /caption/ {
proxy_pass http://caption_backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Extended timeouts for vision model processing
proxy_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# Handle streaming responses
proxy_buffering off;
proxy_cache off;
}
# Whisper ASR routes
location /asr {
proxy_pass http://whisper_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Increase timeouts for transcription requests
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# Increase buffer sizes for large audio files
client_max_body_size 100M;
# Handle large file uploads
proxy_buffering off;
proxy_request_buffering off;
# Keep connections alive
proxy_http_version 1.1;
proxy_set_header Connection "";
}
# Health check endpoint
location /health {
access_log off;
return 200 "nginx load balancer healthy\n";
add_header Content-Type text/plain;
}
}
}