Commit Graph
487 Commits
Author SHA1 Message Date
Claude 42a38c9397 frigate.sh: detect existing camera config, offer keep/backup/add/remove
Previously re-running the installer always overwrote config.yml and .env
from scratch, silently discarding any real camera credentials already on
disk. Now install_frigate parses an existing config.yml + .env (best-effort,
matching this installer's own output shape) and presents a numbered list
of detected cameras with a menu:

  [1] Keep everything as-is (no changes at all)
  [2] Backup existing config and start fresh
  [3] Add more cameras (keep these)
  [4] Remove cameras (choose numbers, or 'all'), then optionally add more

Implementation switches from building config.yml/.env as concatenated text
blocks inline in the collection loop to parallel CAM_* bash arrays
(name/ip/port/var-names/enabled/notify/substream-suffixes), so cameras can
be parsed, listed, removed, and re-rendered independently:

- _frigate_parse_existing: reads go2rtc streams + cameras: enabled/notifications
  from config.yml, and credential values from .env, into the CAM_* arrays
- _frigate_review_existing: numbered menu, mutates arrays per choice
- _frigate_next_suffix_int: kept cameras retain their existing FRIGATE_RTSP_USER[N]
  var names unchanged; new cameras get the next unused numeric suffix so
  credentials never collide after removals
- _frigate_camera_wizard / _frigate_render_config: same prompts and output
  shape as before, now array-driven so kept + new cameras render uniformly
- _frigate_backup_existing: copies config.yml/.env/docker-compose.yml to a
  timestamped backup-YYYYMMDD-HHMMSS/ dir before any destructive rewrite

Verified with a 5-scenario test harness (fresh install, keep-as-is producing
byte-identical output, add-camera preserving existing credentials, remove-
by-number without var collisions, backup-and-fresh) before committing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 20:25:55 +00:00
Claude 7dc9a762a0 frigate.sh: interactive camera wizard generates go2rtc + cameras config
Previously Frigate always wrote a placeholder config.yml the operator had
to hand-edit to add cameras. Now install_frigate prompts to add cameras
one at a time (name, RTSP IP/port/user/password/path, optional sub-stream,
enabled, notifications), matching the go2rtc + cameras structure used in
production frigate configs:

- Each camera gets a go2rtc stream entry (+ optional _sub for detection)
  and a cameras: block with ffmpeg inputs/roles, detect, notifications
- RTSP credentials/IPs are written to .env as FRIGATE_* variables (first
  camera gets FRIGATE_RTSP_USER/PASSWORD, later cameras get numbered
  suffixes _1, _2, ... to avoid collisions) and referenced in config.yml
  via Frigate's {FRIGATE_VAR} substitution syntax — secrets never appear
  in the YAML directly
- docker-compose.yml now includes env_file: .env so those vars actually
  reach the container for substitution to work
- Skipping all camera prompts falls back to the original starter
  config.yml for manual editing, preserving existing behavior
- README and DRY-RUN summary updated to reflect the new flow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 19:49:26 +00:00
Claude 9cf3765f83 setup.sh: don't offer to install Caddy when CADDY_MODE is remote/none
The 'Install Caddy now?' prompt ran regardless of the just-answered
Caddy location question, so choosing 'remote' still asked whether to
install Caddy locally — contradicting the choice made one prompt earlier.
Gate it on CADDY_MODE being local (or unset, for configs predating the
wizard split).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 17:14:36 +00:00
Claude e8d49e9e70 setup.sh: ask Caddy location unconditionally before offering site defaults
Previously the Caddy-location question lived inside run_site_configure,
gated behind 'Configure site defaults now? (y/n)'. Answering 'n' (e.g.
because Caddy is on a different box and you don't care about domain/tz
autofill) meant CADDY_MODE never got set, which silently disabled Caddy
prompts for every service for the life of the install (configure_caddy_for_service
falls through to mode 'none' and returns immediately).

Split into two steps:
1. ask_caddy_location() — always runs on first setup.sh invocation,
   independent of any other prompt, and persists CADDY_MODE immediately.
2. run_site_configure() — now only asks timezone/domain/Caddy-network,
   and is only offered when CADDY_MODE=local (those defaults are only
   useful for FQDN autofill tied to a locally-managed Caddyfile).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 17:11:11 +00:00
Claude a9446190da setup.sh: ask Caddy location first in site wizard, skip network prompt if not local
Reorders the site defaults wizard so 'Where does Caddy run?' comes before
timezone/domain, since it's the more fundamental choice and the answer
context matters when explaining the other prompts. Also skips the Caddy
Docker network prompt entirely when Caddy isn't running locally — that
setting is only relevant to services joining a local Caddy container's
bridge network; remote/none mode proxies via localhost:PORT + snippet
files instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 16:45:47 +00:00
Claude 83293f61cd common.sh: install Docker via direct apt steps instead of get.docker.com
The get.docker.com convenience script internally wraps every step in
'sudo -E sh -c ...'. On minimal/cloud Ubuntu images that never installed
the sudo package (common when operating purely as root), those internal
sudo calls silently fail while the outer script still exits 0 — apt never
actually runs, but no error surfaces. require_docker already runs as root,
so there's no need for sudo at all.

Replaced it with Docker's documented apt-repo steps run directly: add the
keyring, add the repo (with architecture/codename detected via dpkg and
os-release), apt-get install docker-ce + compose plugin, enable the
service. Real apt/curl/systemctl failures now propagate and print to the
terminal instead of being masked by the wrapper script.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 16:26:16 +00:00
Claude 3d976b84e3 base.sh: surface Docker install failures instead of swallowing them
require_docker returning non-zero was silently ignored (no set -e).
Add explicit warning so the operator sees the failure; setup.sh already
has an unconditional Docker check after base that will retry.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 16:08:00 +00:00
Claude 8b5a519717 setup.sh: always install Docker, not only on first base run
The Docker check+install was inside the else branch that only runs when
base has never been installed. On re-runs (base already present) Docker
was silently skipped and only warned about. Move the check outside the
if/else so Docker is always installed if missing, regardless of whether
base was skipped.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-07-01 16:06:08 +00:00
Claude a6465404fa fix whiptail navigation + add installed-service summary
whiptail fix:
- bootstrap.sh: redirect stdout and stderr to /dev/tty alongside stdin so
  whiptail has full terminal control for raw mode (arrow keys, highlighting)
- setup.sh: run 'stty sane' on /dev/tty before the menu loop to reset any
  stale terminal state from SSH reconnections or prior sessions

Installed-service summary:
- Print a grouped list of all currently-installed services before every
  menu session so the operator knows the current state at a glance

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 18:17:26 +00:00
Claude 93c373e893 setup.sh: fix whiptail arrow-key navigation when run via curl | bash
Two fixes:
1. Export TERM (default xterm-256color) early — whiptail needs a valid
   TERM to enter raw mode; when bash is started via pipe TERM may be
   unset, causing keypresses to leak to the shell instead of the menu
2. Add </dev/tty to both whiptail calls so keyboard input always comes
   from the controlling terminal regardless of how stdin was redirected

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 18:11:57 +00:00
Claude 01979c52f0 fix: SITE_DOMAIN not pre-filling FQDN prompts after wizard
Three fixes:
1. configure_caddy_for_service: remove the '!= example.com' filter that
   silently dropped any valid domain matching that string; now any non-empty
   SITE_DOMAIN is used as the default subdomain suggestion
2. load_site_config: trim leading/trailing whitespace from key and val so
   hand-edited .config files with extra spaces still parse correctly
3. setup.sh: call load_site_config after the site wizard saves so the
   in-memory values are guaranteed fresh for all subsequent service installs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 15:07:07 +00:00
Claude c09dd775ea base.sh: add Docker, SSH server/hardening, and NetBird to base install
- require_docker now runs as part of base so Docker is present on every box
- Install openssh-server, offer GitHub (gh:) and Launchpad (lp:) key import
  via ssh-import-id; disable password auth only after keys are confirmed imported
- Handle Ubuntu cloud-init drop-in that re-enables PasswordAuthentication
- Offer NetBird install with optional --allow-server-ssh flag and setup key

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 15:00:51 +00:00
Claude e167f98370 common.sh: fall back to /usr/bin/docker when PATH is restricted under sudo
command -v may miss the binary if sudo stripped PATH; check the canonical
apt install location directly as a fallback before reporting failure, and
use the same fallback when printing the installed version.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 14:37:03 +00:00
Claude 64776731fb common.sh: fix Docker install failing silently in piped execution
Two bugs in require_docker:
1. apt post-install hooks (needrestart etc.) block on stdin which is
   at EOF when running via pipe; DEBIAN_FRONTEND=noninteractive skips them
2. bash's command hash table doesn't pick up a newly installed binary;
   hash -r flushes it so command -v docker finds /usr/bin/docker
Also moved usermod and success log after the binary check so [OK] only
prints when docker is actually reachable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 12:18:10 +00:00
Claude bb107b424b bootstrap.sh: redirect stdin from /dev/tty when launching setup.sh
curl | bash consumes stdin from the pipe, so when bootstrap hands off
to setup.sh the script gets EOF immediately and exits with 'Cancelled'.
Redirecting </dev/tty restores keyboard input for the interactive menu.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 12:09:42 +00:00
Claude 5954cdb984 bootstrap.sh: replace BASH_SOURCE with $0 to fix pipe execution
BASH_SOURCE[0] is unbound when bash reads from a pipe; set -u turns
this into a fatal error that no amount of :- or set +u reliably fixes
across bash versions. $0 is always set: 'bash' when piped (dirname
gives '.' where no setup.sh exists), and the correct path when run
directly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 12:07:07 +00:00
Claude 9a50eb4758 bootstrap.sh: use set +u guard around BASH_SOURCE to fix pipe execution
${BASH_SOURCE[0]:-} still triggers set -u when BASH_SOURCE is entirely
unset (not just empty) in pipe mode. Temporarily disable -u for that
single assignment, then restore it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 12:03:27 +00:00
Claude dfe41fe593 bootstrap.sh: fix BASH_SOURCE unbound variable when piped through bash
set -euo pipefail causes ${BASH_SOURCE[0]} to abort with 'unbound variable'
when the script is fed via curl | bash. Use ${BASH_SOURCE[0]:-} so the
variable expands to an empty string in that context, letting SCRIPT_DIR
resolve safely and the pipe path continue to the git-clone branch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LQJBvqzXeyuhhAcAA3Q5Wq
2026-06-28 12:00:53 +00:00
Outis 094c28aeab Merge pull request #152 from outis1one/claude/blissful-carson-4dckso
kyber-server: fix Wine crash + map rotation format
2026-06-27 13:00:42 -04:00
Outis 29d039af48 Merge pull request #151 from outis1one/claude/gifted-shannon-5ti8vx
Default PaintPlus OpenAI provider to gpt-image-2, fix GPU quick-start
2026-06-27 13:00:01 -04:00
Claude 71ef582873 kyber-server: fix Wine crash + map rotation format
Three root-cause fixes found by reading the Docker image source:

1. Wine/Proton page fault: Docker's default seccomp profile blocks
   system calls that Wine Proton GE requires. Fix: security_opt:
   seccomp=unconfined + shm_size: 256m (Xvfb needs /dev/shm for
   MIT-SHM extension; 64 MB default is too small).
   Added network_mode: host for game traffic (dynamic UDP ports).

2. KYBER_MAP_ROTATION exit 64: the Kyber CLI decodes base64 and
   parses newline-separated "MODE;MAP_PATH" lines, not JSON objects.
   Our JSON [{map:...,mode:...}] format split on semicolons into one
   field → ExitCode.usage (64). Fixed builder to emit MODE;MAP_PATH\n
   lines and updated .env comment + README example.

3. GPU passthrough removed: Proton GE includes DXVK which crashes
   headlessly when a GPU is passed through (no Vulkan display). The
   server needs no GPU; removing passthrough is the correct fix.

Also: install libgamemode0:i386 on the host (Wine/Proton dep),
add alphanumeric-password warning (special chars → INVALID_PASSWORD).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014be1aK9G8CY2msho5LjxR4
2026-06-26 15:26:55 +00:00
Claude 43c66ea860 Default PaintPlus OpenAI provider to gpt-image-2, fix GPU quick-start
dall-e-2/dall-e-3 retired May 12 2026 and gpt-image-1 deprecates Oct 23
2026, so move every OpenAI default (config.py, both provider classes,
both compose files, .env.example, the in-app provider-settings dropdown,
README) to gpt-image-2 for both generation and edits. Also fix response
parsing in ai_provider.py's OpenAIProvider, which never sent a model
param and assumed a url response — gpt-image-1/2 only return b64_json.

Separately, .env.example shipped AI_PROVIDER=replicate by default, but
replicate has no driver in remote_provider.py, so following the
documented "cp .env.example .env" setup silently broke every AI call
and defeated the GPU quick-start (an explicit non-empty .env value
overrides docker-compose.gpu.yml's own local_gpu fallback). Default to
local_gpu instead, mark replicate/stability as not-yet-implemented, and
recommend Lykon/dreamshaper-8-inpainting as a hands/face-tuned
HF_MODEL_INPAINT override for 4-6GB cards (Quadro P2200, GTX 1060/1660).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
2026-06-26 15:17:18 +00:00
Outis c130d43383 Merge pull request #150 from outis1one/claude/gifted-shannon-5ti8vx
Fix PaintPlus OpenAI edit quality: edits silently fell back to dall-e-2
2026-06-26 11:07:49 -04:00
Claude 36a126bee7 Fix PaintPlus OpenAI edit quality: edits silently fell back to dall-e-2
inpaint()/img2img()/outpaint() called /v1/images/edits without a model
field, so OpenAI defaulted every cloud edit to dall-e-2 regardless of
configuration — while txt2img used dall-e-3. Add a separate
OPENAI_EDIT_MODEL (default gpt-image-1, the only current model that
supports masked edits at ChatGPT-comparable quality), thread it through
the provider and both compose files, and handle gpt-image-1's
b64_json-only response shape alongside the url shape dall-e-2/3 return.
2026-06-26 13:57:04 +00:00
Outis f97a4266b6 Merge pull request #149 from outis1one/claude/gifted-shannon-5ti8vx
Claude/gifted shannon 5ti8vx
2026-06-26 09:34:38 -04:00
Claude efc4100640 fix dispatcher hyphen bug in 4 more services
setup.sh's run_service() looks up install_<name> using the literal
hyphenated registered name, not an underscore-converted one. borg-backup,
calibre-web, gaming-backup, and stirling-pdf all used underscored function
names and were therefore uninstallable ("has no install_<name>"). Same
fix already applied to ai-gpu/ai-stack; this closes out the rest of the
repo-wide audit.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
2026-06-26 13:20:49 +00:00
Claude 246803d073 paintplus: add ai-stack InvokeAI/ComfyUI as a local backend option
PaintPlus's backend already supported invokeai/comfyui providers (generic
"self-hosted, on another machine" remote APIs) but the installer never
exposed them and the compose file never passed the URLs through. Add a
3rd provider choice — shown only when the ai-stack service is installed —
that sets AI_PROVIDER + INVOKEAI_URL/COMFYUI_URL and joins ai-stack's
Docker network (ai-stack_default) so PaintPlus can reach those containers
by name. No cloud key, no extra GPU download: it rides on ai-stack's
already-running InvokeAI/ComfyUI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
2026-06-26 13:20:43 +00:00
Claude 0d6cf89e1d ai-stack: add optional GPU switcher and clarify frontend roles
Add gpu-mode.sh (written into ~/docker/ai-stack at install): time-shares
one small GPU between local chat (Ollama, for Open WebUI) and local
image-gen (InvokeAI + ComfyUI, backends for PaintPlus), leaving the
always-on services (Open WebUI, Gitea, RAG, MCP, Kiwix) untouched. A new
"small local GPU?" prompt enables it: when on, the GPU defaults to chat
mode after install and the user is told to swap deliberately. Cloud
models need no swap.

Document the intended split in POST-INSTALL-NOTES: Open WebUI is the
text hub (chat/research/light coding, wired to Gitea + GitHub sync + RAG
+ MCP), PaintPlus is the single image hub (cloud or local comfyui/
invokeai backend). Note web search is DuckDuckGo — this installer path
generates no SearXNG, so the SearXNG references are dropped.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
2026-06-26 12:56:11 +00:00
Claude c6576178b4 ai-stack: vendor the local-ai full AI stack as a new service
Vendor the functional source of github.com/outis1one/local-ai into
./ai-stack (22 files) and add services/ai-stack.sh, which copies the
source to ~/docker/ai-stack and hands off to the app's VRAM-aware
installer (local-ai-setup.sh). The stack bundles Ollama, Open WebUI,
RAG + MCP servers, ChromaDB, SearXNG, Kiwix, Gitea, InvokeAI, ComfyUI
and Portainer.

Cloud LLM providers (Groq/DeepInfra/OpenAI/OpenRouter) are optionally
wired into Open WebUI via the plural OPENAI_API_BASE_URLS list, with the
local RAG connection kept as the first entry so RAG keeps working. Open
WebUI ships built-in auth, so Caddy is configured without Authelia.

Excludes the upstream's two bundled copies of this very project
(ubuntu-post-install.sh, ubuntu-post-install-main.zip) — stale and
circular. Coexists with the existing ai-gpu service.

Also fix the install-function names for ai-gpu and ai-stack: the
dispatcher calls install_<raw-name>, so the function must be
install_ai-gpu / install_ai-stack (hyphen), matching the working
mail-archiver / wg-easy services. ai-gpu was previously uninstallable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
2026-06-26 12:41:44 +00:00
Outis 4f04deefe3 Merge pull request #148 from outis1one/claude/zealous-heisenberg-8ylloi
kyber-server: add interactive map rotation selection
2026-06-26 02:04:15 -04:00
Outis 3d2a7cddc1 Merge pull request #147 from outis1one/claude/gifted-shannon-5ti8vx
Add cloud LLM provider picker and vendor PaintPlus photo editor
2026-06-26 02:03:32 -04:00
Claude f2d662a680 kyber-server: add interactive map rotation selection
Shows a numbered menu of 12 known SWBF2 maps (Galactic Assault, Planetary
Battles, Starfighter Assault) during install. Selected maps are encoded as
base64 JSON and written to KYBER_MAP_ROTATION in .env.

Map IDs decoded from maprotation.hive binary: Geonosis, Kamino, Endor,
Tatooine, Death Star II, Starkiller Base, Crait, Hoth, Fondor (space).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 06:00:00 +00:00
Claude 084922afaa paintplus: vendor the app source and rename from EditmaskwithAI
Bring the full EditmaskwithAI application into the repo under paintplus/
(429 files) so the service is self-contained — the installer copies the
vendored source to ~/docker/paintplus/src instead of cloning at runtime.

Rename to PaintPlus (service + branding; app logic untouched):
- services/editmaskwithai.sh -> services/paintplus.sh (register_service
  paintplus, install_paintplus, ~/docker/paintplus, Caddy paintplus:8000,
  Authelia option preserved)
- container names -> paintplus across docker-compose*.yml; dev network
  -> paintplus-network
- browser <title> -> "PaintPlus - AI Image Editor"; README heading ->
  PaintPlus with upstream provenance note
- README utilities table: editmaskwithai -> paintplus

Backend/frontend code (help strings referencing the old container name,
the ai_photo_edit.db filename) is intentionally left as-is to avoid
touching application logic.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
2026-06-26 05:48:43 +00:00
Claude b4e8ba2a79 editmaskwithai: add EditmaskwithAI photo editor service
Package the self-hosted mask-based AI photo editor
(github.com/outis1one/EditmaskwithAI) as a utilities service. Clones the
repo into ~/docker/editmaskwithai and deploys on port 3080.

Two install modes:
- Cloud API (no GPU): writes .env from the repo template with the chosen
  AI_PROVIDER (OpenAI gpt-image or Replicate), API key, and a generated
  SECRET_KEY, then `docker compose up -d --build`.
- Local GPU (NVIDIA): runs the repo's own install-local-gpu.sh and
  bring-up-local-gpu.sh (downloads ~13 GB of models).

The app has no built-in auth, so it offers Authelia SSO and reverse-proxies
via Caddy (ai-photo-edit:8000). Cloud mode joins caddy_net through a
docker-compose.override.yml; GPU mode is attached with `docker network
connect` since the GPU compose runs with an explicit -f and does not merge
overrides.

Also lists the service in the README utilities table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
2026-06-26 05:30:43 +00:00
Outis 9077a8f39d Merge pull request #146 from outis1one/claude/zealous-heisenberg-8ylloi
Fix write_readme missing from standalone bootstrap fallback
2026-06-26 01:08:53 -04:00
Outis 4ec133d63d Merge pull request #145 from outis1one/claude/gifted-shannon-5ti8vx
ai-gpu: offer multiple cloud LLM providers in Open WebUI
2026-06-26 01:08:20 -04:00
Claude 1087b59424 Fix write_readme missing from standalone bootstrap fallback
When run directly without setup.sh, write_readme is not defined.
Add a minimal implementation to the else block of both kyber-server.sh
and sunshine.sh so standalone runs no longer fail with command not found.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 05:07:11 +00:00
Claude a3d673c435 ai-gpu: offer multiple cloud LLM providers in Open WebUI
Generalize the optional Groq toggle into a provider picker so the GPU AI
stack can wire Groq, DeepInfra, OpenAI, and/or OpenRouter into Open WebUI
at once. All are OpenAI-compatible, so they share Open WebUI's
OPENAI_API_BASE_URLS / OPENAI_API_KEYS (semicolon-separated, matched by
position). Keys are written to llm/.env; only ${VAR} references go into
docker-compose.yml.

Updates the install prompt, .env template, compose patch, README, the
dry-run note, and the final summary accordingly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb2vJ8W7bHKx1JXVvpCraH
2026-06-26 05:02:25 +00:00
Outis 757d8f178b Merge pull request #144 from outis1one/claude/zealous-heisenberg-8ylloi
Claude/zealous heisenberg 8ylloi
2026-06-26 00:56:21 -04:00
Claude 7d3cd46d9d kyber-server: offer to set up kyber-launcher at end of install
If the kyber bin symlink and desktop entry are not present, prompt to
set up the launcher. Calls install_kyber_launcher directly if already
loaded (wizard), or sources kyber-launcher.sh when run standalone.
Skips the prompt on rerun if the launcher is already installed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 04:55:36 +00:00
Claude 8b13928cc0 kyber-server: auto-launch AppImage for EA login if no token found
If auth.toml has no token, launch the Kyber AppImage as the actual user
(with DISPLAY/XAUTHORITY passed through), prompt the user to log in via
the EA Account button, then re-read auth.toml once they close Kyber.
Falls back to manual token paste if auth.toml still has nothing.
Skips the AppImage entirely on rerun when a token is already cached.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 04:51:17 +00:00
Claude 1b392472bc kyber-server: read EA token from auth.toml instead of browser flow
Running kyber_cli get_token under sudo opens a broken browser OAuth flow.
Instead, read the token directly from ~/.local/share/maxima/auth.toml which
Kyber writes after a normal GUI login. If missing, show clear instructions
to run the AppImage as yourself first, then re-run the installer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 04:44:50 +00:00
Outis 432d38f2c2 Merge pull request #143 from outis1one/claude/zealous-heisenberg-8ylloi
Claude/zealous heisenberg 8ylloi
2026-06-26 00:33:11 -04:00
Claude 87384980da kyber-server: mount SWBF2 folder read-write not read-only
The Kyber server patches vivoxsdk.dll into the game folder at startup.
Mounting it :ro caused a loop of cp permission errors. Removed the :ro flag.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 04:32:31 +00:00
Claude 472a8fb72b kyber-server: fresh start option and special char safe .env quoting
On rerun, if ~/.local/share/maxima exists, offer to wipe it so EA login
starts completely fresh (fixes stuck/broken auth states).

Single-quote all .env values so passwords and tokens containing $, !, &,
spaces, and other shell special characters are written safely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 04:30:22 +00:00
Outis 9c0f5c09d5 Merge pull request #142 from outis1one/claude/zealous-heisenberg-8ylloi
kyber-server: find SWBF2 in custom Steam library locations
2026-06-26 00:02:34 -04:00
Claude 3654167596 kyber-server: find SWBF2 in custom Steam library locations
The standard Steam path search missed installs on secondary drives.
Now also reads libraryfolders.vdf to find all Steam library paths, then
falls back to a broad find across home/mnt/media. Wolf's copy is excluded
from the fallback search to prefer the native Steam install.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 04:01:33 +00:00
Outis c6b3f8d025 Merge pull request #141 from outis1one/claude/zealous-heisenberg-8ylloi
sunshine: add SWBF2 Single Player app entry
2026-06-25 23:55:17 -04:00
Claude 360630af79 sunshine: add SWBF2 Single Player app entry
Adds a Moonlight app entry that launches SWBF2 directly via Steam
(steam://rungameid/1237950) — both with and without the Kyber entry.
Moonlight app list now shows: Kyber SWBF2 | SWBF2 Single Player | Desktop

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
2026-06-26 03:16:39 +00:00
Outis 0b6dbbfee4 Merge pull request #140 from outis1one/claude/zealous-heisenberg-8ylloi
kyber-server: offer to rsync SWBF2 files from remote machine
2026-06-25 22:51:49 -04:00