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)
  • Sample rate conversion via miniaudio resampler -- minihost.resample() API and minihost resample CLI subcommand
  • Real-time audio playback via miniaudio (cross-platform), with duplex capture mode for effect processing
  • Real-time audio input -- lock-free ring buffer API (write_input()) and duplex capture (capture=True) for routing system audio through effects
  • 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)
  • Batch processing -- glob patterns and directory output for processing multiple files (minihost process -i "*.wav" -o output/)
  • Auto-tail detection -- tail_seconds="auto" monitors output amplitude and stops rendering when reverb/delay tails decay below threshold
  • 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,resample} ...

Audio plugin hosting CLI

positional arguments:
  {scan,info,params,midi,play,process,resample}
                        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)
    resample            Resample audio file to a different sample rate

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"

# Enable audio input for effect processing (duplex mode)
minihost play /path/to/reverb.vst3 --input
minihost play /path/to/amp-sim.vst3 --input --midi 0  # with MIDI too

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

# Batch processing (glob input, directory output)
minihost process /path/to/reverb.vst3 -i "drums/*.wav" -o processed/
minihost process /path/to/effect.vst3 -i "*.wav" -o output/ -y  # overwrite existing

# Mixed sample rates are automatically resampled (use --no-resample to error instead)
minihost process /path/to/effect.vst3 -i 44100hz.wav -i 48000hz_sidechain.wav -o out.wav

minihost resample - Resample audio files

minihost resample input.wav -o output.wav -r 48000
minihost resample input.wav -o output.wav -r 44100 --bit-depth 16
minihost resample input.wav -o output.wav -r 96000 -y  # overwrite

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 Audio Input (Effect Processing)

Route system audio through an effect plugin using duplex mode or the ring buffer API:

import minihost
import numpy as np
import time

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

# Option 1: Duplex mode (system audio capture -> plugin -> speakers)
with minihost.AudioDevice(plugin, capture=True) as audio:
    print("Processing system audio through effect... Ctrl+C to stop")
    time.sleep(10)

# Option 2: Ring buffer (push audio from Python)
audio = minihost.AudioDevice(plugin)
audio.enable_input()  # ~0.5s ring buffer by default
audio.start()

# Write audio into the ring buffer (e.g., from a file or generator)
data, sr = minihost.read_audio("guitar.wav")
block_size = 512
for i in range(0, data.shape[1], block_size):
    chunk = data[:, i:i+block_size]
    audio.write_input(chunk)
    time.sleep(block_size / sr * 0.9)  # pace to real time

audio.stop()
audio.disable_input()

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")

Sample Rate Conversion

import minihost

# Resample a numpy array
data, sr = minihost.read_audio("input_44100.wav")  # 44.1kHz
resampled = minihost.resample(data, 44100, 48000)   # -> 48kHz
minihost.write_audio("output_48000.wav", resampled, 48000)

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

# Auto-detect reverb/delay tail (stops when output decays below -80 dB)
audio = minihost.render_midi(plugin, "song.mid", tail_seconds="auto")

# Custom threshold (-40 dB) and max tail (10s safety cap)
audio = minihost.render_midi(plugin, "song.mid",
                             tail_seconds="auto", tail_threshold=1e-2, max_tail_seconds=10)

# 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);

// Resample audio (e.g., 44.1kHz -> 48kHz)
MH_AudioData* resampled = mh_audio_resample(
    audio->data, audio->channels, audio->frames,
    44100, 48000, err, sizeof(err));
if (resampled) {
    printf("Resampled: %u frames at %u Hz\n", resampled->frames, resampled->sample_rate);
    mh_audio_data_free(resampled);
}

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.4.tar.gz (1.3 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.4-cp314-cp314-win_amd64.whl (12.9 MB view details)

Uploaded CPython 3.14Windows x86-64

minihost-0.1.4-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.4-cp314-cp314-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

minihost-0.1.4-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.4-cp313-cp313-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

minihost-0.1.4-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.4-cp312-cp312-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

minihost-0.1.4-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.4-cp311-cp311-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

minihost-0.1.4-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.4-cp310-cp310-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

minihost-0.1.4-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.4.tar.gz.

File metadata

  • Download URL: minihost-0.1.4.tar.gz
  • Upload date:
  • Size: 1.3 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.4.tar.gz
Algorithm Hash digest
SHA256 a1f3688b62b278d85273567fc87a1eaf6e2df39bcfc5264dc22823a139b9154f
MD5 3fae5be4b7b7569df8892c4470f1c849
BLAKE2b-256 00c9ba839da0c678f66eb77ecf7f3cabe9273f6495bb50f57a1fce1088ab8cfd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minihost-0.1.4-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.4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 bd9ed99dafd67ac3e24f19c9bb12955d155f7d9f71be4b7448929d7c5f972458
MD5 357df658090e8b8c0211e54a47ceb5e9
BLAKE2b-256 28ae0e03dd5d965461c2b18fb0b9acfcad3df5ab0ea6c1b222bb35484baf4baa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f5797efa34e9fc53d85bcf3ac91455d1fbe49a0814cdfc4dc63a127be23d9806
MD5 7936cf3d0f0a323dfb698a0dd33402ac
BLAKE2b-256 c16d105755b6a8e3e17cd142141137a6e6b20a4390a8252ae1bb3952d58eb5ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c84b3231ff4fa6c36f057d3b9ff3a9c6187578d0642d53d4728d195ec0373f32
MD5 7a471330941125988d32a0c5854071d6
BLAKE2b-256 22fe72498b84fd2ddc55ec377d816cc79279c80156863e50b54baf05b88dec56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ff606d082f7a5cdde71b64dfb894b6d9b3050883d8b3d4d4d0073cef263ccc1a
MD5 220d4587ca822a460ae270db89101e4b
BLAKE2b-256 c30b44cb7be18f90602b8174b06b0a69f7b4526d160d02be1f404e5dd9b16ccc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minihost-0.1.4-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.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8970f68d842894ced96bf28b9cac9d0df9b1e7c51558b0dc8e2682875623ea60
MD5 d320120a6503da641fa7b873eb465c4c
BLAKE2b-256 61a903f7b8b3e4b264126ffdd506c3648a71c2289f1f283cd5230bfad8236fde

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 05b7c34cb7d7088bff0535fc7c775179d7a644d059b04a19607a0a6fcc849a44
MD5 cb7117441c792d3aac469d7f8464f49c
BLAKE2b-256 849270dad00792441ca28976d989b4e2574f58ed64ab216cd951b62a90f6e791

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 97b125a416775eef126a0dcd00a704484860148959e3ac39b84fdcbaaeb1dfbd
MD5 f38172eb200f30bf9b2d5c742c7f940c
BLAKE2b-256 eb40a96dbc5013f6981521f7845aaebb001ec6cbd628aced600add4ec2bc3f06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 83334c0de9f3b0c3f5f976c93999032c2058930652581bdd7ed99ba5060a622f
MD5 240646911ecc7812f3f4d6f64e77bcd1
BLAKE2b-256 52346d1e69b8a1b7818992f95f23f845fd946c4cdd6268cf6f76c567b6e5173a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minihost-0.1.4-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.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f174135915cacd98b32fc12a4bd7b5f55b1aaba944e5ef6355cc5ec331812e82
MD5 e263994a601df83fca80ad6c4d236669
BLAKE2b-256 14e3e48ec777198b263ee7c18ebcea93c58826458c081668d62e9ee2f4dfad85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 846817f90ab2323852e96981c34f24bcdf13c916169b61ebfc2d9b61cc4a54f9
MD5 c9ed60e4dce415d3dd228191f7355427
BLAKE2b-256 ca4d7dcde9b8d99386fbeb248d13aa8d5028d9ad4b165e44f67fe0240b15cb0f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 2a269454a50654564075b7cf676147214ca6b8e0f92776eb70d0fe05a4732164
MD5 33918d636ee205b7766941926fb16b73
BLAKE2b-256 705a0d48011cd8c343259fc3714034b449c3549825b320cc0af79c977421072a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5cc079c1b077bf9a8dd9207e85dce249ecbd432f84ca0b6015528848ad71a84e
MD5 ad2092c97df215052c15896bcf869227
BLAKE2b-256 5a821e1cb86b3e9ea0e594ac9b9661da920e5d4a3e9163873b2ebc3515762f59

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minihost-0.1.4-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.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 10ed255573698ac1e7daf98d4c0d0676212ea0ef13459a16f1f3a4dbdf0d2161
MD5 837693acad496d0660e3140b65c2195c
BLAKE2b-256 c530d28875c896adb3a8a8f098fdabc166c24b257e7b4da2b4024c6c6c2571d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9759051407117ec934aae3165114d8165ae9ec37e59c0357effcbf308dad102f
MD5 21b9bda832d1ad94bb4833e447b740ec
BLAKE2b-256 5f01a75b6814a49b2733697a2ad2b6d4514e582ea37e879f6af05135903710b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 951b842b9826592fac4e7eaaa872d2c3421f237f190ab04f27b6724f4f87fee7
MD5 4b3fe1c497fdfc9bfb0e5064cb27e567
BLAKE2b-256 e7f959ca8c1b6b15f17f7537988dddcccd899ff3ad4669e4a28e7cb8493b8e58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 538ba045c7507148e23add64ee52068c6690fe129297f8f2f6a282fb5904a403
MD5 a9e5a9d4583c2daaa51705262f5d3431
BLAKE2b-256 449cd6fd6510989613914c34c6ac4f8a2086f49f53ae3d120caf23fa2bc5cd84

See more details on using hashes here.

File details

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

File metadata

  • Download URL: minihost-0.1.4-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.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9a2ce1fe0d2e7a90cbf568cd102b7c81f963d27a6b4ff7e6362d98b35d06371e
MD5 cc1db34c4423b1cd936609c4ff23ec56
BLAKE2b-256 5b2016843a7f242757a0b4bfb42b74e8d70d5afe1a12150895c7087d7737c66b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 53142be86639fb7225c4bf52e69e32fbd620d9dd9249a833f1b0c55dbfdbe63d
MD5 30fa2c91dc187bddd83da555136aeb05
BLAKE2b-256 00de3bd6ebc08f6a23ed0e8daa0016ce17f9c5584db6ca814b169a9542510505

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 112faa3208c21674b30ba541d427a3969c7d7a4446b9edafa9f07a0f27964edd
MD5 ba56fdc6d166744ec39c9c7d751417b0
BLAKE2b-256 39f4cc969a2c7a5907e494bb4def5402f34fd9acf257f334e2e20e8749295793

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for minihost-0.1.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 10288242611b7c8e1c2392e648be7557e4e5126dcc5108c1f35c5acddc42a963
MD5 89f5bb04bf00190a7737176ce80ccb55
BLAKE2b-256 60871905f2ef1ec9a4110747b7048ce4777509b6ca4cde1620b33cbbd67487e9

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