SkillBot is a production-ready, self-hosted AI assistant powered by .NET 10 and Microsoft Semantic Kernel.
Chat with OpenAI, Claude, or Gemini through a beautiful web UI, Telegram bot, REST API, or terminal console.
Everything runs on your own infrastructure β your data never leaves your server.
Quick Start Β· Features Β· Docs Β· Roadmap Β· Contributing
πΈ Screenshots coming soon β the web UI is fully functional; visual walkthroughs are being prepared.
Most AI assistant tools are cloud-only, lock you into a single provider, and send your conversations to someone else's servers. SkillBot takes a different approach:
| SkillBot | |
|---|---|
| π Privacy-first | Runs entirely on your own server. Conversations stay in your SQLite database, never leaving your infrastructure. |
| π Provider-flexible | Switch between OpenAI GPT-4, Anthropic Claude, and Google Gemini per-user at runtime β no redeploy needed. |
| π Every interface covered | One deployment gives you a polished web UI, a Telegram bot, a REST API, and an interactive console. |
| π€ Multi-agent intelligence | Route complex tasks to specialised agents (Researcher, Coder, Data Analyst, Writer) that collaborate automatically. |
| π οΈ Extensible by design | Add capabilities in minutes with the plugin system β just drop in a class with [Plugin] and [KernelFunction] attributes. |
- Multi-LLM support β Use OpenAI (GPT-4/4o), Anthropic Claude, or Google Gemini; switch provider per-user at runtime without restarting
- Microsoft Semantic Kernel β Battle-tested orchestration layer with memory, planning, and function calling
- Multi-agent orchestration β Automatically routes tasks to specialised agents: Research, Coding, Data Analysis, and Writing, with single/parallel/sequential strategies
- Web search integration β SerpAPI-powered real-time search with two-tier caching (in-memory + SQLite)
- Blazor WebAssembly UI β Modern SPA with MudBlazor Material Design: chat, settings, admin dashboard, dark mode, keyboard shortcuts, and full mobile support
- Telegram bot β Full-featured bot with
/start,/help,/setkey,/setprovider,/search,/multi, and per-user API key management - REST API β ASP.NET Core with JWT authentication, Swagger UI, rate limiting, and content safety middleware
- Console client β Interactive terminal interface with single-agent and multi-agent modes
- Plugin system β Reflection-based discovery using
[Plugin],[KernelFunction], and[Description]attributes; built-in plugins for Calculator, Weather, Time, and Web Search - Two-tier caching β L1 in-memory + L2 SQLite cache for LLM responses keyed by SHA-256 content hash
- SQLite persistence β Conversation history and user settings via EF Core; zero configuration, file-based
- Background task scheduling β Hangfire-powered one-time and recurring jobs; cache cleanup, usage reports
- Token usage tracking β Per-user, per-conversation token consumption statistics
- JWT authentication β Configurable expiry, issuer, and audience; per-user API key storage (encrypted at rest)
- Rate limiting β Per-user and per-endpoint request throttling, configurable via appsettings
- Input validation β Length limits, content safety checks, and prompt-injection detection
- Structured logging β Serilog with rolling file and console sinks; configurable log levels per namespace
# Clone the repository
git clone https://github.com/harshil-sh/skillbot.git
cd skillbot
# Copy the example environment file and fill in your keys
cp .env.example .env
# Edit .env with your API key and a JWT secret (min 32 characters)
# OPENAI_API_KEY=sk-...
# JWT_SECRET=your-super-secret-key-at-least-32-chars
# Start everything (API + Web UI + background jobs)
docker compose up -d
# The API is available at http://localhost:8080
# The web UI is served by the API at http://localhost:8080That's it. Open http://localhost:8080, register an account, and start chatting.
Prerequisites: .NET 10 SDK Β· An API key for OpenAI, Claude, or Gemini
# Clone and restore
git clone https://github.com/harshil-sh/skillbot.git
cd skillbot
dotnet restore SkillBot.slnx
# Set secrets (development only)
cd SkillBot.Api
dotnet user-secrets set "SkillBot:ApiKey" "sk-your-openai-key"
dotnet user-secrets set "JwtSettings:Secret" "your-super-secret-jwt-key-min-32-chars"
cd ..
# Apply the database migration and start
dotnet run --project SkillBot.Api/SkillBot.Api.csproj| Service | URL |
|---|---|
| REST API | https://localhost:7101 |
| Swagger UI | https://localhost:7101/swagger |
| Web UI (dev) | http://localhost:5000 |
# (Optional) Run the web UI separately in development
dotnet run --project SkillBot.Web/SkillBot.Web.csproj
# (Optional) Launch the console client
dotnet run --project SkillBot.Console/SkillBot.Console.csproj
dotnet run --project SkillBot.Console/SkillBot.Console.csproj -- --multi-agent# Linux / macOS
chmod +x scripts/setup.sh && ./scripts/setup.sh
# Windows (PowerShell)
.\scripts\setup.ps1The script checks prerequisites, generates a JWT secret, guides you through the .env configuration, and starts the application with Docker Compose.
SkillBot follows a clean layered architecture with clear dependency rules:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Clients β
β ββββββββββββββ βββββββββββββββ ββββββββββββββββββββ β
β β Web UI β β Telegram β β Console Client β β
β β (Blazor β β Bot β β (API client) β β
β β WASM) β β β β β β
β βββββββ¬βββββββ ββββββββ¬βββββββ ββββββββββ¬ββββββββββ β
ββββββββββΌβββββββββββββββββΌβββββββββββββββββββΌβββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SkillBot.Api (ASP.NET Core) β
β Auth Β· Rate Limiting Β· Content Safety Β· Hangfire β
β EF Core β SQLite Β· Serilog Β· Swagger β
ββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββΌββββββββββββββ
β SkillBot.Infrastructure β
β SemanticKernelEngine β
β LlmTaskRouter β
β AgentOrchestrator β
β LLM Providers β
β Two-Tier Cache β
β Channel Manager β
βββββββββββββββ¬ββββββββββββββ
β
βββββββββββββββΌββββββββββββββ
β SkillBot.Core β
β Interfaces Β· Models β
β Domain Contracts β
βββββββββββββββββββββββββββββ
| Project | Responsibility |
|---|---|
SkillBot.Core |
Interfaces, domain models, shared contracts β zero external dependencies |
SkillBot.Infrastructure |
Semantic Kernel, agent orchestration, LLM providers, channels, cache |
SkillBot.Api |
ASP.NET Core host, JWT auth, EF Core, Hangfire background jobs |
SkillBot.Console |
Authenticated terminal client that calls the API |
SkillBot.Plugins |
Calculator, Weather, Time, and SerpAPI search plugins |
SkillBot.Web |
Blazor WebAssembly SPA (MudBlazor 9.x) |
SkillBot.Tests.Unit |
50 unit tests β services, LLM factory, channel manager |
SkillBot.Tests.Integration |
15 integration tests β auth, chat, settings, Telegram webhook |
SkillBot.Tests.E2E |
Playwright end-to-end tests (require live server, marked [Explicit]) |
| Feature | SkillBot | ChatGPT | Ollama | LiteLLM |
|---|---|---|---|---|
| Self-hosted | β | β | β | β |
| Your data stays local | β | β | β | Varies |
| OpenAI support | β | β | β | β |
| Claude support | β | β | β | β |
| Gemini support | β | β | β | β |
| Telegram bot | β | β | β | β |
| Web UI included | β | β | β | β |
| REST API | β | API only | β | β |
| Console client | β | β | β | β |
| Multi-agent orchestration | β | β | β | β |
| Plugin system | β | β (GPTs) | β | β |
| Per-user API keys | β | N/A | β | β |
| Web search | β | β (Plus) | β | β |
| Docker deployment | β | N/A | β | β |
| Free / open source | β MIT | β | β MIT | β MIT |
The most important settings in SkillBot.Api/appsettings.json:
{
"JwtSettings": {
"Secret": "your-super-secret-key-min-32-chars-long",
"ExpirationMinutes": 1440
},
"SkillBot": {
"ApiKey": "sk-your-openai-key",
"Model": "gpt-4",
"Caching": { "Enabled": true }
},
"SerpApi": {
"ApiKey": "your-serpapi-key"
},
"Channels": {
"Telegram": {
"Enabled": false,
"BotToken": "",
"BotUsername": "",
"WebhookUrl": "https://yourdomain.com/api/webhook/telegram"
}
}
}Every value can be overridden with environment variables (e.g. SkillBot__ApiKey=sk-...).
See docs/CONFIGURATION.md for the complete reference.
| Document | Description |
|---|---|
| docs/INSTALLATION.md | Prerequisites, secrets setup, first run |
| docs/CONFIGURATION.md | Every appsettings.json key documented |
| docs/USER_GUIDE_WEB.md | Web UI walkthrough |
| docs/ADMIN_GUIDE.md | Admin dashboard and user management |
| docs/TELEGRAM.md | BotFather setup, webhook config, commands |
| docs/FAQ_WEB.md | Frequently asked questions |
| Document | Description |
|---|---|
| docs/API.md | Full REST endpoint reference with curl examples |
| docs/DEPLOYMENT_WEB.md | Docker, nginx, GitHub Pages, Azure, IIS |
| docs/TROUBLESHOOTING_WEB.md | Common problems and solutions |
| docs/RELEASE_CHECKLIST.md | Pre-release checklist |
| Document | Description |
|---|---|
| docs/ARCHITECTURE.md | System architecture deep-dive |
| docs/frontend/ARCHITECTURE.md | Blazor frontend architecture |
| docs/frontend/COMPONENTS.md | Component reference |
| docs/frontend/API_INTEGRATION.md | Frontend API client |
| docs/frontend/STYLING.md | MudBlazor theme and CSS guide |
| docs/frontend/DEVELOPMENT.md | Frontend dev environment setup |
| CONTRIBUTING.md | How to contribute |
| CHANGELOG.md | Version history |
- Multi-LLM support (OpenAI, Claude, Gemini)
- REST API with JWT authentication
- Telegram bot with slash commands
- Console client (single-agent and multi-agent)
- Plugin system with built-in plugins
- Two-tier caching (memory + SQLite)
- Rate limiting and content safety
- Blazor WebAssembly web UI
- Admin dashboard
- Docker deployment
- CI/CD pipeline
- Full test suite (unit + integration + E2E)
- Streaming responses (Server-Sent Events)
- Conversation export (JSON, Markdown, PDF)
- Voice input support (Web Speech API)
- File upload and document Q&A
- Conversation sharing (public links)
- Custom system prompts per conversation
- Discord bot channel
- Slack bot channel
- OpenRouter API support (access 50+ models)
- Local model support via Ollama
- Webhook outbound notifications
- Google Calendar / GitHub / Jira plugins
- Team workspaces and shared conversations
- LDAP / SSO authentication
- Audit logging
- Kubernetes Helm chart
- Usage quotas and billing tracking
- Conversation analytics dashboard
Contributions of all kinds are welcome β bug fixes, features, documentation, tests, and design feedback.
# Fork and clone
git clone https://github.com/<your-username>/skillbot.git
cd skillbot
# Create a feature branch
git checkout -b feature/my-feature
# Build and test
dotnet build SkillBot.slnx
dotnet test SkillBot.Tests.Unit
dotnet test SkillBot.Tests.Integration
# Run the full integration test suite
powershell -File .\scripts\Test-SkillBot-AllFeatures.ps1 -SkipBuild
# Push and open a PR
git push origin feature/my-featurePlease read CONTRIBUTING.md before submitting a pull request β it covers code style, commit message format, and the review process.
| Channel | Link |
|---|---|
| π Bug reports | GitHub Issues |
| π‘ Feature requests | GitHub Discussions |
| β Questions | GitHub Discussions β Q&A |
| π§ Direct contact | Harshil.sh@gmail.com |
If SkillBot is useful to you, please consider giving it a β on GitHub β it genuinely helps with visibility.
MIT License
Copyright (c) 2026 Harshil Shah
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
SkillBot is built on the shoulders of some excellent open-source projects:
- Microsoft Semantic Kernel β AI orchestration framework
- MudBlazor β Blazor component library
- Hangfire β Background job processing
- Serilog β Structured logging
- Telegram.Bot β Telegram Bot API client
- Markdig β Markdown processor for .NET
- Blazored.LocalStorage β localStorage for Blazor
Made with β€οΈ by Harshil Shah