Skip to main content

A minimal juce-based plugin host using nanobind

Project description

minihost

Minihost is a headless, JUCE-based audio plugin host that supports VST3, AudioUnit, and LV2 plugins. It provides a C/C++ API for integration and a Python API powered by nanobind.

Features

  • Load VST3 plugins (macOS, Windows, Linux)
  • Load AudioUnit plugins (macOS only)
  • Load LV2 plugins (macOS, Windows, Linux)
  • Headless mode (default) - no GUI dependencies, uses JUCE's juce_audio_processors_headless module
  • Plugin chaining - connect multiple plugins in series (synth -> reverb -> limiter)
  • Audio file I/O via miniaudio + tflac -- read WAV/FLAC/MP3/Vorbis, write WAV (16/24/32-bit) and FLAC (16/24-bit)
  • Real-time audio playback via miniaudio (cross-platform)
  • Real-time MIDI I/O via libremidi (cross-platform)
  • Virtual MIDI ports - create named ports that DAWs can connect to (macOS, Linux)
  • Standalone MIDI input - monitor raw MIDI messages without a plugin (MidiIn class)
  • Process audio with sample-accurate parameter automation
  • Single and double precision processing
  • MIDI input/output support
  • Transport info for tempo-synced plugins
  • State save/restore for presets and per-program state
  • Thread-safe parameter access
  • Change notifications (latency, parameter info, program, non-parameter state)
  • Parameter gestures for automation bracketing
  • Bus layout validation and sidechain support
  • Track name/color metadata forwarding to plugins
  • Latency and tail time reporting

Requirements

  • CMake 3.20+
  • C++17 compiler
  • JUCE framework (automatically downloaded if not present)

Platform-specific

  • macOS: Xcode command line tools
  • Windows: Visual Studio 2019+ or MinGW
  • Linux: Install the following development libraries:
    sudo apt install libasound2-dev libfreetype-dev libfontconfig1-dev \
        libwebkit2gtk-4.1-dev libgtk-3-dev libgl-dev libcurl4-openssl-dev
    

Building

macOS / Linux

# Clone the repository
git clone https://github.com/shakfu/minihost.git
cd minihost

# Build (JUCE will be downloaded automatically)
make

# Or with a custom JUCE path
cmake -B build -DJUCE_PATH=/path/to/JUCE
cmake --build build

# Disable headless mode (enables GUI support)
cmake -B build -DMINIHOST_HEADLESS=OFF
cmake --build build

Windows

# Clone the repository
git clone https://github.com/shakfu/minihost.git
cd minihost

# Download JUCE
python scripts/download_juce.py

# Configure and build
cmake -B build
cmake --build build --config Release

JUCE Setup

JUCE is downloaded automatically by make (macOS/Linux). You can also download it manually:

# Cross-platform (recommended) - works on Windows, macOS, Linux
python scripts/download_juce.py

# Unix only (bash)
./scripts/download_juce.sh

To use a different version or existing installation:

# Download specific version (macOS/Linux)
JUCE_VERSION=8.0.6 python scripts/download_juce.py

# Download specific version (Windows PowerShell)
$env:JUCE_VERSION="8.0.6"; python scripts/download_juce.py

# Or point to existing JUCE
cmake -B build -DJUCE_PATH=/path/to/your/JUCE

Command Line Interface

The minihost command provides a CLI for common plugin operations:

# Install (from source)
uv sync

# Available commands
minihost --help
usage: minihost [-h] [-r SAMPLE_RATE] [-b BLOCK_SIZE]
                {scan,info,params,midi,play,process} ...

Audio plugin hosting CLI

positional arguments:
  {scan,info,params,midi,play,process}
                        Commands
    scan                Scan directory for plugins
    info                Show plugin info
    params              List plugin parameters
    midi                List or monitor MIDI ports
    play                Play plugin with real-time audio/MIDI
    process             Process audio through plugin (offline)

options:
  -h, --help            show this help message and exit
  -r, --sample-rate SAMPLE_RATE
                        Sample rate in Hz (default: 48000)
  -b, --block-size BLOCK_SIZE
                        Block size in samples (default: 512)

Commands

minihost info - Show plugin info

minihost info /path/to/plugin.vst3          # full info (loads plugin)
minihost info /path/to/plugin.vst3 --probe  # lightweight metadata only
minihost info /path/to/plugin.vst3 --json   # JSON output

By default shows full runtime details (sample rate, channels, latency, buses, presets). Use --probe for fast metadata-only mode without fully loading the plugin.

minihost scan - Scan directory for plugins

minihost scan /Library/Audio/Plug-Ins/VST3/
minihost scan ~/Music/Plugins --json

minihost params - List plugin parameters

minihost params /path/to/plugin.vst3
minihost params /path/to/plugin.vst3 --json

minihost midi - List or monitor MIDI ports

minihost midi                          # list all MIDI ports
minihost midi --json                   # list as JSON
minihost midi -m 0                     # monitor MIDI input port 0
minihost midi --virtual-midi "Monitor" # create virtual port and monitor

minihost play - Play plugin with real-time audio/MIDI

# Connect to MIDI input port 0
minihost play /path/to/synth.vst3 --midi 0

# Create a virtual MIDI port (macOS/Linux)
minihost play /path/to/synth.vst3 --virtual-midi "My Synth"

minihost process - Process audio/MIDI offline

# Process audio through effect
minihost process /path/to/effect.vst3 -i input.wav -o output.wav

# With parameter control
minihost process /path/to/effect.vst3 -i input.wav -o output.wav --param "Mix:0.5"

# Render MIDI through synth
minihost process /path/to/synth.vst3 -m song.mid -o output.wav --tail 3.0

# With preset and bit depth
minihost process /path/to/synth.vst3 -m song.mid -o output.wav --preset 5 --bit-depth 16

# Sidechain processing (second -i is sidechain)
minihost process /path/to/compressor.vst3 -i main.wav -i sidechain.wav -o output.wav

Global Options

Option Description
-r, --sample-rate Sample rate in Hz (default: 48000)
-b, --block-size Block size in samples (default: 512)

Python API

uv sync
import numpy as np
import minihost

plugin = minihost.Plugin("/path/to/plugin.vst3", sample_rate=48000)

input_audio = np.zeros((2, 512), dtype=np.float32)
output_audio = np.zeros((2, 512), dtype=np.float32)
plugin.process(input_audio, output_audio)

Real-time Audio Playback

import minihost
import time

plugin = minihost.Plugin("/path/to/synth.vst3", sample_rate=48000)

# Use as context manager for automatic start/stop
with minihost.AudioDevice(plugin) as audio:
    # Plugin is now producing audio through speakers
    # Send MIDI programmatically
    audio.send_midi(0x90, 60, 100)  # Note on: C4, velocity 100
    time.sleep(1)
    audio.send_midi(0x80, 60, 0)    # Note off
    time.sleep(0.5)

# Or manual control
audio = minihost.AudioDevice(plugin)
audio.start()
audio.send_midi(0x90, 64, 80)  # E4 note on
time.sleep(0.5)
audio.send_midi(0x80, 64, 0)   # E4 note off
audio.stop()

Real-time MIDI I/O

import minihost

# Enumerate available MIDI ports
inputs = minihost.midi_get_input_ports()
outputs = minihost.midi_get_output_ports()
print(f"MIDI Inputs: {inputs}")
print(f"MIDI Outputs: {outputs}")

# Connect MIDI when creating AudioDevice
with minihost.AudioDevice(plugin, midi_input_port=0) as audio:
    # MIDI from port 0 is now routed to the plugin
    pass

# Or connect dynamically
audio = minihost.AudioDevice(plugin)
audio.connect_midi_input(0)
audio.start()
# ...
audio.disconnect_midi_input()
audio.stop()

# Create virtual MIDI ports (appear in system MIDI, DAWs can connect)
audio = minihost.AudioDevice(plugin)
audio.create_virtual_midi_input("minihost Input")
audio.create_virtual_midi_output("minihost Output")
audio.start()
# Other apps can now send MIDI to "minihost Input"
# and receive MIDI from "minihost Output"

Standalone MIDI Input

Monitor MIDI messages without loading a plugin:

import minihost

def on_midi(data: bytes):
    status = data[0]
    if status & 0xF0 == 0x90 and data[2] > 0:
        print(f"Note On: {data[1]} vel={data[2]}")

# Open hardware MIDI port
with minihost.MidiIn.open(0, on_midi) as midi_in:
    input("Press Enter to stop...\n")

# Or create a virtual MIDI port
with minihost.MidiIn.open_virtual("My Monitor", on_midi) as midi_in:
    input("Press Enter to stop...\n")

Audio File I/O

import minihost

# Read audio files (WAV, FLAC, MP3, Vorbis)
data, sample_rate = minihost.read_audio("input.wav")
# data shape: (channels, samples), dtype: float32

# Write audio files
minihost.write_audio("output.wav", data, sample_rate, bit_depth=24)   # WAV (16/24/32-bit)
minihost.write_audio("output.flac", data, sample_rate, bit_depth=24)  # FLAC (16/24-bit)

# Get file info without decoding
info = minihost.get_audio_info("song.wav")
print(f"{info['channels']}ch, {info['sample_rate']}Hz, {info['duration']:.2f}s")

MIDI File Read/Write

import minihost

# Create a new MIDI file
mf = minihost.MidiFile()
mf.ticks_per_quarter = 480

# Add events
mf.add_tempo(0, 0, 120.0)  # 120 BPM at tick 0
mf.add_note_on(0, 0, 0, 60, 100)    # C4 note on at tick 0
mf.add_note_off(0, 480, 0, 60, 0)   # C4 note off at tick 480

# Save to file
mf.save("output.mid")

# Load existing MIDI file
mf2 = minihost.MidiFile()
mf2.load("input.mid")

# Read events
events = mf2.get_events(0)  # Get events from track 0
for event in events:
    if event['type'] == 'note_on':
        print(f"Note {event['pitch']} vel {event['velocity']} at {event['seconds']:.2f}s")

MIDI File Rendering

Render MIDI files through plugins to produce audio output:

import minihost

plugin = minihost.Plugin("/path/to/synth.vst3", sample_rate=48000)

# Render to numpy array
audio = minihost.render_midi(plugin, "song.mid")
print(f"Rendered {audio.shape[1] / 48000:.2f} seconds of audio")

# Render directly to WAV file
samples = minihost.render_midi_to_file(plugin, "song.mid", "output.wav", bit_depth=24)

# Stream blocks for large files or real-time processing
for block in minihost.render_midi_stream(plugin, "song.mid", block_size=512):
    # Process each block (shape: channels, block_size)
    pass

# Fine-grained control with MidiRenderer class
renderer = minihost.MidiRenderer(plugin, "song.mid")
print(f"Duration: {renderer.duration_seconds:.2f}s")

while not renderer.is_finished:
    block = renderer.render_block()
    print(f"Progress: {renderer.progress:.1%}")

Plugin Chaining

Chain multiple plugins together for serial processing:

import minihost
import time

# Load plugins (all must have same sample rate)
synth = minihost.Plugin("/path/to/synth.vst3", sample_rate=48000)
reverb = minihost.Plugin("/path/to/reverb.vst3", sample_rate=48000)
limiter = minihost.Plugin("/path/to/limiter.vst3", sample_rate=48000)

# Create chain
chain = minihost.PluginChain([synth, reverb, limiter])
print(f"Total latency: {chain.latency_samples} samples")
print(f"Tail length: {chain.tail_seconds:.2f} seconds")

# Real-time playback through chain
with minihost.AudioDevice(chain) as audio:
    audio.send_midi(0x90, 60, 100)  # Note on to synth
    time.sleep(2)
    audio.send_midi(0x80, 60, 0)    # Note off
    time.sleep(1)  # Let reverb tail fade

# Offline processing
import numpy as np
input_audio = np.zeros((2, 512), dtype=np.float32)
output_audio = np.zeros((2, 512), dtype=np.float32)
chain.process(input_audio, output_audio)

# Process with MIDI (MIDI goes to first plugin)
midi_events = [(0, 0x90, 60, 100)]
chain.process_midi(input_audio, output_audio, midi_events)

# Sample-accurate automation across chain
# param_changes: (sample_offset, plugin_index, param_index, value)
param_changes = [
    (0, 1, 0, 0.3),    # Set reverb param 0 at sample 0
    (256, 1, 0, 0.6),  # Change reverb param 0 at sample 256
    (0, 2, 0, 0.8),    # Set limiter param 0 at sample 0
]
chain.process_auto(input_audio, output_audio, midi_events, param_changes)

# Render MIDI file through chain
audio = minihost.render_midi(chain, "song.mid")
minihost.render_midi_to_file(chain, "song.mid", "output.wav")

# Access individual plugins in chain
for i in range(chain.num_plugins):
    plugin = chain.get_plugin(i)
    print(f"Plugin {i}: {plugin.num_params} params")

C API Usage

#include "minihost.h"

// Load a plugin
char err[256];
MH_Plugin* plugin = mh_open("/path/to/plugin.vst3",
                            48000.0,  // sample rate
                            512,      // max block size
                            2, 2,     // in/out channels
                            err, sizeof(err));

// Process audio
float* inputs[2] = { in_left, in_right };
float* outputs[2] = { out_left, out_right };
mh_process(plugin, inputs, outputs, 512);

// Process with MIDI
MH_MidiEvent midi[] = {
    { 0, 0x90, 60, 100 },   // Note on at sample 0
    { 256, 0x80, 60, 0 }    // Note off at sample 256
};
mh_process_midi(plugin, inputs, outputs, 512, midi, 2);

// Parameter control
int num_params = mh_get_num_params(plugin);
float value = mh_get_param(plugin, 0);
mh_set_param(plugin, 0, 0.5f);

// State save/restore
int size = mh_get_state_size(plugin);
void* state = malloc(size);
mh_get_state(plugin, state, size);
mh_set_state(plugin, state, size);

// Cleanup
mh_close(plugin);

Real-time Audio Playback

#include "minihost_audio.h"

// Open audio device for real-time playback
MH_AudioConfig config = { .sample_rate = 48000, .buffer_frames = 512 };
MH_AudioDevice* audio = mh_audio_open(plugin, &config, err, sizeof(err));

// Start playback
mh_audio_start(audio);

// Plugin is now producing audio through speakers
// Send MIDI, adjust parameters, etc.

// Stop and cleanup
mh_audio_stop(audio);
mh_audio_close(audio);
mh_close(plugin);

Real-time MIDI I/O

#include "minihost_midi.h"

// Enumerate available MIDI ports
int num_inputs = mh_midi_get_num_inputs();
int num_outputs = mh_midi_get_num_outputs();

for (int i = 0; i < num_inputs; i++) {
    char name[256];
    mh_midi_get_input_name(i, name, sizeof(name));
    printf("MIDI Input %d: %s\n", i, name);
}

// Connect MIDI to audio device
MH_AudioConfig config = {
    .sample_rate = 48000,
    .midi_input_port = 0,   // Connect to first MIDI input
    .midi_output_port = -1  // No MIDI output
};
MH_AudioDevice* audio = mh_audio_open(plugin, &config, err, sizeof(err));

// Or connect/disconnect dynamically
mh_audio_connect_midi_input(audio, 1);
mh_audio_disconnect_midi_input(audio);

// Create virtual MIDI ports (appear in system MIDI, DAWs can connect)
mh_audio_create_virtual_midi_input(audio, "minihost Input");
mh_audio_create_virtual_midi_output(audio, "minihost Output");

Plugin Chaining

Chain multiple plugins together for processing (e.g., synth -> reverb -> limiter):

#include "minihost_chain.h"

// Load plugins
MH_Plugin* synth = mh_open("/path/to/synth.vst3", 48000, 512, 0, 2, err, sizeof(err));
MH_Plugin* reverb = mh_open("/path/to/reverb.vst3", 48000, 512, 2, 2, err, sizeof(err));
MH_Plugin* limiter = mh_open("/path/to/limiter.vst3", 48000, 512, 2, 2, err, sizeof(err));

// Create chain (all plugins must have same sample rate)
MH_Plugin* plugins[] = { synth, reverb, limiter };
MH_PluginChain* chain = mh_chain_create(plugins, 3, err, sizeof(err));

// Get combined latency
int latency = mh_chain_get_latency_samples(chain);

// Process audio through chain
float* inputs[2] = { in_left, in_right };
float* outputs[2] = { out_left, out_right };
mh_chain_process(chain, inputs, outputs, 512);

// Process with MIDI (MIDI goes to first plugin only)
MH_MidiEvent midi[] = { { 0, 0x90, 60, 100 } };
mh_chain_process_midi_io(chain, inputs, outputs, 512, midi, 1, NULL, 0, NULL);

// Sample-accurate automation across chain
MH_ChainParamChange changes[] = {
    { .sample_offset = 0,   .plugin_index = 1, .param_index = 0, .value = 0.3f },
    { .sample_offset = 256, .plugin_index = 1, .param_index = 0, .value = 0.6f },
};
mh_chain_process_auto(chain, inputs, outputs, 512,
                       NULL, 0, NULL, 0, NULL, changes, 2);

// Real-time playback through chain
MH_AudioConfig config = { .sample_rate = 48000, .buffer_frames = 512 };
MH_AudioDevice* audio = mh_audio_open_chain(chain, &config, err, sizeof(err));
mh_audio_start(audio);
// ...
mh_audio_stop(audio);
mh_audio_close(audio);

// Cleanup
mh_chain_close(chain);  // Does not close individual plugins
mh_close(synth);
mh_close(reverb);
mh_close(limiter);

Audio File I/O

Read and write audio files without external dependencies:

#include "minihost_audiofile.h"

// Read any supported format (WAV, FLAC, MP3, Vorbis)
char err[1024];
MH_AudioData* audio = mh_audio_read("input.flac", err, sizeof(err));
if (audio) {
    printf("Channels: %u, Frames: %u, Rate: %u\n",
           audio->channels, audio->frames, audio->sample_rate);
    // audio->data is interleaved float32
    mh_audio_data_free(audio);
}

// Write audio file (format selected by extension)
mh_audio_write("output.wav", interleaved_data,
               2, num_frames, 48000, 24, err, sizeof(err));   // WAV
mh_audio_write("output.flac", interleaved_data,
               2, num_frames, 48000, 24, err, sizeof(err));   // FLAC

// Get file info without decoding
MH_AudioFileInfo info;
mh_audio_get_file_info("song.wav", &info, err, sizeof(err));
printf("Duration: %.2f seconds\n", info.duration);

Thread Safety

  • mh_process, mh_process_midi, mh_process_midi_io, mh_process_auto: Call from audio thread only (no locking)
  • All other functions are thread-safe with internal locking
  • Do not call mh_close while another thread is using the plugin

API Reference

Detailed API documentation:

  • C API Reference -- minihost.h, minihost_audio.h, minihost_audiofile.h, minihost_chain.h, minihost_midi.h
  • Python API Reference -- Plugin, PluginChain, AudioDevice, MidiFile, MidiIn, audio I/O, MIDI rendering, automation, VST3 presets
  • Hosting Guide -- practical guide with extended examples

License

GPL3

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

minihost-0.1.3.tar.gz (23.9 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

minihost-0.1.3-cp314-cp314-win_amd64.whl (12.9 MB view details)

Uploaded CPython 3.14Windows x86-64

minihost-0.1.3-cp314-cp314-manylinux_2_28_x86_64.whl (17.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

minihost-0.1.3-cp314-cp314-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

minihost-0.1.3-cp314-cp314-macosx_11_0_arm64.whl (15.8 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

minihost-0.1.3-cp313-cp313-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.13Windows x86-64

minihost-0.1.3-cp313-cp313-manylinux_2_28_x86_64.whl (17.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

minihost-0.1.3-cp313-cp313-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

minihost-0.1.3-cp313-cp313-macosx_11_0_arm64.whl (15.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

minihost-0.1.3-cp312-cp312-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.12Windows x86-64

minihost-0.1.3-cp312-cp312-manylinux_2_28_x86_64.whl (17.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

minihost-0.1.3-cp312-cp312-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

minihost-0.1.3-cp312-cp312-macosx_11_0_arm64.whl (15.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

minihost-0.1.3-cp311-cp311-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.11Windows x86-64

minihost-0.1.3-cp311-cp311-manylinux_2_28_x86_64.whl (17.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

minihost-0.1.3-cp311-cp311-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

minihost-0.1.3-cp311-cp311-macosx_11_0_arm64.whl (15.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

minihost-0.1.3-cp310-cp310-win_amd64.whl (12.7 MB view details)

Uploaded CPython 3.10Windows x86-64

minihost-0.1.3-cp310-cp310-manylinux_2_28_x86_64.whl (17.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

minihost-0.1.3-cp310-cp310-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

minihost-0.1.3-cp310-cp310-macosx_11_0_arm64.whl (15.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file minihost-0.1.3.tar.gz.

File metadata

  • Download URL: minihost-0.1.3.tar.gz
  • Upload date:
  • Size: 23.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for minihost-0.1.3.tar.gz
Algorithm Hash digest
SHA256 ccc38fc1ca3ef60bd40f17393628d1b226d0a0c86adae4d739f5352ecee76ea0
MD5 fd5c40b9d24f83a256bb2d43135dd104
BLAKE2b-256 7da92c7e3e294302cedc39c7fe3a3d7afbdddcb772b64165681a1e96dc5760ef

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: minihost-0.1.3-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 12.9 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for minihost-0.1.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 3cbc42334584932078855303f0eab1ac68ba9d79c4e133deb9541eb8cc6cdc63
MD5 eea8bc4e28df289873463c0fd390d5ae
BLAKE2b-256 3e2036261607a5117b742b7bd6b16ccf3ec3398202f946981f53010b531465fa

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a67dc1071c288c518b5e0093fddb64dc2fde10bf689297bb85d4ba7ae637e7bb
MD5 6992864a2190fa029c889d5fe773199e
BLAKE2b-256 223687f3f0b43c18856f36764836d08637b2bcafda0ef23fbb86aedb4228adc0

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp314-cp314-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 50b6ca13fe28e77b777d9a16c26a7a245cc7db311239a5518088a0ccf139d80b
MD5 81f004378d9c5059c05893bb63396fb9
BLAKE2b-256 e6bffb0bdd8db1a9929f5717819a7982ee7d8ebded9ab2a4c5a965daedbbaee4

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5dc4301c0ce965b163174fd511b40e9380a785fff00610ed819e2522b3f37f68
MD5 d70101d6c4ee992de0f99fff1406371a
BLAKE2b-256 56ef51b5c771f30a93d820c4a8c1eaa2b9abcea0891955eaad370cc8d73d2047

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: minihost-0.1.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 12.7 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for minihost-0.1.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1b3bf6d0e6282134873942b2d9903af318e0514ad4f9f0cde879c803a6630b88
MD5 ade695d9caae10893c80fa89c4d6a9ee
BLAKE2b-256 b4238f6f755eda32219317995a3f8be0cea61ad5fb216eaaa572be416cb556d3

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 97099e948291d4523fb596c2f4be789465f1b97d5927cb20a967555a9c191a75
MD5 0e4b883bdbe60213354524d61fff4d78
BLAKE2b-256 2df4dd33e6629ca5f3cdf849b82c584b153cc54a0ef98a0430194c8adb4b97cb

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 94643b2f71189709091fbcf88c43667cb94286df815dc06c203a41f622ebe12a
MD5 8a775f726cce7a1396cf6d225d4507d8
BLAKE2b-256 17e12533c1bb0ddfeb7db1f144e77397fa280105fb1d1edcaa3fc7850bb6f167

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aac7a2befc4fb013235c4f3793cdad44338e52992ea7d6af1c98ad3279abc94d
MD5 c75b6f64343984a808496555987ff4f1
BLAKE2b-256 d068323ca93d1322953eff3bb3cd1272a7ea4efddb2161e8b4ab1c47ed9f4bb7

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: minihost-0.1.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 12.7 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for minihost-0.1.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0b65e89aca2db21681325401f70db139edb3408f002f76ec602d4ca2f45f82de
MD5 9ca2ee47c5e61e6b13d2d5f8ed810bfe
BLAKE2b-256 d6f151313bfe5fd2a0e396eb1f15329c3334f0e5ba176ae4a3bd4c7d904a1bec

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 099451e1d70617df98c879e4bbccc731d901745877da387e0b5eae960cb75eb1
MD5 5a8a11da10b854a4a7f7e73b5fd536ee
BLAKE2b-256 51b60d51672fff5119e6bbc4f0000d38e91de0ed7607b65313e129856b449555

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 69a6c212b4494e22c0c5f8a830352bfdf02cfd510ff0fb0c53c473a1bfa3bcb5
MD5 540b7565af075f2af0568033ffb8a8fa
BLAKE2b-256 f7d365761882945546ca6bc90ba446531d2c36b07ccc1118230ed8273cdaaf2e

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6352a30fea2757cd46e3701682a16ef7b7f2a621f03e059cecbd7f6592f1732e
MD5 d0ce9d15ca8d6b7eddd636196022aa4a
BLAKE2b-256 d123fba9126b4318e8dfbc1032635f6740a00a452372536ecf4a4909cff29613

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: minihost-0.1.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 12.7 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for minihost-0.1.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 260df7b63cf0ae91f80d045709a408290e33532aa15acbec45a31f66bc743fe8
MD5 5aaea794e11681f8e2b4ebd264ee13d3
BLAKE2b-256 467a6d425d3253f00452a0c74a4bbdb1bcb89d49e813686b9643a77f11bac8e8

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fba49e71e37164878a5b8022d6bf3c42598346898a89c1635af3a25c01028c3d
MD5 161c605ac36871a7dcfd15b5a8c19959
BLAKE2b-256 79867e3690bcb248257e2aac307bf86d3629fa6513b599825304b89d68465400

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c0df31235c1735234f10febaab9f0f8d2d90ddfe0a11fedba389ff198601ecfa
MD5 2371d91c4dbc9f4e7c849cabad65d8e8
BLAKE2b-256 5a42ebaad71d241c8920d11aab0c032366b9329a95b09da693e287cf6b8c1445

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cf302272b706672fbd7c5e1f9a9512ebf79c86f29d18a0adc5f563f1fce9e90d
MD5 eecfbd8fdd6f6e34ed63bb4af6fc57c2
BLAKE2b-256 fa8b9e5ee3e24e5d68366fc482fb7bc4f788fd80f60598a5f94c4ed6fe530958

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: minihost-0.1.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 12.7 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for minihost-0.1.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 56ebe88e4e5867f58416403581d19ce3143cbdf7e0b9968fcfd8f8d331e602ee
MD5 33b26a5b17fba8adfa86cc0b4308ff8c
BLAKE2b-256 3e8b1db0e7445b799cfc936744b4762867429891c8f0913e8beacf46dcee8a5d

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c8ffcc80019f0ca1b9fe50e748430cf83318fd13abe63db3e810d8a1e211c7fd
MD5 79b5378ccf09d578a794037fb12f4ffd
BLAKE2b-256 eace7bae866b8c5fc2b95713533cd6204001a605d930169541b3f33d9ef352ef

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d93de8e7c6751443bd296058683c126286a75e360fd545b8fa463d81915d352b
MD5 d36a4e5142b0b70eae94ee9f1ad8507f
BLAKE2b-256 9870722bc8585f2482db7b45cfaf8e7e335da4831f9682f3a01ae3c058e1eb85

See more details on using hashes here.

File details

Details for the file minihost-0.1.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for minihost-0.1.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 74e80def70d213ffccccef46b945a367735f8f51ed9b07f33c64319837d17bdd
MD5 fee0f80866c2c9e961fe7d785205860e
BLAKE2b-256 acb8b86881401482f6ccfb00bc6ac6ef22a6d891ad5fc3f230b8efd27a695e33

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page