#!/usr/bin/env bash # Inside The Machine · one-command install: Make images # Pictures from a text prompt, made on your own computer. No credits, no upload. # Page: https://insidethemachine.ai/do/images Agent doc: https://insidethemachine.ai/install/images.md # Run status: Not run: taken from the README, not checked. Point-and-click apps (Draw Things, ComfyUI). The script only checks and prints where to get them. # This script: The wrapper scripts are generated from the site data. Every .sh passed bash -n and shellcheck and ran in plan mode on Linux (Debian 13). Every .ps1 passed the PowerShell parser and chat.ps1 ran in plan, verify and rollback mode under PowerShell 7 on Linux with Windows calls mocked. Not run on macOS or real Windows. # # Read it first: curl -fsSL https://insidethemachine.ai/install/images.sh | less # curl -fsSL https://insidethemachine.ai/install/images.sh | bash install, then check # curl -fsSL https://insidethemachine.ai/install/images.sh | bash -s -- plan print every step, run nothing # curl -fsSL https://insidethemachine.ai/install/images.sh | bash -s -- verify only the checks # curl -fsSL https://insidethemachine.ai/install/images.sh | bash -s -- rollback --yes undo it (without --yes it only prints) # Options: ITM_RAM=32 (memory in GB instead of detecting it) # Lines marked YOU RUN are left to you: servers that keep running, interactive apps, your own files. # shellcheck disable=SC2016,SC1090 set -u main() { ACT="${ITM_ACTION:-install}"; YES="${ITM_YES:-}" for a in "$@"; do case "$a" in --yes|-y) YES=1 ;; install|plan|verify|rollback) ACT="$a" ;; *) echo "unknown option: $a (use install, plan, verify or rollback)" >&2; exit 2 ;; esac; done START="$(pwd)"; FAILS=0; NEXT="" case "$(uname -s)" in Darwin) P=mac ;; Linux) P=linux ;; *) P=other ;; esac say() { printf '\n== %s\n' "$1"; } note() { printf ' # %s\n' "$1"; } die() { printf '\nSTOP: %s\nHelp: %s\n' "$1" 'https://insidethemachine.ai/do/images#fix' >&2; exit 1; } run() { printf ' $ %s\n' "$1"; [ "$ACT" = plan ] && return 0; eval "$1" || die "this step failed: $1"; } mac() { if [ "$P" != mac ]; then printf ' (macOS only, skipped: use your package manager) %s\n' "$1"; return 0; fi case "$1" in xcode-select*) printf ' $ %s\n' "$1"; [ "$ACT" = plan ] || xcode-select -p >/dev/null 2>&1 || die "install Apple's command line tools first: run xcode-select --install, finish the window, then run this again"; return 0 ;; brew*) [ "$ACT" = plan ] || command -v brew >/dev/null 2>&1 || die "needs Homebrew first: https://brew.sh" ;; esac run "$1"; } you() { printf ' YOU RUN: %s\n' "$1"; [ -n "$2" ] && printf ' (%s)\n' "$2"; NEXT="$NEXT $1\n"; } undo() { if [ "${2:-}" = mac ] && [ "$P" != mac ]; then return 0; fi; printf ' $ %s\n' "$1"; if [ "$ACT" = rollback ] && [ -n "$YES" ]; then eval "$1" || echo " (failed, carrying on)"; fi; } check() { printf ' ? %s\n expect: %s\n' "$1" "$2"; [ "$ACT" = plan ] && return 0; if out=$(eval "$1" 2>&1) && ! printf '%s' "$out" | grep -q '^{"error"'; then echo " PASS"; else echo " FAIL"; FAILS=$((FAILS + 1)); fi; [ -n "$out" ] && printf '%s\n' "$out" | head -n 3 | sed 's/^/ | /'; return 0; } need_ollama() { [ "$ACT" = plan ] && return 0; ollama list >/dev/null 2>&1 && return 0; echo " starting 'ollama serve' in the background (log: /tmp/itm-ollama.log)"; nohup ollama serve >/tmp/itm-ollama.log 2>&1 & i=0; while [ $i -lt 30 ]; do sleep 1; ollama list >/dev/null 2>&1 && return 0; i=$((i + 1)); done; die "Ollama is not running. Open the Ollama app, then run this again."; } [ "$P" = other ] && die "this script is for macOS and Linux." install_any() { say '1. Easiest: install Draw Things' note 'Draw Things is a free Mac app made for Apple silicon. Get it from the Mac App Store. (https://drawthings.ai)' say '2. Pick a model' note 'When it opens, choose a model from its list and let it download. Pick a smaller one first. A small model is faster and still looks good.' say '3. Make your first image' note 'Type what you want to see, then press Generate. Short, concrete prompts work best, for example “a red bicycle in the rain, photo”.' say '4. Want more control? Try ComfyUI' note 'ComfyUI builds images from connected blocks. It can do much more, but it takes longer to learn. Download the desktop app from comfy.org and start from one of its templates. (https://insidethemachine.ai/setups/comfyui)' } verify_any() { say 'Check' check 'test -d "/Applications/Draw Things.app" || test -d /Applications/ComfyUI.app' 'Draw Things or ComfyUI is installed (macOS)' } rollback_any() { say 'Rollback' note 'nothing to undo' } act() { return 0; } inwd() { return 0; } V=any printf 'Inside The Machine · Make images · %s · %s%s\n' "$ACT" "$P" "" case "$ACT" in install|plan) "install_$V"; cd "$START" || exit 1; act; inwd; "verify_$V"; cd "$START" || exit 1; [ "$ACT" = plan ] && "rollback_$V" ;; verify) act; inwd; "verify_$V" ;; rollback) [ -n "$YES" ] || note 'print only: add --yes to run these'; act; "rollback_$V" ;; esac if [ -n "$NEXT" ]; then say 'Now you run these (in order)'; printf '%b' "$NEXT"; fi [ "$ACT" = install ] && printf '\nDone. %s check(s) failed. Next steps and fixes: %s\n' "$FAILS" 'https://insidethemachine.ai/do/images' [ "$FAILS" -eq 0 ] } main "$@"