×marble
001 — abstractday-zero · cross-modal · p50 < 30 ms

The personalization graph.

Marble turns the first signal into a living knowledge graph — relationships, inferences, predictions — that powers Vivo, Video, Music, and your product.

See how it works
live
fig. 01 · user graph, in motionn=35 · e=42
01cold-start
0 seconds
02latency
p50 < 30 ms
03modalities
any content
04explainable
every score
01
primitives

Three primitives. One layer.

A personalization engine with a small, composable surface. Each primitive is the input to the next.

i

Graph

Every user becomes a structured graph of entities, attributes, and weighted relationships. Not a vector. Not a row in a database.

ii

Inference

Marble surfaces what's implied — the connections your users haven't told you yet, derived from the structure of their preferences.

iii

Prediction

Score any candidate — story, song, video, product — against the live graph in milliseconds. Re-rank, re-route, regenerate.

02
anatomy

In, core, out.

We don't share the algorithm. We share what goes in, what comes out, and the shape of what's between.

01 — insignals
clickplaywatchskipratequerydwellsharesavepurchase

Any interaction, any modality. Marble normalizes the stream into typed events.

02 — marble coregraph + inference
graphentities · relations · weights
inferencepropagation · structural
predictionranking · scoring · gen

A live, per-user knowledge graph that updates with every signal and answers every query in milliseconds.

03 — outsurfaces
score0.0 → 1.0
rankordered list
embedn-dim vector
explaingraph path
nextcandidate id

Plug into your ranker, your video pipeline, your CRM, your generative model.

[i]

Cold-start in seconds, not weeks.

[ii]

One graph spans every modality.

[iii]

Every prediction comes with the path.

[iv]

The user's graph stays the user's graph.

03
integration

An afternoon, not a sprint.

A single endpoint. Send a signal, get a score, read the path. Everything else is just calling the API.

marble.ts·
1import { Marble } from "@timesmarble/marble";
2 
3const marble = new Marble({ apiKey: process.env.MARBLE_KEY });
4 
5// 1. send a signal
6await marble.signal({
7 userId: "u_42",
8 type: "play",
9 entity: {
10 kind: "song",
11 id: "song_abc",
12 attrs: { genre: "post-rock", year: 2014 },
13 },
14});
15 
16// 2. score candidates against the live graph
17const scored = await marble.score({
18 userId: "u_42",
19 candidates: nextUpQueue,
20});
21 
22// 3. read the inference path (explainability)
23const why = await marble.explain({
24 userId: "u_42",
25 candidateId: scored[0].id,
26});
authapi key · per-env
transporthttps / json · grpc
latencyp50 < 30 ms
ingestbatch or stream
sdksts · py · go · curl
hostingcloud · vpc · self
05
for your product

If you have users and content,
you have a personalization problem.

no deck · no salesperson · just the founder