Deploying MacWhisper with MDM
If you are planning to distribute MacWhisper across your organisation through MDM you can use our simple info.plist method. If a user has a MacWhisper license file at the following location they will automatically be validated on launch.
~/Library/Application\ Support/MacWhisper/mdmlicense.plist
Here is a complete mdmlicense.plist example file:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>licenseKey</key>
<string>xxxxxxxxx-xxxxxxxx-xxxxxxx-xxxxxxxx</string>
<key>allowsRemoteTranslation</key>
<true/>
<key>allowsCloudTranscription</key>
<true/>
<key>allowsAddingAIServices</key>
<true/>
<!-- AI Services Configuration (optional, available from MacWhisper v12.14+) -->
<!-- MDM-configured AI services appear as "MDM Managed" and cannot be edited/deleted by users -->
<key>aiServices</key>
<array>
<!-- OpenAI: ChatGPT models for AI Assistant -->
<!-- Required: type, uniqueId, model, apiKey -->
<dict>
<key>type</key>
<string>openAI</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440001</string>
<key>model</key>
<string>gpt-4o-mini</string>
<key>apiKey</key>
<string>sk-your-openai-api-key-here</string>
</dict>
<!-- Anthropic: Claude models for AI Assistant -->
<!-- Required: type, uniqueId, model, apiKey -->
<dict>
<key>type</key>
<string>anthropic</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440002</string>
<key>model</key>
<string>claude-3-5-sonnet-latest</string>
<key>apiKey</key>
<string>sk-ant-your-anthropic-api-key-here</string>
</dict>
<!-- Azure OpenAI Service: Microsoft-hosted OpenAI models -->
<!-- Required: type, uniqueId, deploymentURL, apiVersion, apiKey -->
<dict>
<key>type</key>
<string>azure</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440000</string>
<key>deploymentURL</key>
<string>https://mycompany.openai.azure.com/openai/deployments/gpt-4o/chat/completions</string>
<key>apiVersion</key>
<string>2024-02-15-preview</string>
<key>apiKey</key>
<string>your-azure-api-key-here</string>
</dict>
<!-- Groq -->
<!-- Required: type, uniqueId, model, apiKey -->
<dict>
<key>type</key>
<string>groq</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440004</string>
<key>model</key>
<string>llama-3.3-70b-versatile</string>
<key>apiKey</key>
<string>gsk_your-groq-api-key-here</string>
</dict>
<!-- OpenRouter -->
<!-- Required: type, uniqueId, model, apiKey -->
<dict>
<key>type</key>
<string>openRouter</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440005</string>
<key>model</key>
<string>meta-llama/llama-3.1-70b-instruct</string>
<key>apiKey</key>
<string>sk-or-your-openrouter-api-key-here</string>
</dict>
<!-- xAI: Grok models -->
<!-- Required: type, uniqueId, model, apiKey -->
<dict>
<key>type</key>
<string>xAI</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440006</string>
<key>model</key>
<string>grok-beta</string>
<key>apiKey</key>
<string>xai-your-xai-api-key-here</string>
</dict>
<!-- Deepseek -->
<!-- Required: type, uniqueId, model, apiKey -->
<dict>
<key>type</key>
<string>deepseek</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440007</string>
<key>model</key>
<string>deepseek-chat</string>
<key>apiKey</key>
<string>sk-your-deepseek-api-key-here</string>
</dict>
<!-- Google Gemini -->
<!-- Required: type, uniqueId, model, apiKey -->
<dict>
<key>type</key>
<string>gemini</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440008</string>
<key>model</key>
<string>gemini-1.5-flash</string>
<key>apiKey</key>
<string>your-gemini-api-key-here</string>
</dict>
<!-- Ollama: Self-hosted open models -->
<!-- Required: type, uniqueId, baseURL, model -->
<!-- Note: No apiKey needed for local deployment -->
<dict>
<key>type</key>
<string>ollama</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440003</string>
<key>baseURL</key>
<string>http://localhost:11434</string>
<key>model</key>
<string>llama3.2</string>
</dict>
<!-- LMStudio: Self-hosted models via LMStudio app -->
<!-- Required: type, uniqueId, baseURL, model -->
<!-- Note: No apiKey needed for local deployment -->
<dict>
<key>type</key>
<string>lmstudio</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440009</string>
<key>baseURL</key>
<string>http://localhost:1234/v1</string>
<key>model</key>
<string>local-model</string>
</dict>
<!-- Custom: Any OpenAI-compatible API endpoint -->
<!-- Required: type, uniqueId, name, baseURL, model -->
<!-- Optional: apiKey (only if endpoint requires authentication) -->
<dict>
<key>type</key>
<string>custom</string>
<key>uniqueId</key>
<string>550e8400-e29b-41d4-a716-446655440010</string>
<key>name</key>
<string>Corporate LLM Server</string>
<key>baseURL</key>
<string>https://llm.company.com/v1</string>
<key>model</key>
<string>company-llm-model</string>
<key>apiKey</key>
<string>custom-api-key-here</string>
</dict>
</array>
</dict>
</plist>
Fields listed in the plist will be hidden from configuration within the app (i.e. the corresponding Settings toggle will not be shown). Setting a field to false disables the feature entirely. Omitting a key makes that feature user-configurable.
Required*
| key | Description | value |
| licenseKey | The license key associated with your MDM purchase | String |
Functionality
| allowsCloudTranscription | Allow users to use cloud transcription services such as OpenAI, ElevenLabs and Deepgram | Bool |
| allowsAddingAIServices | Allow users to setup AI Services | Bool |
| allowsRemoteTranslation | Allow users to use remote translation services such as DeepL. Does not currently disable use of Apple's Translate API. | Bool |
Features
| playSoundOnCompleteTranscription | Whether to play a sound when a transcription completes | Bool |
| showSaveConfirmation | Show a save confirmation alert when closing a transcription that's not been saved yet | Bool |
| autoCreateWhisperFileAfterTranscription | Automatically save a .whisper file when creating a transcript | Bool |
| shouldShowTranscriptWithSentences | Show the transcript split up by sentences | Bool |
| showTimestampInSegment | Show timestamps in the segment view | Bool |
| showTimestampMilliseconds | Show milliseconds in the segment view | Bool |
| shouldAlsoSaveVideoToWhisperFile | Save video files to a .whisper file when saving | Bool |
| enableSpeakerDetection | Enable automatic speaker recognition (with supported models) | Bool |
| removeDuplicatedSegments | Automatically remove duplicated segments | Bool |
| defaultRecordingPath | The default path where recordings are saved to. This path will be created if it doesn't already exist.
|
String |
| shouldLaunchOnLogin | Will add MacWhisper to the system Login Items | Bool |
| aiServices | Allows preconfigured AI Services to be added. See the plist example above. | Array |
If you are interested in deploying MacWhisper in your organisation and you have more questions or features you would want to configure, please reach out to support@macwhisper.com and we'd be happy to see what we can do!