@CoinSh0t: This lawyer made $150,000 selling portable offline AI. It analyzes docs that can’t legally be shown on the web. The who…
Summary
A lawyer built a $50 portable offline AI device using a Raspberry Pi 5, Ollama, and Phi-3-mini, selling it for $999 to law firms needing secure document analysis. This guide explains how to replicate the setup step-by-step.
View Cached Full Text
Cached at: 05/27/26, 03:18 AM
This lawyer made $150,000 selling portable offline AI.
It analyzes docs that can’t legally be shown on the web.
The whole setup costs $50 and he sells it for $999.
Here’s how to make one step-by-step:
You need 4 things:
→ Raspberry Pi 5 (8GB)
→ PiSugar 3 Plus battery
→ Whisplay HAT for the screen and mic
→ 64GB SD card.
Total cost on Ali is around $50 to $90 if you wait for the right deals.
-
Write Raspberry Pi OS Lite 64-bit to the SD card using Raspberry Pi Imager.
-
Stack the PiSugar battery underneath the Pi, snap the Whisplay HAT on top, insert the SD card, and boot the device.
-
Open the terminal and install Ollama with one command: curl -fsSL https://ollama.com/install.sh | sh
-
Pull a model that actually runs on the Pi without choking:
ollama pull phi3:mini 5. Run the model and start chatting offline:
ollama run phi3:mini The whole thing fits in your pocket, lasts 4 hours on battery, and never touches the internet once setup is done.
The lawyer wraps his version in a custom case, preloads it with legal document analysis prompts, and sells it to law firms that can’t legally process client data in the cloud.
You can sell yours to doctors, accountants, government contractors, defense companies, or anyone else who handles data that legally cannot leave the building.
Hardware cost: $50 to $90.
Selling price: $500 to $1999
Source: https://release-assets.githubusercontent.com/github-production-release-asset/658928958/b696725b-a213-40f6-a003-1b99674bed73?sp=r&sv=2018-11-09&sr=b&spr=https&se=2026-05-27T03%3A57%3A05Z&rscd=attachment%3B+filename%3Dinstall.sh&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2026-05-27T02%3A56%3A26Z&ske=2026-05-27T03%3A57%3A05Z&sks=b&skv=2018-11-09&sig=3dxnE8IrJ70Fn0zBhunimcwkQEBIvoqUrKtnXF85nbU%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc3OTg1MjE4NywibmJmIjoxNzc5ODUxODg3LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.R0yqz-Q9igPnWKiPVAW5iNEmSVwjgg36K6wIUsy7ElQ&response-content-disposition=attachment%3B%20filename%3Dinstall.sh&response-content-type=application%2Foctet-stream #!/bin/sh # This script installs Ollama on Linux and macOS. # It detects the current operating system architecture and installs the appropriate version of Ollama. # Wrap script in main function so that a truncated partial download doesn’t end # up executing half a script. main() { set -eu red=“\( \(/usr/bin/tput bold \|\| :; /usr/bin/tput setaf 1 \|\| :\) 2\>&\-\)" plain="( (/usr/bin/tput sgr0 || :) 2>&-)” status() { echo “>>> \*" \>&2; \} error\(\) \{ echo "{red}ERROR:${plain} \*"; exit 1; \} warning\(\) \{ echo "{red}WARNING:${plain} \*"; \} TEMP\_DIR=(mktemp -d) cleanup() { rm -rf $TEMP_DIR; } trap cleanup EXIT available() { command -v $1 >/dev/null; } require() { local MISSING=‘’ for TOOL in $*; do if ! available TOOL; then MISSING="MISSING $TOOL” fi done echo MISSING \} OS="(uname -s)“ ARCH=\(uname \-m\) case "ARCH“ in x86_64) ARCH=“amd64” ;; aarch64|arm64) ARCH=“arm64” ;; *) error “Unsupported architecture: ARCH" ;; esac VER\_PARAM="{OLLAMA_VERSION:+?version=OLLAMA\_VERSION\}" \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# \# macOS \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# if \[ "OS” = “Darwin” ]; then NEEDS=\(require curl unzip\) if \[ \-n "NEEDS“ ]; then status “ERROR: The following tools are required but missing:” for NEED in $NEEDS; do echo “ - NEED" done exit 1 fi DOWNLOAD\_URL="https://ollama\.com/download/Ollama\-darwin\.zip{VER_PARAM}“ if pgrep -x Ollama >/dev/null 2>&1; then status “Stopping running Ollama instance...” pkill -x Ollama 2>/dev/null || true sleep 2 fi if [ -d “/Applications/Ollama.app” ]; then status “Removing existing Ollama installation...” rm -rf “/Applications/Ollama.app” fi status “Downloading Ollama for macOS...” curl --fail --show-error --location --progress-bar \ -o “TEMP\_DIR/Ollama\-darwin\.zip" "DOWNLOAD_URL” status “Installing Ollama to /Applications...” unzip -q “TEMP\_DIR/Ollama\-darwin\.zip" \-d "TEMP_DIR” mv “TEMP\_DIR/Ollama\.app" "/Applications/" if \[ \! \-L "/usr/local/bin/ollama" \] \|\| \[ "(readlink “/usr/local/bin/ollama”)“ != “/Applications/Ollama.app/Contents/Resources/ollama” ]; then status “Adding ‘ollama’ command to PATH (may require password)...” mkdir -p “/usr/local/bin” 2>/dev/null || sudo mkdir -p “/usr/local/bin” ln -sf “/Applications/Ollama.app/Contents/Resources/ollama” “/usr/local/bin/ollama” 2>/dev/null || \ sudo ln -sf “/Applications/Ollama.app/Contents/Resources/ollama” “/usr/local/bin/ollama” fi if [ -z “\{OLLAMA\_NO\_START:\-\}" \]; then status "Starting Ollama\.\.\." open \-a Ollama \-\-args hidden fi status "Install complete\. You can now run 'ollama'\." exit 0 fi \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# \# Linux \#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\# \[ "OS” = “Linux” ] || error ‘This script is intended to run on Linux and macOS only.’ IS_WSL2=false KERN=\(uname \-r\) case "KERN“ in *icrosoft*WSL2 | *icrosoft*wsl2) IS_WSL2=true;; *icrosoft) error “Microsoft WSL1 is not currently supported. Please use WSL2 with ‘wsl --set-version2’” ;; *) ;; esac SUDO= if [ “\(id \-u\)" \-ne 0 \]; then \# Running as root, no need for sudo if \! available sudo; then error "This script requires superuser permissions\. Please re\-run as root\." fi SUDO="sudo" fi NEEDS=(require curl awk grep sed tee xargs) if [ -n “$NEEDS” ]; then status “ERROR: The following tools are required but missing:” for NEED in $NEEDS; do echo “ - NEED" done exit 1 fi \# Function to download and extract with fallback from zst to tgz download\_and\_extract\(\) \{ local url\_base="1“ local dest_dir=“2" local filename="3” # Check if .tar.zst is available if curl --fail --silent --head --location “\{url\_base\}/{filename}.tar.zst${VER_PARAM}” >/dev/null 2>&1; then # zst file exists - check if we have zstd tool if ! available zstd; then error “This version requires zstd for extraction. Please install zstd and try again: - Debian/Ubuntu: sudo apt-get install zstd - RHEL/CentOS/Fedora: sudo dnf install zstd - Arch: sudo pacman -S zstd” fi status “Downloading \{filename\}\.tar\.zst" curl \-\-fail \-\-show\-error \-\-location \-\-progress\-bar \\ "{url_base}/\{filename\}\.tar\.zst{VER_PARAM}” | \ zstd -d | SUDO tar \-xf \- \-C "{dest_dir}“ return 0 fi # Fall back to .tgz for older versions status “Downloading \{filename\}\.tgz" curl \-\-fail \-\-show\-error \-\-location \-\-progress\-bar \\ "{url_base}/\{filename\}\.tgz{VER_PARAM}” | \ SUDO tar \-xzf \- \-C "{dest_dir}“ } for BINDIR in /usr/local/bin /usr/bin /bin; do echo $PATH | grep -q BINDIR && break \|\| continue done OLLAMA\_INSTALL\_DIR=(dirname \{BINDIR\}\) if \[ \-d "OLLAMA_INSTALL_DIR/lib/ollama“ ] ; then status “Cleaning up old version at $OLLAMA_INSTALL_DIR/lib/ollama” SUDO rm \-rf "OLLAMA_INSTALL_DIR/lib/ollama“ fi status “Installing ollama to $OLLAMA_INSTALL_DIR” $SUDO install -o0 -g0 -m755 -d $BINDIR SUDO install \-o0 \-g0 \-m755 \-d "OLLAMA_INSTALL_DIR/lib/ollama“ download_and_extract “https://ollama.com/download” “OLLAMA\_INSTALL\_DIR" "ollama\-linux\-{ARCH}” if [ “OLLAMA\_INSTALL\_DIR/bin/ollama" \!= "BINDIR/ollama” ] ; then status “Making ollama accessible in the PATH in $BINDIR” SUDO ln \-sf "OLLAMA_INSTALL_DIR/ollama“ “BINDIR/ollama" fi \# Check for NVIDIA JetPack systems with additional downloads if \[ \-f /etc/nv\_tegra\_release \] ; then if grep R36 /etc/nv\_tegra\_release \> /dev/null ; then download\_and\_extract "https://ollama\.com/download" "OLLAMA_INSTALL_DIR” “ollama-linux-\{ARCH\}\-jetpack6" elif grep R35 /etc/nv\_tegra\_release \> /dev/null ; then download\_and\_extract "https://ollama\.com/download" "OLLAMA_INSTALL_DIR” “ollama-linux-${ARCH}-jetpack5” else warning “Unsupported JetPack version detected. GPU may not be supported” fi fi install_success() { status ‘The Ollama API is now available at 127.0.0.1:11434.’ status ‘Install complete. Run “ollama” from the command line.’ } trap install_success EXIT # Everything from this point onwards is optional. configure_systemd() { if ! id ollama >/dev/null 2>&1; then status “Creating ollama user...” $SUDO useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama fi if getent group render >/dev/null 2>&1; then status “Adding ollama user to render group...” $SUDO usermod -a -G render ollama fi if getent group video >/dev/null 2>&1; then status “Adding ollama user to video group...” $SUDO usermod -a -G video ollama fi status “Adding current user to ollama group...” $SUDO usermod -a -G ollama \(whoami\) status "Creating ollama systemd service\.\.\." cat </dev/null \[Unit\] Description=Ollama Service After=network\-online\.target \[Service\] ExecStart=BINDIR/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 Environment=“PATH=PATH" \[Install\] WantedBy=default\.target EOF SYSTEMCTL\_RUNNING="(systemctl is-system-running || true)” case $SYSTEMCTL_RUNNING in running|degraded) status “Enabling and starting ollama service...” $SUDO systemctl daemon-reload $SUDO systemctl enable ollama start_service() { SUDO systemctl restart ollama; \} trap start\_service EXIT ;; \*\) warning "systemd is not running" if \[ "IS_WSL2“ = true ]; then warning “see https://learn.microsoft.com/en-us/windows/wsl/systemd#how-to-enable-systemd to enable it” fi ;; esac } if available systemctl; then configure_systemd fi # WSL2 only supports GPUs via nvidia passthrough # so check for nvidia-smi to determine if GPU is available if [ “IS\_WSL2" = true \]; then if available nvidia\-smi && \[ \-n "(nvidia-smi | grep -o “CUDA Version: [0-9]*\.[0-9]*”)“ ]; then status “Nvidia GPU detected.” fi install_success exit 0 fi # Don’t attempt to install drivers on Jetson systems if [ -f /etc/nv_tegra_release ] ; then status “NVIDIA JetPack ready.” install_success exit 0 fi # Install GPU dependencies on Linux if ! available lspci && ! available lshw; then warning “Unable to detect NVIDIA/AMD GPU. Install lspci or lshw to automatically detect and install GPU dependencies.” exit 0 fi check_gpu() { # Look for devices based on vendor ID for NVIDIA and AMD case $1 in lspci) case $2 in nvidia) available lspci && lspci -d ‘10de:’ | grep -q ‘NVIDIA’ || return 1 ;; amdgpu) available lspci && lspci -d ‘1002:’ | grep -q ‘AMD’ || return 1 ;; esac ;; lshw) case $2 in nvidia) available lshw && $SUDO lshw -c display -numeric -disable network | grep -q ‘vendor: .* \[10DE\]’ || return 1 ;; amdgpu) available lshw && SUDO lshw \-c display \-numeric \-disable network \| grep \-q 'vendor: \.\* \\\[1002\\\]' \|\| return 1 ;; esac ;; nvidia\-smi\) available nvidia\-smi \|\| return 1 ;; esac \} if check\_gpu nvidia\-smi; then status "NVIDIA GPU installed\." exit 0 fi if \! check\_gpu lspci nvidia && \! check\_gpu lshw nvidia && \! check\_gpu lspci amdgpu && \! check\_gpu lshw amdgpu; then install\_success warning "No NVIDIA/AMD GPU detected\. Ollama will run in CPU\-only mode\." exit 0 fi if check\_gpu lspci amdgpu \|\| check\_gpu lshw amdgpu; then download\_and\_extract "https://ollama\.com/download" "OLLAMA_INSTALL_DIR“ “ollama-linux-${ARCH}-rocm” install_success status “AMD GPU ready.” exit 0 fi CUDA_REPO_ERR_MSG=“NVIDIA GPU detected, but your OS and Architecture are not supported by NVIDIA. Please install the CUDA driver manually https://docs.nvidia.com/cuda/cuda-installation-guide-linux/” # ref: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#rhel-7-centos-7 # ref: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#rhel-8-rocky-8 # ref: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#rhel-9-rocky-9 # ref: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#fedora install_cuda_driver_yum() { status ‘Installing NVIDIA repository...’ case $PACKAGE_MANAGER in yum) $SUDO PACKAGE\_MANAGER \-y install yum\-utils if curl \-I \-\-silent \-\-fail \-\-location "https://developer\.download\.nvidia\.com/compute/cuda/repos/12/(uname -m | sed -e ‘s/aarch64/sbsa/’)/cuda-12.repo“ >/dev/null ; then $SUDO PACKAGE\_MANAGER\-config\-manager \-\-add\-repo https://developer\.download\.nvidia\.com/compute/cuda/repos/12/(uname -m | sed -e ‘s/aarch64/sbsa/’)/cuda-12.repo else error CUDA\_REPO\_ERR\_MSG fi ;; dnf\) if curl \-I \-\-silent \-\-fail \-\-location "https://developer\.download\.nvidia\.com/compute/cuda/repos/12/(uname -m | sed -e ‘s/aarch64/sbsa/’)/cuda-12.repo“ >/dev/null ; then $SUDO PACKAGE\_MANAGER config\-manager \-\-add\-repo https://developer\.download\.nvidia\.com/compute/cuda/repos/12/(uname -m | sed -e ‘s/aarch64/sbsa/’)/cuda-12.repo else error $CUDA_REPO_ERR_MSG fi ;; esac case $1 in rhel) status ‘Installing EPEL repository...’ # EPEL is required for third-party dependencies such as dkms and libvdpau $SUDO PACKAGE\_MANAGER \-y install https://dl\.fedoraproject\.org/pub/epel/epel\-release\-latest\-2.noarch.rpm || true ;; esac status ‘Installing CUDA driver...’ if [ “1" = 'centos' \] \|\| \[ "1$2” = ‘rhel7’ ]; then $SUDO $PACKAGE_MANAGER -y install nvidia-driver-latest-dkms fi $SUDO PACKAGE\_MANAGER \-y install cuda\-drivers \} \# ref: https://docs\.nvidia\.com/cuda/cuda\-installation\-guide\-linux/index\.html\#ubuntu \# ref: https://docs\.nvidia\.com/cuda/cuda\-installation\-guide\-linux/index\.html\#debian install\_cuda\_driver\_apt\(\) \{ status 'Installing NVIDIA repository\.\.\.' if curl \-I \-\-silent \-\-fail \-\-location "https://developer\.download\.nvidia\.com/compute/cuda/repos/12/(uname -m | sed -e ‘s/aarch64/sbsa/’)/cuda-keyring_1.1-1_all.deb“ >/dev/null ; then curl -fsSL -o TEMP\_DIR/cuda\-keyring\.deb https://developer\.download\.nvidia\.com/compute/cuda/repos/12/(uname -m | sed -e ‘s/aarch64/sbsa/’)/cuda-keyring_1.1-1_all.deb else error $CUDA_REPO_ERR_MSG fi case $1 in debian) status ‘Enabling contrib sources...’ $SUDO sed ‘s/main/contrib/’ < /etc/apt/sources.list | $SUDO tee /etc/apt/sources.list.d/contrib.list > /dev/null if [ -f “/etc/apt/sources.list.d/debian.sources” ]; then $SUDO sed ‘s/main/contrib/’ < /etc/apt/sources.list.d/debian.sources | $SUDO tee /etc/apt/sources.list.d/contrib.sources > /dev/null fi ;; esac status ‘Installing CUDA driver...’ $SUDO dpkg -i $TEMP_DIR/cuda-keyring.deb SUDO apt\-get update \[ \-n "SUDO“ ] && SUDO_E=“$SUDO -E” || SUDO_E= DEBIAN_FRONTEND=noninteractive SUDO\_E apt\-get \-y install cuda\-drivers \-q \} if \[ \! \-f "/etc/os\-release" \]; then error "Unknown distribution\. Skipping CUDA installation\." fi \. /etc/os\-release OS\_NAME=ID OS_VERSION=$VERSION_ID PACKAGE_MANAGER= for PACKAGE_MANAGER in dnf yum apt-get; do if available PACKAGE\_MANAGER; then break fi done if \[ \-z "PACKAGE_MANAGER“ ]; then error “Unknown package manager. Skipping CUDA installation.” fi if ! check_gpu nvidia-smi || [ -z “$(nvidia-smi | grep -o “CUDA Version: [0-9]*\.[0-9]*”)“ ]; then case $OS_NAME in centos|rhel) install_cuda_driver_yum ‘rhel’ $(echo $OS_VERSION | cut -d ‘.’ -f 1) ;; rocky) install_cuda_driver_yum ‘rhel’ $(echo $OS_VERSION | cut -c1) ;; fedora) [ $OS_VERSION -lt ‘39’ ] && install_cuda_driver_yum $OS_NAME $OS_VERSION || install_cuda_driver_yum $OS_NAME ‘39’;; amzn) install_cuda_driver_yum ‘fedora’ ‘37’ ;; debian) install_cuda_driver_apt $OS_NAME $OS_VERSION ;; ubuntu) install_cuda_driver_apt $OS_NAME $(echo OS\_VERSION \| sed 's/\\\.//'\) ;; \*\) exit ;; esac fi if \! lsmod \| grep \-q nvidia \|\| \! lsmod \| grep \-q nvidia\_uvm; then KERNEL\_RELEASE="(uname -r)“ case $OS_NAME in rocky) $SUDO $PACKAGE_MANAGER -y install kernel-devel kernel-headers ;; centos|rhel|amzn) $SUDO PACKAGE\_MANAGER \-y install kernel\-devel\-KERNEL_RELEASE kernel-headers-$KERNEL_RELEASE ;; fedora) $SUDO PACKAGE\_MANAGER \-y install kernel\-devel\-KERNEL_RELEASE ;; debian|ubuntu) SUDO apt\-get \-y install linux\-headers\-KERNEL_RELEASE ;; *) exit ;; esac NVIDIA_CUDA_VERSION=\(SUDO dkms status | awk -F: ’/added/ { print 1 \}'\) if \[ \-n "NVIDIA_CUDA_VERSION“ ]; then $SUDO dkms install $NVIDIA_CUDA_VERSION fi if lsmod | grep -q nouveau; then status ‘Reboot to complete NVIDIA CUDA driver install.’ exit 0 fi $SUDO modprobe nvidia $SUDO modprobe nvidia_uvm fi # make sure the NVIDIA modules are loaded on boot with nvidia-persistenced if available nvidia-persistenced; then $SUDO touch /etc/modules-load.d/nvidia.conf MODULES=“nvidia nvidia-uvm” for MODULE in MODULES; do if \! grep \-qxF "MODULE“ /etc/modules-load.d/nvidia.conf; then echo “$MODULE” | $SUDO tee -a /etc/modules-load.d/nvidia.conf > /dev/null fi done fi status “NVIDIA GPU ready.” install_success } main
Similar Articles
My Anti AI computer
A maker describes building a portable 'anti AI computer' using Raspberry Pi Picos, a floppy drive, and a chorded keyboard, while reflecting on the irony that all the code was generated with AI.
@heynavtoor: A lawyer in Manhattan gets a 500-page contract. Every clause needs to be searchable. By hand: one week. An accountant i…
MinerU is a free, open-source tool that extracts text, tables, and equations from PDFs and scanned documents, supporting 109 languages and batch processing, saving hours of manual work.
@PrajwalTomar_: https://x.com/PrajwalTomar_/status/2069409824824316060
The author built a fully offline AI agent using local embedding models, Llama via Ollama, and VectorAI DB to address the risks of cloud-dependent AI. The agent runs on an 8GB MacBook, processes sensitive documents, and maintains memory across sessions.
@gippp69: THIS GUY SAW A $430 AI BILL AND BUILT HIS OWN AI LAB UNDER HIS DESK INSTEAD RTX 5090 + RTX 4090, 56GB VRAM, 128GB RAM, …
A user built a private AI lab under his desk using RTX 5090 and RTX 4090 GPUs, running local open-source models like Qwen, DeepSeek, and Llama to avoid API costs.
@neil_xbt: He built a legal AI startup and sold it to Thomson Reuters for $650 million! Then went to Y Combinator and gave away th…
A founder who sold his legal AI startup to Thomson Reuters for $650 million shares a playbook on AI innovation categories, pricing strategies, and the overlooked opportunity of enabling previously impossible tasks at scale.