1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Configuration
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Example `.env` file
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Create a `.env` file in your project directory. PlanOpticon loads it automatically.
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# =============================================================================
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# PlanOpticon Configuration
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# =============================================================================
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Copy this file to .env and fill in the values you need.
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# You only need ONE AI provider — PlanOpticon auto-detects which are available.
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- AI Providers (set at least one) ----------------------------------------
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# OpenAI — get your key at https://platform.openai.com/api-keys
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
OPENAI_API_KEY=sk-...
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Anthropic — get your key at https://console.anthropic.com/settings/keys
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ANTHROPIC_API_KEY=sk-ant-...
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Google Gemini — get your key at https://aistudio.google.com/apikey
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GEMINI_API_KEY=AI...
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Azure OpenAI — from your Azure portal deployment
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# AZURE_OPENAI_API_KEY=...
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Together AI — https://api.together.xyz/settings/api-keys
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# TOGETHER_API_KEY=...
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Fireworks AI — https://fireworks.ai/account/api-keys
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# FIREWORKS_API_KEY=...
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Cerebras — https://cloud.cerebras.ai/
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# CEREBRAS_API_KEY=...
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# xAI (Grok) — https://console.x.ai/
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# XAI_API_KEY=...
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Ollama (local, no key needed) — just run: ollama serve
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# OLLAMA_HOST=http://localhost:11434
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- Google (Drive, Docs, Sheets, Meet, YouTube) ----------------------------
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Option A: OAuth (interactive, recommended for personal use)
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Create credentials at https://console.cloud.google.com/apis/credentials
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# 1. Create an OAuth 2.0 Client ID (Desktop application)
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# 2. Enable these APIs: Google Drive API, Google Docs API
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GOOGLE_CLIENT_ID=123456789-abc.apps.googleusercontent.com
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GOOGLE_CLIENT_SECRET=GOCSPX-...
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Option B: Service Account (automated/server-side)
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- Zoom (recordings) ------------------------------------------------------
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Create an OAuth app at https://marketplace.zoom.us/develop/create
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# App type: "General App" with OAuth
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Scopes: cloud_recording:read:list_user_recordings, cloud_recording:read:recording
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ZOOM_CLIENT_ID=...
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ZOOM_CLIENT_SECRET=...
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# For Server-to-Server (no browser needed):
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# ZOOM_ACCOUNT_ID=...
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- Microsoft 365 (OneDrive, SharePoint, Teams) ----------------------------
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Register an app at https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# API permissions: OnlineMeetings.Read, Files.Read (delegated)
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
MICROSOFT_CLIENT_ID=...
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
MICROSOFT_CLIENT_SECRET=...
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- Notion ------------------------------------------------------------------
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Option A: OAuth (create integration at https://www.notion.so/my-integrations)
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# NOTION_CLIENT_ID=...
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# NOTION_CLIENT_SECRET=...
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Option B: API key (simpler, from the same integrations page)
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
NOTION_API_KEY=secret_...
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- GitHub ------------------------------------------------------------------
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Option A: Personal Access Token (simplest)
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Create at https://github.com/settings/tokens — needs 'repo' scope
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GITHUB_TOKEN=ghp_...
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Option B: OAuth App (for CI/automation)
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# GITHUB_CLIENT_ID=...
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# GITHUB_CLIENT_SECRET=...
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- Dropbox -----------------------------------------------------------------
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Create an app at https://www.dropbox.com/developers/apps
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# DROPBOX_APP_KEY=...
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# DROPBOX_APP_SECRET=...
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Or use a long-lived access token:
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# DROPBOX_ACCESS_TOKEN=...
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# --- General -----------------------------------------------------------------
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# CACHE_DIR=~/.cache/planopticon
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Environment variables reference
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### AI providers
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Variable | Required | Where to get it |
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|----------|----------|----------------|
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `OPENAI_API_KEY` | At least one provider | [platform.openai.com/api-keys](https://platform.openai.com/api-keys) |
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `ANTHROPIC_API_KEY` | At least one provider | [console.anthropic.com](https://console.anthropic.com/settings/keys) |
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `GEMINI_API_KEY` | At least one provider | [aistudio.google.com/apikey](https://aistudio.google.com/apikey) |
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `AZURE_OPENAI_API_KEY` | Optional | Azure portal > your OpenAI resource |
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `AZURE_OPENAI_ENDPOINT` | With Azure | Azure portal > your OpenAI resource |
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `TOGETHER_API_KEY` | Optional | [api.together.xyz](https://api.together.xyz/settings/api-keys) |
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `FIREWORKS_API_KEY` | Optional | [fireworks.ai](https://fireworks.ai/account/api-keys) |
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `CEREBRAS_API_KEY` | Optional | [cloud.cerebras.ai](https://cloud.cerebras.ai/) |
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `XAI_API_KEY` | Optional | [console.x.ai](https://console.x.ai/) |
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `OLLAMA_HOST` | Optional | Default: `http://localhost:11434` |
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Cloud services
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Variable | Service | Auth method |
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|----------|---------|-------------|
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `GOOGLE_CLIENT_ID` | Google (Drive, Docs, Meet) | OAuth |
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `GOOGLE_CLIENT_SECRET` | Google | OAuth |
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `GOOGLE_APPLICATION_CREDENTIALS` | Google | Service account |
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `ZOOM_CLIENT_ID` | Zoom | OAuth |
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `ZOOM_CLIENT_SECRET` | Zoom | OAuth |
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `ZOOM_ACCOUNT_ID` | Zoom | Server-to-Server |
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `MICROSOFT_CLIENT_ID` | Microsoft 365 | OAuth |
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `MICROSOFT_CLIENT_SECRET` | Microsoft 365 | OAuth |
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `NOTION_CLIENT_ID` | Notion | OAuth |
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `NOTION_CLIENT_SECRET` | Notion | OAuth |
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `NOTION_API_KEY` | Notion | API key |
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `GITHUB_CLIENT_ID` | GitHub | OAuth |
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `GITHUB_CLIENT_SECRET` | GitHub | OAuth |
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `GITHUB_TOKEN` | GitHub | API key |
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `DROPBOX_APP_KEY` | Dropbox | OAuth |
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `DROPBOX_APP_SECRET` | Dropbox | OAuth |
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `DROPBOX_ACCESS_TOKEN` | Dropbox | API key |
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### General
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Variable | Description |
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|----------|-------------|
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| `CACHE_DIR` | Directory for API response caching |
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Authentication
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon uses OAuth for cloud services. Run `planopticon auth` once per service — tokens are saved locally and refreshed automatically.
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon auth google # Google Drive, Docs, Meet, YouTube
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon auth dropbox # Dropbox
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon auth zoom # Zoom recordings
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon auth notion # Notion pages
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon auth github # GitHub repos and wikis
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon auth microsoft # OneDrive, SharePoint, Teams
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Credentials are stored in `~/.planopticon/`. Use `planopticon auth SERVICE --logout` to remove them.
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### What each service needs
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Service | Minimum setup | Full OAuth setup |
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---------|--------------|-----------------|
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Google | `GOOGLE_CLIENT_ID` + `GOOGLE_CLIENT_SECRET` | Create OAuth credentials in [Google Cloud Console](https://console.cloud.google.com/apis/credentials) |
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Zoom | `ZOOM_CLIENT_ID` + `ZOOM_CLIENT_SECRET` | Create a General App at [marketplace.zoom.us](https://marketplace.zoom.us/develop/create) |
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Microsoft | `MICROSOFT_CLIENT_ID` + `MICROSOFT_CLIENT_SECRET` | Register app in [Azure AD](https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps) |
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Notion | `NOTION_API_KEY` (simplest) | Create integration at [notion.so/my-integrations](https://www.notion.so/my-integrations) |
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| GitHub | `GITHUB_TOKEN` (simplest) | Create token at [github.com/settings/tokens](https://github.com/settings/tokens) |
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Dropbox | `DROPBOX_APP_KEY` + `DROPBOX_APP_SECRET` | Create app at [dropbox.com/developers](https://www.dropbox.com/developers/apps) |
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
For detailed OAuth app creation walkthroughs, see the [Authentication guide](../guide/authentication.md).
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Provider routing
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PlanOpticon auto-discovers available models and routes each task to the cheapest capable option:
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Task | Default preference |
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|------|--------------------|
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Vision (diagrams) | Gemini Flash > GPT-4o-mini > Claude Haiku > Ollama |
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Chat (analysis) | Claude Haiku > GPT-4o-mini > Gemini Flash > Ollama |
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Transcription | Local Whisper > Whisper-1 > Gemini Flash |
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Default models prioritize cost efficiency. For complex or high-stakes analysis, override with more capable models using `--chat-model` or `--vision-model`.
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
If no cloud API keys are configured, PlanOpticon automatically falls back to Ollama when a local server is running. This enables fully offline operation when paired with local Whisper for transcription.
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Override with `--provider`, `--vision-model`, or `--chat-model` flags.
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Frame sampling
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Control how frames are extracted:
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Sample rate: frames per second (default: 0.5)
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon analyze -i video.mp4 -o ./out --sampling-rate 1.0
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Change threshold: visual difference needed to keep a frame (default: 0.15)
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon analyze -i video.mp4 -o ./out --change-threshold 0.1
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Periodic capture: capture a frame every N seconds regardless of change (default: 30)
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Useful for slow-evolving content like document scrolling
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon analyze -i video.mp4 -o ./out --periodic-capture 15
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Disable periodic capture (rely only on change detection)
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon analyze -i video.mp4 -o ./out --periodic-capture 0
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Lower `change-threshold` = more frames kept. Higher `sampling-rate` = more candidates. Periodic capture catches content that changes too slowly for change detection (e.g., scrolling through a document during a screen share).
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
People/webcam frames are automatically filtered out using face detection — no configuration needed.
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Focus areas
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Limit processing to specific extraction types:
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon analyze -i video.mp4 -o ./out --focus "diagrams,action-items"
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## GPU acceleration
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
planopticon analyze -i video.mp4 -o ./out --use-gpu
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Requires `planopticon[gpu]` extras installed.
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!