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!