Commit Graph
69 Commits
Author SHA1 Message Date
Claude 7fa91e9816 Add Quadro RTX 5000 NVLink budget build guide and Qwen 3.5 models
Research and document the $850 budget build: 2x Quadro RTX 5000 (16GB each)
connected via NVLink for 32GB unified VRAM. With Qwen 3.5's Gated Delta
Network architecture (Feb 2026), this setup runs the 35B-A3B MoE model
with full 262K context in ~25GB — the best price-to-capability ratio
for local AI coding available.

Includes:
- Exact NVLink bridge part numbers (RTX 5000 uses unique smaller connector)
- Motherboard/PSU requirements and slot spacing guidance
- llama.cpp and Ollama multi-GPU configuration
- VRAM budget calculations for all Qwen 3.5 model sizes
- Phased build plan (start with 1 card at $400, add second later)
- Updated model table with full Qwen 3.5 family specs
- Cost comparison vs RTX 8000, RTX 3090, Claude Max, and API pricing

https://claude.ai/code/session_01PtYTPherSJaxDEVPgF6Nxu
2026-03-22 15:57:24 +00:00
Claude 8646dca2bb Fix RTX 8000 pricing: $2,000-2,900 realistic, not $750
The $750 listing was a single outlier. Actual market price for
Quadro RTX 8000 Passive 48GB is $2,000-2,900 on eBay. Updated
all recommendations and cost comparisons accordingly.

https://claude.ai/code/session_01PtYTPherSJaxDEVPgF6Nxu
2026-03-22 14:32:28 +00:00
Claude a14a45bce6 Major update: 48GB GPU analysis with RTX 8000 as best value
- Added full 48GB GPU market comparison (RTX 8000, A40, A6000, L40, RTX 6000 Ada)
- Quadro RTX 8000 Passive at $750-1,400 is 4-5x cheaper than alternatives
- Added RTX 8000 LLM benchmarks (34 t/s on 30B models at 8K context)
- Explained why 48GB >> 24GB for coding: context window is the bottleneck
- Added 2026 coding model landscape (Qwen3.5 27B, Qwen3-Coder, etc.)
- Revised recommendations: RTX 8000 as primary, dual P40 as budget alt
- Updated config notes for 48GB (32K context, higher quantization options)
- All prices verified from real listings as of March 22, 2026

https://claude.ai/code/session_01PtYTPherSJaxDEVPgF6Nxu
2026-03-22 14:29:58 +00:00
Claude a4e0ebc1bd Update GPU research with real March 2026 prices and 32B model analysis
- Corrected all GPU prices to actual eBay/Newegg listings as of March 22, 2026
- Added analysis of 32B coding models (Qwen2.5-Coder 32B, Qwen3.5 27B) on 24GB VRAM
- Added honest comparison of local LLM quality vs Claude Code
- Revised recommendations: dual P40 ($400-500) or P40+T4 ($400-550)
- Added configuration notes for 32B models, dual-GPU, and newer Qwen3 models
- RTX A4000 at $700+ is too expensive for this build

https://claude.ai/code/session_01PtYTPherSJaxDEVPgF6Nxu
2026-03-22 14:21:02 +00:00
Claude 14da24c02b Add GPU setup research for rack server AI workloads
Research comparing P40, A2000, T4, and M40 GPUs for LLM inference
and image generation in Dell R720/R730 rack servers. Includes
benchmarks, compatibility notes, pricing, and recommendations.

https://claude.ai/code/session_01PtYTPherSJaxDEVPgF6Nxu
2026-03-22 14:12:46 +00:00
Outis 063a7b6db1 Merge pull request #20 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-21 14:54:51 -04:00
Claude f0eca342a7 fix kiwix 502: map host:8181 to container:80 (kiwix default port)
kiwix-serve binds to port 80 by default; the previous mapping to 8080
caused a 502. Change port mapping to 8181:80 and drop --port flag.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 18:53:33 +00:00
Claude 9306fe312e fix kiwix 502: bind to port 8080 to match docker port mapping
kiwix-serve defaults to port 80 but the compose mapping is 8181:8080,
causing a 502. Add --port 8080 to the serve command.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 18:46:40 +00:00
Outis fbb9c76c01 Merge pull request #19 from outis1one/claude/cleanup-setup-webui-bCgPE
fix kiwix crash-loop when no ZIM files present
2026-03-21 14:26:51 -04:00
Claude 2912208f87 fix kiwix crash-loop when no ZIM files present
Replace subshell ls expansion (which produces no args when /data is empty)
with a conditional: serve ZIM files if they exist, otherwise sleep infinity
so the container stays up gracefully until ZIM files are added.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 18:25:04 +00:00
Outis 336216092e Merge pull request #18 from outis1one/claude/cleanup-setup-webui-bCgPE
remove SearXNG entirely; fix Kiwix cold-start
2026-03-21 14:20:07 -04:00
Claude 799fc84875 remove SearXNG entirely; fix Kiwix cold-start
SearXNG:
- Dropped from both setup scripts and docker-compose (Google/Startpage
  block self-hosted instances by IP — not reliable enough to include)
- Removed all interactive safe-search and engine-selection prompts
- Removed Open WebUI RAG web-search env vars (ENABLE_RAG_WEB_SEARCH,
  SEARXNG_QUERY_URL, etc.)
- Removed port 8888 from UFW rules, start.sh URLs, done output, and
  the Caddyfile template
- Removed searxng/ from .gitignore (directory no longer created)
- configure-searxng-safesearch.sh kept in repo for optional manual use

Kiwix:
- Replace the blocking wait-loop (`until ls *.zim`) with a one-liner
  that passes whatever ZIM files exist (or none) directly to kiwix-serve,
  so the container starts immediately and shows an empty library page
  rather than hanging until ZIMs are downloaded

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 18:15:56 +00:00
Outis 27bf8a3d81 Merge pull request #17 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-21 13:41:10 -04:00
Claude 5bfedf2cee consolidate everything into the repo folder; add compose management comments
All scripts now default BASE to their own directory (SCRIPT_DIR) instead
of ~/docker/ai-stack, so after a git clone the user never needs to change
folders — docker-compose.yml, .env, settings, and data dirs all live next
to the scripts.

configure-searxng-safesearch.sh and configure-storage.sh do the same for
standalone use (still honoured when called with BASE= from a parent script).

docker-compose.yml (generated by both setup scripts) gains a comment block
at the top listing the everyday docker compose commands:
  up -d / down / restart / stop / logs -f / pull / ps
so the file itself is the reference for managing containers.

.gitignore added to exclude generated files (docker-compose.yml, .env,
requirements.txt, helper scripts) and data directories (workspace/, kiwix/,
searxng/, gitea/, etc.) from git tracking.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 15:38:20 +00:00
Claude a4f2adc50a fix mcp-server crash and Kiwix FQDN resolution
mcp_server.py / local-ai-setup.sh:
  FastMCP.get_asgi_app() was removed in mcp 1.x — replace with
  sse_app(), which returns the same Starlette ASGI app for SSE
  transport.  Fixes the crash loop the container was stuck in.

laptop_full_setup.sh Caddyfile:
  $(hostname).local requires mDNS (Avahi/Bonjour) to resolve from a
  proxy machine, which is often not available on all LAN clients.
  Replace every occurrence with $LOCAL_IP (the machine's LAN IP)
  so the generated Caddyfile.example works reliably regardless of
  mDNS support.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 15:03:27 +00:00
Outis aca95b1741 Merge pull request #16 from outis1one/claude/fix-invokeai-upload-To8AX
Add LoRA import script and InvokeAI usage guide
2026-03-21 10:49:19 -04:00
Claude ed315999b1 Add LoRA import script and InvokeAI usage guide
Adds invokeai-import-lora.sh to copy LoRA .safetensors files directly
into InvokeAI's Docker model volume, bypassing the greyed-out UI upload
buttons. Also adds README documentation for LoRA usage and troubleshooting.

https://claude.ai/code/session_01RU7NQuTbA8S8NRoWojvhR5
2026-03-21 14:12:45 +00:00
Outis 7de4d385c4 Merge pull request #15 from outis1one/claude/cleanup-setup-webui-bCgPE
lock safesearch preference when level is moderate or strict
2026-03-21 02:04:12 -04:00
Claude 0eac82e06e lock safesearch preference when level is moderate or strict
SearXNG's preferences.lock list prevents users from changing a setting
via the UI — it greys out the option. Without this, safe_search in
settings.yml was only a server default that users could still override
in their preferences page.

For moderate/strict, add:
  preferences:
    lock:
      - safesearch

For none, the lock is omitted so users can freely adjust it.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 06:02:25 +00:00
Outis fc9bbeebac Merge pull request #14 from outis1one/claude/cleanup-setup-webui-bCgPE
fix ENABLE_MAP unbound variable in reporting block
2026-03-21 01:58:26 -04:00
Claude 07f8c83acb fix ENABLE_MAP unbound variable in reporting block
set +u was added around the ENGINE_BLOCK for-loops but the reporting
lines after ok "Updated settings.yml" still ran under set -u.
bash < 4.4 throws "unbound variable" for ${#ENABLE_MAP[@]} when the
associative array is empty (no --enable-engines argument was given).

Add set +u before the Disabled/Re-enabled info lines; it already covers
the ${#DISABLE_MAP[@]} reference at the end of the script.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:56:42 +00:00
Outis 30ff4014f2 Merge pull request #13 from outis1one/claude/cleanup-setup-webui-bCgPE
fix whiptail capture bug (2>/dev/null killed selections); add artic; …
2026-03-21 01:47:38 -04:00
Claude b090b902c0 fix whiptail capture bug (2>/dev/null killed selections); add artic; fix ENABLE_MAP
Root cause of all 85 engines being disabled:
  `3>&1 1>&2 2>&3 2>/dev/null` — the trailing `2>/dev/null` overwrites FD2
  with /dev/null AFTER the FD swap, destroying the pipe that whiptail writes
  selections to. User selections were silently discarded every time. Remove it.

Also: if whiptail exits 0 but returns empty string (all items unchecked),
fall back to pre-checked defaults rather than disabling everything.

ENABLE_MAP: unbound variable (configure-searxng-safesearch.sh):
  bash < 4.4 treats `${!empty_assoc[@]}` as unbound under `set -u`.
  Wrap for loops and mark_disabled key-check with set +u / set -u.

Add artic (Art Institute of Chicago) to image engine menus.
Add yandex images (defaults OFF for moderate/strict, same as yandex).
Update _SX_AUTOFF to include "yandex images" so re-enabling it works.
Update configure script engine category lists to match expanded menus.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:45:30 +00:00
Outis a1d9c2970e Merge pull request #12 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-21 01:30:21 -04:00
Claude fc10cbf668 expand engine menus to ~80 engines across 6 categories; fix permissions
configure-searxng-safesearch.sh:
- Fix "Permission denied" when Docker created settings.yml as root:
  detect unwritable file, run sudo chown before writing

Engine menus (both setup scripts):
- Web:       +presearch, yep, wiby  (15 total)
- Images:    +startpage images, mojeek images, presearch images,
              pexels, pixabay images, pinterest, flickr (moved to ON — it
              supports safe-search), wikcommons.images, artstation, adobe stock
              (19 total); removed flickr/dailymotion from no-safe-search list
- Videos:    +brave videos, qwant videos, rumble, odysee, bitchute,
              media.ccc.de, wikcommons.videos  (17 total)
- News:      +startpage news, presearch news, mojeek news, reuters,
              yahoo news, wikinews, yep news  (12 total)
- Reference: NEW — wikipedia, wikidata, wolframalpha, ask, ddg definitions,
              encyclopsearch, wikibooks, wikiquote, wikisource, wikispecies,
              wikiversity, wikivoyage  (12 total)
- Science:   unchanged (5)

_sxst() updated: removed flickr/dailymotion from OFF list; added
  vimeo, bitchute, rumble, odysee, artstation, mojeek images/news

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:28:23 +00:00
Claude 9a329a754b replace ZIM text prompts with whiptail radiolist + checklist
- Radiolist first: Choose / All / Skip (ESC = skip)
- Checklist shows all 18 ZIMs with sizes; pre-checks any already
  downloaded ZIMs so re-runs don't re-select what you have
- ZIM_PICKS now stores space-separated names (wikipedia, stackoverflow,
  archlinux...) instead of numbers; dispatch updated to match
- Text fallback (no whiptail): same numbered list as before, converts
  input numbers to names before dispatch
- Summary shows count and names of selected ZIMs

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 05:18:54 +00:00
Outis 0c783de44e Merge pull request #11 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-21 01:07:47 -04:00
Claude e6eaec4bd4 replace category/engine text prompts with whiptail checklists
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
2026-03-21 05:01:50 +00:00
Claude 9bcef89719 add interactive SearXNG safe-search prompts and category/engine controls
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
2026-03-21 04:49:50 +00:00
Claude bab3f113a2 add SearXNG safe-search script and improve OWUI search env vars
- 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
2026-03-21 04:38:03 +00:00
Claude cccf3afc4f Enable tool servers and auth in Open WebUI config
- WEBUI_AUTH=true: require login (auth was disabled by default)
- ENABLE_TOOL_SERVERS=true: unlocks the MCP/OpenAPI tool server UI

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 03:41:11 +00:00
Claude e5e357a37d Enable Open WebUI authentication (WEBUI_AUTH=true)
Disabling auth is unsafe when Open WebUI is exposed via a public FQDN.
Enabling it allows proper login/signup with credentials.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 03:18:27 +00:00
Outis 7832248209 Merge pull request #10 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-20 23:09:20 -04:00
Claude 90111df03f Fix Open WebUI FQDN auth and Kiwix 502 on cold start
- 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
2026-03-21 03:07:20 +00:00
Claude f5ddb345dd Add Open WebUI MCP tool registration hint to Done output
After install, remind users to add the MCP SSE URL in Open WebUI's
Admin → Settings → Tools panel (only shown when both MCP and WebUI
are selected).

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 02:54:20 +00:00
Outis 9cb05fcdde Merge pull request #9 from outis1one/claude/cleanup-setup-webui-bCgPE
Fix permission denied when --force overwrites root-owned config files
2026-03-20 22:52:29 -04:00
Claude 55cfa71464 Fix permission denied when --force overwrites root-owned config files
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
2026-03-21 02:49:51 +00:00
Outis 0cd56b7aec Merge pull request #8 from outis1one/claude/cleanup-setup-webui-bCgPE
Move ZIM selection into the wizard so all prompts complete before dow…
2026-03-20 22:26:52 -04:00
Claude cd150a7911 Move ZIM selection into the wizard so all prompts complete before downloads start
- 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
2026-03-21 02:21:54 +00:00
Outis 44f2ed3a66 Merge pull request #7 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-20 22:13:29 -04:00
Claude 01ab7b8cc9 Number drive mount points for Ollama and Kiwix storage selection
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
2026-03-21 02:11:39 +00:00
Claude 19346ba867 Use numbered input for size tier selection
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
2026-03-21 02:08:21 +00:00
Claude 342c746b51 Revert "Replace whiptail menus with numbered text toggle selection"
This reverts commit c83439f576.
2026-03-21 02:06:55 +00:00
Claude c83439f576 Replace whiptail menus with numbered text toggle selection
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
2026-03-21 02:05:08 +00:00
Outis 523d72e5a6 Merge pull request #6 from outis1one/claude/cleanup-setup-webui-bCgPE
Claude/cleanup setup webui b cg pe
2026-03-20 21:53:40 -04:00
Claude 47e91baf69 Fix start.sh and Done output to only show URLs for selected services
Build URL/path lines as variables before the heredoc so only
installed services appear in start.sh and the final Done summary.

https://claude.ai/code/session_012gDnantBmFTWZGCiKyjazx
2026-03-21 01:48:22 +00:00
Claude 7e52271cb6 Replace component menu with per-service whiptail checklist
- 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
2026-03-21 00:33:14 +00:00
Claude 7953ba9d99 Add model selection wizard with speed estimates and origin preference
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
2026-03-21 00:23:11 +00:00
Claude 796a073c0a Add Docker/Compose always-check and SSH key import to AI stack setup
- 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
2026-03-20 22:22:02 +00:00
Claude 45dfa58d93 Add top-level checklist menu to laptop_full_setup.sh
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
2026-03-20 22:03:49 +00:00