Metadata-Version: 2.4
Name: machinable
Version: 5.0.0
Summary: A modular configuration system for research projects
Project-URL: Homepage, https://machinable.org
Project-URL: Repository, https://github.com/machinable-org/machinable
Project-URL: Documentation, https://machinable.org
Author-email: Frithjof Gressmann <hello@machinable.org>
Maintainer-email: Frithjof Gressmann <hello@machinable.org>
License-Expression: MIT
License-File: LICENSE.txt
Keywords: machine-learning,research
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Requires-Python: >=3.11
Requires-Dist: arrow>=1.4.0
Requires-Dist: cloudpickle>=3
Requires-Dist: dill>=0.4.1
Requires-Dist: flatten-dict<1,>=0.5
Requires-Dist: omegaconf==2.4.0.dev12
Requires-Dist: pydantic<3,>=1
Provides-Extra: all
Requires-Dist: numpy; extra == 'all'
Requires-Dist: pandas; extra == 'all'
Provides-Extra: api
Requires-Dist: aiofiles>=23; extra == 'api'
Requires-Dist: fastapi>=0.115; extra == 'api'
Requires-Dist: httpx>=0.27; extra == 'api'
Requires-Dist: textual>=1.0; extra == 'api'
Requires-Dist: uvicorn[standard]>=0.30; extra == 'api'
Provides-Extra: mcp
Requires-Dist: fastmcp>=2; extra == 'mcp'
Requires-Dist: numpy; extra == 'mcp'
Requires-Dist: pandas; extra == 'mcp'
Requires-Dist: scipy; extra == 'mcp'
Provides-Extra: widgets
Requires-Dist: anywidget>=0.9; extra == 'widgets'
Description-Content-Type: text/markdown

<div align="center">
  <img width="120" src="https://raw.githubusercontent.com/machinable-org/machinable/main/docs/logo/logo.png" alt="machinable">

# machinable

[![Build status](https://github.com/machinable-org/machinable/workflows/build/badge.svg)](https://github.com/machinable-org/machinable/actions?query=workflow%3Abuild)
[![License](https://img.shields.io/github/license/machinable-org/machinable)](https://github.com/machinable-org/machinable/blob/main/LICENSE)

</div>

**machinable** is a content-addressed system for research code. You write an
experiment once; running it, reloading its results, and asking questions of
them are the same gesture. A run's identity is its module and configuration,
so identical runs deduplicate, sweeps are incremental, and results stay
reachable from code with no run names or paths to track.

```python
from machinable import get

get("train", {"lr": 0.1}).launch()   # runs it ...
get("train", {"lr": 0.1}).loss()    # ... or reads it back
```

## Installation

```bash
pip install machinable
```

## Documentation

Visit [machinable.org](https://machinable.org/) to get started.
