Automated installation script for Simon Willison's llm CLI tool and related AI/LLM command-line utilities for Debian-based Linux environments.
- Features
- System Requirements
- Installation
- Quick Reference
- Documentation
- What Gets Installed
- Usage
- Getting Started
- Basic Prompts
- Understanding Command Output (wut)
- Command Completion
- Attachments & Multi-modal
- Fragments
- Templates
- Git and Sorting
- Code Generation
- Tools
- Context System Usage
- RAG (Document Querying)
- Image Generation (imagemage)
- Speech-to-Text Transcription
- Integration with Other Tools
- LLM Functions (Optional)
- Micro Text Editor Integration
- Terminator Assistant
- Claude Code Router
- Managing Models
- Model-Specific Parameters
- Managing API Keys
- Understanding the Shell Integration
- Session Recording & Context System
- Understanding Azure OpenAI Setup
- Alternative: Gemini for Private Use
- Configuration
- Troubleshooting
- Support
- Related Projects
- Credits
- License
- Contributing
- ✅ One-command installation - Run once to install everything
- ✅ Self-updating - Re-run to update all tools automatically
- ✅ Provider choice - Configure either Azure OpenAI (enterprise) or Google Gemini (free tier)
- ✅ Easy provider switching - Use
--azureor--geminiflags to switch anytime - ✅ Command completion - Press Ctrl+N for AI command suggestions, Tab for llm autocompletion (Zsh)
- ✅ Automatic session recording - Terminal history captured for AI context
- ✅ AI-powered context retrieval - Query your command history with
contextorllm -T context - ✅ RAG document querying - Query your documents with
llm ragusing hybrid semantic+keyword search (llm-tools-rag) - ✅ Terminator Assistant - AI pair programming assistant with command execution (Terminator only)
- OS: Debian, Ubuntu, Kali Linux (or derivatives)
- Python: 3.8+ (usually pre-installed)
- Rust: 1.85+ (automatically installed via rustup if not available)
- Node.js: 20+ (automatically installed via nvm if repository version is older)
- Internet: Required for installation and API access
- Disk Space: ~500MB for all tools and dependencies
Supported Shells:
- Zsh (5.0+) - Recommended
- Bash (3.0+)
Note: The installation script automatically handles Rust and Node.js version requirements. If your system has older versions, it will offer to install newer versions via rustup and nvm respectively.
Recommended: For a fully configured Linux environment with optimized shell settings, security tools, and system utilities, consider installing linux-setup first. This provides the base configuration layer that complements the LLM tools.
For the best experience, install linux-setup first to get a fully configured Linux environment:
git clone https://github.com/c0ffee0wl/linux-setup.git
cd linux-setup
./linux-setup.shThe linux-setup repository provides:
- Optimized Zsh configurations and aliases
- Essential security and development tools
- Base environment that complements LLM tools
This step is optional but recommended for the most complete setup.
sudo git clone https://github.com/c0ffee0wl/llm-linux-setup.git /opt/llm-linux-setup
sudo chown -R $(whoami):$(whoami) /opt/llm-linux-setup
cd /opt/llm-linux-setup
./install-llm-tools.shDuring first-time installation, you'll be prompted for:
- Provider Choice - Choose either Azure OpenAI (enterprise) or Google Gemini (free tier)
- Azure: Prompts for API key and resource URL
- Gemini: Prompts for API key (free from Google AI Studio)
- Session Log Storage - Choose between temporary (
/tmp, cleared on reboot) or permanent (~/session_logs, survives reboots)
Note: To switch providers later, use the appropriate flag (--azure or --gemini).
Simply re-run the installation script:
cd /opt/llm-linux-setup
./install-llm-tools.shTo switch or reconfigure providers:
# Switch to or reconfigure Azure OpenAI
./install-llm-tools.sh --azure
# Switch to or reconfigure Google Gemini
./install-llm-tools.sh --geminiThe script will:
- Pull the latest version of the repository (and itself) from git.
- Update llm, its plugins, and all applications installed by the llm-setup.
- Update custom templates (llm.yaml, llm-code.yaml).
- Refresh shell integration files.
- Preserve existing provider and session log configurations (unless switching providers).
⚡ Most Common Commands (no need to specify -t llm - it's the default!)
# Ask questions (assistant template auto-applied)
llm "Your question here"
llm -c "Your follow up" # Continue last conversation on CLI
llm chat # Start interactive conversation
llm chat -c # Continue last conversation interactively
# Include local context via shell expansion or piping
llm "explain this error: $(python zero_division.py 2>&1)"
docker logs -n 20 my_app | llm "check logs, find errors, provide possible solutions"
cat setup.py | llm 'extract the metadata'
llm 'extract the metadata' < setup.py # Avoid useless use of cat
llm -f setup.py 'extract the metadata' # Alternatively use local fragments
ls -1aG | llm "Describe each of the files"
llm "What does 'ls -1aG' do?"
# Use command completion (works best with Zsh)
# Type: find pdf files larger than 20MB
# Press: Ctrl+N
# Generate clean code ('llm code' is an alias for 'llm -t llm-code')
llm code "python function to..." | tee output.py
# You can iterate on generated code by continuing the last conversation
llm code "find files larger than 100MB as a bash script" | tee script.sh
llm code -c "and smaller than 500MB; add comments" | tee script.sh
# Use fragments for context
llm -f github:user/repo "analyze this"
llm -f pdf:document.pdf "summarize"
llm -f pdf:https://example.com/doc.pdf "summarize remote PDF"
llm -f yt:https://youtube.com/watch?v=VIDEO_ID "summarize video"
llm -f https://example.com "extract key points"
# Use -t when you want a DIFFERENT template than the default assistant template
llm -t fabric:summarize "..." # Not the default
llm -t fabric:analyze_threat_report # Not the default
# Git workflow - AI-powered commit messages
llm git-commit # Generate commit message from staged changes
llm git-commit --tracked # Generate commit message from all tracked changes
# Semantic sorting - sort by meaning, not alphabetically
cat names.txt | llm sort --query "Which is more suitable for a pet monkey?"
llm sort --query "Most technical" --top-k 5 topics.txt
# Query your documents with RAG (llm-tools-rag hybrid search)
llm rag add mydocs /path/to/files # Add documents to collection
llm rag search mydocs "query" # Search collection
llm -T 'rag("mydocs")' "question" # Use RAG as a tool in conversations
# Understand command output
wut # Explain what just happened
wut "why did this fail?" # Ask specific question about last command
# Web search with Google (requires Gemini/Vertex)
llm chat-google-search # Interactive chat with Google Search grounding
# Query terminal history (context tool is built into assistant template!)
llm "what was the error in my last command?" # Uses context tool automatically in default template
command llm -T context "..." # Explicit tool call (for non-assistant templates)
context # Show last command
context 5 # Show last 5 commands
# Run shell commands safely (sandboxed_shell tool is built into assistant template!)
llm "Check if docker is installed and show version" # AI runs commands safely, automatically
llm chat # Then ask: "Can you list the files in /root?"
llm "Check kernel version" --td # Show tool execution details
llm "Check kernel version" --ta # Require manual approval before execution
command llm -T sandboxed_shell "..." # Explicit tool call (for non-assistant templates)
# File manipulation (use -T Patch with --ta for safety)
llm -T Patch "Read config.yaml" --ta # Read files
llm -T Patch "Create hello.py with a hello world program" --ta # Create files
llm -T Patch "In config.yaml, change debug to true" --ta # Edit files
# Terminator Assistant (AI terminal assistant)
llm assistant # Launch AI assistant in Terminator
llm assistant azure/gpt-4.1 # Launch with specific model
# Inside assistant:
# /watch detect security issues # Security monitoring
# /watch spot inefficient shell commands # Shell efficiency tips
# /watch monitor logs for errors and suggest fixes # Log monitoring
# /help # Show commands
# /quit # Exit
# Claude Code Router (multi-provider routing)
routed-claude # Launch Claude Code through router (alias for 'ccr code')- README.md - Readme
- CLAUDE.md - Developer documentation and architecture guide (for Claude Code and contributors)
- LLM Documentation
- LLM Plugins Directory
- Gitingest Documentation
- Files-to-Prompt Documentation
- Claude Code Documentation
- llm - LLM CLI tool (fork with markdown markup enhancements, originally by Simon Willison - Documentation)
- Claude Code - Anthropic's official agentic coding CLI
- Claude Code Router - Multi-provider routing proxy for Claude Code (Azure + Gemini dual-provider or Gemini-only)
- Python 3 - Required for llm
- uv - Modern Python package installer
- Node.js - JavaScript runtime (v20+, from repositories or nvm)
- Rust/Cargo - Rust toolchain (v1.85+, from repositories or rustup)
- Go - Go toolchain (v1.22+, optional, for imagemage)
- argc - Bash CLI framework and command runner (enables optional llm-functions integration)
- bubblewrap - Sandboxing tool for llm-tools-sandboxed-shell
- poppler-utils - PDF utilities (pdftotext for RAG)
- pandoc - Document converter (DOCX support for RAG)
- xsel - X11 clipboard tool (enables pbcopy/pbpaste on Linux)
- jq - Command-line JSON processor
- llm-cmd - Command execution and management
- llm-cmd-comp - AI-powered command completion (powers Ctrl+N)
- llm-tools-quickjs - JavaScript execution tool
- llm-tools-sqlite - SQLite database tool
- llm-jq - JSON processing tool
- llm-tools-sandboxed-shell - Sandboxed shell command execution
- llm-tools-patch - File manipulation tools (read, write, edit, multi_edit, info)
- llm-tools-context - Terminal history integration (exposes
contexttool to AI) - llm-fragments-site-text - Web page content extraction
- llm-fragments-pdf - PDF content extraction
- llm-fragments-github - GitHub repository integration
- llm-fragments-youtube-transcript - YouTube video transcript extraction with metadata
- llm-arxiv - arXiv paper search, fetch, and image extraction
- llm-fragments-dir - Load all text files from a local directory recursively
- llm-templates-fabric - Fabric prompt templates
- llm-tools-llm-functions - Bridge for optional llm-functions integration (enables custom tools in Bash/JS/Python)
- llm-gemini - Google Gemini models integration
- llm-vertex - Google Vertex AI Gemini models integration
- llm-openrouter - OpenRouter API integration
- llm-anthropic - Anthropic Claude models integration
- llm-git-commit - AI-powered Git commit message generation with interactive refinement
- llm-sort - Semantic sorting using LLM-based pairwise comparisons
- llm-classify - Text classification with confidence scoring using logprobs
- llm-consortium - Multi-model orchestration for consensus-based problem solving
- llm.yaml - Custom assistant template with security/IT expertise configuration (Optimized for cybersecurity and Linux tasks, includes
contextandsandboxed_shelltools by default) - llm-code.yaml - Code-only generation template (outputs clean, executable code without markdown)
- llm-wut.yaml - Command-line assistant for explaining terminal output and troubleshooting (concise 5-sentence responses, uses
contexttool automatically) - llm-assistant.yaml - AI pair programming template for Terminator terminal (provides intelligent debugging, command suggestions, and automatic execution in split panes)
- gitingest - Convert Git repositories to LLM-friendly text
- yek - Fast repository to LLM-friendly text converter (230x faster than alternatives, written in Rust)
- files-to-prompt - File content formatter for LLM prompts
- asciinema - Terminal session recorder (built from source for latest features)
- context - Terminal history extraction from asciinema recordings (CLI + LLM tool)
- Micro - Modern terminal text editor with llm-micro plugin for in-editor AI assistance
- imagemage - Gemini image generation CLI (requires Go 1.22+, only installed when Gemini is configured)
- onnx-asr - Speech-to-text transcription using NVIDIA Parakeet TDT (25 European languages, auto-punctuation)
- llm-assistant - TmuxAI-inspired AI assistant for Terminator terminal (automatic command execution, watch mode)
- AI-powered command completion (Ctrl+N) - see
llm-integration.bash/.zsh - Tab completion for llm commands (Zsh only) - see
llm-zsh-plugin - Custom llm wrapper with automatic template application - see
llm-common.sh - Automatic session recording with asciinema - see
llm-common.sh - macOS-style clipboard aliases (
pbcopy/pbpasteviaxselon Linux) - Common aliases and PATH configuration
Discover your installation and available commands:
# Verify llm is installed and in PATH
which llm
command llm
# View general help
llm --help
# Get help for specific commands
llm prompt --help
llm chat --help
# View your assistant template configuration
xdg-open ~/.config/io.datasette.llm/templates/llm.yaml # Linux
open ~/.config/io.datasette.llm/templates/llm.yaml # macOS
# View installed plugins
llm plugins💡 Important: All llm and llm chat commands automatically use the assistant template by default. You don't need to specify -t llm!
The assistant template is configured for security/IT expertise - perfect for cybersecurity and Linux tasks.
Simple question-and-answer prompts:
# Ask a question (per your assistant template)
# The assistant template is automatically applied
llm "Was ist das meistverbreite Betriebssystem für Pentester?"
# Continue the most recent conversation in CLI mode (--continue / -c)
llm -c "Und für Forensiker?"
# Include system information in your prompt
llm "Tell me about my operating system: $(uname -a)"
# Pipe output to clipboard
llm "Was ist das meistverbreite Betriebssystem für Pentester?" | pbcopyNote: The shell integration provides macOS-style clipboard commands (pbcopy/pbpaste) on Linux via aliases to xsel.
Markdown Rendering (Fork Feature)
This llm fork includes markdown rendering capabilities using the rich library:
# Render output as beautifully formatted markdown
llm "Explain Docker in markdown format" --markdown
# Use the shorthand flag
llm "Create a bullet list of top 5 Linux commands" --md
# Works with piping too
cat article.txt | llm "Summarize in markdown" --mdThe --markdown/--md flags provide:
- Syntax-highlighted code blocks
- Formatted tables, lists, and headers
- Better readability in the terminal
Interactive Chat Mode
Continue a conversation with context (assistant template is auto-applied to new chats):
# Start a new chat conversation (assistant template auto-applied)
llm chat
# Continue the most recent conversation (template not re-applied)
llm chat -cHelp Documentation Queries
A powerful workflow is piping command help output to llm for natural language questions, then continuing the conversation:
# Ask questions about command options
bat --help | llm "What is the difference between '| bat -p -l md' and '| bat --language=markdown --force-colorization'?"
# Continue asking follow-up questions in a chat (don't pipe directly to 'llm chat'!)
docker --help | llm
llm chat -c --md
# > What's the difference between 'docker run' and 'docker exec'?
# > When should I use '--detach' vs '--interactive'?
# Get explanations for complex commands
git --help | llm "Explain git rebase in simple terms"
llm -c "Now explain the difference between rebase and merge"The -c (continue) flag lets you maintain context and ask follow-up questions without re-sending the help text.
The wut command is a command-line assistant that explains terminal output and helps troubleshoot issues. It automatically accesses your terminal history to understand what went wrong and provides expert analysis with actionable fixes.
Basic Usage:
# Run a command that produces output or errors
docker build -t myapp .
# Error: failed to solve with frontend dockerfile.v0
# Ask what happened (automatic explanation)
wut
# AI explains the docker build error, identifies the root cause, and suggests a fix
# Ask a specific question
npm install
# Warning: deprecated packages...
wut "are these deprecation warnings a security issue?"
# AI analyzes the warnings and provides security context
# Interactive troubleshooting mode
wut
# Then continue with follow-up questions using: llm chat -cHow It Works:
- Automatic context: Uses the
contexttool to access your terminal history automatically - Concise responses: Maximum 5 sentences unless the issue is complex
- Expert analysis: Applies security/IT best practices to recommendations
- Two modes:
- Explain mode:
wut(no arguments) explains what happened with your last command - Answer mode:
wut "question"answers your specific question about the output
- Explain mode:
Use Cases:
# Debug failed builds
cargo build
# Error: cannot find crate...
wut "how do I fix this dependency issue?"
# Understand API errors
curl https://api.example.com/endpoint
# HTTP 403 Forbidden
wut
# Analyze logs
journalctl -xe | tail -20
wut "what caused this service to crash?"
# Diagnose permission issues
mkdir /var/myapp
# Permission denied
wut "how do I create this directory properly?"💡 Pro tip: The wut command uses the same expert assistant template as llm chat, so it understands your technical environment (Linux, security tools, development workflow).
Type a partial command or describe what you want in natural language, then press Ctrl+N:
# Type: list all pdf files
# Press Ctrl+N
# Result: find . -type f -name "*.pdf"
# Type: Wie finde ich alle .sh-Dateien unter /root?
# Press Ctrl+N
# Result: find /root -name "*.sh"
# Don't execute it yet.
# Type: Aber nur auf demselben Dateisystem.
# Result: find /root -name "*.sh" -xdevThe AI will suggest a command and execute it after your approval.
You can also use llm cmd to suggest a command and leave you to modify and execute it.
# Generate a shell command
llm cmd "Find all .sh files below /root"Some models support images, PDFs, audio, and video as input:
# Attach an image from URL
llm "Beschreibe" -a https://www.corporate-trust.de/wp-content/uploads/2023/12/poster_ransomware.pdf
llm "Wenn ich nur eines mache, was ist dann das wichtigste?" -c
# Attach local images
llm "Extrahiere den Text" -a image1.jpg -a image2.jpg
# Pipe content and attach it
wget https://www.corporate-trust.de/wp-content/uploads/2023/12/poster_ransomware.pdf -O poster.pdf
cat poster.pdf | llm 'describe image' -a -Note: The -a - flag reads attachment data from stdin.
Fragments are reusable pieces of context that can be loaded into your prompts. They can be files, URLs, GitHub repositories, or PDFs.
For more details, see the official fragments documentation.
File and URL Fragments
Load local files or fetch content from URLs:
# Load a local file as context
llm -f /path/to/file.py "Explain this code"
# Simple alternative without local fragment
llm "Explain this code" < /path/to/file.py
# Load content directly from a URL (raw fetch)
llm -f https://example.com/article "Summarize this article"
# Combine multiple fragments (great for comparing files)
llm chat -f https://raw.githubusercontent.com/offsh/terminator_logger/refs/heads/master/auditor.py \
-f https://raw.githubusercontent.com/gnome-terminator/terminator/refs/heads/master/terminatorlib/plugins/logger.py
# Then ask in the chat
# > Was ist der Unterschied zwischen den beiden Implementierungen?💡 URL Fragment Types: -f https://url vs -f site:https://url
There are two ways to fetch web content:
-
Direct URL fetch (
-f https://url):- Fetches the URL content directly (raw)
- Best for: APIs, JSON endpoints, raw files, GitHub raw content, RSS feeds
- Gets exactly what the URL returns (HTML, JSON, plain text, etc.)
-
Smart web extraction (
-f site:https://url):- Uses the
llm-fragments-site-textplugin - Intelligently extracts main content from HTML pages
- Converts to clean markdown
- Best for: Blog posts, articles, documentation pages, news sites
- Uses the
When to use which:
# ✅ Direct fetch for raw content and APIs
llm -f https://api.github.com/repos/user/repo "What's the star count?"
llm -f https://raw.githubusercontent.com/user/repo/main/script.py "Explain this code"
# ✅ Smart extraction for web pages with lots of HTML
llm -f site:https://example.com/blog/article "Summarize the main points"
llm -f site:https://docs.example.com/guide "Extract the installation steps"
# ❌ Don't use site: for raw content (it's already clean)
# llm -f site:https://api.github.com/repos/user/repo # Unnecessary
# llm -f site:https://raw.githubusercontent.com/... # UnnecessaryGitHub Repository Fragments
Load entire GitHub repositories or specific issues/PRs (powered by llm-fragments-github):
# Load an entire repository
llm -f github:Softeria/ms-365-mcp-server \
"Wo wird da die App / der Dienstprinzipal konfiguriert in welcher Quelltextdatei?"
# Continue the conversation
llm chat -c
# > Was muss ich machen, wenn ich selbst so eine App in meinem Tenant anlegen möchte?
# Compare two similar projects
llm -f github:space-cadet/yt-mcp \
"Kann dieser MCP-Server Playlisten beliebiger länge abfragen, oder gibt es ein hartkodiertes Limit?"
llm -c -f github:emit-ia/youtube-transcript-mcp \
"Und jetzt im Vergleich dieser. Was sind da die Unterschiede? Der letzte erfordert keinen API-Key, oder wie macht er das?"
# Load a specific GitHub issue
llm -f issue:simonw/llm/123 "Summarize this issue"
# Load a pull request with diff
llm -f pr:simonw/llm/456 "Review this PR"PDF Fragments
For models that don't support native PDF attachments, use the pdf: fragment type:
wget https://www.corporate-trust.de/wp-content/uploads/2023/12/poster_ransomware.pdf -O poster.pdf
# Load a PDF as context
# Alternative to using -a for PDFs (converts to markdown first)
llm -f pdf:poster.pdf "Was ist das wichtigste auf diesem Poster?"YouTube Video Fragments
Extract transcripts and metadata from YouTube videos using the yt: fragment type:
# Summarize a YouTube video
llm -f yt:https://www.youtube.com/watch?v=VIDEO_ID "Summarize this video"
# Extract key points from a video
llm -f yt:https://youtu.be/VIDEO_ID "What are the main topics discussed?"
# Analyze video content with fabric pattern
llm -f yt:https://www.youtube.com/watch?v=VIDEO_ID -t fabric:youtube_summary --md
llm -f yt:https://www.youtube.com/watch?v=VIDEO_ID -t fabric:summarize_lecture --md
# Compare multiple videos
llm -f yt:https://www.youtube.com/watch?v=VIDEO_ID_1 \
-f yt:https://www.youtube.com/watch?v=VIDEO_ID_2 \
"Compare these two videos and highlight the differences"Note: The plugin uses yt-dlp for metadata extraction and youtube-transcript-api for transcript retrieval. Auto-generated captions are used if manual transcripts aren't available.
arXiv Paper Fragments
Access and analyze arXiv papers using the arxiv: fragment type or the llm arxiv command:
# Load an arXiv paper by ID
llm -f arxiv:2310.06825 "Summarize the key findings"
# Search for papers on a topic
llm arxiv-search "transformer architecture" -n 5
# Fetch and analyze a specific paper
llm arxiv 2310.06825 "What methodology was used?"
# Include figures from PDF (requires vision model)
llm arxiv 2310.06825 -i all -m gemini-2.5-flash "Describe the architecture diagram"
# Include specific pages' images
llm arxiv 2310.06825 -i P:1,3-5 "What does Figure 1 show?"
# Compare multiple papers
llm -f arxiv:2310.06825 -f arxiv:2401.12345 "Compare the approaches in these papers"Features:
- Fragment loader for embedding paper content in prompts
- Image extraction from PDFs with page control (
-i P:1,3-5or-i all) - Search by keywords, author, or title
- Resize images for token management (
-r 800for max 800px dimension)
Directory Fragments
Load all text files from a local directory recursively using the dir: fragment type:
# Load all text files from a directory
llm -f dir:/path/to/project "Analyze the structure of this codebase"
# Load from current directory
llm -f dir:. "Summarize all documentation files in this project"
# Combine with other fragments
llm -f dir:./docs -f dir:./src "Compare documentation with implementation"
# Use in interactive mode
llm chat -f dir:/etc/nginx/conf.d
# > Explain the nginx configuration
# > What security settings are configured?What's included:
- Recursively includes all text files from the specified directory
- Automatically skips binary files
- Useful for analyzing local codebases, documentation, or configuration directories
Tip: For large directories, consider using more specific paths or combining with other tools like gitingest, files-to-prompt, or yek for better control over file selection.
Templates are pre-configured prompt patterns that you can reuse. This setup includes custom templates and Fabric patterns.
💡 Reminder: The assistant template is already the default - you only need -t for different templates!
Using Templates
# ❌ Don't do this (assistant is already default)
# llm -t llm "Your question here"
# ✅ Just use llm directly for the default assistant template
llm "Your question here"
# ✅ Use -t when you want a DIFFERENT template
llm -t fabric:summarize -f https://github.com/c0ffee0wl/llm-linux-setupFabric Templates
The llm-templates-fabric plugin provides access to Fabric patterns:
# Summarize content
llm -f site:https://example.com/article -t fabric:summarize
# Explain code using Fabric's explain_code pattern
llm -f github:TheR1D/shell_gpt -t fabric:explain_code
# Analyze email headers for phishing detection
llm -f email_headers.txt -t fabric:analyze_email_headers
# Analyze a threat report
llm -f https://www.volexity.com/blog/2025/04/22/phishing-for-codes-russian-threat-actors-target-microsoft-365-oauth-workflows/ \
-t fabric:analyze_threat_report
# Review code architecture
llm -f github:user/repo -t fabric:review_code
# Create STRIDE threat model
llm -f github:user/secure-app -t fabric:create_stride_threat_model
# Analyze malware samples and extract IOCs
llm -f malware_report.txt -t fabric:analyze_malware
# Structure incident/breach analysis
llm -f breach_article.md -t fabric:analyze_incident
# Generate network threat landscape from port scan
nmap -sV scanme.nmap.org | llm -t fabric:create_network_threat_landscapeSuggested Fabric Patterns:
fabric:explain_code- Explains code, security tool output, configurationfabric:analyze_email_headers- Analyze phishing/spam emails (SPF, DKIM, DMARC analysis)fabric:analyze_threat_report- Extracts insights from cybersecurity reportsfabric:create_network_threat_landscape- Generate threat assessment from port scans and network servicesfabric:review_code- Analyzes code architecture and designfabric:review_design- Analyzes system and software design architecturefabric:create_stride_threat_model- STRIDE threat modelingfabric:write_nuclei_template_rule- Create Nuclei vulnerability detection templatesfabric:write_semgrep_rule- Generates Semgrep security rulesfabric:create_sigma_rules- Generate Sigma SIEM detection rules from TTPsfabric:analyze_malware- Extract IOCs and MITRE ATT&CK techniques from malware analysisfabric:analyze_incident- Structure breach/incident analysis with attack types and remediationfabric:analyze_threat_report_cmds- Extract penetration testing commands from security materialsfabric:create_report_finding- Structure security findings for professional reportsfabric:analyze_risk- Conduct vendor risk assessments and recommend security controlsfabric:analyze_terraform_plan- Evaluate infrastructure as code for security risks and compliancefabric:summarize- Creates concise summariesfabric:create_threat_scenarios- Identifies likely attack methods for any system by providing a narrative-based threat model, balancing risk and opportunity.
For a complete list of available patterns, see the Fabric Pattern Explanations.
Creating Custom Templates
You can create your own templates to customize AI behavior for specific tasks. Templates are YAML files stored in ~/.config/io.datasette.llm/templates/.
Quick Start:
# Create a simple template for a user prompt
llm 'Summarize the following: ' --save summarize
# Create a system prompt
llm --system 'Summarize this' --save summarize
# Create a new template file
cat > ~/.config/io.datasette.llm/templates/mytemplate.yaml <<'EOF'
system: |
You are a helpful assistant specialized in database design.
Always provide SQL examples when relevant.
Use PostgreSQL syntax by default.
EOF
# Use your template
llm -t mytemplate "How do I create an index on multiple columns?"Template Components:
Templates support these fields:
system: System prompt that defines the AI's role and behaviormodel: Default model to use (e.g.,azure/gpt-4.1,gemini-2.5-flash)tools: List of tools to make available (e.g.,context,sandboxed_shell)options: Model parameters (temperature, max_tokens, etc.)
Using Templates:
# Use custom template
llm -t mytemplate "Your user prompt here"
# List all available templates
llm templates
# Show template details
llm templates show mytemplateFor complete template documentation, see the LLM Templates Guide.
AI-Powered Commit Messages with llm-git-commit
Generate conventional commit messages using AI that analyzes your Git diffs:
# Generate commit message for staged changes
llm git-commit
# Generate commit message for all tracked changes
llm git-commit --tracked
# Interactive workflow:
# 1. AI analyzes your diff and generates a commit message
# 2. Review the suggested message
# 3. Press Ctrl+I to refine the message via chat
# 4. Use /apply to accept or /cancel to discard
# 5. Confirm before committing
# 6. Optionally push after commitFeatures:
- Conventional commit format: Follows industry-standard commit message conventions
- Interactive refinement: Press
Ctrl+Ito chat with AI and improve the message - Safe workflow: Always shows preview and requires confirmation before committing
- Context-aware: Analyzes actual code changes to generate meaningful messages
Example session:
$ git add src/api.py
$ llm git-commit
Analyzing changes...
Suggested commit message:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
feat: add user authentication endpoint
- Implement JWT token generation
- Add password hashing with bcrypt
- Create /api/login route with validation
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[A]ccept, [E]dit, [R]egenerate, or [C]ancel? a
Committing...
[main 1a2b3c4] feat: add user authentication endpoint
1 file changed, 45 insertions(+)
Push changes? [y/N]Semantic Sorting with llm-sort
Sort items by meaning rather than alphabetically using LLM-powered semantic comparisons:
# Sort items by semantic criteria
llm sort --query "Which is more suitable for a pet monkey?" names.txt
# Sort with piped input
cat programming_languages.txt | llm sort --query "Which is better for web development?"
# Use a different method, limit the output to the top 5 lines, and specify a custom model and prompt:
llm sort --query "Rank these slogans" --method sliding --top-k 5 --model azure/gpt-4.1 \
--prompt 'Decide which line is more compelling. Answer with "Line A" or "Line B" Query: {query} Lines: {docA} {docB}.' quotes.txtUse Cases:
- Prioritization: "Which task is more urgent?" "Which feature provides more value?"
- Recommendations: "Which book should I read to learn Python?" "Which tool is better for this task?"
- Categorization: "Which item is more technical?" "Which concept is more advanced?"
- Quality ranking: "Which code solution is cleaner?" "Which explanation is clearer?"
How it works:
llm-sort uses pairwise LLM comparisons to determine semantic ordering. Unlike alphabetical sorting, it understands context and meaning, making it ideal for subjective or context-dependent sorting tasks.
Options:
--query: The semantic criterion for sorting (required)--method: Ranking approach (sortingorsliding, default:sorting)--top-k: Limit output to top N results--model: Specify which LLM model to use--prompt: Custom comparison prompt template
Text Classification with llm-classify
Classify text into user-defined categories with confidence scores using LLM logprobs:
# Basic sentiment classification
echo "This is exciting news!" | llm classify -c positive -c negative -c neutral
# Multi-item classification
llm classify "I love this" "This is terrible" -c positive -c negative -c neutral
# Few-shot learning with examples
llm classify "Stock market crashed" -c economic -c political -c environmental \
-e "Trade deal:economic" -e "Election:political"
# Custom model
llm classify "Analyze this" -c spam -c ham -m gpt-4oOutput Format:
Results are returned as JSON arrays with class, score (0-1 confidence), and content.
Use Cases:
- Content moderation: Classify user content as appropriate/inappropriate
- Sentiment analysis: Categorize reviews as positive/negative/neutral
- Topic routing: Route support tickets to appropriate departments
- Intent detection: Classify user queries by intent type
Multi-Model Consensus with llm-consortium
Orchestrate multiple language models to collaboratively solve problems through parallel reasoning. Based on Karpathy's concept that asking all models and getting them to reach consensus produces optimal performance on complex problems:
# Simple query with default models
llm consortium "Your complex question here"
# Advanced: multiple model instances with custom arbiter
llm consortium "Analyze this security vulnerability" \
-m o3-mini:1 -m gpt-4o:2 \
--arbiter claude-3-opus-20240229 \
--confidence-threshold 0.9 \
--max-iterations 4
# Save configuration for reuse
llm consortium "Query" --save my-consortium
llm -m my-consortium "Use saved config"
# Continue conversations
llm -m my-consortium "Initial prompt"
llm -c "Follow-up question"Key Options:
--arbiter: Judge model for evaluating responses (default: claude-3-opus)--confidence-threshold: Target confidence level 0.0-1.0 (default: 0.8)--max-iterations: Maximum refinement rounds (default: 3)-m model:count: Specify model with instance count (e.g.,gpt-4o:2)
Use Cases:
- Complex reasoning: Math proofs, logic puzzles, code review
- High-stakes decisions: Security analysis, legal review
- Verification-heavy tasks: Fact-checking, data validation
- Research synthesis: Combining perspectives from multiple models
Generate clean, executable code without markdown formatting using the llm code command (a convenient shorthand for llm -t llm-code).
The code template outputs pure code without explanations or markdown blocks, making it perfect for piping to files or direct execution. It infers the scripting/programming language from context, but it is better explicitly state it.
Examples:
# Generate bash script
llm code "Bash script to backup directory with timestamp" | tee backup.sh
# Pass existing code and modify it
cat fizz_buzz.py | llm code "Generate comments for each line of my code" | sponge fizz_buzz.py
# You can iterate on generated code by continuing the last conversation
llm code "find files larger than 100MB as a bash script" | tee script.sh
llm code -c "and smaller than 500MB; add comments" | tee script.sh
# Direct execution (use with caution!)
llm code "one-liner to find files larger than 100MB in Bash" | bash
# Generate Python function
llm code "solve classic fizz buzz problem using Python" | tee fizz_buzz.py
# Generate SQL query (prints to stdout)
llm code "SQL select users who registered this month"
# Generate configuration file
llm code "nginx config for reverse proxy on port 3000" | tee nginx.conf
# Generate Dockerfile
llm code "dockerfile for nodejs app with nginx" | tee Dockerfile
# Generate regex pattern
llm code "regex to match email addresses"💡 Tip: Examples use | tee filename instead of > filename to provide visual feedback - you'll see the generated code in your terminal while it's also being saved to the file. This helps verify the output before using it.
Process Substitution (Execute Without Saving)
Use Bash/Zsh process substitution <(command) to execute generated code as a temporary file:
# Execute Python code directly without creating files
python <(llm code "Python function to calculate fibonacci, then print first 10 numbers")How it works: The <(command) syntax creates a temporary file descriptor that Python or any other program reads as if it were a regular file, then automatically cleans up when done.
# Safer: Review before executing
llm code "Python script to delete old files" | tee cleanup.py
# Review cleanup.py, then: python cleanup.pyAdvanced Code Generation
Use fragments to provide context for code generation, enabling sophisticated plugin development and code transformations:
Plugin Development with Repository Context
Generate complete plugins by providing reference implementations as context:
# Develop a new llm plugin using an existing plugin as reference
llm code -m openai/o4-mini \
-f github:simonw/llm-hacker-news \
'write a new plugin called llm_video_frames.py which takes video:path-to-video.mp4
and creates a temporary directory which it then populates with one frame per second
of that video using ffmpeg - then it returns a list of
[llm.Attachment(path="path-to-frame1.jpg"), ...]
- it should also support passing video:video.mp4?fps=2 to increase to two frames per second,
and if you pass ?timestamps=1 or ×tamps=1 then it should add a text timestamp to the
bottom right corner of each image with the mm:ss timestamp of that frame (or hh:mm:ss if
more than one hour in) and the filename of the video without the path as well.' \
-o reasoning_effort high
# Generate a fragments plugin using reference code
llm -m claude-sonnet-4.5 \
-f https://raw.githubusercontent.com/simonw/llm-hacker-news/refs/heads/main/llm_hacker_news.py \
-f https://raw.githubusercontent.com/simonw/tools/refs/heads/main/github-issue-to-markdown.html \
-s 'Write a new fragments plugin in Python that registers issue:org/repo/123 which fetches
that issue number from the specified github repo and uses the same markdown logic as the
HTML page to turn that into a fragment'Code Transformation and Modernization
Use fragments to provide existing code as context for transformations:
# Convert setup.py to modern pyproject.toml
llm code -f setup.py "convert to pyproject.toml" -m claude-sonnet-4.5 | tee pyproject.tomlUsing Multiple Fragments for Complex Tasks
Combine documentation, code, and requirements:
# Generate code with full project context
llm code \
-f github:user/project \
-f requirements.txt \
-f docs/API.md \
"Create a Python client library for this API with async support"
# Refactor code using style guide
llm code \
-f existing_module.py \
-f CONTRIBUTING.md \
"Refactor this module to match our style guide, add type hints and docstrings"Workflow Tips
- Use reasoning models (
-m openai/o4-mini -o reasoning_effort high) for complex plugin development - Provide reference code via fragments to establish patterns and coding style
- Leverage GitHub fragments (
-f github:org/repo) to quickly pull in reference implementations - Use
-s(system prompt) to override the code template when you need additional context or explanations - Combine with
-cto iterate: generate initial code, review, then refine with follow-up prompts
LLM supports tools that AI models can call during conversations.
Sandboxed Shell Execution
💡 Important: The sandboxed_shell tool is built into the assistant template by default! You can ask AI to run commands naturally without specifying -T sandboxed_shell every time.
Execute shell commands safely in an isolated environment using bubblewrap (bwrap):
# ✅ Ask AI naturally - sandboxed_shell tool is automatically available
llm "Check if docker is installed and show version"
llm chat
# > Can you list the files in /root?
# > Which kernel am I using?
# ⚠️ Explicit tool invocation (useful for non-assistant templates)
command llm -T sandboxed_shell "Run this command safely: cat /etc/passwd"
# Show tool execution details with --td flag
llm "Check if docker is installed" --td
# Manually approve each tool execution with --ta flag
llm "Check if docker is installed" --ta
# Combine both to see details AND approve
llm "Check if docker is installed" --td --taThe --td flag shows full details of tool executions.
The --ta flag requires manual approval before each tool execution.
Security Benefits:
- Isolation: Commands run in a restricted environment using Linux namespaces
- Read-only root: System directories are mounted read-only
- No network access: Sandboxed commands cannot access the network by default
Note: Requires bubblewrap (already installed by setup script).
File Manipulation with llm-tools-patch
The llm-tools-patch plugin provides AI agents with direct file system access for reading, writing, and editing files. This enables AI to autonomously manage files during conversations.
- This plugin grants direct file system access to AI agents
- Always use
--taflag to manually approve each file operation - Review operations carefully before approving
- Works within the current working directory by default
- Use
--chain-limit 0to allow unlimited consecutive tool invocations when needed
Available Operations:
- patch_read - Read complete file contents
- patch_write - Create or overwrite files
- patch_edit - Perform single string replacement
- patch_multi_edit - Execute multiple replacements sequentially
- patch_info - Access file metadata (size, permissions, modification time)
Usage Examples:
# Read a file (with manual approval)
llm -T Patch "Read the contents of config.yaml" --ta
# Create a new file
llm -T Patch "Create a file hello.py with a hello world program" --ta
# Edit existing file (single replacement)
llm -T Patch "In config.yaml, replace 'debug: false' with 'debug: true'" --ta
# Multiple edits in one operation
llm -T Patch "In script.sh, replace all instances of 'echo' with 'printf' and add error handling" --ta --chain-limit 0
# Get file information
llm -T Patch "Show me the file info for README.md" --ta
# Interactive mode with file access
llm chat -T Patch --ta
# > Read the package.json file
# > Update the version to 2.0.0
# > Create a new test file with basic scaffoldingBest Practices:
- Always use
--ta(tool approval) for file operations to review changes before they're applied - Backup important files before running multi-step edit operations
- Use specific file paths to avoid ambiguity
- Test with
--tdflag first to see what operations will be performed without executing - Be explicit in your prompts about what changes you want
Safety Example - Dry Run:
# See what the AI plans to do without executing
llm -T Patch "Refactor index.js to use ES6 imports" --td --ta
# The --td flag shows tool execution details
# The --ta flag requires your approval before any changesIntegration with Other Workflows:
# Combine with context tool - fix errors automatically
llm -T Patch "Read the context. The last command failed. Fix the error in the script." --ta
# Chain with code generation
llm code "python script for file backup" | tee backup.py
llm -T Patch "Add error handling to backup.py" --ta
# Use with sandboxed_shell for complete automation
llm -T Patch "Check if config.yaml exists, if not create it with default values" --taSQLite Database Queries
Query SQLite databases using natural language:
# Download a sample database
wget https://www.timestored.com/data/sample/chinook.db
# Query with natural language (--td shows tool calls, in this case DB queries)
llm -T 'SQLite("chinook.db")' "Count rows in the most interesting looking table" --td
# Approve database queries before execution (--ta for manual approval)
llm -T 'SQLite("chinook.db")' "Count rows in the most interesting looking table" --ta
# Interactive chat mode with database access (add --td to show DB queries)
llm chat -T 'SQLite("chinook.db")'
# > Show me the three most interesting looking tables
# > What are the top 5 best-selling artists?The --td flag shows full details of tool executions.
The --ta flag requires manual approval before each tool execution.
JSON Processing with llm-jq
Generate and execute jq programs using natural language:
# Parse JSON structures
echo '{"users": [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]}' | \
llm jq 'extract names and ages'
# Process JSON from an API
curl -s https://api.github.com/repos/simonw/datasette/issues | \
llm jq 'count by user.login, top 3'
# Options:
# -s/--silent: Hide the generated jq program
# -o/--output: Show only the jq program (don't execute)
# -v/--verbose: Display the AI prompt and responseControlling Tool Execution with Chain Limits
When AI models use tools, they can call multiple tools in sequence to accomplish complex tasks. The --chain-limit (or --cl) parameter controls how many consecutive tool calls are allowed in a single prompt, preventing infinite loops while enabling multi-step reasoning.
Default Behavior:
- Standard llm default: 5 tool calls
- This setup's default: 15 tool calls (configured in shell wrapper)
- Set to 0 for unlimited tool calls
# Use the default chain limit (15 in this setup)
llm "Check if docker is installed, then show all running containers"
# Allow more tool calls for complex multi-step tasks
llm --cl 30 "Analyze system, check disk space, find large files, and suggest cleanup"
# Limit tool calls to prevent excessive API usage
llm --cl 3 "Simple task with minimal tool usage"
# Unlimited tool calls (use with caution!)
llm --cl 0 "Complex task requiring many sequential operations"
# Works in chat mode too
llm chat --cl 20When to adjust:
- Increase (
--cl 20or higher): Complex multi-step tasks, extensive data analysis, or when you see "Chain limit reached" errors - Decrease (
--cl 3-5): Simple tasks where you want to minimize API calls and costs - Unlimited (
--cl 0): Only when necessary, as it can lead to excessive API usage if the model gets stuck in loops
💡 Important: The context tool is built into the assistant template by default! You can ask about your terminal history naturally without typing -T context or --tool context every time.
Query your terminal history to get context-aware AI assistance. Make sure to include wording that lets the LLM know that you want it to query the history as context.
# ✅ Ask AI naturally - context tool is automatically available
llm "what was the error in my last command?"
llm chat
# > Summarize what I did in this session
# > Read the context. How do I fix the compilation error?
# ⚠️ Explicit tool invocation (useful for one-shot queries or non-assistant templates)
command llm -T context "summarize what I did in this session"
# Show last command and output directly
context
# Show last 5 commands with outputs
context 5
# Show entire session history
context allSide-by-Side Terminal Workflow
The context -e feature enables a powerful workflow where you can query an ongoing session from a separate terminal window. This is ideal for side-by-side setups in Terminator, tmux, or any terminal multiplexer:
# Terminal 1 (left pane): Your work session
cd /opt/myproject
./build.sh
# ... working on something ...
# Get the export command
context -e
# Terminal 2 (right pane): AI assistant watching your session
# Paste the export command from Terminal 1
export SESSION_LOG_FILE="/tmp/session_logs/asciinema/2025-10-15_14-30-45-123_12345.cast"
# Now you can query what's happening in Terminal 1 in real-time
# Context tool is available automatically - just ask naturally!
llm "what did the build script just do?"
llm "were there any errors in the last command?"
# Or use chat mode for continuous assistance
llm chat
# > Read the context. What compilation errors occurred?
# > Suggest a fix for the last error shown
# Terminal 1: Keep working
make test
git commit -m "fix compilation error"
# Terminal 2: Query the updates
llm "did the tests pass?"Use Cases:
- Real-time debugging: Watch compilation/test output in one terminal while querying AI for solutions in another
- Learning workflows: Execute tutorials/commands while asking AI to explain what's happening
Note: Both terminals read from the same .cast file, so the side terminal sees all commands and outputs from the work terminal as they happen.
The context system automatically captures:
- Commands you run
- Complete command output
- Error messages and stack traces
This allows AI models to provide context-aware debugging and assistance based on your actual terminal activity.
Query your documents, codebases, and knowledge bases using AI with llm-tools-rag. The system uses hybrid semantic+keyword search (ChromaDB vectors + BM25) for high-quality retrieval.
Quick Start:
# Add documents to a collection
llm rag add mydocs /path/to/files
llm rag add mydocs /path/to/directory/
llm rag add mydocs "*.py" # Glob patterns supported
# Search a collection
llm rag search mydocs "how does authentication work?"
# Use RAG as a tool in conversations
llm -T 'rag("mydocs")' "Explain the authentication system"
# List all collections
llm rag list
# View collection info
llm rag info mydocs
# Rebuild BM25 index after changes
llm rag rebuild mydocsCLI Commands:
llm rag list # List all RAG collections
llm rag add <collection> <path> # Add document to collection
llm rag add <collection> <path> --refresh # Force reindex
llm rag search <collection> <query> # Search collection
llm rag search <collection> <query> --mode vector # Vector-only search
llm rag search <collection> <query> --mode keyword # BM25-only search
llm rag info <collection> # Show collection statistics
llm rag documents <collection> # List documents in collection
llm rag sources <collection> # Show sources from last search
llm rag rebuild <collection> # Rebuild BM25 index
llm rag delete <collection> # Delete collection
llm rag check-deps # Check document loader dependencies
llm rag repl [collection] # Interactive REPL modeUsing RAG as a Tool:
# Simple tool usage
llm -T 'rag("mydocs")' "What does the config file contain?"
# With custom parameters
llm -T 'rag("mydocs", top_k=10, mode="hybrid")' "Find all API endpoints"
# Search modes: "hybrid" (default), "vector", "keyword"Supported Source Types:
| Source | Example |
|---|---|
| Files | /path/to/file.txt |
| Glob patterns | "*.py", "**/*.md" |
| URL | https://example.com/docs/page.html |
| RecursiveUrl (websites) | https://example.com/docs/** |
| Git Repository (remote) | git:https://github.com/user/repo |
| Git Repository (local) | git:/path/to/local/repo |
Supported Document Types:
The system automatically processes various file types with intelligent chunking:
- Text files: .txt, .md, .rst, .json, .yaml, .py, .js, etc.
- PDF files: Extracted with PyMuPDF (layout-aware)
- DOCX files: Converted with python-docx
- Git repositories: Use
git:prefix to load source code
Adding Git Repositories:
# Remote GitHub repository
llm rag add mycode git:https://github.com/user/repo
# Local repository
llm rag add mycode git:/path/to/local/repo💡 Why the git: prefix is required:
- Without prefix:
https://github.com/user/repo→ Fetched as a web page (HTML) - With prefix:
git:https://github.com/user/repo→ Processed as a git repository (source code)
The git: prefix triggers the repository loader which:
- Extracts source code from the repository
- Respects .gitignore files
- Provides clean, formatted code for the index
Search Modes:
| Mode | Description |
|---|---|
hybrid |
Combined semantic + keyword search (default, best quality) |
vector |
Semantic search only (good for conceptual queries) |
keyword |
BM25 keyword search only (good for exact matches) |
Tips:
- Use descriptive collection names (e.g.,
aws-docs,company-policies,project-api) - Hybrid mode gives best results for most queries
- Use
--refreshflag to reindex documents that have changed - Collections are stored in
~/.config/io.datasette.llm/rag/
Generate images using Google's Gemini models (aka "Nano Banana") with the imagemage CLI. Only installed when Gemini is configured.
Available Commands:
| Command | Description |
|---|---|
generate |
Create images from text descriptions |
edit |
Modify existing images or compose multiple images |
restore |
Enhance degraded photographs |
icon |
Generate application icons in multiple sizes |
pattern |
Create seamless textures and patterns |
story |
Produce sequential images for visual narratives |
diagram |
Generate technical flowcharts and diagrams |
Quick Start:
# Basic image generation
imagemage generate "watercolor painting of a fox in snowy forest"
# Generate multiple variations
imagemage generate "mountain landscape" --count=3
# Edit an existing image
imagemage edit photo.png "make it black and white"
# Use cost-effective model (Gemini 2.5 Flash instead of Gemini 3 Pro)
imagemage generate "concept art" --frugal
# Specify aspect ratio (1:1, 16:9, 9:16, 4:3, 3:4, etc.)
imagemage generate "banner image" --aspect=16:9
# Generate app icons in multiple sizes
imagemage icon "minimalist cloud logo"Configuration:
imagemage uses GEMINI_API_KEY (automatically exported by this installation script to ~/.profile).
For full documentation, see the imagemage repository.
Transcribe audio and video files using onnx-asr with NVIDIA's Parakeet TDT model:
# Basic transcription (outputs to stdout)
transcribe recording.mp3
# Save to file
transcribe video.mp4 -o transcript.txt
# Suppress progress messages (progress goes to stderr)
transcribe meeting.m4a 2>/dev/nullSupported formats: mp3, mp4, wav, m4a, flac, ogg, webm (converted via ffmpeg)
Supported languages: 25 European languages (auto-detected): Bulgarian, Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hungarian, Italian, Latvian, Lithuanian, Maltese, Polish, Portuguese, Romanian, Slovak, Slovenian, Spanish, Swedish, Russian, Ukrainian
Model: nemo-parakeet-tdt-0.6b-v3 (~600MB, auto-downloaded on first use)
For detailed documentation, see CLAUDE.md - Speech-to-Text Transcription.
Repository Analysis with gitingest and yek
Convert Git repositories to LLM-friendly text. Both tools serve the same purpose but with different performance characteristics:
- gitingest: Python-based, feature-rich, good compatibility
- yek: Rust-based, extremely fast (230x faster), parallel processing
# Using gitingest (Python-based)
gitingest https://github.com/user/repo
gitingest /path/to/local/repo
# Using yek (Rust-based, much faster)
yek https://github.com/user/repo
yek /path/to/local/repo
# Both tools output to stdout by default
yek https://github.com/user/repo > repo-context.txt
# Combine with LLM for analysis
yek https://github.com/user/repo | \
llm "What is the main purpose of this codebase?"
# Direct analysis without saving
yek /path/to/local/repo | llm "Review architecture and suggest improvements"
# Show more parameters
gitingest --help
yek --helpPerformance comparison: For large repositories with many files, yek is significantly faster due to Rust's performance and parallel processing. Choose based on your needs:
- Use yek for large repos or when speed matters
- Use gitingest for maximum compatibility or specific features
File Bundling with files-to-prompt
Concatenate multiple files for LLM context:
# Bundle all Python files in a directory
files-to-prompt src/*.py | llm "Review this codebase for security issues"
# Include only specific file types
files-to-prompt project/ -e py -e js | llm "What frameworks are being used?"
# Output in Claude XML format
files-to-prompt src/ -c > context.xml
# Show more parameters, e.g. for exclusion and inclusion
files-to-prompt --helpFor complete documentation of parameters, see the files-to-prompt repository.
Git Log Analysis
Analyze your development history:
# Summarize recent development (last 30 days)
cd /opt/llm-linux-setup
git log --since="30 days ago" | \
llm "In visual markdown, prepare a timeline of development during this period, including stages of work and milestones."
# Analyze commit patterns
git log --author="Your Name" --since="1 month ago" --pretty=format:"%s" | \
llm "Categorize these commits by type (feature, fix, docs, etc.)"Piping Workflows
Chain multiple tools together:
# Fetch, extract, and analyze
curl -s https://api.github.com/repos/simonw/llm | \
llm jq 'extract stars, forks, and open issues' | \
llm "Analyze the project popularity"
# Process logs
tail -n 100 /var/log/syslog | \
llm "Identify any errors or warnings and explain them"
# Analyze command output
docker ps --format json | \
llm jq 'count by image' | \
llm "Which containers are running most frequently?"Note: This is an optional feature. The installation script prepares your environment for llm-functions by installing argc and the llm-tools-llm-functions bridge plugin, but you must install llm-functions separately if you want to use it.
llm-functions is a framework that allows you to build custom LLM tools and agents using Bash, JavaScript, and Python. When installed, these tools become available to the llm command through the bridge plugin.
Installing llm-functions:
# Clone the llm-functions repository
git clone https://github.com/sigoden/llm-functions.git
cd llm-functions
# Create tools.txt to specify which tools to enable (one per line)
cat > tools.txt <<EOF
get_current_weather.sh
execute_command.sh
# execute_py_code.py # Lines starting with # are disabled
EOF
# Build function declarations and binaries
argc build
# Verify environment is ready (checks dependencies, env vars, etc.)
argc check
Creating Custom Tools:
llm-functions uses a simple comment-based syntax to define tools:
Bash Example (tools/get_current_weather.sh):
#!/usr/bin/env bash
set -e
# @describe Get the current weather in a given location.
# @option --location! The city and optionally the state or country, e.g., "London", "San Francisco, CA".
# @env LLM_OUTPUT=/dev/stdout The output path
main() {
curl -fsSL "https://wttr.in/$(echo "$argc_location" | sed 's/ /+/g')?format=4&M" \
>> "$LLM_OUTPUT"
}
eval "$(argc --argc-eval "$0" "$@")"Python Example:
See the execute_py_code.py example in the llm-functions repository. This tool uses Python's ast module to execute code and capture output, demonstrating how to define function parameters via docstrings.
JavaScript Example:
See the execute_js_code.js example in the llm-functions repository. This tool demonstrates JavaScript/Node.js code execution with output capture, using JSDoc comments to define parameters.
Tool Discovery in llm:
The llm-tools-llm-functions plugin automatically discovers tools by reading the functions.json file generated by argc build. Tools are registered with llm's function-calling system and become available to AI models.
# Use tools with llm
llm -T get_current_weather "What's the weather in Berlin?"
# In interactive mode
llm chat -T get_current_weather
# > What's the weather in Berlin?Why llm-functions is Optional:
- Requires manual setup and tool development
- Best for users who need custom tool integration
- Not everyone needs to build custom function-calling tools
Use Cases:
- System Integration: Call system commands, APIs, or services from AI conversations
- Custom Workflows: Build domain-specific tools for your projects
- Automation: Create tools that interact with databases, cloud services, or local applications
For complete documentation, see the llm-functions repository.
The repository installs Micro (https://github.com/zyedidia/micro), a modern terminal-based text editor, along with llm-micro (https://github.com/ShamanicArts/llm-micro), a plugin that integrates Simon Willison's LLM CLI directly into the editor for AI-powered text generation and modification.
Architecture Overview:
- Micro Editor: Modern, intuitive terminal editor designed as a successor to nano
- Single Binary: No external dependencies (just libc6)
- Lua Plugin System: Extensible via Lua-based plugins
Usage Modes:
-
Generate Mode (no text selection):
- Cursor positioned where you want output
- Press
Ctrl+E, type:llm write a python function to parse JSON - AI output inserted at cursor position
- Context: Sends surrounding lines for better results
-
Modify Mode (with text selection):
- Select text to modify
- Press
Ctrl+E, type:llm fix this code - AI analyzes selection and replaces it with modified version
- Context: Sends selected text plus surrounding lines
Command Syntax:
llm [options] <request>
Options:
-t <template>, --template <template> Use specific LLM template
-s "<prompt>", --system "<prompt>" Custom system prompt
Examples:
llm write a bash function to list files
llm -t llm-code implement binary search in python
llm --system "you are a python expert" optimize this loop
llm fix the syntax error in this code
Template Commands:
llm_template <name> # Open/edit template YAML
llm_template_default <name> # Set default template
llm_template_default --clear # Remove default template
llm_template_default --show # Show current default
Configuration (~/.config/micro/settings.json):
{
"llm.default_template": "assistant",
"llm.context_lines": 100
}Settings:
llm.default_template(string, default: ""): Default template for LLM operationsllm.context_lines(number, default: 100): Lines of context before/after cursor; 0 to disable
Automatic Features:
- Markdown Extraction: Automatically appends
-xflag to extract text from code blocks - Progress Messages: Shows status in Micro's infobar during generation
- Context Awareness: Sends surrounding code for better AI understanding
Workflow Examples:
# Launch Micro
micro myfile.py
# Generate new code (no selection)
# Position cursor, press Ctrl+E
llm write a function to calculate fibonacci
# Modify existing code (with selection)
# Select code block, press Ctrl+E
llm add error handling to this function
# Use specific template
llm -t llm-code implement quicksort in python
# Custom system prompt
llm -s "you are a security expert" review this code for vulnerabilitiesTips:
- Set
llm.default_templateto your most-used template for faster workflow - Use
-t llm-codetemplate for clean, executable code without explanations - Adjust
llm.context_linesbased on your needs (more context = better understanding, but slower) - View plugin logs: Press
Ctrl+E, typelogto see debug output
The repository includes llm-assistant, a TmuxAI-inspired terminal AI assistant for Terminator terminal emulator that provides an interactive AI pair programming experience.
Key Features:
- Automatic Exec terminal: Auto-creates split terminal for command execution
- Smart context: Captures all terminals except its own (self-aware)
- Watch mode: Proactive monitoring with user-defined goals
- Command execution: AI suggests commands, you approve, they run in Exec terminal
- Streaming responses: Rich markdown rendering with streaming output
Quick Start:
# Launch assistant in any Terminator terminal
llm assistant
# Launch with specific model
llm assistant azure/gpt-4.1
# Direct invocation also works
llm-assistantWorkflow:
- Run
llm assistantin any Terminator terminal - Script auto-creates Exec terminal via D-Bus hsplit
- Type messages in Chat terminal (where script runs)
- AI responds with streaming markdown
- If AI suggests commands (
<EXECUTE>tags), prompted: "Execute? [y/n/e]" - Approved commands run in Exec terminal
- Command output captured for next AI iteration
Slash Commands:
| Command | Description |
|---|---|
/help |
Show available commands |
/clear |
Clear conversation history |
/reset |
Full reset: clear history and remove squash summaries |
/model [name] |
Switch AI model or list available models |
/info |
Show session info (conversation ID, context size, model) |
/watch <goal> |
Enable watch mode (e.g., /watch detect security issues) |
/watch off |
Disable watch mode |
/squash |
Manually compress conversation context |
/quit |
Exit assistant |
Input Modes:
!multi- Enter multi-line input mode (finish with!end)!fragment <name>- Attach an llm fragment to the conversation
Watch Mode Example:
you> /watch detect inefficient commands
Watch mode enabled: monitoring all terminals
# AI now monitors all terminals and provides proactive suggestionsRequirements:
- Terminator terminal emulator
- Plugin enabled: Terminator Preferences -> Plugins -> Check "TerminatorAssistant"
For detailed documentation, see integration/CLAUDE.md.
Claude Code Router (CCR) is an intelligent proxy that routes Claude Code requests to different LLM providers based on task type. It enables multi-provider setups that regular Claude Code doesn't support.
Key Features:
- Dual-provider support: Azure OpenAI for main tasks + Gemini for web search
- Gemini-only mode: All tasks routed to Google Gemini
- Task-aware routing: Different models for different task types
- Automatic configuration: Detects available providers and configures accordingly
Quick Start:
# Launch Claude Code through the router
routed-claudeProvider Configurations:
| Mode | Primary Provider | Web Search | Use Case |
|---|---|---|---|
| Dual-Provider | Azure OpenAI | Gemini | Enterprise with Azure + free Gemini |
| Gemini-Only | Gemini | Gemini | Free tier or Gemini preference |
Routing Options:
| Route Type | Purpose |
|---|---|
default |
Main code generation tasks |
background |
Analysis with cost optimization |
think |
Complex reasoning (uses best model) |
longContext |
Large file/project handling |
webSearch |
Web-dependent research |
Configuration:
- Config file:
~/.claude-code-router/config.json - Auto-generated based on available provider keys
- User modifications preserved via checksum tracking
Note: CCR can use both providers simultaneously in dual-provider mode (Azure + Gemini).
For technical details, see CLAUDE.md.
List Available Models
# List all models (shows Azure, Gemini, and other configured models)
llm models
# Find default model
llm models | grep -i default
# List Azure models
llm models | grep azure
# List Gemini models
llm models | grep gemini
# Get detailed Gemini model info
llm gemini modelsSet Default Model
# Set default model for all commands
llm models default azure/gpt-4.1-mini
# Alternative: using environment variable
export LLM_MODEL=azure/gpt-4.1
llm "Your prompt" # Uses gpt-4.1Use Specific Models
# Override default with -m flag
llm "Ten names for cheesecakes" -m azure/gpt-4.1-mini
# Use different models for different tasks
llm -m azure/gpt-4.1 "Enterprise compliance analysis"
llm -m gemini-2.5-flash "Personal coding question"
llm -m gemini-2.5-flash "Describe this image" -a photo.jpgAzure OpenAI Models
The following Azure models are configured (examples):
azure/gpt-4.1- GPT-4.1 (most capable)azure/gpt-4.1-mini- GPT-4.1 Mini (balanced, default)azure/gpt-4.1-nano- GPT-4.1 Nano (fast, cost-effective)azure/o4-mini- O4 Mini (advanced reasoning)azure/gpt-5-mini,azure/gpt-5-nano,azure/gpt-5.1- GPT-5 models
Default Model Recommendation:
This setup uses azure/gpt-4.1-mini as the default for its balance of performance and cost-effectiveness. For more complex tasks requiring deeper reasoning (such as extensive code analysis, multi-step problem solving, or nuanced decision making), switch to azure/gpt-4.1:
# Switch to gpt-4.1 for complex tasks
llm models default azure/gpt-4.1
# Or use it for a single query with -m flag
llm -m azure/gpt-4.1 "Complex analysis task..."Note: Model IDs shown above are examples from a specific Azure deployment. Your available models depend on your Azure Foundry configuration. Use llm models to see your configured models.
Different model providers support unique parameters beyond the standard temperature and max_tokens settings. Use the -o (options) flag to pass provider-specific parameters.
Gemini and Vertex AI Models
Google's Gemini models (via llm-gemini and llm-vertex plugins) support advanced features like code execution:
# Enable code execution for computational tasks
command llm -m gemini-2.5-flash -o code_execution 1 \
"write and execute python to calculate fibonacci sequence up to n=20"
# Use Vertex AI with code execution
command llm -m vertex/gemini-2.5-flash -o code_execution 1 \
"write and execute python to generate a 80x40 ascii art fractal"
# Combine with other options
command llm -m gemini-2.5-flash \
-o code_execution 1 \
-o temperature 0.7 \
"solve this math problem step by step with code"Code Execution Feature: When enabled, Gemini models can write Python code, execute it in a secure sandbox, see the results, and incorporate the output into their response. This is particularly powerful for:
- Mathematical calculations
- Data analysis and visualization
- Algorithm implementation and testing
- Generating dynamic content (ASCII art, graphs, etc.)
Reasoning Models (o-series)
OpenAI's reasoning models support effort control:
# High reasoning effort for complex problems
command llm -m openai/o4-mini \
-o reasoning_effort high \
"design a distributed caching system with these requirements..."
# Medium effort for balanced performance
command llm -m azure/o4-mini \
-o reasoning_effort medium \
"analyze this algorithm's time complexity"
# Low effort for simpler reasoning tasks
command llm -m openai/o4-mini \
-o reasoning_effort low \
"explain this code pattern"Common Model Options
Standard options supported across most models:
# Control randomness (0.0 = deterministic, 2.0 = very creative)
llm -m gemini-2.5-flash -o temperature 0.9 "creative story prompt"
# Limit output length
llm -m azure/gpt-4.1 -o max_tokens 500 "brief summary needed"
# Combine multiple options
llm -m claude-sonnet-4.5 \
-o temperature 0.3 \
-o max_tokens 2000 \
"technical documentation request"Temperature Range Note: Gemini models support temperature values from 0 to 2.0, while most other models use 0 to 1.0. Check your model's documentation for valid ranges.
For complete parameter documentation:
Configure Azure OpenAI Key:
# Set Azure key interactively
llm keys set azure
# View configured keys
llm keys
# View key storage path
llm keys pathConfigure Gemini Key:
# Set Gemini key interactively
llm keys set gemini
# Verify Gemini key is working
llm -m gemini-2.5-flash "test prompt"Get API Keys:
- Azure OpenAI: Obtained from your Azure Foundry portal/deployment
- Gemini: Free from Google AI Studio (no credit card required)
- OpenAI: From OpenAI platform (requires payment)
- Anthropic: From Anthropic console (requires payment)
The installation adds a smart wrapper function around the llm command that automatically applies templates based on context. This means you rarely need to specify -t llm explicitly!
✅ When the assistant template is AUTO-APPLIED:
llm "Your question"→ Uses assistant template automaticallyllm chat→ Uses assistant template automatically- Any prompt command without explicit template specification
- When continuing a conversation:
llm chat -c,llm -c "follow-up" - When specifying a custom template:
llm -t fabric:summarize - When using a custom system prompt:
llm -s "You are..." - For management commands:
llm models,llm keys,llm plugins, etc. - For specialized subcommands:
llm cmd,llm jq,llm cmdcomp, etc.
If you need to execute the original llm command without the shell wrapper function (for debugging, testing, or to avoid automatic template application), use the command builtin:
# Bypasses the wrapper (no automatic template)
command llm "Your question"
# Useful for debugging or when you want exact control
command llm -t llm "Your question" # You must specify -t explicitlyWhen to use command llm:
- Testing without automatic template modifications
- Scripts that need exact
llmbehavior without wrapper modifications - When you want complete manual control over all parameters
You ONLY need -t when you want a DIFFERENT template:
# ❌ Unnecessary (assistant is already default)
llm -t llm "What is Docker?"
# ✅ Correct (just omit -t)
llm "What is Docker?"
# ✅ Use -t for non-default templates
llm -t fabric:summarize < report.txt
llm -t fabric:analyze_threat_report -a report.pdfWhat does the assistant template do? See the llm.yaml source - it configures the AI with:
- Security/IT/Linux expertise (20 years experience)
- Cybersecurity focus (ethical hacking, forensics, incident response)
- Kali Linux/Ubuntu/Debian environment awareness
- Integrated
contexttool for reading terminal history (automatically available!) - Integrated
sandboxed_shelltool for safe command execution (automatically available!)
The assistant template includes the context and sandboxed_shell tools by default, which means AI models can automatically read your terminal history and execute shell commands safely without you needing to explicitly specify --tool context or -T sandboxed_shell every time!
✅ When these tools are automatically available:
# Just ask naturally - the AI can use the context tool
llm "what was the error in my last command?"
# Or ask the AI to run commands via sandboxed_shell
llm "check if docker is installed and show version"
llm chat
# > Read the context. What did I just run?
# > Can you explain the output from my last command?
# > List the files in /root# When using a different template
llm -t fabric:summarize --tool context "what happened?"
llm -t fabric:summarize -T sandboxed_shell "check docker"
# When bypassing the shell wrapper
command llm --tool context "what went wrong?"
command llm -T sandboxed_shell "run this safely"This setup includes an automatic terminal session recording system that captures your command history and allows AI models to query it for context-aware assistance.
-
Automatic Recording: Every interactive shell session is automatically recorded using asciinema
- Recording starts transparently when you open a terminal
- Each tmux/screen pane gets its own independent recording
-
Context Extraction: The
contextcommand parses asciinema recordings to show command history- Shows commands with their complete output
- Supports showing last N commands or entire session
-
AI Integration: The
llm-tools-contextplugin exposes terminal history as a tool- The
contexttool is built into the assistant template by default - AI models can automatically query your recent command history during conversations
- Just ask naturally:
llm "what was the error?"- no need for--tool context! - Explicit
--tool contextis only needed for non-assistant templates or continuations
- The
On first installation, you'll be prompted to choose where session recordings are stored:
- Temporary (default):
/tmp/session_logs/asciinema/- Cleared on reboot, saves disk space - Permanent:
~/session_logs/asciinema/- Survives reboots, useful for long-term history
You can change this later by editing the SESSION_LOG_DIR export in your .bashrc or .zshrc.
Suppressing Session Start Messages:
To hide the "Session is logged for 'context'..." message on shell startup:
# Add to your .bashrc or .zshrc before the integration source line
export SESSION_LOG_SILENT=1Useful for cleaner shell startup or automated environments.
This installation can configure either Azure OpenAI (Azure Foundry) or Google Gemini as your primary provider. On first run, you'll be asked which provider you want to use.
If you choose Azure OpenAI (default choice for enterprise/workplace use), the setup differs from standard OpenAI API integration.
Key Differences from Standard OpenAI:
- Uses Azure-hosted OpenAI models (not direct OpenAI API)
- Model IDs require
azure/prefix (e.g.,azure/gpt-4.1-mini,azure/o4-mini) - Requires separate API key (
azurenotopenai) - API base URL points to your Azure resource (e.g.,
https://your-resource.openai.azure.com)
LLM Configuration:
- Location:
~/.config/io.datasette.llm/extra-openai-models.yaml - Purpose: Defines Azure-hosted models for llm CLI tool
- Format: YAML file with model definitions
Example structure:
- model_id: azure/gpt-4.1-mini
model_name: gpt-4.1-mini
api_base: https://your-resource.openai.azure.com
api_key_name: azure-a/--attachment parameter, you will receive this error:
Error you'll see:
Error code: 400 - {'error': {'message': "Invalid Value: 'file'.
This model does not support file content types.", 'type': 'invalid_request_error'}}
Workarounds for PDF attachments:
-
For text extraction from PDFs: Use the
pdf:fragmentllm -f pdf:document.pdf "summarize the text" -
For PDF visual analysis: Use non-Azure models
llm -m gpt-4o "analyze this PDF" -a document.pdf llm -m gemini-2.5-flash "describe" -a poster.pdf llm -m claude-sonnet-4.5 "analyze" -a document.pdf
When Azure is the right choice:
- Enterprise/workplace requirements - Compliance, SLAs, data residency
- Organizational policies - Centralized billing, governance
- Private deployments - Models hosted in your Azure subscription
When to consider alternatives:
- Personal/hobbyist use - Free tiers available elsewhere (see Gemini section below)
- Attachment support needed - Standard APIs support multimodal better
- No Azure subscription - Direct API access simpler
For personal projects, learning, and hobbyist use, Google's Gemini 2.5 Flash offers exceptional value with a generous free tier and competitive performance.
Choosing between providers:
- Azure OpenAI: Enterprise/workplace environments, compliance requirements
- Gemini: Personal projects, free tier, hobbyist use
Get your API key:
- Visit Google AI Studio
- Sign up (free, no credit card required)
- Generate an API key from the dashboard
To switch from Azure to Gemini or vice versa:
# Switch to Gemini
./install-llm-tools.sh --gemini
# Switch to Azure
./install-llm-tools.sh --azureThe script will reconfigure the selected provider.
Temperature Note: Gemini supports temperature values from 0 to 2.0, while most models use 0 to 1.0. Be mindful when setting temperature values.
-
~/.config/io.datasette.llm/- LLM configuration directoryextra-openai-models.yaml- Azure OpenAI model definitionstemplates/llm.yaml- Custom assistant template with security/IT expertise (cybersecurity focus)templates/llm-code.yaml- Code-only generation template (no markdown, no explanations)default_model.txt- Currently selected default model- API keys stored securely via llm's key management
-
~/.config/llm-tools/- Additional tool configurationasciinema-commit- Tracks asciinema version for update detection
-
$SESSION_LOG_DIR/- Session recording storage- Default:
/tmp/session_logs/asciinema/(temporary) or~/session_logs/asciinema/(permanent) - Contains
.castfiles with terminal session recordings - Configured via
SESSION_LOG_DIRenvironment variable in your shell RC file
- Default:
-
~/.config/io.datasette.llm/rag/- RAG collections (llm-tools-rag)- Contains ChromaDB vector databases and BM25 indices
Located in the integration/ subdirectory:
integration/llm-integration.bash- Bash integration (Ctrl+N keybinding)integration/llm-integration.zsh- Zsh integration (Ctrl+N keybinding)integration/llm-common.sh- Shared configuration (llm wrapper function, auto-recording)
These are automatically sourced from your .bashrc or .zshrc.
"fatal: Not possible to fast-forward, aborting"
This error occurs when your local git branch has diverged from the remote (both have conflicting changes). This typically happens if you made local edits to files that were also updated remotely.
Solutions:
# Option 1: Discard local changes and match remote (recommended)
cd /opt/llm-linux-setup
git reset --hard origin/main
./install-llm-tools.sh
# Option 2: Try to reapply your local commits on top of remote changes
git pull --rebase
# Option 3: Nuclear option - delete and re-clone
sudo rm -rf /opt/llm-linux-setup
sudo git clone https://github.com/c0ffee0wl/llm-linux-setup.git /opt/llm-linux-setup
sudo chown -R $(whoami):$(whoami) /opt/llm-linux-setup
cd /opt/llm-linux-setup
./install-llm-tools.shFor Ctrl+N (AI completion):
-
Restart your shell or source your profile:
source ~/.bashrc # or ~/.zshrc
-
Verify llm is in PATH:
which llm
-
Test llm command completion:
llm cmdcomp "list files"
For Tab completion (Zsh only):
-
Verify you're using Zsh:
echo $SHELL(should show/bin/zshor similar) -
Clear completion cache and restart shell:
rm -f ~/.zcompdump* exec zsh
-
Verify the plugin is in fpath:
echo $fpath | grep llm-zsh-plugin
-
Test tab completion:
llm <TAB> # Should show: chat, code, rag, models, etc.
-
Verify API key is set:
llm keys get azure
-
Check model configuration:
cat ~/.config/io.datasette.llm/extra-openai-models.yaml -
Update the API base URL in the YAML file if needed
Problem: cargo install fails with errors about minimum Rust version
Solution: The script automatically detects and offers to upgrade Rust to 1.85+ via rustup. If you declined during installation:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/envCheck Rust version:
rustc --versionProblem: npm or node commands fail, or Claude Code won't install
Solution: The script requires Node.js 20+. If you have an older version:
# Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source ~/.bashrc # or ~/.zshrc
# Install Node 22
nvm install 22
nvm use 22
nvm alias default 22Problem: context command shows "No asciinema session recording found"
Solutions:
-
Verify asciinema is installed and in PATH:
which asciinema
-
Check shell integration is loaded:
grep -r "llm-integration" ~/.bashrc ~/.zshrc
-
Restart your shell or re-source your RC file:
source ~/.bashrc # or ~/.zshrc
-
Check if recording is active (should see asciinema process):
ps aux | grep asciinema
Problem: context command shows old or wrong session history
Solutions:
-
Check current session file:
echo $SESSION_LOG_FILE
-
Manually set session file if needed:
export SESSION_LOG_FILE="/path/to/your/session.cast"
-
Get correct export command:
context -e
Problem: New tmux panes don't get their own recordings
Solution: Check for pane-specific environment markers:
env | grep IN_ASCIINEMA_SESSIONYou should see markers like IN_ASCIINEMA_SESSION_tmux_0=1 for each pane. If not, re-source your shell RC file in the new pane:
source ~/.bashrc # or ~/.zshrcFor issues, questions, or suggestions:
- Open an issue: https://github.com/c0ffee0wl/llm-linux-setup/issues
- llm-windows-setup - Windows version
- Simon Willison - Original llm CLI tool and plugins (llm-gemini, llm-anthropic, llm-openrouter, llm-jq, llm-tools-sqlite, llm-tools-quickjs, llm-fragments-github, llm-cmd)
- c0ffee0wl - llm fork with markdown markup enhancements
- sigoden - argc Bash CLI framework and llm-functions framework
- Anthropic - Claude Code agentic coding CLI
- Astral - uv Python package manager
- Rust Foundation - Rust programming language and Cargo
- Node.js Foundation - Node.js JavaScript runtime
- Daniel Turkel - llm-fragments-pdf, llm-fragments-site-text
- Ryan Patterson - llm-cmd-comp plugin
- Dan Mackinlay - files-to-prompt (fork)
- Damon McMinn - llm-templates-fabric (fork)
- Daniel Miessler - Original Fabric prompt patterns
- ShamanicArts - llm-git-commit AI-powered commit messages
- vagos - llm-sort semantic sorting
- irthomasthomas - llm-classify text classification, llm-consortium multi-model orchestration
- RKeelan - llm-fragments-dir directory fragment loader
- Bubblewrap Project - Sandboxing tool for unprivileged containers
- stedolan/jq - Command-line JSON processor
- Asciinema - Terminal session recorder
- Coderamp Labs - gitingest repository analyzer
- Zachary Yedidia - Micro modern terminal text editor
- ShamanicArts - llm-micro plugin for in-editor AI assistance
- bodo-run - yek fast repository converter
- istupakov - onnx-asr speech recognition
- NVIDIA - Parakeet TDT ASR model
This installation script is provided as-is. Individual tools have their own licenses:
- llm: Apache 2.0
- See individual tool repositories for details
To modify or extend this installation, see CLAUDE.md for detailed architecture documentation.
Key files to understand:
install-llm-tools.sh- Main installation script (7 phases, self-updating)integration/llm-common.sh- Shell wrapper function, auto-recordingllm-tools-context/- Terminal history extraction (CLI + LLM tool)llm-templates/- Custom template sources
Development workflow:
- Read CLAUDE.md to understand architecture
- Edit the scripts in the repository
- Test your changes
- Commit and push to git
- Changes pulled automatically on next run