Skip to content

pkdindustries/soulshack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

377 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Soulshack User Guide

soulshack

Soulshack is an advanced IRC chatbot powered by LLMs, designed to bridge traditional chat with modern AI capabilities.

Features

  • Multi-Provider Support: Works with OpenAI, Anthropic, Google Gemini, and Ollama.
  • Unified Tool System: Supports shell scripts, MCP servers, and native IRC tools.
  • Secure: Full SSL/TLS and SASL authentication support.
  • Session Management: Configurable history, context window, and session TTL.
  • Streaming: Real-time responses with IRC-appropriate chunking.
  • Passive Mode: Optional URL watching and analysis.
  • Runtime Configuration: Manage settings via IRC commands.

Quickstart

Option 1: Docker

docker build . -t soulshack:dev

Option 2: Build from Source

Prerequisites: Go 1.23+

  1. Clone and Build:

    git clone https://github.com/pkdindustries/soulshack.git
    cd soulshack
    go build -o soulshack cmd/soulshack/main.go
  2. Run:

    Configuration File (Recommended)

    Local Binary:

    ./soulshack --config examples/chatbot.yml

    Docker:

    # Mount config file to container
    docker run -v $(pwd)/examples/chatbot.yml:/config.yml soulshack:dev \
      --config /config.yml

    All Flags (Kitchen Sink)

    Local Binary:

    ./soulshack \
      --nick soulshack \
      --server irc.example.com \
      --port 6697 \
      --tls \
      --channel '#soulshack' \
      --saslnick mybot \
      --saslpass mypassword \
      --admins "admin!*@*" \
      --model openai/gpt-5.1 \
      --openaikey "sk-..." \
      --maxtokens 4096 \
      --temperature 1 \
      --apitimeout 5m \
      --tool "examples/tools/datetime.sh" \
      --tool "irc__op" \
      --thinkingeffort off \
      --urlwatcher \
      --verbose

    Docker:

    docker run soulshack:dev \
      --nick soulshack \
      --server irc.example.com \
      --port 6697 \
      --tls \
      --channel '#soulshack' \
      --saslnick mybot \
      --saslpass mypassword \
      --admins "admin!*@*" \
      --model openai/gpt-5.1 \
      --openaikey "sk-..." \
      --maxtokens 4096 \
      --temperature 1 \
      --apitimeout 5m \
      --thinkingeffort off \
      --urlwatcher \
      --verbose
    # Note: Local file tools/scripts require volume mounts to work in Docker

    Ollama (Local)

    Local Binary:

    ./soulshack \
      --server irc.example.com \
      --channel '#soulshack' \
      --model ollama/qwen3:30b \
      --ollamaurl "http://localhost:11434"

    Docker:

    # Use --network host to access Ollama on localhost
    docker run --network host soulshack:dev \
      --server irc.example.com \
      --channel '#soulshack' \
      --model ollama/qwen3:30b \
      --ollamaurl "http://localhost:11434"

    Anthropic

    Local Binary:

    ./soulshack \
      --server irc.example.com \
      --channel '#soulshack' \
      --model anthropic/claude-opus-4.5 \
      --anthropickey "sk-ant-..."

    Docker:

    docker run soulshack:dev \
      --server irc.example.com \
      --channel '#soulshack' \
      --model anthropic/claude-opus-4.5 \
      --anthropickey "sk-ant-..."

Configuration Flags

Flag Default Description
-n, --nick soulshack Bot nickname
-s, --server localhost IRC server address
-p, --port 6667 IRC server port
-c, --channel Channel to join
-e, --tls false Enable TLS
--tlsinsecure false Skip TLS cert verification
--saslnick SASL username
--saslpass SASL password
-b, --config Path to YAML config file
-A, --admins Comma-separated admin hostmasks
-V, --verbose false Enable debug logging
--model ollama/llama3.2 LLM model (provider/name)
--maxtokens 4096 Max tokens per response
--temperature 0.7 Sampling temperature
-t, --apitimeout 5m API request timeout
--openaikey OpenAI API key
--anthropickey Anthropic API key
--geminikey Google Gemini API key
--ollamaurl http://localhost:11434 Ollama API endpoint
--tool Path to tool definition (repeatable)
--thinkingeffort off Reasoning effort level: off, low, medium, high
--urlwatcher false Enable passive URL watching
--sandbox false Sandbox shell, bash, and MCP tools (see below)

YAML Configuration

Create a config.yml file:

server:
  nick: "soulshack"
  server: "irc.example.com"
  port: 6697
  channel: "#soulshack"
  tls: true

bot:
  admins: ["nick!user@host"]
  tools:
    - "examples/tools/datetime.sh"
    - "examples/mcp/filesystem.json"

Run with: ./soulshack --config config.yml

Commands

Command Admin? Description
/help No Show available commands
/version No Show bot version
/tools No List loaded tools
/tools add <spec> Yes Add a tool at runtime
/tools remove <pattern> Yes Remove a tool
/admins Yes List admins
/admins add <hostmask> Yes Add an admin
/set <key> <value> Yes Set config parameter
/get <key> No Get config parameter

Built-in Tools

Soulshack comes with native IRC management tools (permissions apply):

  • irc_op, irc_deop: Grant/revoke operator status.
  • irc_kick, irc_ban, irc_unban: User management.
  • irc_topic: Set channel topic.
  • irc_invite: Invite users to channel.
  • irc_mode_set, irc_mode_query: Manage channel modes.
  • irc_names, irc_whois: User information.

Sandboxing

With --sandbox (or sandbox: true in YAML, env SOULSHACK_SANDBOX), all shell scripts, the built-in bash tool, and MCP servers launched via --tool run inside a platform sandbox. Disabled by default.

Requirements: sandbox-exec on macOS, bwrap (bubblewrap) on Linux. If the backend isn't available the flag is ignored with a sandbox_unavailable warning and tools run as before.

Default policy (applied to every sandboxed tool):

  • Writes allowed only under the OS temp directory.
  • Outbound network blocked.
  • Sensitive paths blocked from reads: ~/.ssh, ~/.gnupg, ~/.aws, ~/.azure, ~/.config/gcloud, ~/.kube, ~/.docker/config.json, ~/.npmrc, ~/.config/gh, ~/.netrc, ~/.git-credentials, macOS keychains, and other credential stores.
  • Each sandboxed tool's description gets a [sandboxed] suffix so the model knows it's restricted.

Per-tool overrides — shell scripts declare a sandbox field in their --schema output; MCP server JSON files add it alongside command/args:

"sandbox": true
"sandbox": { "allowNetwork": true, "writablePaths": ["/tmp/data"] }
"sandbox": { "denyWrite": true }
"sandbox": { "allowEnv": ["HOME", "PATH"] }

false opts the tool out entirely (runs unsandboxed even when --sandbox is enabled). Absence of the field uses the default policy above. POLLYTOOL_* env vars are always stripped from sandboxed processes unless listed in allowEnv.

Native IRC tools (irc_op, irc_kick, etc.) run in-process and are unaffected.

The sandbox itself lives in pollytool — for the full config schema, merge semantics, and per-platform backend details see pollytool's Sandboxing section and API.md.

Documentation


Named as tribute to my old friend dayv, sp0t, who i think of often.

About

soulshack, an irc chatbot. openai/ollama/gemini/anthropic apis. basic shell tools and mcp server support.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Contributors

Languages