The simplest local-first feature store for Python.

Define features once. Train models without data leakage. Serve features in milliseconds. No Kubernetes. No Redis. No Cloud. Just Python.

View Repository
$pip install boxlink
100K+ weeklydownloads
10K+
active devs
50K+projects
1M+ dailyfeatures served

Why BoxLink for Feature Engineering

Traditional feature engineering fails during model deployment. BoxLink bridges the gap.

The BoxLink Way
Define OnceDuckDB JoinsPoint-in-TimeZero LeakageFast ServingLocal SQLiteNo DriftVersioned FeaturesLineage Tracked
Without BoxLink
Duplicated CodeData LeakageRedis SetupKubernetes OpsTrain-Serve SkewManual JoinsSpaghetti PipelinesHard To SwapOffline Drift

Performance Benchmark

How BoxLink stack measures up against cloud-heavy traditional feature store infrastructure.

BoxLink (Local-first)

Local SQLite/DuckDB retrieval times

Show Optimized Indexes
0.8 ms
Online Retrieval
4.2 ms
Point-in-Time Join
0.3 ms
SDK Overhead
Local
75%
Cloud
25%

Traditional Store (Feast)

Cloud infrastructure retrieval latency

Size: Small
Industry: Tech
18.5 ms
Redis + WAN Network
112 ms
Spark Offline Join
5.4 ms
gRPC Connection

Architecture

DuckDB powers point-in-time offline historical joins, and SQLite delivers sub-millisecond serving online.

Offline DataLocal Parquet FilesBoxLink ClientDuckDB (Offline)SQLite (Online)ML ApplicationTraining & Inference

BoxLink vs. Feast

A comparison of features, infrastructure requirements, and local development velocity.

CapabilityBoxLinkFeast
Local-first / Zero-infrastructureYesComplex
Kubernetes RequiredNoOften
Redis RequiredNoUsually
DuckDB (Offline Joins)YesNo
SQLite (Online Serving)YesNo
Point-in-Time JoinsYesYes
Feature VersioningYesYes
Zero SetupYesNo

2-Minute Quick Example

Register features, perform historical temporal joins, and materialize to SQLite for sub-millisecond serving.

from boxlink import Entity, Feature, FeatureView, BoxLinkClient

client = BoxLinkClient()

# Identify entity
customer = Entity(name="customer_id", value_type="INT64")
client.register_entity(customer)

# Define feature view mapping to local Parquet file
fv = FeatureView(
    name="customer_stats",
    entities=[customer],
    features=[
        Feature(name="balance", dtype="double"),
        Feature(name="active_days", dtype="int64")
    ],
    source_path="customer_data.parquet",
    timestamp_field="timestamp"
)
client.register_feature_view(fv)

Latest From The Blog

Deep dives into local-first feature engineering, real-time machine learning, and data pipelines.

EngineeringJuly 15, 2026 • 6 min read

Building Local-First ML Pipelines with DuckDB & SQLite

How to utilize embedded databases to solve offline feature generation and online serving without standing up heavy network infrastructure.

Read Article
ConceptsJune 28, 2026 • 8 min read

Understanding Point-in-Time Joins and Data Leakage

A detailed breakdown of temporal joins, why traditional joins cause target leakage, and how BoxLink automates AS-OF joins.

Read Article
ProductionJune 12, 2026 • 5 min read

From Laptop to Production: Deploying BoxLink in Serverless

Learn how BoxLink's zero-dependency design makes it the perfect fit for AWS Lambda, Google Cloud Run, and edge runtimes.

Read Article