Integrations
Every variant, LLM provider, messaging channel, voice engine, desktop app, data service, and platform that Luna works with.
Luna is built to plug into what you already use. Every integration is configured in .env โ no code changes needed. Local integrations require no API key; cloud ones are always opt-in.
Variants
Luna ships as two distinct deployment modes. Set luna_variant in .env to switch; no data is lost.
Local-first AI companion for daily individual use. Casual conversational tone. Voice, vision, Spotify, maps, app launcher, and desktop automation all enabled. No authentication required.
luna_variant=personal ยท Start with: luna dev
Professional team assistant. Multi-user JWT authentication, sliding-window rate limiting, Slack/Telegram/Discord messaging channels. No Spotify, no desktop launchers โ focused on productivity and Q&A.
luna_variant=business ยท Start with: luna docker:business
Change the luna_variant key in .env and restart. Personal and Business mode share the same codebase โ the variant controls which features are exposed, which system prompt is used, and whether auth is enforced.
LLM Providers
Luna supports 8 providers natively. Switch by changing llm_provider in .env โ no code changes, no restart of anything else.
Local inference
Runs models locally on your machine. The default provider. No API key, no internet required. Supports GPU acceleration via CUDA or Metal.
llm_provider=ollama ยท ollama_base_url=http://localhost:11434 ยท ollama_model=qwen2.5:7b
Local model server with a GUI. Exposes an OpenAI-compatible endpoint. Good for trying new GGUF models without configuring Ollama.
llm_provider=openai-compatible ยท openai_base_url=http://localhost:1234/v1
Minimal OpenAI-compatible server. Maximum control over quantization and hardware utilisation.
llm_provider=openai-compatible ยท openai_base_url=http://localhost:8080/v1
Open-source local model manager with a desktop GUI. Exposes an OpenAI-compatible API on localhost.
llm_provider=openai-compatible ยท openai_base_url=http://localhost:1337/v1
Cloud inference
Native Anthropic Messages API. Claude Sonnet and Opus models. Recommended for the Business variant โ strong instruction following, long context, and function calling.
llm_provider=anthropic ยท anthropic_api_key=sk-ant-โฆ ยท anthropic_model=claude-sonnet-4-5
Native Google AI REST API. Gemini 2.0 Flash by default. Exceptional long-context performance (1M tokens) and multimodal support.
llm_provider=google ยท google_api_key=AIzaโฆ ยท google_model=gemini-2.0-flash
Purpose-built LPU inference โ LLaMA 3.3 70B at ~300 tok/s. Free tier available. Best for low-latency chat where speed matters more than context length.
llm_provider=groq ยท groq_api_key=gsk_โฆ ยท groq_model=llama-3.3-70b-versatile
Command R+ with native RAG tooling. European data residency option. Strong at retrieval-augmented tasks and long structured outputs.
llm_provider=cohere ยท cohere_api_key=โฆ ยท cohere_model=command-r-plus
Mistral Large, European-hosted and GDPR-friendly. Strong at coding and multilingual tasks.
llm_provider=mistral ยท mistral_api_key=โฆ ยท mistral_model=mistral-large-latest
NVIDIA-hosted or self-hosted NIM endpoints using the OpenAI-compatible chat completions API.
llm_provider=nvidia-nim / nvidia_nim_base_url=https://integrate.api.nvidia.com/v1
GPT-4o, GPT-4o mini, o1, and future models via the official OpenAI API.
llm_provider=openai-compatible ยท openai_base_url=https://api.openai.com/v1 ยท openai_model=gpt-4o
One API key for every major model: Claude, Gemini, GPT-4o, Mistral, Llama, Command R, and hundreds more. Pay-per-token, no subscriptions.
llm_provider=openai-compatible ยท openai_base_url=https://openrouter.ai/api/v1
Use openai-compatible with OpenRouter to access Claude, Gemini, GPT-4o, Mistral, and hundreds of other models through a single API key:
llm_provider=openai-compatible
openai_base_url=https://openrouter.ai/api/v1
openai_api_key=sk-or-...
openai_model=anthropic/claude-opus-4Models known to work well
| Model | Provider | Good for |
|---|---|---|
qwen2.5:7b | Ollama (local) | Daily driver โ fast, tool-calling, 8 GB VRAM |
qwen2.5:14b | Ollama (local) | Better reasoning, 12 GB VRAM |
llama3.2:3b | Ollama (local) | Low-end hardware, 4 GB VRAM |
claude-sonnet-4-5 | Anthropic | Business variant โ complex instructions, tools |
gemini-2.0-flash | Long context, multimodal, fast | |
llama-3.3-70b-versatile | Groq | Fastest cloud response times |
command-r-plus | Cohere | RAG and structured retrieval tasks |
mistral-large-latest | Mistral | GDPR workloads, multilingual, coding |
gpt-4o-mini | OpenAI | Budget cloud option |
Messaging Channels
The Business variant routes messages from Telegram, Discord, Slack, or a generic webhook into Luna's chat engine. Each channel user gets a persistent conversation thread. UI-only commands (widgets, maps, Spotify) are automatically stripped from channel replies.
Set up a bot via @BotFather, point the webhook at your Luna instance. Supports markdown replies and per-user conversation history.
telegram_bot_token=โฆ ยท Endpoint: POST /api/channels/telegram
Register a Discord application and set the Interactions Endpoint URL. Ed25519 signature verification built-in. Replies are capped at Discord's 2000-character limit.
discord_bot_token=โฆ ยท discord_public_key=โฆ ยท Endpoint: POST /api/channels/discord
Subscribe to the message.channels event in a Slack app. HMAC-SHA256 request signature verified on every inbound message.
slack_bot_token=xoxb-โฆ ยท slack_signing_secret=โฆ ยท Endpoint: POST /api/channels/slack
Post any JSON payload with user_id, user_name, and text fields โ Luna replies with a plain-text reply field. Integrate with any platform.
POST /api/channels/webhook ยท {"user_id":"โฆ","user_name":"โฆ","text":"โฆ"}
Quick setup
# Telegram
telegram_bot_token=7123456789:AAF...
# Discord
discord_bot_token=MTI3...
discord_public_key=a1b2c3...
# Slack
slack_bot_token=xoxb-...
slack_signing_secret=abc123...curl http://localhost:8899/api/channels/statusLuna must be publicly reachable for Telegram, Discord, and Slack to deliver messages. Use luna tunnel (ngrok) for local testing:
luna tunnel
# โ https://abc123.ngrok-free.app
# Set this as your webhook URL in the respective platform dashboardGitHub
GitHub integration has two parts: a webhook receiver that turns GitHub events into Slack or Telegram notifications, and a set of Luna toolsthat let the LLM interact with your repositories directly via natural language.
Webhook events
Receives push, pull request, issue, issue comment, and release events from any repo or organisation. HMAC-SHA256 signature verified on every request.
github_webhook_secret=โฆ ยท Endpoint: POST /api/channels/github
Point a GitHub webhook at https://YOUR_HOST/api/channels/github and set the secret to the value of github_webhook_secret in your .env. Luna acknowledges every event and optionally forwards a formatted summary to Slack or Telegram:
github_token=ghp_... # Personal Access Token (repo scope)
github_webhook_secret=strong-secret # Must match the secret in GitHub webhook settings
# Forward event summaries to a notification channel (optional โ pick one)
github_notify_slack_channel=C0123ABCDEF # Slack channel ID
github_notify_telegram_chat_id=123456789 # Telegram chat IDPayload URL: https://YOUR_HOST/api/channels/github
Content type: application/json
Secret: <same as github_webhook_secret in .env>
Events: โ Pushes โ Pull requests โ Issues โ Issue comments โ ReleasesGitHub tools (LLM actions)
Set github_token in .env and Luna can interact with GitHub directly from chat. Set github_default_repo to avoid typing the repo name every time.
| Tool | What it does | Permission |
|---|---|---|
github_list_repos | List your repos sorted by last update | allow |
github_list_issues(repo) | List open issues in a repo | allow |
github_list_prs(repo) | List open pull requests in a repo | allow |
github_get_pr(repo, number) | Get diff stats and details for a PR | allow |
github_create_issue(repo, title, body) | Open a new issue | confirm |
github_comment(repo, number, body) | Post a comment on an issue or PR | confirm |
"List open issues in myorg/myrepo"
"Open an issue in myorg/myrepo: Add dark mode support"
"What PRs are waiting for review in myrepo?"
"Comment on issue #42 in myrepo: This is fixed in v2.1"A fine-grained PAT with Contents (read), Issues (read/write), and Pull requests (read) is sufficient. Classic tokens need the repo scope.
Voice Engines
Voice runs entirely on your machine. No audio is sent to external servers unless you configure a cloud TTS.
Speech-to-text (STT)
OpenAI Whisper reimplemented in CTranslate2. Runs locally, significantly faster than the original. Recommended.
whisper_model=base (tiny / base / small / medium / large)
Offline speech recognition toolkit. Very fast, low memory footprint, good for wake-word detection on low-end hardware.
voice_runtime=vosk
Text-to-speech (TTS)
Microsoft Edge neural TTS voices. High quality, 300+ voices and languages. Requires an internet connection โ audio is synthesised by Microsoft's servers.
tts_provider=edge-tts
Fully offline TTS using the OS voice engine (SAPI5 on Windows, NSSpeechSynthesizer on macOS, eSpeak on Linux). No internet required.
tts_provider=pyttsx3 ยท tts_voice_index=0
For the full STT/TTS config options and model tradeoff table, see the Voice page. Voice is a Personal variant feature and is disabled in Business mode.
Desktop Apps & Automation
Luna can launch and control apps through natural language on Windows, macOS, and Linux. Every action goes through the permission system โ allow, confirm, or block per tool. Desktop features are available in the Personal variant only unless noted.
App launcher
Launch any app by name across Windows, macOS, and Linux. Say "open VS Code", "launch Figma", "open Discord". Discovery uses curated profiles, macOS Spotlight (mdfind), Linux .desktop files, Windows registry, and Start Menu โ covering virtually any installed app.
luna dev โ "open <app name>" to launch. Covers all categories below.
| Category | Apps covered |
|---|---|
| Browsers | Chrome, Firefox, Edge, Safari, Brave, Opera, Vivaldi, Tor, Arc |
| Terminals & editors | VS Code, Cursor, Sublime Text, Vim, Emacs, Warp, Hyper, Xcode, Visual Studio |
| IDEs | PyCharm, IntelliJ, WebStorm, Android Studio, Rider, CLion, DataGrip, GoLand, Eclipse, NetBeans |
| Dev tools | Postman, Insomnia, DBeaver, TablePlus, Sequel Pro, GitHub Desktop, GitKraken, Sourcetree, Docker, Figma |
| Communication | Slack, Zoom, Teams, Discord, Signal, WhatsApp, Telegram, Skype, Viber, Messages, FaceTime, Outlook, Thunderbird |
| Office | Word, Excel, PowerPoint, LibreOffice, Pages, Numbers, Keynote, Notion, Obsidian |
| Media & creative | VLC, Spotify, Music, GIMP, Inkscape, Audacity, Blender, OBS, Kdenlive, DaVinci Resolve, HandBrake |
| Cloud & storage | Dropbox, OneDrive, Google Drive |
| Gaming | Steam, Epic Games, Xbox |
| Security | Bitwarden, 1Password, Windows Security |
| System utilities | Task Manager, Activity Monitor, Event Viewer, Device Manager, Registry Editor, Disk Utility, Disk Management, Task Scheduler, Resource Monitor |
| System settings | Settings, Display, Sound, Bluetooth, Network, Updates, Privacy, Accessibility (all platforms) |
| macOS system apps | Safari, Mail, Messages, FaceTime, Music, Podcasts, Books, News, Contacts, Reminders, Calendar, Maps, Notes, Stickies, Console, Keychain Access, Disk Utility, Script Editor, Automator, Font Book, Preview, Voice Memos, Find My |
| Linux (XDG) | Any app with a .desktop file โ Flatpak, Snap, and natively installed apps all discovered automatically |
System controls
Get and set system volume (0โ100), mute/unmute. Works on Windows (PowerShell/nircmd), macOS (osascript), and Linux (pactl/amixer). Say "set volume to 40", "mute", "unmute".
API: GET/POST /api/system/volume ยท POST /api/system/volume/mute|unmute
Get and set display brightness (0โ100). Windows uses WMI, macOS uses the brightness CLI (brew install brightness), Linux uses brightnessctl or xbacklight. Say "set brightness to 60".
API: GET/POST /api/system/brightness
Instantly lock the workstation. Windows: rundll32 LockWorkStation. macOS: Command+Control+Q. Linux: loginctl lock-session or xdg-screensaver. Say "lock my screen".
API: POST /api/system/lock
Put the system to sleep / suspend. Windows: SetSuspendState. macOS: pmset sleepnow. Linux: systemctl suspend. Requires confirm permission by default.
API: POST /api/system/sleep ยท Permission: confirm
Read and write the system clipboard. Windows: PowerShell Get/Set-Clipboard. macOS: pbpaste/pbcopy. Linux: xclip, xsel, or wl-paste/wl-copy. Say "copy this to clipboard" or "what's in my clipboard?"
API: GET/POST /api/system/clipboard
Turn off the display without sleeping the system. Windows: SendMessage. macOS: pmset displaysleepnow. Linux: xset dpms.
API: POST /api/system/display/off
Report OS, RAM, battery percentage, and machine name. Cross-platform via WMI (Windows), sysctl (macOS), and /proc (Linux).
API: GET /api/system/info
Other personal features
Playback control, queue management, search, and now-playing display. Trigger with phrases like "play something chill" or "skip this".
Requires spotify_client_id and spotify_client_secret in .env.
Open URLs and read public page content. Playwright can be enabled for full browser automation including JavaScript-rendered pages.
Playwright: pip install playwright && playwright install chromium
Create, list, update, and complete tasks in Luna's local SQLite database. Proactive reminders fire when tasks are due.
DuckDuckGo HTML search โ no API key required. Fires automatically when the LLM needs live information.
Switch the default Windows audio output device by name โ headphones, speakers, virtual audio.
API: GET /api/system/audio-devices ยท POST /api/system/audio-device
Open interactive MapLibre map overlays with a location query.
Live Data & APIs
These feed the Luna dashboard and the LLM's context. All are opt-in except Open-Meteo.
Free, no-key weather API. Returns current conditions and forecasts for any coordinates. Default weather provider.
Set weather_lat, weather_lon, weather_city, weather_timezone in .env.
Live top headlines and category-filtered news articles for the dashboard. Falls back to RSS when no key is configured.
the_news_api=your-key
Stock quotes and market data. Used by default for equities in the dashboard โ no API key required.
Cryptocurrency prices and market cap data. Used by default for crypto widgets โ no API key required.
Extended stock market data and technical indicators. Used as an alternative data source when configured.
alpha_vantage=your-key
Health Platforms
Connect wearables and health apps to give Luna awareness of your fitness, sleep, heart rate, and body metrics. All data is stored locally โ nothing is sent to any cloud.
Full REST API coverage: steps, distance, calories, heart rate, HRV, all sleep stages, SpO2, breathing rate, skin temperature, and weight. OAuth2 setup takes about 2 minutes.
fitbit_client_id= ยท fitbit_client_secret= ยท GET /api/health/oauth/authorize/fitbit
Aggregates activity data from any Android wearable synced to Google Fit โ Pixel Watch, Galaxy Watch, Wear OS devices, and more. Steps, calories, HR, weight, sleep via Google OAuth2.
google_fit_client_id= ยท google_fit_client_secret= ยท GET /api/health/oauth/authorize/google_fit
Best-in-class sleep staging, HRV, resting heart rate, readiness score, stress levels, and respiratory rate. Simple personal access token auth โ no OAuth flow.
oura_api_key= โ cloud.ouraring.com/user/api-tokens
Medical-grade smart scales (weight, BMI, body fat), blood pressure monitors, and sleep mats. The only platform that provides blood pressure readings.
withings_client_id= ยท withings_client_secret= ยท GET /api/health/oauth/authorize/withings
Detailed GPS workouts, VO2 Max, Body Battery (readiness), stress, sleep stages, and SpO2 via the garth library. Works with every Garmin wearable: Forerunner, Fenix, Venu, and more.
garmin_email= ยท garmin_password= ยท pip install garth
All HealthKit metrics from Apple Watch via webhook push. Apple has no public REST API, so Luna uses the free 'Health Auto Export' iOS app to push data on a schedule.
Endpoint: POST /api/health/webhook/apple ยท health_webhook_secret= in .env
Galaxy Watch and Galaxy Fit data via a compatible Android exporter app. Supports the same Health Auto Export JSON format as Apple Health.
Endpoint: POST /api/health/webhook/samsung ยท health_webhook_secret= in .env
For setup guides, supported device lists, all 23 metric types, API reference, and chat examples, see the Health Platforms page.
Production
The Business variant includes production-grade features for team deployments. All are configured in .env.
HS256 JSON Web Tokens for multi-user access. Issue per-user tokens with expiry, rotate them without downtime, and list active users via the admin API.
jwt_secret=โฆ ยท jwt_expiry_hours=720
Sliding-window in-memory rate limiter. Configurable per-minute limit and burst allowance. Returns 429 with Retry-After header when exceeded. No Redis required.
rate_limit_enabled=true ยท rate_limit_per_minute=60 ยท rate_limit_burst=20
Create, list, rotate tokens, and delete users via REST API. User store is a flat JSON file โ no database migration needed.
GET/POST /api/admin/users ยท DELETE /api/admin/users/{id} ยท POST /api/admin/users/{id}/rotate-token
compose.business.yml includes a commented nginx block for TLS termination. Point a domain at the container and uncomment to enable HTTPS.
See the commented nginx service in compose.business.yml
Admin API quick reference
curl -X POST http://localhost:8899/api/admin/users \
-H "Authorization: Bearer $JWT_SECRET" \
-H "Content-Type: application/json" \
-d '{"name":"alice","email":"alice@example.com"}'
# โ {"id":"โฆ","name":"alice","token":"eyJโฆ"}curl http://localhost:8899/api/admin/llm/providers \
-H "Authorization: Bearer $JWT_SECRET"Generate a strong secret with openssl rand -hex 32 and set it as jwt_secret in .env. Admin API calls use Authorization: Bearer <jwt_secret>.
Platforms
Where Luna runs and what works on each platform.
# .env
host=0.0.0.0Then open http://YOUR-LAN-IP:8899 on any device. For the business variant, set jwt_secret to protect the admin API.