A minimal juce-based plugin host using nanobind
Project description
minihost
A minimal audio plugin host library for loading and processing VST3 and AudioUnit plugins. Provides a simple C API suitable for embedding in audio applications, and also Python bindings.
Features
- Load VST3 plugins (macOS, Windows, Linux)
- Load AudioUnit plugins (macOS only)
- Plugin chaining - connect multiple plugins in series (synth -> reverb -> limiter)
- 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)
- Process audio with sample-accurate parameter automation
- MIDI input/output support
- Transport info for tempo-synced plugins
- State save/restore for presets
- Thread-safe parameter access
- 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
# Clone the repository
git clone https://github.com/user/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
JUCE Setup
JUCE is downloaded automatically by make or ./scripts/download_juce.sh. To use a different version or existing installation:
# Download specific version
JUCE_VERSION=8.0.6 ./scripts/download_juce.sh
# Or point to existing JUCE
cmake -B build -DJUCE_PATH=/path/to/your/JUCE
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);
// 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);
Python Bindings
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"
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)
# 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")
Command Line Interface
The minihost command provides a CLI for common plugin operations:
# Install (from source)
uv sync
# Available commands
minihost --help
Commands
minihost probe - Get plugin metadata
minihost probe /path/to/plugin.vst3
minihost probe /path/to/plugin.vst3 --json
minihost scan - Scan directory for plugins
minihost scan /Library/Audio/Plug-Ins/VST3/
minihost scan ~/Music/Plugins --json
minihost info - Show detailed plugin info
minihost info /path/to/plugin.vst3
Shows runtime information including sample rate, channels, latency, buses, and factory presets.
minihost params - List plugin parameters
minihost params /path/to/plugin.vst3
minihost params /path/to/plugin.vst3 --json
minihost midi-ports - List available MIDI ports
minihost midi-ports
minihost midi-ports --json
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 render - Render MIDI file through plugin
# Basic render to WAV
minihost render /path/to/synth.vst3 song.mid output.wav
# With preset and tail length
minihost render /path/to/synth.vst3 song.mid output.wav --preset 5 --tail 3.0
# With custom bit depth
minihost render /path/to/synth.vst3 song.mid output.wav --bit-depth 16
# Load plugin state
minihost render /path/to/synth.vst3 song.mid output.wav --state preset.fxp
minihost process - Process audio file offline
# Process raw float32 audio through effect
minihost process /path/to/effect.vst3 input.raw output.raw
# Use double precision
minihost process /path/to/effect.vst3 input.raw output.raw --double
Global Options
| Option | Description |
|---|---|
-r, --sample-rate |
Sample rate in Hz (default: 48000) |
-b, --block-size |
Block size in samples (default: 512) |
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_closewhile another thread is using the plugin
API Reference
Plugin Functions
| Function | Description |
|---|---|
mh_open |
Load a plugin |
mh_close |
Unload a plugin |
mh_get_info |
Get plugin info (channels, params, latency) |
mh_process |
Process audio |
mh_process_midi |
Process audio with MIDI input |
mh_process_midi_io |
Process audio with MIDI input/output |
mh_process_auto |
Process with sample-accurate automation |
mh_get_num_params |
Get parameter count |
mh_get_param |
Get parameter value (0-1) |
mh_set_param |
Set parameter value (0-1) |
mh_get_param_info |
Get parameter metadata |
mh_get_state_size |
Get state size for save |
mh_get_state |
Save plugin state |
mh_set_state |
Restore plugin state |
mh_set_transport |
Set transport info (tempo, position) |
mh_get_tail_seconds |
Get reverb/delay tail length |
mh_get_bypass |
Get bypass state |
mh_set_bypass |
Set bypass state |
mh_get_latency_samples |
Get plugin latency |
Audio Device Functions (minihost_audio.h)
| Function | Description |
|---|---|
mh_audio_open |
Open audio device for real-time playback |
mh_audio_close |
Close audio device |
mh_audio_start |
Start audio playback |
mh_audio_stop |
Stop audio playback |
mh_audio_is_playing |
Check if audio is playing |
mh_audio_set_input_callback |
Set input callback for effects |
mh_audio_get_sample_rate |
Get actual sample rate |
mh_audio_get_buffer_frames |
Get actual buffer size |
mh_audio_get_channels |
Get number of output channels |
mh_audio_connect_midi_input |
Connect MIDI input port to device |
mh_audio_connect_midi_output |
Connect MIDI output port to device |
mh_audio_disconnect_midi_input |
Disconnect MIDI input |
mh_audio_disconnect_midi_output |
Disconnect MIDI output |
mh_audio_get_midi_input_port |
Get connected MIDI input port index |
mh_audio_get_midi_output_port |
Get connected MIDI output port index |
mh_audio_create_virtual_midi_input |
Create virtual MIDI input port |
mh_audio_create_virtual_midi_output |
Create virtual MIDI output port |
mh_audio_is_midi_input_virtual |
Check if MIDI input is virtual |
mh_audio_is_midi_output_virtual |
Check if MIDI output is virtual |
mh_audio_send_midi |
Send MIDI event programmatically |
mh_audio_open_chain |
Open audio device for chain playback |
Plugin Chain Functions (minihost_chain.h)
| Function | Description |
|---|---|
mh_chain_create |
Create chain from array of plugins |
mh_chain_close |
Close chain (does not close plugins) |
mh_chain_process |
Process audio through chain |
mh_chain_process_midi_io |
Process with MIDI (to first plugin) |
mh_chain_get_latency_samples |
Get total chain latency |
mh_chain_get_num_plugins |
Get number of plugins in chain |
mh_chain_get_plugin |
Get plugin by index |
mh_chain_get_num_input_channels |
Get input channels (first plugin) |
mh_chain_get_num_output_channels |
Get output channels (last plugin) |
mh_chain_get_sample_rate |
Get sample rate |
mh_chain_get_max_block_size |
Get maximum block size |
mh_chain_reset |
Reset all plugins in chain |
mh_chain_set_non_realtime |
Set non-realtime mode for all plugins |
mh_chain_get_tail_seconds |
Get max tail length |
MIDI Functions (minihost_midi.h)
| Function | Description |
|---|---|
mh_midi_enumerate_inputs |
Enumerate MIDI input ports via callback |
mh_midi_enumerate_outputs |
Enumerate MIDI output ports via callback |
mh_midi_get_num_inputs |
Get number of MIDI input ports |
mh_midi_get_num_outputs |
Get number of MIDI output ports |
mh_midi_get_input_name |
Get MIDI input port name by index |
mh_midi_get_output_name |
Get MIDI output port name by index |
mh_midi_in_open_virtual |
Create virtual MIDI input port |
mh_midi_out_open_virtual |
Create virtual MIDI output port |
MidiFile Class (Python)
| Method/Property | Description |
|---|---|
MidiFile() |
Create new MIDI file |
load(path) |
Load MIDI file from path |
save(path) |
Save MIDI file to path |
num_tracks |
Number of tracks (read-only) |
ticks_per_quarter |
Ticks per quarter note (resolution) |
duration_seconds |
Total duration in seconds |
add_track() |
Add a new track |
add_tempo(track, tick, bpm) |
Add tempo event |
add_note_on(track, tick, channel, pitch, velocity) |
Add note on event |
add_note_off(track, tick, channel, pitch, velocity) |
Add note off event |
add_control_change(track, tick, channel, controller, value) |
Add CC event |
add_program_change(track, tick, channel, program) |
Add program change |
add_pitch_bend(track, tick, channel, value) |
Add pitch bend event |
get_events(track) |
Get all events from track as list of dicts |
join_tracks() |
Merge all tracks into track 0 |
split_tracks() |
Split by channel into separate tracks |
MIDI Rendering (Python)
| Function/Class | Description |
|---|---|
render_midi(plugin, midi_file, ...) |
Render MIDI to numpy array |
render_midi_stream(plugin, midi_file, ...) |
Generator yielding audio blocks |
render_midi_to_file(plugin, midi_file, output_path, ...) |
Render MIDI to WAV file |
MidiRenderer(plugin, midi_file, ...) |
Stateful renderer for fine-grained control |
MidiRenderer properties:
| Property | Description |
|---|---|
duration_seconds |
Total duration including tail |
midi_duration_seconds |
MIDI content duration (no tail) |
total_samples |
Total samples to render |
current_sample |
Current position |
current_time |
Current time in seconds |
progress |
Progress as fraction (0.0-1.0) |
is_finished |
True when rendering complete |
MidiRenderer methods:
| Method | Description |
|---|---|
render_block() |
Render next block, returns numpy array |
render_all() |
Render all remaining audio |
reset() |
Reset to beginning |
PluginChain Class (Python)
| Method/Property | Description |
|---|---|
PluginChain(plugins) |
Create chain from list of plugins |
process(input, output) |
Process audio through chain |
process_midi(input, output, midi_events) |
Process with MIDI (to first plugin) |
reset() |
Reset all plugins in chain |
set_non_realtime(enabled) |
Set non-realtime mode for all plugins |
get_plugin(index) |
Get plugin by index |
num_plugins |
Number of plugins (read-only) |
latency_samples |
Total latency in samples (read-only) |
num_input_channels |
Input channel count (read-only) |
num_output_channels |
Output channel count (read-only) |
sample_rate |
Sample rate (read-only) |
tail_seconds |
Max tail length in seconds (read-only) |
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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file minihost-0.1.0.tar.gz.
File metadata
- Download URL: minihost-0.1.0.tar.gz
- Upload date:
- Size: 796.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba120bcc283b56ececacaaeeab8fdfed486ea76bbbabb66ffaa7f6c3e5010772
|
|
| MD5 |
ffc14b93dc0c1f86fb59cb5373b0dfb3
|
|
| BLAKE2b-256 |
b9b72bcd8ee3f02f47659f5e3b8b35eda624ef2a695fabf55c6b36ed54134435
|
File details
Details for the file minihost-0.1.0-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: minihost-0.1.0-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 14.2 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebe8bc1b3adbe2ed78f2c873a2d9e9dc6da0bccc7d03259298f22a6e3d6f6bd8
|
|
| MD5 |
568427759515ad9cef93daa6d4f31d85
|
|
| BLAKE2b-256 |
f3205bb3b15aaa3c397baaba1b8eb692355c9c3dae1c0edacece645010e16dbd
|
File details
Details for the file minihost-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 31.0 MB
- Tags: CPython 3.14, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03bc895d3b89316a38998ed7878dab127301e781c04a65d22bb978600c1e69d5
|
|
| MD5 |
bb51810df0b79fda2219cbce13a07c71
|
|
| BLAKE2b-256 |
e6dfa0281b9c3c23f866465c6c070b43e42dddddef6f72cf0ff6c24c1ed95413
|
File details
Details for the file minihost-0.1.0-cp314-cp314-macosx_11_0_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp314-cp314-macosx_11_0_x86_64.whl
- Upload date:
- Size: 18.7 MB
- Tags: CPython 3.14, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f192b1ef93cb19ad1ffba7c85c6c75e76dfc6eabeb73326892dfc9ff49c07188
|
|
| MD5 |
c8776e28985c5a7a122166958a9356a2
|
|
| BLAKE2b-256 |
aec19b4e953ab859e07a877018d5f86582e329ea4360c8c8a1d00385757a952a
|
File details
Details for the file minihost-0.1.0-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: minihost-0.1.0-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 18.3 MB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a38dccc19dbd56d9a7333bb507257d6b93baa7dac4a647e0823c688d073d493
|
|
| MD5 |
0847c07db40e46b3ad8898ff62e7fd86
|
|
| BLAKE2b-256 |
8d224b319ef2962a167393266a259ac336d2412a2b4f76af2597757864d5c4ee
|
File details
Details for the file minihost-0.1.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: minihost-0.1.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 13.9 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f62c7323e4182e46f01e9b0d8d1db5558ce03090dd2d5e4c6b90ca119ae4131
|
|
| MD5 |
f1d49c37a3f1fca8f18bc36734fdd5c3
|
|
| BLAKE2b-256 |
e2932fd4c046d927b2b660db0262a9239435f0a54f73713dab4a8fcbc2ceb258
|
File details
Details for the file minihost-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 31.0 MB
- Tags: CPython 3.13, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0a7ed02e97c9f1e62f7edc436894ab69101f612cd800f1c490d105343faa9f5
|
|
| MD5 |
dba48b774fd6c96b04f26d7f30d98980
|
|
| BLAKE2b-256 |
f3364e45525d1b577418e292831e859f2fdeff037e670f6c904f5afc6f27381f
|
File details
Details for the file minihost-0.1.0-cp313-cp313-macosx_11_0_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp313-cp313-macosx_11_0_x86_64.whl
- Upload date:
- Size: 18.7 MB
- Tags: CPython 3.13, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f04fa24f0d00e9a55e2dfe4c823c476af23b827c7407499645de155cb6f2ad94
|
|
| MD5 |
ee07ed6e5623240aa17b86656c7125b1
|
|
| BLAKE2b-256 |
51ec806b0d366f8fc7092de7eff6d2a22bb954bc593e95432affe40ddabc0561
|
File details
Details for the file minihost-0.1.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: minihost-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 18.3 MB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20f7859f6fcbed026aa23b9dbdb13fd0e35b1edaca9af175122ca64ed495a7e0
|
|
| MD5 |
b45325c54c00f5064a7e452311d758bb
|
|
| BLAKE2b-256 |
362419b6dbaa7c403912fad651fa3ebb62bad5bdf2228e6cb77dd5f85025be73
|
File details
Details for the file minihost-0.1.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: minihost-0.1.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 13.9 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
168f3dd71c1eb47f003e7f543a64c64a9e0f0bdfdccac60243a2543ddf0fd240
|
|
| MD5 |
01932fdd1ab1bad0068d5b63d0af0b56
|
|
| BLAKE2b-256 |
26060e8c704fe0e0455d3b70523b1465e01ecbc2510885b303cb545683509399
|
File details
Details for the file minihost-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 31.0 MB
- Tags: CPython 3.12, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d442a8210e2e322f8ea1a715a1c157049a725d5d6c659dadce71387f0ae5fefb
|
|
| MD5 |
f9283fa7234b1d33bbb9997d6a2e83b6
|
|
| BLAKE2b-256 |
3e5cf4f0228594d1b750d42b654da9d2c53e6d8e3b8c60bb422c8dc6ca7ded83
|
File details
Details for the file minihost-0.1.0-cp312-cp312-macosx_11_0_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp312-cp312-macosx_11_0_x86_64.whl
- Upload date:
- Size: 18.7 MB
- Tags: CPython 3.12, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f493188f253fa84bb6e041d5cc6cc191db176de81de58670cd79dcbe68119492
|
|
| MD5 |
4510e701f9aa04b3ff80c738e91d689b
|
|
| BLAKE2b-256 |
cc47901f9bebdd76eeda4af710d8f6dd5b54f2b1c2fb59250cd90d21509269ac
|
File details
Details for the file minihost-0.1.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: minihost-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 18.3 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
366d9a83013129fc6976facb1c1f10b45579d9cc443e64cdc3ab482a71de9bd2
|
|
| MD5 |
03df8a97b9d62b9b8459f5f1b804cf16
|
|
| BLAKE2b-256 |
32015c59a2fc85057c552b82c8ca7d9f9001641a3f08b8391c91848132efa243
|
File details
Details for the file minihost-0.1.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: minihost-0.1.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 13.9 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
826e3077415a8b033aed141d89e041c2eea36c536aa7b98a6efd6ed03c750432
|
|
| MD5 |
b7d6c399cea6d316077fa5e0e297a987
|
|
| BLAKE2b-256 |
576cca4e1f42ee2d5d154ca6eaefc78bb603e4799f8b5e2b2afebd2ff81bf167
|
File details
Details for the file minihost-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 31.0 MB
- Tags: CPython 3.11, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d7a8e2a4261b9ab44c08c9d6d6a5abf8728040b39623a7b2f1ca50f93ed445d
|
|
| MD5 |
07b719e81d557accc38515993a490e1b
|
|
| BLAKE2b-256 |
ece12f4aa042ecadfb841604dcaa18caa7dd3b7515422ecd517faaa96df73f12
|
File details
Details for the file minihost-0.1.0-cp311-cp311-macosx_11_0_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp311-cp311-macosx_11_0_x86_64.whl
- Upload date:
- Size: 18.7 MB
- Tags: CPython 3.11, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3a7e270dc76e5914e82d6c82553ac3f37c88b1ee683a99455b0901ab739191f
|
|
| MD5 |
85f47a4999d732b4c4beb85be9d67d43
|
|
| BLAKE2b-256 |
f14be3e335e735c2e43ffac3e9df03cb44ef45c97f9c11779f0da63b1c29beee
|
File details
Details for the file minihost-0.1.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: minihost-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 18.3 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38267574a62c5df875a0f14aa6fb993a7e608640e3fcbf9be7c0b0e5b8a92f5f
|
|
| MD5 |
1cbb26bb43e7b18a1f74ca3f4ef85c92
|
|
| BLAKE2b-256 |
2f93137f20414857fa3e8b6a27a9b23a6528d8751e49e4b85689eefa9db0af42
|
File details
Details for the file minihost-0.1.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: minihost-0.1.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 13.9 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c74eca336fd4fc818b1463ba78194d409e1eadb559b1b315df02fcdc5543856
|
|
| MD5 |
da0796d32f39131ad43ec63eacfaf099
|
|
| BLAKE2b-256 |
662a4b62e7388c0cafd2f9f97dac144d4e1de49cb79cd35f0fc419270371575d
|
File details
Details for the file minihost-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 31.0 MB
- Tags: CPython 3.10, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a4fb92a8c8c87072d37f531d2882cce85b6964f659595db146b54009624a63f
|
|
| MD5 |
1b0437df8173ea301ce16bdb67813594
|
|
| BLAKE2b-256 |
9abda6f38d538400e37632e7522ea13a12732e6f1081e8010d4e7618a3d669d0
|
File details
Details for the file minihost-0.1.0-cp310-cp310-macosx_11_0_x86_64.whl.
File metadata
- Download URL: minihost-0.1.0-cp310-cp310-macosx_11_0_x86_64.whl
- Upload date:
- Size: 18.7 MB
- Tags: CPython 3.10, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7c82c0a2440e9a7ae58b8e345745a09d148478ee19e9e20cb573fc9d762ec49
|
|
| MD5 |
a191e88a84712190d855d751b15e8a80
|
|
| BLAKE2b-256 |
d026d55d0dd0265a357950ab50c41c936972fcc591c2f45a253e6acdfd9b3714
|
File details
Details for the file minihost-0.1.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: minihost-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 18.3 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc0824b327569b4cc49b9f32423061085d133fbf84069ec5812125fe999f3715
|
|
| MD5 |
5ed6ecec5a00ba7d8c750389e1066190
|
|
| BLAKE2b-256 |
cd1f8fe483ebb7289c2114610738e9b5d1f48337b65fbd2d381f13631d67078e
|