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 --versionShould 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 | shAfter install, verify the daemon is reachable:
curl http://localhost:11434/api/tagsShould 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.
| OS | Command |
|---|---|
| Windows | winget install yt-dlp |
| macOS | brew install yt-dlp |
| Linux / pip | pip 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 SolBroStep 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 signinThis 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.
| Model | Where it runs | Notes |
|---|---|---|
minimax-m2.7:cloud | Ollama cloud | Recommended. Frontier-class, strong tool calling, efficient. Requires ollama signin. |
Other :cloud tags | Ollama cloud | Browse ollama.com/library for the current cloud-eligible roster. |
mistral-nemo | Local ~8 GB | Best local tool-calling. Use this if you need fully-offline. |
llama3.1:8b | Local ~8 GB | Balanced. Strong general reasoning. |
qwen3:4b | Local ~4 GB | Smallest viable local option. Tool calling is hit-or-miss. |
qwen2.5:14b | Local ~10 GB | Larger, smarter. |
gpt-oss:20b | Local ~16 GB | Heavyweight. |
For any of the local models, pull it first:
ollama pull <model-name>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:7bAlternatives: llava:13b, llama3.2-vision, bakllava.
Verify everything pulled:
ollama listStep 3 Create the Discord application
- Open discord.com/developers/applications.
- Click New Application (top right). Name it whatever you want your bot called.
- Accept the terms, click Create.
Get the bot token
- In the left sidebar of the application page, click Bot.
- Click Reset Token (or Copy) and save it somewhere safe.
.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.
Step 4 Invite the bot to a server
You need a Discord server you own or have Manage Server permission on.
- In the developer portal sidebar, click OAuth2 → URL Generator.
- Under Scopes, tick:
botapplications.commands
- 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
- Copy the Generated URL at the bottom and open it in a new tab.
- 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
Lets the model search the web with AI-friendly snippets. Without this, it falls back to scraping DuckDuckGo HTML — works, but flakier.
- Open tavily.com and click Get Started.
- Sign up with email or Google.
- After login, look for API Keys in the dashboard sidebar.
- Copy your key — it starts with
tvly-.
Goes into .env as:
Tavily__ApiKey=tvly-xxxxxxxxxxxxxxxxxxxxxxxxGiphy — GIF search
The model decides when to drop a GIF in the conversation. Without a key, the bot says "GIF search is not configured."
- Open developers.giphy.com and click Create an App.
- Sign up if you don't have an account, then click Create an App again.
- Choose API (not SDK), click Next Step.
- Name your app something like "Discord Bot" and give it a one-line description.
- Agree to the terms, click Create App.
- Your API key shows on the dashboard — a long alphanumeric string. Copy it.
Goes into .env as:
Giphy__ApiKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxVisual Crossing — Weather
Enables "what's the weather in Tokyo?" style queries.
- Open visualcrossing.com/weather-api and click Sign Up in the top right.
- Sign up with email; they'll send a verification.
- After verifying, log in and click Account in the top nav.
- Scroll to Your Key and copy the value.
Goes into .env as:
Weather__ApiKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxStep 6 Fill in .env
From the repo root, copy the template:
# Windows PowerShell
Copy-Item .env.example .env
# macOS / Linux
cp .env.example .envOpen .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
- Wrapping the token in quotes — don't. Values in
.envare unquoted. - Using
OLLAMA:Hostsyntax — that's forappsettings.json. In.env, useOLLAMA__Host(double underscore). - Saving as
.env.txton 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 runWatch the terminal output. You're looking for these five lines:
Token loaded successfully!BotMemory: SQLite database initialized.Bot Successfully Logged InBot is running!Slash commands registered for guild: <Your Server>
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
| Symptom | Fix |
|---|---|
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.