* docs: one canonical install path, first-run flow that ends in a working chat
- Install guides download the shipped docker-compose.yml instead of pasting
divergent copies; variants (Ollama in Docker, Ollama on the host, LM Studio)
are shown as docker-compose.override.yml diffs.
- New canonical "Connect a provider" section in 4-AI-PROVIDERS with the real UI
labels (Add Configuration, Test, Models/Discover Models, Add, Auto-assign
Defaults) and a final test chat; every install path links to it.
- Docker settings go in the open_notebook environment block and are applied
with `docker compose up -d`; .env only fills ${...} placeholders.
- Fix single-container /mydata volume and root:root requirement, external
Ollama on Linux (extra_hosts + OLLAMA_HOST=0.0.0.0), from-source SURREAL_URL,
prerequisites (Python 3.11-3.12, Node 20.9+, ffmpeg), wrong service names,
down -v, backups and updates.
- Provider table regenerated from provider_registry.py (24 providers, with
modalities); retired models and prices removed.
- Merge the OpenAI quick start into the cloud one (pointer left behind).
- README: license badge, provider matrix, languages, roadmap -> VISION.md.
- docs/index.md reduced to one navigation table, version stamp removed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: address review (network exposure, key generation, Ollama reachability, migration)
- Warn before the first `docker compose up -d` that 8502/5055 are published on
all interfaces with no password; offer 127.0.0.1 binding or
OPEN_NOTEBOOK_PASSWORD. Narrow the local quick start's privacy claim.
- No literal encryption keys: placeholders plus generate commands
(openssl, PowerShell, `uv run python -c secrets`).
- Host Ollama: Docker Desktop usually works as is, with an OLLAMA_HOST
fallback for macOS/Windows; stronger exposure caveat for 0.0.0.0.
- Single container: copy /mydata out of the container before removing it.
- Vertex AI form fields; local providers need no key; Add Source menu wording.
- from-source: SURREAL_URL=127.0.0.1, INTERNAL_API_URL when the API port
changes, mention `make start-all` (fixed on main).
- Windows: quote rocksdb paths. README: Italian, key optional for local.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* docs: launchctl setenv is not persistent; restart Ollama after setting OLLAMA_HOST
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
10 KiB
Windows Native Installation (No Docker)
This guide runs Open Notebook on Windows natively, without Docker or WSL. It is community-maintained; the officially supported route is Docker Compose.
Who Is This For?
- Windows ARM64 users: Docker Desktop and WSL2 have limitations on ARM64
- Users without Hyper-V: some Windows editions can't run Docker Desktop
- Users who prefer native installs: fewer layers, easier debugging
Prerequisites
| Software | Installation | Notes |
|---|---|---|
| Git | winget install Git.Git |
|
| uv | winget install astral-sh.uv |
Also installs a matching Python for you |
| Python 3.11 or 3.12 | Installed by uv sync |
3.13+ is not supported yet |
| Node.js 20.9+ | winget install OpenJS.NodeJS.LTS |
Next.js 16 requires 20.9 or later |
| SurrealDB 2.x | SurrealDB releases or scoop install surrealdb |
Use a 2.x release: the Docker setup pins surrealdb:v2 |
| ffmpeg | winget install Gyan.FFmpeg |
Needed for audio/video sources and podcasts |
Quick Start
-
Clone and install:
cd %USERPROFILE%\Projects git clone https://github.com/lfnovo/open-notebook.git cd open-notebook uv sync cd frontend && npm install && cd .. -
Create
.env: generate an encryption key withuv run python -c "import secrets; print(secrets.token_hex(32))"then copy
.env.exampleto.envand change these two lines, pasting the generated value as the key (never an example value). Keep it: if it changes, saved API keys can't be decrypted.OPEN_NOTEBOOK_ENCRYPTION_KEY=<the value you generated> SURREAL_URL="ws://127.0.0.1:8000/rpc"Use
127.0.0.1, notlocalhostand notsurrealdb(see Issue 2). You add AI provider keys in the UI later, not in.env. -
Start the four services, each in its own terminal, from the
open-notebookfolder.Open Notebook does not ship a launcher script. Start the services manually as below, or wrap them in your own
.bat(see Optional: one-click launcher).REM Terminal 1 — SurrealDB (database files go in the folder you name here) surreal start --user root --pass root --bind 127.0.0.1:8000 "rocksdb:%USERPROFILE%\Projects\open-notebook-data\surrealdb" REM Terminal 2 — API uv run --env-file .env run_api.py REM Terminal 3 — Worker (module form avoids the Windows "canonicalize" error, see Issue 3) set PYTHONPATH=%CD% uv run --env-file .env python -m surreal_commands.cli.worker --import-modules commands REM Terminal 4 — Frontend cd frontend && npm run dev -
Open the app at http://127.0.0.1:3000.
-
Connect a provider: follow Connect a provider. It ends with a test chat; chat won't work until the default models are set. A local Ollama is at
http://127.0.0.1:11434.
Where your data lives
- Database: the folder you pass to
surreal start(above:%USERPROFILE%\Projects\open-notebook-data\surrealdb). Keeping it outside the code folder protects it when you reinstall. - Uploads and chat checkpoints: always in the
data\folder insideopen-notebook\. The path is fixed inopen_notebook/config.pyand can't be changed with an environment variable. Back it up together with the database.
Optional: one-click launcher
Open Notebook does not ship a launcher, but you can save the following as
start-open-notebook.bat (anywhere you like) to start all four services with a
double-click. Adjust ROOT and DB_DIR to match your setup.
@echo off
REM --- adjust these two paths ---
set ROOT=%USERPROFILE%\Projects\open-notebook
set DB_DIR=%USERPROFILE%\Projects\open-notebook-data\surrealdb
set PYTHONPATH=%ROOT%
cd /d %ROOT%
start "SurrealDB" surreal start --user root --pass root --bind 127.0.0.1:8000 "rocksdb:%DB_DIR%"
start "API" cmd /k "uv run --env-file .env run_api.py"
start "Worker" cmd /k "uv run --env-file .env python -m surreal_commands.cli.worker --import-modules commands"
start "Frontend" cmd /k "cd /d %ROOT%\frontend && npm run dev"
Then open http://127.0.0.1:3000.
Optional: production frontend build
npm run dev is the development server: it compiles pages on demand and runs
with development overhead, unlike what the Docker image runs. For day-to-day use you can build once and serve the
standalone output, which is exactly what the container does (node server.js):
cd frontend
npm run build
REM The standalone output does not include static assets — copy them in
REM (the Dockerfile does the same with COPY). Without this the UI loads unstyled.
xcopy .next\static .next\standalone\.next\static /E /I /Y
xcopy public .next\standalone\public /E /I /Y
cd .next\standalone
set PORT=8502
set HOSTNAME=127.0.0.1
node server.js
Then open http://127.0.0.1:8502. Re-run the build and both xcopy lines after
every upgrade.
Critical Windows Fixes
Issue 1: Wrong Python Version
Symptom:
ModuleNotFoundError: No module named 'langgraph.checkpoint.sqlite'
Traceback shows system Python (e.g., C:\Python314\) instead of venv.
Cause: Windows may have multiple Python versions. The venv's activate.bat doesn't always override correctly.
Solution: Use uv run instead of direct python calls:
REM Wrong:
.venv\Scripts\python.exe run_api.py
REM Correct:
uv run python run_api.py
Issue 2: Database Health Check Timeout
Symptom:
WARNING: Database health check timed out after 2 seconds
Frontend shows "Database is offline" even though SurrealDB is running.
Cause: .env uses localhost but SurrealDB binds to 127.0.0.1.
Solution: In .env, change:
# Wrong:
SURREAL_URL="ws://localhost:8000/rpc"
# Correct:
SURREAL_URL="ws://127.0.0.1:8000/rpc"
Issue 3: Worker "Failed to canonicalize script path"
Symptom:
Failed to canonicalize script path
Cause: The surreal-commands-worker.exe can't find the Python commands module.
Solution: Use Python module invocation with PYTHONPATH:
set PYTHONPATH=%ROOT%
uv run --env-file .env python -m surreal_commands.cli.worker --import-modules commands
Upgrading
When a new version is released:
cd open-notebook
git pull
uv sync
cd frontend && npm install && cd ..
Then restart all services. Your .env and data are preserved.
Migrating from a Docker Install
If you already run Open Notebook with the stock docker-compose.yml, you can
move to a native install without re-importing anything: the compose file
bind-mounts ./surreal_data and ./notebook_data, so the database and uploads
already live on your Windows disk.
Run the docker compose commands below from the folder that contains your
docker-compose.yml, so they work whatever your container names are.
-
Match the SurrealDB version. A native
surrealof the same version can open the existing RocksDB files directly. Check the container's version:docker compose exec surrealdb /surreal versionand download the matching Windows binary from the SurrealDB releases.
-
Back up first while the containers are still running:
surreal export --endpoint http://127.0.0.1:8000 --username root --password <your-password> ^ --namespace open_notebook --database open_notebook backup.surql -
Remove the containers. Stopping is not enough: the stock compose file uses
restart: always, so Docker Desktop would start them again on its next launch and they would fight the native services over ports 8000 and 5055.downremoves the containers but keeps the bind-mountedsurreal_dataandnotebook_datafolders (do not add-v);docker compose up -dbrings the Docker setup back if you need to roll back:docker compose down -
Start SurrealDB on the existing data (path from the compose file's
rocksdb:/mydata/mydatabase.db):surreal start --user root --pass <your-password> --bind 127.0.0.1:8000 "rocksdb:surreal_data\mydatabase.db" -
Fix what only made sense inside the container, before starting the API and worker. Run these in
surreal sql(namespace/databaseopen_notebook):-- Credentials that reached host services (Ollama, local embedding servers) -- through host.docker.internal now run on the same machine: UPDATE credential SET base_url = string::replace(base_url, 'host.docker.internal', '127.0.0.1') WHERE base_url CONTAINS 'host.docker.internal'; -- A job that was running when the container stopped stays 'running' forever; -- put it back in the queue (the worker picks up 'new' jobs on startup): UPDATE command SET status = 'new' WHERE status = 'running'; -
Start the API, worker and frontend as described above.
Known limitation: sources uploaded inside Docker store absolute container
paths such as /app/data/uploads/<file>.pdf, which do not resolve on Windows.
Their extracted text, notes and embeddings are unaffected — search and chat keep
working — but features that re-read the original file (re-processing, download)
will not find it for those older sources. New uploads are fine.
Services & Ports
| Service | Port | URL |
|---|---|---|
| SurrealDB | 8000 | ws://127.0.0.1:8000 |
| API | 5055 | http://127.0.0.1:5055/docs |
| Frontend | 3000 | http://127.0.0.1:3000 |
Troubleshooting
Services won't start
- Check if ports are in use:
netstat -ano | findstr :8000 - Kill existing processes:
taskkill /F /PID <pid>
Frontend can't connect to API
- Verify the API is running: http://127.0.0.1:5055/docs
- Open the UI at
http://127.0.0.1:3000. The frontend derives the API address from the address you use (http://127.0.0.1:5055), and the API only listens on127.0.0.1by default.
Worker not processing commands
- Check the Worker window for errors
- Verify
PYTHONPATHis set to theopen-notebookfolder in that terminal
Contributing
Found another Windows-specific issue? Please share your solution!
Tested on Windows 11 ARM64 with Open Notebook v1.6.0 Docker migration and production frontend build tested on Windows 11 x64 with Open Notebook v1.14.0 and SurrealDB 2.6.5 Created: January 2026