Skip to content

harshil-sh/SkillBot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

22 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ€– SkillBot

Your AI assistant. Your server. Your rules.

CI License: MIT .NET Blazor Docker GitHub Stars

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.


πŸ’‘ Why SkillBot?

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.

✨ Features

🧠 AI & Language Models

  • 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)

πŸ–₯️ Interfaces

  • 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

πŸ”Œ Platform & Infrastructure

  • 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

πŸ›‘οΈ Security

  • 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

⚑ Quick Start

Option 1 β€” Docker (Recommended)

# 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:8080

That's it. Open http://localhost:8080, register an account, and start chatting.

Option 2 β€” Manual (.NET SDK)

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

Option 3 β€” Setup Script

# Linux / macOS
chmod +x scripts/setup.sh && ./scripts/setup.sh

# Windows (PowerShell)
.\scripts\setup.ps1

The script checks prerequisites, generates a JWT secret, guides you through the .env configuration, and starts the application with Docker Compose.


πŸ—οΈ Architecture

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])

πŸ†š SkillBot vs ChatGPT / Other Tools

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

βš™οΈ Configuration

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.


πŸ“š Documentation

User Guides

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

API & Deployment

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

Developer Docs

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

πŸ—ΊοΈ Roadmap

v1.0 β€” Foundation βœ…

  • 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)

v1.1 β€” User Experience 🚧

  • 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

v1.2 β€” Integrations

  • 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

v1.3 β€” Enterprise

  • Team workspaces and shared conversations
  • LDAP / SSO authentication
  • Audit logging
  • Kubernetes Helm chart
  • Usage quotas and billing tracking
  • Conversation analytics dashboard

🀝 Contributing

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-feature

Please read CONTRIBUTING.md before submitting a pull request β€” it covers code style, commit message format, and the review process.


πŸ†˜ Support

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.


πŸ“„ License

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.

πŸ™ Acknowledgements

SkillBot is built on the shoulders of some excellent open-source projects:


Made with ❀️ by Harshil Shah