Skip to content

Latest commit

 

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Medovukha

Personal Homebrew tap for packages built or maintained by EndorFlem. VoiceInk and Odysseus are source-built casks in this repository.

VoiceInk source build

This tap builds the free VoiceInk source tree from Beingpax/VoiceInk. It does not use the official paid voiceink cask or its precompiled binary.

The package is intentionally a cask rather than a formula. Homebrew formula builds run inside Homebrew's sandbox, while VoiceInk's local build resolves SwiftPM dependencies and invokes Xcode tools that need to manage their own cache and sandbox. That combination failed with sandbox_apply. A cask installer script is the supported Homebrew escape hatch for this kind of installer and runs outside the cask sandbox.

The installer:

  • downloads an archive pinned to one exact VoiceInk commit;
  • builds the pinned macOS-only Whisper framework;
  • runs make local with ad-hoc signing;
  • compiles VoiceInk with Sparkle's updater code and metadata disabled;
  • on Swift 6.2.1/Xcode 26.2, pins mlx-swift to 0.31.4 and swift-syntax to 602.0.0, whose manifests are compatible with that toolchain;
  • installs the result as ~/Applications/VoiceInk-local.app;
  • keeps build caches and rollback backups under ~/Library/Application Support/VoiceInkTap;
  • does not remove VoiceInk user data.

Installation

This repository is named Medovukha, not homebrew-medovukha, so add the explicit SSH remote:

brew tap EndorFlem/medovukha git@github.com:EndorFlem/Medovukha.git
brew install EndorFlem/medovukha/voiceink-source
brew install EndorFlem/medovukha/odysseus-source

The local checkout used to maintain the tap is:

~/.taps/Medovukha/

VoiceInk host requirements:

  • Apple Silicon;
  • macOS Sequoia or newer;
  • full Xcode with its macOS SDK and Swift toolchain;
  • Xcode's Metal Toolchain component;
  • Command Line Tools, including Git and Make;
  • Homebrew CMake.

If Xcode reports a missing Metal Toolchain, install the component once:

DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer \
  xcodebuild -downloadComponent MetalToolchain

The installer automatically selects /Applications/Xcode.app when xcode-select currently points only at Command Line Tools. An explicit developer directory still works:

DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer \
  brew install EndorFlem/medovukha/voiceink-source

An Xcode-version warning from Homebrew is separate from the source-build logic. The tap does not delete Command Line Tools or require the destructive sudo rm -rf /Library/Developer/CommandLineTools workaround.

For Xcode 26.2 the installer also forces Xcode to use the committed SwiftPM versions and applies the known mlx-swift 0.31.4 and swift-syntax 602.0.0 compatibility pins. If a future VoiceInk commit changes either dependency to an unknown incompatible version, the installer stops instead of silently building a different dependency graph.

The local build passes xcodebuild's skipMacroValidation flag only for this pinned VoiceInk build. This avoids changing Xcode's macro-validation policy globally; the trade-off is that the source and all SwiftPM revisions in the build must be trusted.

Odysseus source build

Odysseus is a self-hosted AI workspace. This tap uses its stable main branch and keeps the upstream Docker Compose project intact. Odysseus-local.app only runs docker compose up -d --build; it does not install a native Python environment and does not open Chrome or any other browser.

The installer:

  • downloads one exact Odysseus commit;
  • installs the Compose project under the tap's application state directory;
  • creates ~/Applications/Odysseus-local.app;
  • keeps source, Compose settings, logs, and data under ~/Library/Application Support/Medovukha/Odysseus;
  • preserves the data directory when the source cask is upgraded.
  • skips the upstream optional Real-ESRGAN wheel prebuild, which otherwise can block the first Apple Silicon image build for a very long time.

Docker Desktop must be installed; the launcher starts it in the background if it is not running. This cask deliberately does not install Docker or any native Python dependencies. Start the app wrapper with:

open "$HOME/Applications/Odysseus-local.app"

Then open Odysseus manually in Zen or another browser:

http://127.0.0.1:7000

The first launch builds the upstream Docker image and can take several minutes while Debian downloads Chromium and graphics dependencies. Progress is written to ~/Library/Application Support/Medovukha/Odysseus/logs/docker-compose-launch.log. Repeated clicks during this build are ignored by a launcher lock.

The first admin password is generated by the container and can be read with:

odysseus_root="$HOME/Library/Application Support/Medovukha/Odysseus"
docker compose --project-directory "$odysseus_root/source" \
  --env-file "$odysseus_root/.env" logs odysseus

To stop the stack:

odysseus_root="$HOME/Library/Application Support/Medovukha/Odysseus"
docker compose --project-directory "$odysseus_root/source" \
  --env-file "$odysseus_root/.env" down

Port 7000 is the default. macOS AirPlay Receiver commonly occupies that port and answers with 403 as AirTunes; that response is not Odysseus. If the configured port is busy, the launcher automatically selects the next free port, saves it in .env, and sends a notification with the actual URL. To claim 7000 specifically, turn off AirPlay Receiver and set APP_PORT=7000 in the saved .env file.

Updates

Once installed from the tap, the normal update command is:

brew upgrade

The scheduled GitHub Action runs once a week on Monday at 03:17 UTC. It reads the latest commits on Beingpax/VoiceInk main and odysseus-dev/odysseus main, downloads the corresponding archives, calculates their SHA256 values, and updates both casks. A changed version is then visible to ordinary brew upgrade, which runs the relevant installer again. The next launch of Odysseus-local.app rebuilds/recreates the Docker stack from the new source.

The version format is:

YYYY.MM.DD.HHMMSS-<first-eight-commit-hex-digits>

There is no HEAD formula and no brew upgrade --fetch-HEAD step.

If Homebrew auto-update is disabled in your shell, refresh the tap explicitly:

brew update
brew upgrade

Repository layout

Medovukha/
├── Casks/voiceink-source.rb
├── Casks/odysseus-source.rb
├── scripts/update-voiceink-cask.rb
├── scripts/update-odysseus-cask.rb
├── .github/workflows/update-voiceink-cask.yml
├── .gitignore
└── README.md

update-voiceink-cask.yml needs repository Contents: Read and write permission for the workflow token. If branch protection disallows direct workflow pushes, change the final step to create a pull request instead.

About

My homebrew "repo" with custom formulas

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages