# Clone the repository
git clone https://github.com/RecNes/nunti.git
cd nunti
# Copy and configure environment
cp .env.example .env
# Edit .env and set at least one AI provider API key
# Start with internal PostgreSQL and Redis
docker compose --profile internal up
Open http://localhost:8000 in your browser.
# Windows (PowerShell)
cp .env.example .env
# Set DEVELOPMENT=True in .env
.\start.ps1
# Linux / macOS
cp .env.example .env
# Set DEVELOPMENT=True in .env
./start.sh
Note: Local mode uses SQLite (no PostgreSQL needed). Redis is still required for the worker and scheduler — the startup script will auto-start a Redis container if Docker is available.
| Dependency | Version | Required For |
|---|---|---|
| Python | 3.11+ | Application runtime |
| Redis | 6.x+ | Task queue & schedule coordination |
| PostgreSQL | 13+ | Production database (optional in dev) |
| Dependency | Purpose |
|---|---|
| Docker & Docker Compose | Containerized deployment |
| An AI provider API key | Translation & summarization (OpenAI, Anthropic, etc.) |
git clone https://github.com/yourusername/nunti.git
cd nunti
cp .env.example .env
Edit .env with your preferred settings. At minimum, you need:
# Enable development mode (uses SQLite — no PostgreSQL needed)
DEVELOPMENT=True
# Set at least one AI provider API key
OPENAI_API_KEY=sk-your-key-here
Using uv (recommended — 10-100x faster than pip):
# Install uv if you don't have it
pip install uv
# Create virtual environment and install dependencies
uv venv .venv
source .venv/bin/activate # Linux/macOS
# OR
.venv\Scripts\activate # Windows (PowerShell)
uv pip install -e .
Using pip:
python -m venv .venv
source .venv/bin/activate # Linux/macOS
# OR
.venv\Scripts\activate # Windows (PowerShell)
pip install -e .
The application requires Redis for background task processing. If you have Docker available, the startup scripts will automatically start a Redis container. Otherwise, install Redis manually:
Windows (using Docker):
docker run -d --name hn-redis -p 6379:6379 redis:6-alpine
Linux (apt):
sudo apt install redis-server
sudo systemctl start redis
macOS (Homebrew):
brew install redis
brew services start redis
Windows (PowerShell):
# Start all services (server + worker + scheduler + auto Redis)
.\start.ps1
# Or start only the web server
.\start.ps1 -Mode server
# Start all services except auto-Redis
.\start.ps1 -Mode all
Linux/macOS/Git Bash:
chmod +x start.sh
# Start all services (server + worker + scheduler)
./start.sh all
# Or start only the web server
./start.sh server
Start each service in a separate terminal:
# Terminal 1: Database migration (first run only)
alembic upgrade head
# Terminal 2: Web server
nunti server
# Terminal 3: Worker
nunti worker
# Terminal 4: Scheduler
nunti scheduler
Note: The
nuntiCLI command is installed automatically when you runpip install -e .
# Starts server, worker, and scheduler in separate processes
nunti all
Open http://localhost:8000 in your browser.
# Clone and configure
git clone https://github.com/yourusername/nunti.git
cd nunti
cp .env.example .env
# Edit .env with your database and Redis connection details
# Set DEVELOPMENT=False for production mode
# Start the application (expects external db & redis)
docker compose up
This starts three containers:
nunti-app — FastAPI web server on port 8000nunti-worker — Arq background workernunti-scheduler — Cron schedulerAll services use network_mode: host for direct connectivity to your external services.
docker compose --profile internal up
This starts five containers:
nunti-app — Web servernunti-worker — Workernunti-scheduler — Schedulerdb — PostgreSQL 13redis — Redis 6 AlpineThe --profile internal flag activates the database and Redis services that are otherwise disabled in the default profile.
docker compose -f docker-compose.dev.yml --profile internal up
The development compose file provides:
--reload flag on uvicorn)Note: The development compose file uses
profiles: ["internal"]so all services must be explicitly activated with--profile internal.
If you’re using a private Docker registry, set the environment variable:
export DOCKER_REGISTRY=your-registry.example.com
docker compose up
The images will be tagged as ${DOCKER_REGISTRY}/nunti:latest.
| Variable | Default | Description |
|---|---|---|
DEVELOPMENT |
False |
If True, uses SQLite; if False, uses PostgreSQL |
DB_ECHO |
False |
Log all SQL queries (debugging) |
DATABASE_USER |
postgres |
PostgreSQL username |
DATABASE_PASSWORD |
postgres |
PostgreSQL password |
DATABASE_HOST |
localhost |
PostgreSQL host |
DATABASE_PORT |
5432 |
PostgreSQL port |
DATABASE_NAME |
nunti_db |
PostgreSQL database name |
REDIS_HOST |
localhost |
Redis host |
REDIS_PORT |
6379 |
Redis port |
REDIS_DB |
0 |
Redis database number |
REDIS_USERNAME |
(empty) | Redis username (if using ACL) |
REDIS_PASSWORD |
(empty) | Redis password |
OPENAI_API_KEY |
(empty) | OpenAI API key |
ANTHROPIC_API_KEY |
(empty) | Anthropic API key |
DEEPSEEK_API_KEY |
(empty) | DeepSeek API key |
OPENROUTER_API_KEY |
(empty) | OpenRouter API key |
GEMINI_API_KEY |
(empty) | Google Gemini API key |
The application supports multiple AI providers simultaneously. API keys are read exclusively from .env and are never stored in the database or exposed to the frontend.
Provider Priority:
.envMigrations are handled by Alembic and run automatically on startup in Docker. For manual control:
# Create a new migration
alembic revision --autogenerate -m "description"
# Apply pending migrations
alembic upgrade head
# Rollback one migration
alembic downgrade -1
# View migration history
alembic history
curl http://localhost:8000/health
# Response: {"status": "healthy"}
curl http://localhost:8000/api/settings/schedule-status
curl http://localhost:8000/api/stories/
# Test Redis connectivity
redis-cli ping
# Expected: PONG
# Check Redis keys
redis-cli keys 'nunti:*'
# Check worker logs
nunti worker
# Test schedule synchronization
nunti test-schedule
If you encounter permission errors with the Docker volumes:
# Reset volume permissions
docker compose down -v
docker compose --profile internal up
```bash
pg_isready -h localhost -p 5432
docker exec -it nunti-app psql -h $DATABASE_HOST -U $DATABASE_USER -d $DATABASE_NAME