Skyulf PRODUCTS
Kayra
v0.9.6 · live now ↗

Stop trusting your pipeline. Verify it.

Draw it. Code it. Ship it. Kayra keeps scikit-learn as the engine and adds what notebooks never gave you: reproducible artifacts, honest validation scores, and a path to production.

Runs in your browser, no signup.
Kayra visual pipeline canvas with connected nodes
built-in pipeline nodes
36
workspaces, EDA to audit log
11
skyulf-core, use it anywhere
Apache‑2.0
on scikit-learn, pandas & Polars
Python 3.12
WHO IT'S FOR

Built for teams who can't afford a wrong score.

Data that can't leave your network

Hospitals, banks and public bodies run Kayra on their own servers. Nothing is uploaded, nothing is billed per prediction.

Notebook users who need to ship

Keep scikit-learn, get leakage checks, versioned runs, a model registry and a REST endpoint, and export back to a notebook any time.

Databricks teams

Start locally, then generate a Databricks bundle with training, scoring, monitoring and serving jobs on Unity Catalog.

ONE ENGINE

Two ways to drive it.

Prefer clicking or typing? Both produce the same kind of pipeline, and the canvas exports to a notebook whenever you want to drop back into code.

Self-hosted workspaceAGPLv3

Kayra Platform

The full application: a node canvas, automated EDA, background training, experiment comparison, a model registry, deployment and monitoring, all running on your own machine or server.

  • Drag, connect and configure 36 node types
  • Training runs in the background while you keep working
  • Export any pipeline to a runnable Jupyter notebook
$ git clone https://github.com/flyingriverhorse/Kayra
$ docker compose up
Standalone Python libraryApache-2.0

skyulf-core

No server, no UI, no lock-in. A pip-installable library that gives your scripts and notebooks one consistent pipeline API over scikit-learn, with the leakage checks and artifacts built in.

  • Works standalone in any notebook or script
  • Accepts pandas or Polars frames directly
  • Permissive license, ship it inside your own product
# Runs as-is: the dataset ships with scikit-learn.
from sklearn.datasets import load_breast_cancer
from skyulf import SkyulfPipeline

df = load_breast_cancer(as_frame=True).frame

# The configuration is a dict, so you can version it, diff it in
# review, or build it in a loop.
pipeline = SkyulfPipeline({
    "preprocessing": [
        {"name": "split",  "transformer": "TrainTestSplitter"},
        {"name": "impute", "transformer": "SimpleImputer"},
        {"name": "scale",  "transformer": "StandardScaler"},
    ],
    "modeling": {"type": "random_forest_classifier"},
})

# Move the imputer above the splitter and it tells you so, by name.
print(pipeline.validate_leakage_safety())   # []

results = pipeline.fit(df, target_column="target")
print(results["modeling"]["splits"]["test"].metrics)
# {'roc_auc': 0.9954, 'f1': 0.9722, 'pr_auc': 0.9972, ...}

pipeline.save("tumour.pkl")  # save fitted preprocessing and model

From a raw file to a monitored model.

Every stage lives in one workspace, so nothing gets lost between a notebook, a spreadsheet of results and whatever is actually running in production.

  1. Upload CSV, Excel, JSON or Parquet, or connect an S3-compatible bucket. Kayra reads it with Polars, profiles the columns and keeps every version you load, so you can always tell which data produced which model.

  2. One click profiles every column: distributions, correlations, outliers, interactions and clusters. Surrogate decision trees and causal discovery show which relationships actually drive your target.

  3. Drag nodes onto the canvas and connect them. Branch a pipeline to try two feature strategies side by side, preview any node's output as a table, and let validation block a run before it wastes your time.

  4. Runs execute as background jobs, so a long training run never freezes the UI. Switch on hyperparameter search (grid, random, halving or Optuna) and watch each trial report as it finishes.

  5. Every run keeps its metrics, curves and confusion matrix. Put runs next to each other, see which change actually helped, and tune decision thresholds rather than accepting whatever 0.5 gives you.

  6. Trained models land in a registry with their versions and artifacts. Promote one to active and it is served behind a REST endpoint you can call from anything, or export it as a standalone API and batch project that runs without Kayra. The full deployment history is kept for audit.

  7. Models decay because the world moves. Kayra compares live data against the training baseline column by column and flags what shifted, plus an error log, a slow-node profiler and an audit trail.

01 / 07

Your model says 88%.
Production says 75%.

Usually nothing is broken. The score was just measured wrong, and nothing in a normal notebook tells you that.

Where these numbers come from: one model, trained twice on the same data. When feature selection peeked at the test rows, the test score said 88% but 5,000 new rows gave 75%. In the correct order, the test score said 72% and the new rows gave 69%, close to the truth. Average of 10 runs. Run the notebook yourself →

The bug that doesn't raise an error

Fill missing values, scale a column, encode a category or pick features before you split into train and test, and those steps quietly learn from the test rows. Your validation score now includes answers it was supposed to be guessing. The code runs fine. The number just isn't real.

Kayra reads the order of your steps before anything trains. In the library you get the step, the splitter and the fix by name. On the canvas the run is stopped before it starts.

Walk through it in the leakage notebook →
⚠ validate_leakage_safety()library
Step 0 ('SimpleImputer') is configured before the train/test split (step 1, 'TrainTestSplitter') and fits its statistics on the full dataset including the test set - move it after the splitter.
⚠ Leakage check blocked this runcanvas
The same check runs on Preview and on Run. By default nothing trains until the step order is safe, and the notice links to the preprocessing guide.

Honest scores by construction

Every node is split into a part that learns and a part that applies. Learning only ever sees training rows, and what it learned is saved as explicit parameters, so scoring new data never refits anything.

Cross-validation that doesn't peek

During cross-validation and tuning, preprocessing is refit on each fold's training rows only. The held-out fold stays unseen, so a tuning score never includes rows the preprocessing already learned from.

Reproducible six months later

Each pipeline gets a fingerprint and an exportable model card. When someone asks which preprocessing produced a prediction, you answer with a record instead of a guess, and hand over a notebook that re-runs it.

Operations, not just training

Most visual ML tools stop at the model. Kayra keeps going: drift reports, an error log that links to the failing node, slow-node profiling and an audit trail of every pipeline change.

LOCAL TO CLUSTER

Start on your laptop. Scale out to Databricks.

The same pipeline ships as a Databricks asset bundle with training, feature tables, scoring and monitoring jobs. Models register to Unity Catalog, and drift, performance loss and serving rollouts are watched on the cluster.

Databricks guides →
$ databricks bundle init skyulf-core/templates/databricks
$ databricks bundle validate --strict -t test
$ databricks bundle deploy -t test
$ databricks bundle run features -t test
$ databricks bundle run train -t test
$ databricks bundle run monitoring -t test

Everything else in the box.

Shipped and documented, not on a roadmap.
OPEN SOURCE, CHECK IT YOURSELF

Claims are cheap. Here is the evidence.

Every line below points to the code, notebook or demo that backs it. Nothing here is a roadmap item.

  1. 01

    Leakage check you can break on purpose

    validate_leakage_safety() reads the step order and names any imputer, scaler or encoder that would learn from test rows. The leakage notebook builds a leaking pipeline and shows the warning, then the fix.

    Open the notebook ↗
  2. 02

    Drift checks per column

    Numeric columns get Kolmogorov-Smirnov, Population Stability Index, Wasserstein distance and KL divergence, each with its own threshold. Categorical columns get PSI and the share of unseen categories. A column whose type changed is flagged on its own.

    Read the drift code ↗
  3. 03

    Data expectations that stop the run

    expect_columns_exist · expect_no_nulls · expect_value_range · expect_unique fail fast with a clear ExpectationError instead of training on bad data.

    Read the checks ↗
  4. 04

    Ten notebooks on real datasets

    skyulf-core runs end to end on house prices, disaster tweets, mall customers, forest cover, Santander, credit-card fraud, Spaceship Titanic and online retail, plus a quickstart and the leakage walkthrough.

    Browse the notebooks ↗
  5. 05

    Five starter templates on the canvas

    Tabular Classification, Tabular Regression, Text Classification, Customer Segmentation and Ensemble Classification open as ready pipelines you can run and then change.

    Try them in the demo ↗
  6. 06

    A Databricks bundle with worked examples

    Ready configs for guided classification, tuning, serverless and time-based setups, plus three example projects: NYC Taxi, a real air-quality dataset and a Lakeflow pipeline.

    See the examples ↗
vs. a plain scikit-learn Pipeline

Same estimators, plus everything around them.

The step-order check, run records, comparison, serving and drift reports you would otherwise write by hand.

vs. managed cloud ML

Your data stays on your machine.

Nothing is uploaded and nothing is billed per prediction; a trained model exports as a standalone project.

vs. drag-and-drop tools

The canvas is not a dead end.

Every pipeline exports to a runnable notebook and runs from the Apache-2.0 library with no UI.

Always shipping.

Live from the GitHub releases feed, every version, newest first.
All releases ↗

Questions, answered.

The questions people actually ask before trying it.
What is Kayra?

Kayra is two things that share one engine: skyulf-core, a Python library that gives you a single pipeline API over scikit-learn, and a self-hosted workspace where you build that same pipeline on a canvas. It covers the parts a notebook leaves to you: ordering steps so the test set stays untouched, versioning every run, comparing experiments, serving a model and watching it drift.

What is the meaning of Skyulf?

Sky is the open space above Earth, where the sun, moon, stars, and clouds live. Ulf means "wolf", with Nordic roots, and the wolf is also a strong symbol in Turkic tradition. Together it fits the project: independent and community-driven.

Do I have to self-host it?

You can try the hosted demo first, with nothing to install. For real work you run it yourself with docker compose up, which takes a few minutes and needs no account, no credit card and no per-prediction bill. Because it runs on your machine or your server, your data never has to leave it, which is what makes it usable in hospitals, banks and anywhere else the data legally cannot go to a third party.

How is this different from cloud MLOps platforms?

Cloud platforms require uploading your data to third-party servers and charge based on usage. Kayra runs on your own hardware or inside your private cloud. No data leaves your network, no usage-based pricing, and no vendor dependencies.

Is this really free?

Yes. skyulf-core, the Python library, is Apache 2.0, so you can use it in anything, including closed-source commercial products. The platform (backend and canvas) is AGPLv3, so improvements to the application itself are shared back.

Can I run a trained model outside Kayra?

Yes. In the Model Registry, Export project downloads a ZIP with the fitted model and its preprocessing, a FastAPI service and a batch command for CSV or Parquet files. It installs from its own pinned requirements and needs no Kayra server or database. Pipelines that depend on other rows, such as lag or rolling-window features, are exported as a notebook instead. See the project export quickstart.

Can I use this in production?

It is perfect for internal tools, research, and experimentation. We are working towards a stable v1.0 for critical production workloads.

How can I contribute?

Contributions are welcome. Start at GitHub. Whether it's code, documentation, bug reports, or feature ideas, every contribution helps.

Do you offer a commercial license?

Building on skyulf-core (Apache 2.0) is free for any use, commercial included. The platform is AGPLv3: running it internally, unmodified, needs nothing from you, but offering a modified version as a public network service means publishing your source, or asking for a commercial exception.

POWERED BY MODERN OPEN SOURCE

Ready to build?

Try the demo in your browser, or install the library and start from your next notebook.