Scalable performance

for

any workload.

production agents.

streaming data.

e-commerce.

full-stack apps.

APIs.

any workload.

Harper replaces the stack of point solutions behind most apps. Database, cache, application logic, and messaging run in one unified, opinionated runtime that keeps data in the same process as code. Higher throughput, lower latency, lower cost: data access in about a millisecond and up to 85% fewer LLM and origin calls at scale.
Illustration of Harper unified runtime showing layered architecture with glowing blocks for GraphQL, API, REST, WebSocket, and MQTT atop cache and in-memory services, supported by blob, database, NoSQL, and vector storage, connected to distributed global fabric, with floating code and agent cubes representing programmable intelligence in a vibrant dimensional design
~1ms
DATA RETRIEVAL
30-70%
FASTER PAGE LOADS
Up to 85%
LLM CALL REDUCTION
1
PROCESS
TRUSTED BY

One Runtime.
Any Workload.

Faster Agents that Are Easy to Build

Harper agent runtime architecture showing a unified Harper platform connected to an LLM, business systems, and a user. Internal components include agent loop, user profile, agent rules, memory vector, embedding generation, tool interface, voice websocket, and context cache.
30-85%
LLM CALL REDUCTION
Read the Technical Report
Green Arrow
Built-In Agent Memory
Memory, embeddings, tool interfaces, and context cache run in the same Harper runtime, so agents can retrieve state without stitching together a separate vector DB, cache, and app server.
Context Without Extra Hops
Semantic search, cache hits, and user state resolve locally in the runtime, reducing latency before the LLM is called.
Fewer Secrets to Expose
Agents can run against runtime-managed data and services, reducing the number of external credentials, APIs, and integration points in production.

Streaming with State Built-in

Harper streaming architecture showing data producers and consumers connected through a Harper platform. Internal components include message broker, stream processing, routing and filtering, REST, MQTT, server-sent events, WebSocket, state tables, and event store.
Streams and State Together
MQTT, WebSocket, and SSE run alongside the data layer, so apps can subscribe to record changes without wiring in Kafka, Redis, or a separate pub/sub tier.
Writes Replicate Globally
Geo-distributed replication keeps state close to subscribers, so updates can reach users across regions without a separate sync layer.
Fresh State, Fewer Moving Parts
Pub/sub, state, and application logic run in one runtime, reducing polling, cache invalidation, and external queue coordination.

Performance that Pays for Itself

Harper commerce architecture showing commerce systems, a payment gateway, and a customer connected to a Harper-powered storefront. Internal components include storefront server-side rendering, recommendation engine, GraphQL, REST, cart and session state, inventory, and catalog.
47×
ROI
Product Pages in ~600ms
Pre-rendered product pages with live data can load in ~600ms for 95% of users, reducing origin dependency during peak demand.
Live Inventory at the Edge
Stock, price, and availability updates can be served close to the shopper, so customers see current product data without waiting on origin systems.
Scale for Peak, Shrink After
Add regions for seasonal demand, then reduce footprint when traffic normalizes, without re-architecting the commerce stack.

Build the App, Not the Plumbing

Harper application architecture showing third-party APIs and a client connected to Harper. Internal components include frontend app logic, REST and GraphQL APIs, WebSocket and server-sent events, authentication, vector search, session cache, blob storage, and app data.
Up to 30×
FASTER TIME TO PRODUCTION
Skip the Glue Code
Define schema, resources, and config, and REST, real-time, cache, vector search, and blob storage all come from the same runtime. There is no integration code to write and no services to wire together.
Ship App and Data Together
App logic, data, APIs, and real-time features deploy as one unit, instead of a frontend, a database, and a cache you push and version separately.
Run One System, Not Six
One system to monitor, one place to debug, one set of logs. Fewer services means fewer failure points, and the operational surface shrinks as traffic grows instead of multiplying.

Schema-Driven APIs, Built In

Harper API architecture showing third-party APIs and a client developer connected to a Harper platform. The platform includes REST, GraphQL, data transformation, database, in-memory cache, auth cache, and rate limiting.
~1ms
DATA RETRIEVAL
Schema is the API
Define a table and get REST and GraphQL endpoints automatically, with filtering, sorting, joins, and pagination available from the API layer.
Down to 1ms  Server Latency
Harper serves API requests without bouncing between separate app servers, caches, and databases, keeping response times in the single-digit millisecond range.
One Deploy, Every Region
Deploy once to Harper Fabric and run the same API across regions with replication, routing, and failover handled by the platform.

One Deploy.
Everywhere at Once.

The same runtime that's on your laptop runs in every region. No edge build, no replication service to maintain, no multi-region rewrite. Push once, and your backend is live everywhere you want it.
Explore Harper Fabric
Green Arrow
Automatic Failover
Geo-distributed replication is a property of the runtime, not a parallel infrastructure project. Workloads stay up across regional failures, and users get fast responses wherever they are without a separate replication tier or sync service.
Deployment Flexibility
The same code runs in managed cloud, at the edge, on  infrastructure, and in regulated on-prem environments. Where workloads run becomes a business decision — driven by compliance, latency, or customer needs, not by what your platform supports.
Cost Efficient at Scale
Fewer vendor contracts, fewer services to operate, fewer integrations to maintain. Cost-per-interaction drops as volume rises instead of climbing with it — because one system absorbs the load instead of six each charging for it.
DataApp

Real-Time Application Data Fabric

Harper creates a real-time fabric of data, logic, cache, memory, embeddings, and events distributed wherever your application needs to run.
Lower Global Latency
Higher Throughput
Always-Fresh Data

One Surface to Build On

Harper gives developers and AI tools a single, opinionated runtime to reason about. Teams bring their next backend service to market faster, at lower cost, and with higher performance.
Opinionated by Default
Faster Time to Production
Operational Simplicity
Smaller Security Surface

Learn To Build

Build full-stack applications that outperform their multi-system alternatives.

The schema is the server.

Define your catalog in GraphQL. Harper instantly exposes a full REST and GraphQL API, no controllers, no routes, no ORM. Change the schema, and every endpoint changes with it.
Documentation
# schema.graphql

type Product @table @export {
  sku:         ID       @primaryKey   # natural key, e.g. "JKT-001"
  name:        String
  description: String
  price:       Float
  listPrice:   Float                  # original price, for sale badges
  stock:       Int
  status:      String                 # active | discontinued
  embedding:   [Float]  @embed(source: "description", model: "default")   # auto-computed + HNSW-indexed on write
  image:       Blob
  category:    Category @relationship(from: categoryId)
  categoryId:  ID       @indexed
}

type Category @table @export {
  id:   ID     @primaryKey
  name: String @indexed
  slug: String @indexed
}

// You immediately get:
GET     /Product/{sku}
POST    /Product/
PUT     /Product/{sku}
PATCH   /Product/{sku}
DELETE  /Product/{sku}
GET     /Product/?category.slug=outerwear&sort(-price)

GET     /Category/{id}
POST    /Category/
...

// No migrations. No REST framework. No code generation step.

Query Your Way: URL, fetch, or GraphQL.

Filter, sort, join, and paginate from a URL, a fetch call, or the native GraphQL endpoint, all against the same data, no adapter needed.
Documentation
// 1. Add data, as much as you want.

POST /Category/
Content-Type: application/json
{
  "name": "Outerwear",
  "slug": "outerwear"
}

POST /Product/
Content-Type: application/json
{
  "sku": "JKT-001",
  "name": "All-Weather Shell Jacket",
  "description": "Waterproof, packable, seam-sealed",
  "price": 149.00,
  "listPrice": 199.00,
  "stock": 42,
  "status": "active",
  "categoryId": "<copy id from POST /Category/>"
}

// 2. Filter, sort, and traverse relationships in the address bar.

// In-stock products under $150, priced high to low
GET /Product/?price=lt=150&stock=gt=0&sort(-price)&limit(20)

// Category is Outerwear OR Footwear
GET /Product/?(category.slug=outerwear|category.slug=footwear)

// Join through the category relationship
GET /Product/?category.slug=outerwear&select(name,price,category{name,slug})

// fetch, same filters, works anywhere JS runs
const res = await fetch(
  '/Product/?status=active&stock=gt=0&select(sku,name,price)',
);
const products = await res.json();

// GraphQL, enable with one line in config.yaml, query /graphql
{
  Product(status: "active") {
    sku
    name
    price
    category {
      name
      slug
    }
  }
}

Custom behavior, zero new services.

Extend any table with a JavaScript class. Computed fields, validation, side effects, all running in-process next to your data. No microservice, no extra network hop.
Documentation
// resources.js
import { tables } from 'harper';
const { Product } = tables;

export class StorefrontProduct extends Product {
  // Enrich every GET with computed merchandising fields
  static async get(target) {
    const product = await super.get(target);
    return {
      ...product,
      onSale:     product.price < product.listPrice,
      savingsPct: product.listPrice > product.price
        ? Math.round((1 - product.price / product.listPrice) * 100)
        : 0,
      availability: product.stock > 10 ? 'in_stock'
                  : product.stock > 0  ? 'low_stock'
                  :                      'out_of_stock',
    };
  }

  // Validate and set defaults on every POST.
  // Set statusCode on the error to return a 400.
  static async post(target, data) {
    if (!data.name) {
      const error = new Error('Product name is required');
      error.statusCode = 400;
      throw error;
    }
    if (data.price == null) {
      const error = new Error('Product price is required');
      error.statusCode = 400;
      throw error;
    }
    data.status = data.status ?? 'active';
    data.stock  = data.stock  ?? 0;
    return super.post(target, data);
  }
}

// Three files. That's still the whole backend.

Kill your Redis. Keep your speed.

Point a Harper resource at your pricing or inventory service. Harper fetches, caches, and serves it, with configurable TTL and automatic stampede protection. No Redis, no middleware.
Documentation
// in # schema.graphql, live prices cached for 60 seconds
type LivePrice @table(expiration: 60) @export {
  id:    ID    @primaryKey   # sku
  price: Float
  stock: Int
}

// in resources.js, source it from your pricing or ERP service
import { tables, Resource } from 'harper';

// The cache source: a Resource subclass; get() reads the record id.
class PricingService extends Resource {
  async get() {
    const res = await fetch(`https://pricing.internal/v2/sku/${this.getId()}`);
    return res.json();   // { price, stock }
  }
};

tables.LivePrice.sourcedFrom(PricingService);

// Cache miss: one call to the pricing service, result cached for 60s
GET /LivePrice/JKT-001

// Cache hit: served from memory in <1ms. Stampede protection means a
// thousand concurrent requests trigger one upstream fetch, not a thousand.
GET -H 'If-None-Match: "<ETag>"' /LivePrice/JKT-001

Pub/sub is a table feature, not a separate bill.

Subscribe to any product over Server-Sent Events, WebSocket, or MQTT, built in, no extra broker. When price or stock changes, every shopper sees it instantly.
Documentation
// 3 ways to push live inventory and price changes.

// OPTION 1 | Server-Sent Events (SSE), no library needed
const events = new EventSource('/Product/JKT-001');

events.onmessage = (e) => {
  const product = JSON.parse(e.data).value;
  updatePriceTag(product.price, product.stock);
  // "2 left" badges and price drops update live, no polling
};

// OPTION 2 | WebSocket with custom actions via resources.js
import { tables } from 'harper';

// Extend the Product table: connecting to /LiveProduct/{sku}
// subscribes to that product's changes.
export class LiveProduct extends tables.Product {
  async *connect(incomingMessages) {
    for await (const msg of incomingMessages) {
      if (msg.action === 'watch') yield { watching: msg.sku };
    }
  }
}

// OPTION 3 | config.yaml, enable MQTT for warehouse and POS stock feeds
mqtt:
  network:
    port: 1883
  webSocket: true
  requireAuthentication: true

Semantic search without a second database.

Harper embeds your products on write and the shopper's query at search time with the same configured model, HNSW-indexes them, and serves similarity search from the same API. No external embedding service, no separate vector database.
Documentation
// Declared in schema.graphql (Tab 1: Schema):
// embedding: [Float] @embed(source: "description", model: "default")
// Harper computes the vector and updates the HNSW index on every write.

// The "default" model is configured once in harper-config.yaml, and is used by
// both @embed (write) and models.embed (query) — swapping providers is config,
// not code:
//
//   models:
//     embedding:
//       default:
//         backend: ollama
//         model: nomic-embed-text:latest

// Store a product — send text only, no embedding step in your app
await fetch('/Product/', {
  method: 'POST',
  body: JSON.stringify({
    sku:         'JKT-002',
    name:        'Packable Down Puffer',
    description: 'Lightweight insulated jacket for cold, dry weather',
    price:       129.00,
    listPrice:   129.00,
    stock:       18,
    status:      'active',
  }),
});

// Open-text search: embed the shopper's query with the same model, then rank.
import { models, tables } from 'harper';

// models.embed uses the configured "default" model — no external service.
const [queryVector] = await models.embed('warm coat for winter', {
  inputType: 'query',
});

const results = tables.Product.search({
  select: ['sku', 'name', 'price', '$distance'],
  sort: { attribute: 'embedding', target: queryVector },
  limit: 5,
});
// Ranked by cosine similarity, not keyword match. "warm coat" finds the puffer.

No S3. No CDN. Just a field.

The image field in your schema is a native Blob. Upload and serve product photos from the same endpoint as your data, no S3 bucket, no file service.
Documentation
// Already declared in schema.graphql (Tab 1: Schema):
// image: Blob

// Upload a product image
PUT /Product/JKT-001/image
Content-Type: image/jpeg
< ./shell-jacket.jpg

// Retrieve, streams back with the correct Content-Type
GET /Product/JKT-001.image

// Upload straight from a browser file input
const file = fileInput.files[0];
// the File's type sets the Content-Type automatically

await fetch('/Product/JKT-001/image', {
  method: 'PUT',
  body: file,
});

Deploy your backend like you push your code.

Deploy the entire catalog, database, API, cache, logic, real-time, and vector search, to Harper Fabric's distributed network with a single command. No containers, no Kubernetes, no cloud console.
Documentation
# Develop locally
harper dev .

# Log in once to store an auth token for later commands
harper login "https://your-store.fabric.harper.fast/"

# Deploy your local project to Fabric (push-based)
cd catalog
harper deploy . \
  project=catalog \
  target="https://your-store.fabric.harper.fast/" \
  restart=rolling \
  replicated=true

# Or deploy straight from GitHub (pull-based)
harper deploy \
  project=catalog \
  package="https://github.com/your-org/catalog" \
  target="https://your-store.fabric.harper.fast/" \
  restart=rolling \
  replicated=true

# For CI/CD, authenticate with env vars:
#   export HARPER_CLI_USERNAME=your-cluster-username
#   export HARPER_CLI_PASSWORD=your-cluster-password

# Same API. Same schema. Same logic. Now in every region.
GET https://your-store.fabric.harper.fast/Product/?category.slug=outerwear&stock=gt=0

# No Dockerfile. No cloud console wizards.
# All your files, one command, globally distributed.

Explore Open Source Applications

Jumpstart your next build with open source projects.

Get Started

// AGENTIC ENGINEERING

Build secure, build fast.

Most enterprises cannot hand AI agents the keys to their cloud, database, and caching layer. Harper removes the need at the architecture level. A unified runtime gives agents full-stack control through declarative files, with zero credential exposure or access to production data.

Build with AI  

UP TO 30× FASTER
One command scaffolds the unified runtime with skills files that teach any coding agent how to build on Harper.
✓ schema.graphql
Data model + REST API
✓ resources.js
Business logic
✓ config.yaml
Runtime + deploy config
✓ /skills/*.md
Agent onboarding docs