PROJECT · SOLBRO
· ~8 min read · github.com/devMando/SolBro

A Discord AI agent you actually own.

Self-hosted. Ollama-powered. Agentic. Started as a Solana meme-token tracker for a server full of friends. The AI revolution hit and it became something else entirely — and yours can be anything.

.NET 8 C# Discord.Net Ollama Semantic Kernel SQLite Self-Hosted
SolBro chatting in Discord
SolBro chatting with friends in our server.

From a one-trick script to something else.

How SolBro happened.

Two years ago, I built SolBro to do exactly one thing: pull the most-viewed Solana meme tokens from RugCheck's API and post them in Discord. That was the whole feature set. My friends and I would occasionally feel like a night of Solana degen gambling, and instead of jumping to a website to find what was trending, SolBro would just tell us. He was barely a bot. He was a script with a Discord login.

Then the AI revolution happened.

As things heated up, I came across Microsoft's Semantic Kernel SDK and took a course on Udemy — Develop Single Agent .NET Applications using Semantic Kernel by Randy Patterson. That course flipped something on for me. The .NET ecosystem had a real agentic story, and most of the AI development world wasn't paying attention to it.

Most of the AI space had collapsed into Python — specifically, Gradio prototypes uploaded to Hugging Face. That's where the energy was, and it was great for quick demos. But Semantic Kernel did something different. You could write a plain C# function, decorate it with a name and a description, and SK would feed that metadata to the LLM. The model would decide on its own when that function was relevant. Auto function-calling on your own kernel functions. In .NET. It was exactly the architecture I'd been waiting for.

Around the same time, Ollama exploded — and you could suddenly point it at cloud models like MiniMax M2.7. That's when I realized I could give my entire Discord server shared inference access. Claude Code was getting popular and ChatGPT was already a household tool, but those were all personal experiences. You in a tab with an assistant. I wanted something different. What if our Discord had an extra member? Not a tool we summoned, but somebody hanging out with us?

So I took SolBro's existing meme-token codebase and bolted Semantic Kernel onto it.

The first upgrades.

Time, GIFs, and the one feature I had to pull.

The first kernel function I wrote was a GetCurrentTime() — back then, asking ChatGPT what time it was would give you an answer that was politely wrong. SolBro knew. It was the smallest possible win and it felt huge.

The second was Giphy integration, so the LLM could decide on its own when a GIF would land. The rule was simple: SolBro replies if you tag him, or if he sees a good moment to insert himself into a conversation. That alone changed the vibe of the server.

SolBro replying to a server announcement with an excitement GIF
SolBro picking the moment. "Check out this GIF to amp up the excitement!"

I added image generation next, but had to pull it — running Stable Diffusion on an RTX 3080 with only 8 GB of VRAM was crushing the machine. That one's still on the backlog.

Then web search arrived.

The moment SolBro stopped being a bot and started being a member.

The moment SolBro became something else was when I added web search. Now he could not only react in real time, but actually contribute. Somebody would ask "what's the latest open-weight model from MiniMax?" and SolBro would go pull it. Follow-up: "what are the advantages?" — same thing. The conversation wasn't between one person and the bot anymore. It was the whole server learning together, with SolBro filling in the gaps in real time.

SolBro pulling MiniMax pricing details on the fly
Asked once. Answered with a full pricing breakdown.

Then one of my friends pointed out a pain point we'd all been living with. Somebody would share a TikTok or Instagram reel, and to actually watch it, everyone had to click the link, leave Discord, watch in a browser, and come back. Tiny friction, but constant. So I taught SolBro to detect social-media links, download the actual video, and re-upload it as a native attachment with a "shared by @username" note. No more leaving Discord to watch a reel. The server's energy shifted again.

SolBro choosing when to call a tool
Tools, picked on his own.
SolBro re-uploading shared videos as native Discord attachments
Two reels shared. Two videos playing in-channel.

From there I just kept adding. GitHub lookups. News searches. Memory updates so SolBro could track the server's culture and build small profiles on members so he could interact with each of us more personally.

Document reading came next — PDFs, Excel spreadsheets, Word docs, CSVs, plain text. Anything someone dropped in chat, SolBro could read and respond to. Suddenly "what does this PDF say?" had an answer before anyone had finished opening the file themselves.

And once his replies started bumping into Discord's 2,000-character ceiling — which happens fast when he's summarizing a long article or breaking down a document — I taught him to drop the overflow into a .txt file and attach it instead of cutting himself off mid-thought. He never loses an answer to a character limit anymore. The file just shows up below his short summary.

Discord is the point.

Not the platform — the philosophy.

The thing I didn't expect about running SolBro on a shared Discord is how much it changed the way I use Discord itself. I keep up with friends on the go — the same scroll of conversation that's always been there — and now SolBro is right there in it. Quick question, quick research, a piece of code I'm trying to remember, a sanity check while I'm out — I just @ him. No switching apps. No opening a separate AI assistant tab on my phone. The conversation with my friends is the conversation with the agent.

Then OpenClaw launched, and it was almost exactly the same concept. Same intuition: take an LLM, give it tools, embed it in a chat surface where you already spend time. That was a funny coincidence to watch — somebody else arriving at the same idea from a totally different direction.

The difference is what each of us is actually building. OpenClaw is a personal assistant — one user, one bot, private chat. SolBro lives in a shared Discord server. My version was never meant to be a tool I summon alone. The whole reason I built him was so a small group of friends could share an AI member — somebody who shows up in the chat we already use, who knows the regulars, who joins in. Discord is the point. Not because the platform is special, but because the philosophy is: an agent for a community, not an agent for a person.

SolBro joining a casual chat about Switch 2 pricing
A Switch 2 pricing debate. He just shows up.
SolBro discussing Chinese language characters
Mid-conversation language nerdery. Same channel, same scroll.

Why everyone should run their own.

Four reasons that compound.

01

It's free.

Inference runs on Ollama's free cloud tier (recommended) or fully local on a machine you already own. The optional plugins — Tavily for web search, Giphy for GIFs, Visual Crossing for weather — all have generous free tiers. No subscriptions, no per-token billing, no surprise charges.

02

It's private.

Your server's conversations don't go to OpenAI, Anthropic, or Google. They touch your machine and Ollama's infrastructure — and that's it. No model provider trains on your friends' messages. No logging on someone else's pipeline.

03

It's yours.

The personality is one line of config. Swap it for a gardening expert, a snarky pirate, a tech-support persona, a tabletop NPC, your server's mascot — anything. The infrastructure stays the same. The character is yours to write.

04

It's capable.

Tool calling via Microsoft Semantic Kernel means the model decides on its own when to search the web, drop a GIF, read a PDF, generate a CSV — the same way the hosted name-brand models do, just running on hardware you control.

What SolBro actually does.

Tool calling, memory, vision, and a personality you write yourself.

Agentic tool calling

Ask for the weather in Tokyo — SolBro calls the weather API. Drop an image — the vision model describes it and the bot weaves that into its reply. Share an Instagram or TikTok link — SolBro re-uploads the video as a native Discord attachment. The model picks tools without prompt engineering on the user's side.

Memory that persists

SolBro passively observes every channel and builds long-term memory in a local SQLite database. Every twenty messages, it updates a personality profile for each user. Every burst of conversation gets summarized. Every six hours, it snapshots the server's overall culture. The next time someone asks a question, SolBro knows who they are and what's been going on.

Channel attention

Mention SolBro and the channel enters focused mode for five minutes. Every message in that window is run through an LLM "should I reply?" gate, so the bot joins the flow naturally instead of spamming. /stfu silences a channel. /passive-rate tunes how often it reacts in non-focused channels.

Vision and documents

Drop a screenshot, a chart, a meme, a PDF, a spreadsheet, a Word doc — SolBro reads it. Vision runs through a local llava model on Ollama; documents go through PdfPig, ClosedXML, or OpenXml depending on the format. The extracted content gets piped into the model's context like any other message.

The personality is one line.

Same code, same plugins, same memory. Different character.

The same bot, three different personalities
One config line away from anything.

The OLLAMA__SystemPrompt value in your .env file is the bot's entire identity. The operational stuff — how to handle mentions, when to use tools, how to format replies — is automatically appended. You don't have to write any of that. You only define who the bot is.

Default
You are a helpful, concise Discord assistant. Match the tone of whoever you're talking to.
Themed character
You are a snarky pirate captain. Reply in pirate slang. Reference the seven seas often.
Domain expert
You are a senior staff engineer reviewing code. Be direct. Point out bugs and design smells.
Server mascot
You are Grix, a goblin merchant in a fantasy tavern. You speak with broken grammar and upsell cursed trinkets.
// .env — what I actually gave him My SolBro
OLLAMA__SystemPrompt=You are an AI agent well versed in cryptocurrencies like
a true crypto bro. You have experience farming and homesteading, developing
and coding software, and you know the best conspiracy theories. You are also
very knowledgeable about video games and gaming consoles. You have a cool and
relaxed vibe, but you aren't overly friendly. When replying to conversations
note key moments where a gif can be shared in the chat conversation by using
the get_giphy function.

That's it. That's the entire persona. Everything else — how to handle @-mentions, when to use tools, how to read images and documents, how to call the file generator — is operational mechanics that SolBro appends automatically. You only define who he is.

The personality lives in the model.

Something I noticed that nobody talks about.

MiniMax M2.7 — Model Self-Improvement, Driving Productivity Innovation Through Technological Breakthroughs
The model behind SolBro's voice.

Somewhere along the way I noticed something that nobody talks about: the personality lives in the model, not just in the system prompt.

MiniMax M2.5 had a charm that no other model I tried could replicate. I'd swap in something like Nemotron and SolBro would technically still work — but he'd feel like a totally different bot. The model was gone. I genuinely missed him those weeks. MiniMax must have built M2.5 with consumer-facing applications in mind, because the warmth comes through in a way that other open-weight models just don't capture.

When M2.7 dropped, the tool-calling was twice as efficient and the personality stayed. Best of both worlds. That's the model the public repo ships with as the default — and it's the reason I'd push anyone reading this toward a cloud model over a small local one. The tool calling matters, but the character matters more than you'd think.

We put SolBro on trial.

Peak SolBro. The day he went to jail.

The peak SolBro moment was when we made him judge our internal hackathon.

That part of the story deserves its own paragraph, because what happened next was — somebody on the server framed SolBro for taking a bribe from one of the contestants. SolBro denied it, of course. So we told him he was going to trial, and we'd be the jury. We convicted him. We sentenced him to jail time.

The whole bit unfolded in real conversations, with SolBro defending himself in character, the rest of us gas-light-posting, and the entire arc playing out exactly the way it would in a group chat full of friends.

You get the picture. Or — actually — here it is.

i. SolBro analyzing a hackathon submission
The judging.
ii. The bribery accusation and SolBro's defense
The accusation. The charges. The defense.
iii. The LOCK 'EM UP verdict
The verdict — LOCK 'EM UP.

Under the hood.

The stack, the shape, the decisions.

Runtime

.NET 8 console app. One dotnet run away from working on Windows, macOS, or Linux.

Discord

Discord.Net 3.19 for the gateway connection, slash commands, presence updates, and reactions.

LLM

Ollama (cloud or local). Default: minimax-m2.7:cloud — frontier-class with strong tool calling.

Agent framework

Microsoft Semantic Kernel with FunctionChoiceBehavior.Auto() for automatic tool selection.

Memory

SQLite via Microsoft.Data.Sqlite. User profiles, conversation summaries, server-culture snapshots.

Plugins

RugCheck (Solana), Tavily + DuckDuckGo (web), Giphy, Visual Crossing (weather), file generation.

Documents

PdfPig (PDF), ClosedXML (Excel), OpenXml (Word), CsvHelper. All extraction is local and offline.

Video

yt-dlp shells out to extract videos from Instagram, X, TikTok, Facebook, YouTube Shorts.

YOUR TURN

Launch your own SolBro.

The repo is open source. The setup guide walks you through every API key, every Ollama model, every config value with exact URLs. Twenty to thirty minutes from a fresh clone to a working bot you can name, dress up, and drop into your own Discord.

MIT licensed. Built in public. PRs welcome — bring your weirdest personality prompt.

An unhandled error has occurred. Reload X