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.

๐Ÿ 
PersonalDefaultSingle user

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

๐Ÿข
BusinessMulti-userProduction-ready

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

โ„น๏ธ
Switching variants

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

๐Ÿฆ™
OllamaLocalDefault

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

๐Ÿ”ฌ
LM StudioLocal

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

๐Ÿฆพ
llama.cpp serverLocal

Minimal OpenAI-compatible server. Maximum control over quantization and hardware utilisation.

llm_provider=openai-compatible ยท openai_base_url=http://localhost:8080/v1

๐Ÿ 
Jan.aiLocal

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

๐Ÿง 
Anthropic ClaudeCloudBusiness rec.

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

โœจ
Google GeminiCloud

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

โšก
GroqCloudFast

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

๐Ÿชธ
CohereCloud

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 AICloudGDPR

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 NIMCloudOpenAI-compatible

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

รฐลธยคโ€“
OpenAICloud

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

๐ŸŒ
OpenRouterCloudAny model

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

๐Ÿ’ก
OpenRouter โ€” one key for everything

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

Models known to work well

ModelProviderGood for
qwen2.5:7bOllama (local)Daily driver โ€” fast, tool-calling, 8 GB VRAM
qwen2.5:14bOllama (local)Better reasoning, 12 GB VRAM
llama3.2:3bOllama (local)Low-end hardware, 4 GB VRAM
claude-sonnet-4-5AnthropicBusiness variant โ€” complex instructions, tools
gemini-2.0-flashGoogleLong context, multimodal, fast
llama-3.3-70b-versatileGroqFastest cloud response times
command-r-plusCohereRAG and structured retrieval tasks
mistral-large-latestMistralGDPR workloads, multilingual, coding
gpt-4o-miniOpenAIBudget 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.

โœˆ๏ธ
TelegramBusinessPersonal

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

๐ŸŽฎ
DiscordBusiness

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

๐Ÿ’ผ
SlackBusiness

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

๐Ÿ”—
Generic webhookAny platform

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

.env
# Telegram
telegram_bot_token=7123456789:AAF...

# Discord
discord_bot_token=MTI3...
discord_public_key=a1b2c3...

# Slack
slack_bot_token=xoxb-...
slack_signing_secret=abc123...
terminal โ€” check which channels are live
curl http://localhost:8899/api/channels/status
โ„น๏ธ
Registering webhooks

Luna 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 dashboard

GitHub

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

๐Ÿ™
GitHub webhookBoth variants

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:

.env
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 ID
GitHub โ†’ Settings โ†’ Webhooks
Payload 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  โœ“ Releases

GitHub 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.

ToolWhat it doesPermission
github_list_reposList your repos sorted by last updateallow
github_list_issues(repo)List open issues in a repoallow
github_list_prs(repo)List open pull requests in a repoallow
github_get_pr(repo, number)Get diff stats and details for a PRallow
github_create_issue(repo, title, body)Open a new issueconfirm
github_comment(repo, number, body)Post a comment on an issue or PRconfirm
chat examples
"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"
๐Ÿ“Œ
Token scopes

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)

๐ŸŽ™
faster-whisperLocalDefault

OpenAI Whisper reimplemented in CTranslate2. Runs locally, significantly faster than the original. Recommended.

whisper_model=base (tiny / base / small / medium / large)

๐Ÿ”Š
VoskLocal

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)

๐Ÿ”‰
edge-ttsCloudDefault

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

๐Ÿ’ฌ
pyttsx3Local

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

๐Ÿ–ฅ
App launcher โ€” 80+ app profilesPersonal onlyCross-platform

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.

CategoryApps covered
BrowsersChrome, Firefox, Edge, Safari, Brave, Opera, Vivaldi, Tor, Arc
Terminals & editorsVS Code, Cursor, Sublime Text, Vim, Emacs, Warp, Hyper, Xcode, Visual Studio
IDEsPyCharm, IntelliJ, WebStorm, Android Studio, Rider, CLion, DataGrip, GoLand, Eclipse, NetBeans
Dev toolsPostman, Insomnia, DBeaver, TablePlus, Sequel Pro, GitHub Desktop, GitKraken, Sourcetree, Docker, Figma
CommunicationSlack, Zoom, Teams, Discord, Signal, WhatsApp, Telegram, Skype, Viber, Messages, FaceTime, Outlook, Thunderbird
OfficeWord, Excel, PowerPoint, LibreOffice, Pages, Numbers, Keynote, Notion, Obsidian
Media & creativeVLC, Spotify, Music, GIMP, Inkscape, Audacity, Blender, OBS, Kdenlive, DaVinci Resolve, HandBrake
Cloud & storageDropbox, OneDrive, Google Drive
GamingSteam, Epic Games, Xbox
SecurityBitwarden, 1Password, Windows Security
System utilitiesTask Manager, Activity Monitor, Event Viewer, Device Manager, Registry Editor, Disk Utility, Disk Management, Task Scheduler, Resource Monitor
System settingsSettings, Display, Sound, Bluetooth, Network, Updates, Privacy, Accessibility (all platforms)
macOS system appsSafari, 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

๐Ÿ”Š
VolumeCross-platform

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

โ˜€๏ธ
BrightnessCross-platform

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

๐Ÿ”’
Lock screenCross-platform

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

๐Ÿ’ค
SleepCross-platform

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

๐Ÿ“‹
ClipboardCross-platform

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

๐Ÿ–ฅ
Display offCross-platform

Turn off the display without sleeping the system. Windows: SendMessage. macOS: pmset displaysleepnow. Linux: xset dpms.

API: POST /api/system/display/off

โ„น๏ธ
System infoCross-platform

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

๐ŸŽต
SpotifyPersonal onlyOpt-in

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.

๐ŸŒ
Web browserBuilt-in

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

๐Ÿ“…
Calendar & tasksBoth variants

Create, list, update, and complete tasks in Luna's local SQLite database. Proactive reminders fire when tasks are due.

๐Ÿ”
Web searchBoth variants

DuckDuckGo HTML search โ€” no API key required. Fires automatically when the LLM needs live information.

๐Ÿ”ˆ
Audio device switcherWindows only

Switch the default Windows audio output device by name โ€” headphones, speakers, virtual audio.

API: GET /api/system/audio-devices ยท POST /api/system/audio-device

๐Ÿ—บ
MapsPersonal only

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.

โ›…
Open-MeteoFreeNo key

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.

๐Ÿ“ฐ
TheNewsAPIOpt-in

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

๐Ÿ“ˆ
Yahoo FinanceNo key

Stock quotes and market data. Used by default for equities in the dashboard โ€” no API key required.

๐Ÿช™
CoinGeckoNo key

Cryptocurrency prices and market cap data. Used by default for crypto widgets โ€” no API key required.

๐Ÿ“Š
Alpha VantageOpt-in

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.

โŒš
FitbitOAuth2Personal

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

๐Ÿƒ
Google FitOAuth2Android ecosystem

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

๐Ÿ’
Oura RingAPI tokenBest HRV data

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

โš–๏ธ
WithingsOAuth2Blood pressure

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

๐Ÿ”
Garmin ConnectCredentials

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

๐ŸŽ
Apple HealthWebhookiOS app needed

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

๐Ÿ“ฑ
Samsung HealthWebhookAndroid app needed

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

๐Ÿ’ก
Full health documentation

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.

๐Ÿ”
JWT AuthenticationBusiness

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

๐Ÿšฆ
Rate limitingBusiness

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

๐Ÿ‘ฅ
Admin user management APIBusiness

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

๐Ÿ”’
HTTPS / reverse proxyBusiness

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

terminal โ€” create a user and get a token
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โ€ฆ"}
terminal โ€” list all providers and their status
curl http://localhost:8899/api/admin/llm/providers \
  -H "Authorization: Bearer $JWT_SECRET"
๐Ÿ’ก
Setting the admin token

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.

๐ŸชŸ
Windows
Full support
Electron desktop app, voice input/output, app launcher, audio switcher, Spotify, camera, screen vision. Primary development target.
๐ŸŽ
macOS
Full support
Electron desktop app, voice input/output, app launcher, Spotify. Audio switcher not available. Tested on Apple Silicon.
๐Ÿง
Linux
Full support
Electron desktop app. Voice works with PortAudio. pyttsx3 uses eSpeak. Audio switcher not available. Best with Docker.
๐Ÿณ
Docker
Partial
Full chat, memory, tools, channels, admin API, and rate limiting. Voice, Electron shell, and OS-level automation are desktop-only. Any device with Docker installed.
๐Ÿ“ฑ
Phone / Tablet
Partial
Browser access via local network (LAN mode) or via Telegram/Discord/Slack channels in the Business variant. Chat and dashboard work fully.
๐Ÿ’ป
Second computer
Partial
Any machine on your LAN can connect to the same Luna backend via browser. Set host=0.0.0.0 in .env.
โ„น๏ธ
LAN / multi-device access
# .env
host=0.0.0.0

Then open http://YOUR-LAN-IP:8899 on any device. For the business variant, set jwt_secret to protect the admin API.