For both setup scripts and configure-searxng-safesearch.sh:
- Five whiptail checklist menus: Web · Images · Videos · News · Science
- Pre-populated ON/OFF based on the chosen safe-search level:
none → all engines ON
moderate/strict → no-safe-search engines (mojeek, yandex, baidu, naver,
invidious, piped, peertube, sepiasearch, flickr,
imgur, deviantart, dailymotion, vimeo) default OFF
- User can toggle any engine independently before confirming
- ESC on any menu restores defaults for that category (keeps them unchanged)
- If user re-enables an auto-disabled engine, --enable-engines is passed
to configure script to override the auto-disable
- Text fallback for non-interactive/headless installs
- Summary shows count of disabled engines instead of raw list
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
Setup (both scripts):
- Q6 asks safe-search level: none / moderate / strict
- Then asks which categories to disable: videos images news science social
- Then asks which engines to disable by name (duckduckgo, bing, etc.)
- Choices flow into SEARXNG_QUERY_URL &safesearch=N in docker-compose.yml
- SearXNG summary line added to laptop_full_setup.sh install plan
configure-searxng-safesearch.sh:
- Full rewrite: --disable-categories, --disable-engines, --enable-engines
- Category maps: videos / images / news / science / social engine lists
- --enable-engines overrides auto-disables (e.g. keep yandex on strict)
- Preserves existing secret key on update
- Creates settings.yml from scratch if missing (safe for setup use)
- Help flag (-h/--help)
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
- New configure-searxng-safesearch.sh: set strict/moderate/none level,
disable engines that can't enforce the chosen level (torrent sites,
mojeek, baidu, yandex, nvidious/piped/peertube video frontends),
updates &safesearch= in SEARXNG_QUERY_URL, and restarts searxng
- Add RAG_WEB_SEARCH_RESULT_COUNT=5 and RAG_WEB_SEARCH_CONCURRENT_REQUESTS=10
to Open WebUI env in both setup scripts
- Add &safesearch=0 to SEARXNG_QUERY_URL so the script can find/replace it
- Sync ENABLE_TOOL_SERVERS=true into laptop_full_setup.sh (was missing)
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
- Add WEBUI_URL to .env template and open-webui compose env so sessions
work correctly when served behind Caddy (or any reverse proxy)
- Fix Caddyfile.example to pass X-Forwarded-Proto/Host headers for Open WebUI
- Wrap kiwix-serve command in a wait loop so the container stays healthy
while ZIM files are still downloading (avoids 502 from Caddy)
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
When Docker containers write config files (e.g. searxng/settings.yml),
those files end up owned by root. write_if_new now falls back to
sudo tee when the destination file exists but is not writable.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
- The "select which ZIMs" menu now fires during Q4 (upfront wizard),
alongside the yes/select/no choice, not after docker/models start
- Each ZIM entry shows [downloaded] if a matching .zim already exists
in KIWIX_DIR — skips re-downloading automatically via dl_zim check
- Download phase now uses the pre-captured ZIM_PICKS directly,
no interactive prompt mid-install
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
Both [2/6] and [3/6] prompts now show detected mount points as a
numbered list. Type 0 for default/Docker volume, or 1/2/3 to pick a
drive directly. Typing a path manually still works as fallback.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
The tier table now shows 1–4 numbers so you type 1/2/3/4 instead of
typing "14B" or "32B". Tier names are still accepted as fallback.
Recommended tier is shown as a number (e.g. [2] instead of [14B]).
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
All interactive prompts now use numbered toggles (type a number to
toggle on/off, Enter to confirm) instead of requiring whiptail.
Removed whiptail from apt dependencies in ubuntu-post-install.sh.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
- Top-level menu now just: Full system setup / AI stack
- AI stack opens a second whiptail checklist (same style as
ubuntu-post-install.sh) where each service is individually toggled:
Ollama (always on, core)
Open WebUI · RAG+ChromaDB · MCP Server · SearXNG
Gitea · InvokeAI · Portainer · Kiwix
- Kiwix moved from top-level into the AI stack service list
- Existing containers auto-detected and pre-ticked ON
- MCP dependency on RAG enforced automatically with a warning
- COMPOSE_SERVICES, Done URLs, and summary all driven by per-service
SVC_* flags so only selected services are started/shown
- Text toggle fallback for systems without whiptail
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
Replace fixed model defaults with an interactive wizard:
Origin preference:
1) Western-only — Codestral (Mistral 🇫🇷) · Phi4 · Mistral 7B
2) Performance-first — Qwen2.5 + Qwen2.5-Coder (top benchmarks)
3) Mixed — Western chat/reasoning, Qwen for coding only
4) Custom — free-form model names
Size tier table — speed estimated for the user's actual VRAM with no
hard limits (Ollama already uses all available VRAM via NUM_GPU=999):
✓ fast — fully in VRAM
~ good — fits with small overhang (~reading speed)
✗ slow — partial CPU offload
✗ very slow — heavy CPU offload
Recommended tier shown as suggestion based on VRAM, user can override.
pull-models.sh now bakes in the chosen model names at install time.
REASON_MODEL replaces hardcoded deepseek-r1:14b; skipped if empty or
same as chat model.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
- Docker + Docker Compose check now runs on every invocation (not skipped
on updates), installing if missing — ensures the stack can always run
- Added Docker Compose plugin install as fallback if compose is missing
- NVIDIA Container Toolkit check also always runs (not update-gated)
- Added SSH key import wizard question: import public keys from GitHub
(gh:username) and/or Launchpad (lp:username) using ssh-import-id,
so the machine is accessible over SSH immediately after setup
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
Replace the single-choice component menu with a multi-select checklist
(whiptail if available, text-based toggle fallback). Users now pick any
combination of:
[*] Full system setup — runs ubuntu-post-install.sh (Ubuntu apps,
security hardening, backups, Docker services)
[*] AI stack — Ollama, Open WebUI, RAG, MCP, Gitea, InvokeAI
[*] Kiwix — Offline Wikipedia, Stack Overflow, Arch Wiki
This makes laptop_full_setup.sh the single entry point — run it once,
toggle what you need (like Ubuntu Server's tasksel), leave overnight.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
Gather all setup choices upfront so users can answer questions once and
walk away. Changes:
- Setup wizard asks all questions before any installation begins:
1. Component selection (AI stack / Kiwix / both)
2. Ollama model storage (Docker volume or custom bind-mount path)
3. Kiwix ZIM storage location (detect drives with enough free space)
4. Firewall LAN subnet (auto-detected from current IP)
5. Model downloads (confirm GPU-matched models, optional DeepSeek-R1)
6. ZIM downloads (all / select / skip)
- Shows a summary and asks for confirmation before doing anything
- Ollama supports bind-mount to custom path (e.g. /mnt/ssd/ollama)
- Kiwix ZIM dir is configurable (separate large drive)
- Model pull runs unattended at end using upfront answer
- ZIM downloads integrated inline (no need to run kiwix_download.sh
separately) — background wget with progress log
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
Healthcheck tools (wget/curl) are not reliably available in the
chromadb image. Removing the healthcheck and switching rag-server
depends_on to service_started avoids the unhealthy container error.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
- Show menu at startup to select: full stack, AI stack only, or Kiwix only
- Gate server files, SearXNG config, docker compose up, model pull,
and summary URLs based on selection
- Fix ChromaDB healthcheck: wget → curl, /api/v2/ → /api/v1/heartbeat
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
NVIDIA dropped the distro-specific repo URL in favour of a single
stable path. Also pass --yes to gpg --dearmor to avoid the interactive
overwrite prompt on re-runs.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
ubuntu-post-install.sh now embeds both companion scripts as single-quoted
heredocs written to mktemp files at runtime. No external files, git clone,
or internet access needed for [A] Local AI stack or [Z] Download ZIMs —
the single script is the only file required.
local-ai-setup.sh → embedded at lines 1084-1922 (LOCAL_AI_SETUP_EOF)
kiwix_download.sh → embedded at lines 2022-2221 (KIWIX_DOWNLOAD_EOF)
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
Adds two new top-level menu choices to the installation mode selector:
[A] Local AI stack — finds or clones local-ai-setup.sh, asks which
mounted drive to use for Ollama models and Kiwix ZIM files, runs
the installer as the actual user, then patches docker-compose.yml
for alternate storage if selected.
[Z] Download ZIMs — finds or clones kiwix_download.sh, shows
mounted drives, optionally redirects the download via KIWIX_DIR,
then runs the downloader as the actual user in the background.
Both functions locate their scripts alongside ubuntu-post-install.sh
first, then ~/local-ai/, then fall back to cloning outis1one/local-ai.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
Scans mounted drives, shows size/free space, prompts user to assign drives
for Kiwix ZIM files and Ollama model storage, then patches docker-compose.yml
in place with a backup.
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
- laptop_full_setup.sh now handles both fresh install and updates cleanly
(detects existing install, --force flag to overwrite config files)
- server.py: standalone RAG server with AST-aware code chunking (Python),
pattern-split for JS/TS/Go, /ingest/repo and /webhook/gitea|github endpoints
- mcp_server.py: new MCP server (port 8002/SSE) with Claude Code-equivalent
tools: bash, file ops, ripgrep search, git ops, Gitea API, GitHub API,
RAG repo ingest
- docker-compose: adds mcp-server service, workspace volume, env_file for tokens
- .env preserved on update (tokens never overwritten)
- GPU: OLLAMA_NUM_GPU=999 auto-adapts to any VRAM size (no hard-coded 6GB)
- ZIM downloads remain in kiwix_download.sh (separate, large files)
https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx