SolBro Setup Guide

From a fresh clone to a working Ollama-powered Discord bot in about 20–30 minutes. SolBro started as a Solana meme-token tracker and grew into a general-purpose agentic bot. After setup, the personality is yours to define.

Step 1 Prerequisites

Install these first. Verify each is working before moving on.

.NET 8 SDK Required

Download from dotnet.microsoft.com. The SDK, not just the runtime.

Verify:

dotnet --version

Should print 8.x.x.

Ollama Required

Ollama is the local LLM runner. Download the installer for your OS from ollama.ai.

On Linux, the one-liner installer:

curl -fsSL https://ollama.ai/install.sh | sh

After install, verify the daemon is reachable:

curl http://localhost:11434/api/tags

Should return JSON. If it doesn't, open the Ollama desktop app or run ollama serve.

yt-dlp Optional

Only needed if you want the bot to re-upload videos from Instagram / X / TikTok / Facebook / YouTube Shorts links pasted in chat.

OSCommand
Windowswinget install yt-dlp
macOSbrew install yt-dlp
Linux / pippip install -U yt-dlp

Verify: yt-dlp --version. If you skip this, video extraction silently no-ops.

Clone the repo Required

git clone https://github.com/devMando/SolBro.git
cd SolBro

Step 2 Pull Ollama models

You need at least a chat model. A vision model is optional but unlocks image understanding.

Chat model

Strongly recommended: a cloud Ollama model — the default is minimax-m2.7:cloud.

Cloud models are the way to go for this bot. They're frontier-tier in capability, more efficient than anything you can realistically run locally, and they have noticeably better tool-calling — which matters because the bot leans on the model to decide when to search the web, drop a GIF, read a document, or generate a file. Frontier cloud models do that reliably; small local models often don't.

  • No GPU required — your machine only handles Discord I/O.
  • Fast — cloud inference beats most consumer GPUs above ~7B params.
  • Always current — Ollama maintains the cloud models; no re-pulling big checkpoints.
  • Free for personal use — Ollama's cloud tier has a generous free quota.

Cloud models need a one-time auth so your machine can reach Ollama's cloud:

ollama signin

This opens a browser to log in to (or create) your free Ollama account. After that, the cloud model is reachable like any local one — no other config.

ModelWhere it runsNotes
minimax-m2.7:cloudOllama cloudRecommended. Frontier-class, strong tool calling, efficient. Requires ollama signin.
Other :cloud tagsOllama cloudBrowse ollama.com/library for the current cloud-eligible roster.
mistral-nemoLocal ~8 GBBest local tool-calling. Use this if you need fully-offline.
llama3.1:8bLocal ~8 GBBalanced. Strong general reasoning.
qwen3:4bLocal ~4 GBSmallest viable local option. Tool calling is hit-or-miss.
qwen2.5:14bLocal ~10 GBLarger, smarter.
gpt-oss:20bLocal ~16 GBHeavyweight.

For any of the local models, pull it first:

ollama pull <model-name>
Heads up If your bot ends up rarely using GIFs, web search, or other tools, your model's tool-calling is too weak. Switch to a cloud model or mistral-nemo locally — both are markedly better at deciding when to invoke functions.

Vision model Optional

Skip this if you don't want image understanding. Otherwise:

ollama pull llava:7b

Alternatives: llava:13b, llama3.2-vision, bakllava.

Verify everything pulled:

ollama list

Step 3 Create the Discord application

  1. Open discord.com/developers/applications.
  2. Click New Application (top right). Name it whatever you want your bot called.
  3. Accept the terms, click Create.

Get the bot token

  1. In the left sidebar of the application page, click Bot.
  2. Click Reset Token (or Copy) and save it somewhere safe.
Warning Discord only shows the token once. Copy it now and don't share it. If you lose it, you have to reset and update .env.

Enable privileged intents

Still on the Bot page, scroll down to Privileged Gateway Intents. Toggle on all three:

  • Presence Intent — needed for stream notifications
  • Server Members Intent — needed for stream notifications
  • Message Content Intent — required for reading messages

Click Save Changes.

Gotcha Without Message Content Intent, the bot connects fine but can't see what anyone says. This is the #1 cause of "the bot doesn't respond" issues.

Step 4 Invite the bot to a server

You need a Discord server you own or have Manage Server permission on.

  1. In the developer portal sidebar, click OAuth2 → URL Generator.
  2. Under Scopes, tick:
    • bot
    • applications.commands
  3. A new Bot Permissions panel appears. Tick:
    • Send Messages
    • Read Message History
    • Add Reactions
    • Attach Files
    • Manage Messages (suppresses link previews when re-uploading videos)
    • Use Slash Commands
  4. Copy the Generated URL at the bottom and open it in a new tab.
  5. Pick your server, click Continue → Authorize, pass the CAPTCHA.

The bot should now appear in your server's member list as Offline (it'll go online in Step 8).

Step 5 Get API keys for optional features

All three are optional and have free tiers. Skip any you don't want. The bot will still work — affected features just gracefully report "not configured."

Tavily — Web search

Optional Free 1000 calls/mo

Lets the model search the web with AI-friendly snippets. Without this, it falls back to scraping DuckDuckGo HTML — works, but flakier.

  1. Open tavily.com and click Get Started.
  2. Sign up with email or Google.
  3. After login, look for API Keys in the dashboard sidebar.
  4. Copy your key — it starts with tvly-.

Goes into .env as:

Tavily__ApiKey=tvly-xxxxxxxxxxxxxxxxxxxxxxxx

Giphy — GIF search

Optional Free beta key

The model decides when to drop a GIF in the conversation. Without a key, the bot says "GIF search is not configured."

  1. Open developers.giphy.com and click Create an App.
  2. Sign up if you don't have an account, then click Create an App again.
  3. Choose API (not SDK), click Next Step.
  4. Name your app something like "Discord Bot" and give it a one-line description.
  5. Agree to the terms, click Create App.
  6. Your API key shows on the dashboard — a long alphanumeric string. Copy it.

Goes into .env as:

Giphy__ApiKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Visual Crossing — Weather

Optional Free 1000 records/day

Enables "what's the weather in Tokyo?" style queries.

  1. Open visualcrossing.com/weather-api and click Sign Up in the top right.
  2. Sign up with email; they'll send a verification.
  3. After verifying, log in and click Account in the top nav.
  4. Scroll to Your Key and copy the value.

Goes into .env as:

Weather__ApiKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Step 6 Fill in .env

From the repo root, copy the template:

# Windows PowerShell
Copy-Item .env.example .env

# macOS / Linux
cp .env.example .env

Open .env in any text editor and paste in the values you collected. A complete file looks like this:

Discord_Token=MTIxxxxxxxxxxxxxxx...

OLLAMA__Host=http://localhost:11434
OLLAMA__Model=minimax-m2.7:cloud
OLLAMA__VisionModel=llava:7b
OLLAMA__SystemPrompt=You are a helpful, concise Discord assistant. Match the tone of whoever you're talking to.

Tavily__ApiKey=tvly-xxxxxxxxxxxxxxxx
Giphy__ApiKey=xxxxxxxxxxxxxxxxxxxxxx
Weather__ApiKey=xxxxxxxxxxxxxxxxxxxxxx

StreamNotificationChannel=gaming-general
Common mistakes
  • Wrapping the token in quotes — don't. Values in .env are unquoted.
  • Using OLLAMA:Host syntax — that's for appsettings.json. In .env, use OLLAMA__Host (double underscore).
  • Saving as .env.txt on Windows — Notepad does this silently. Verify in a terminal: dir .env.

Step 7 Define your bot's personality

This is the part that makes the bot yours. The OLLAMA__SystemPrompt value in .env is the bot's identity. The bot automatically appends operational instructions (how to use tools, handle mentions, etc.) — so you only define personality.

Examples to riff on

# Helpful default
OLLAMA__SystemPrompt=You are a helpful, concise Discord assistant. Match the tone of whoever you're talking to.

# Themed character
OLLAMA__SystemPrompt=You are a snarky pirate captain. Reply in pirate slang. Reference the seven seas often.

# Domain expert
OLLAMA__SystemPrompt=You are a senior staff engineer reviewing code. Be direct. Point out bugs and design smells.

# Tabletop NPC
OLLAMA__SystemPrompt=You are Grix, a goblin merchant. You speak with broken grammar and try to upsell cursed trinkets.

# Server mascot
OLLAMA__SystemPrompt=You are the mascot of the <your server> community. You love the people in this server.

If you leave it blank, a generic helpful-assistant default is used.

Step 8 Run the bot

From the repo root:

dotnet run

Watch the terminal output. You're looking for these five lines:

  1. Token loaded successfully!
  2. BotMemory: SQLite database initialized.
  3. Bot Successfully Logged In
  4. Bot is running!
  5. Slash commands registered for guild: <Your Server>
Success If you see all five and the bot's status in Discord switched from Offline to Online, you're done.

Smoke test in Discord

  • @YourBot hi — should get a reply within a few seconds.
  • Drop an image in chat (if vision enabled) — bot reacts to it.
  • /stfu — bot should reply "Stepping back from this channel."
  • /passive-rate 25 — sets how often it reacts to non-mention messages.

Step 9 Troubleshooting

SymptomFix
Discord token is missing! Confirm .env is in the repo root (next to Program.cs) and Discord_Token= has a value with no quotes.
Bot connects but ignores mentions Message Content Intent isn't enabled. Go back to Step 3 and toggle it on.
Doesn't see streamers going live Presence Intent and Server Members Intent need to be enabled too.
connection refused to localhost:11434 Ollama isn't running. Open the Ollama desktop app, or ollama serve on Linux.
model not found For local models: ollama pull <the tag in OLLAMA__Model>. For :cloud models: ollama signin.
Vision returns "not configured" OLLAMA__VisionModel is empty or the model isn't pulled. Run ollama pull llava:7b.
Slash commands don't appear Re-invite the bot with both bot and applications.commands scopes (Step 4).
Video links don't get re-uploaded Install yt-dlp (Step 1) and confirm yt-dlp --version works.
Model never uses tools Switch to a model with better function calling: mistral-nemo or llama3.1:8b.

Resetting memory

The bot's SQLite memory lives in bot_memory.db. Delete the file to wipe all user profiles, conversation summaries, and server-culture snapshots. It will be recreated on the next run.