TESSERA Open the app →

Build your first equations

Tessera is a visual manipulator for tensor algebra: expressions are built by fitting blocks together, the way a mosaic is laid. This page walks through four equations, from two blocks clicked into place to one the program simplifies for you, and ends with four more worth building. The first three take about five minutes.

The metaphor is mathematical, not geometric: what you see is the formal structure of a tensor expression — not a manifold, a curve or a field. The geometry of a block is the signature of the tensor, and checking algebraic validity is collision detection: if an expression is not well formed, the blocks do not fit.

The model is T-mosaic, from Giancarlo Bernacchi's Tensors Made Easy. Section marks (§) here and in the program point into that book; they are never translated, because they say where to read, not what to read. Open Tessera in another tab and follow along.

FIRST The block

Two blocks on the canvas: V, with a pin on top labelled with the basis vector e-alpha, and P, with a hole in its bottom edge labelled with the basis covector e-alpha, a circled times sign between them.
A vector Vα and a covector Pβ. Nothing is connected: side by side already means outer product, and the canvas marks it with .

Every tensor is one block, and the block is the whole recipe of it:

Those labels are the point, not decoration. The connectors are the basis: the pin of a vector is the basis vector e⃗α and the hole of a covector is the basis covector α. Body and connectors together are the expansion on that basis — V⃗ = Vα e⃗α — with the components as the ingredients and the basis as what they are ingredients of (§1.4, §1.7).

Which is why the label's variance is the opposite of the connector's: the component Vα goes with e⃗α, and Pα with α. It is not a sign slip; it is the pairing.

A connection is always a pin into a hole: one index up with one index down — a basis vector meeting its dual. That is a contraction, and a contraction is a sum over the repeated index, not a cancellation of symbols. When two blocks fit, the connectors disappear and the bodies merge, multiplying each other (§1.7): the basis is spent in the pairing, and what is left is components. Two pins, or two holes, simply do not go together, and Tessera refuses the fit rather than drawing something false.

Widths are quantised: a block is exactly as many columns wide as it has indexes. The ruler along the top counts those columns, which is why two blocks fitted under a third never overlap.

EQUATION 1 Lowering an index

The metric lowers an index: Vα = gαμ Vμ. Two clicks and one drag.

  1. In the palette on the left, under fundamental, click g. Then, under generic, click V. Both blocks land in the active term — the one inside the violet band.

    The metric g with two holes labelled with basis covectors e-alpha and e-beta, and next to it the vector V with one pin labelled with the basis vector e-gamma.
    gαβ has two holes, α and β — both its indexes are down — and Vγ has one pin, e⃗γ. Tessera picks the name γ on its own: an index that repeated by accident, without being connected, would not be a valid term.
  2. Drag V until its pin meets the right-hand hole of g. As you drag, the target columns light up — green if the core accepts the fit, red if it refuses — and when they are close enough the block snaps into place. When a fit is refused, the panel on the right says why, with the reference to the book.

    The vector V fitted under the metric g: its pin is inside the right-hand hole, both labels gone, and the bodies now read g sub alpha gamma and V super gamma.
    The pin is in, and the two labels are gone with it — γ met e⃗γ and the pair was spent. What is left is in the bodies: γ appears twice, once up and once down, so it is a dummy index standing for a sum over γ = 1…n. Only α is still free, so the assembly is a covector — the index has been lowered.

The panel on the right reads the assembly back to you the whole time: valence, rank, which indexes are free and which are dummy, and what can be done next.

EQUATION 2 Writing it instead of building it

Under by text, type the expression and press Build:

V_{\alpha} = g_{\alpha\mu} V^{\mu}
The whole equation on the canvas: the covector V on the left side, an equals sign, and on the right the metric g with the vector V fitted underneath.
The same expression as before, now a whole equation. The arrangement is automatic: left side, =, right side, all on one line, in the order you read it.

Two things are worth noticing.

Create block adds a single block to the active term; Build reads the whole expression and replaces the line. Both accept LaTeX or the glyph directly — g_{\mu\nu} and g_{μν} give the same block.

Something larger, with two terms and a coefficient — Einstein's tensor:

G_{\alpha\beta} = R_{\alpha\beta} - \tfrac{1}{2} g_{\alpha\beta} R
Einstein's tensor on the canvas: G on the left side, then an equals sign, the Ricci tensor as the first term, and minus one half times the metric times the Ricci scalar as the second.
A sum has no block of its own — it is arrangement. Each summand is a term, laid out side by side with the sign and the coefficient between them. Within a term, blocks placed next to each other are already multiplied: that is the outer product.

EQUATION 3 Letting Tessera do the algebra

Build the metric against its own inverse:

g_{\alpha\mu} g^{\mu\beta}
The metric g with lower indexes alpha and mu, with the inverse metric g with upper indexes mu and beta fitted into its right-hand hole.
The pin μ of gμβ is already in the hole μ of gαμ, because μ appears once up and once down.

Now press Simplify in the panel on the right.

A single block remains: delta with a lower index alpha and an upper index beta, one hole and one pin.
Two blocks collapse into one, with the free indexes they had: a hole for α and a pin for β.

And the panel says why it was allowed to do that:

g⁻¹ and g are inverse: the inner product gives back the identity I, whose components are δ. Note that I is a THIRD tensor, neither g⁻¹ nor g. §2.13, eq.2.28

Every step of a simplification comes with its justification and its place in the book. The program does not ask to be believed.

EQUATION 4 The scalar product, and what a sum means

The book writes a covector as components on a basis, P̃ = Pαα, a vector as V⃗ = Vα e⃗α, and their scalar product as Pα Vα. On the canvas both halves of that sentence are already drawn: the components in the bodies, the basis on the connectors. So the product is one gesture — the pin of V into the hole of P, which is α meeting e⃗α.

P_{\alpha} V^{\alpha}
The covector P with the vector V fitted into its hole from below, no connector left free.
Nothing is left free: no pin, no hole. The assembly is a smooth block — a number.

And this is what the panel says the moment the two indexes meet:

index α now appears twice: that triggers a SUM over α = 1…n, not a cancellation of symbols.

That sentence is the book's second picture — the interlocking cubes, P1V1 + P2V2 + … + PnVn. Tessera draws the structure and never the components: the dimension n box at the top of the screen is the n of that 1…n, and the sum over components is what a connection means, not something the mosaic spells out. A sum has no block of its own (§2.3) — and a sum over components has no drawing at all.

Why does the product come out as that plain sum, with the basis nowhere in it? Because the two bases are dual: ⟨ẽβ, e⃗α⟩ = δβα — one when the indexes match, zero otherwise. That is what the connectors were doing when they vanished, and you can watch it on its own: the palette has the basis blocks by themselves. Under bases, click and e⃗, then fit the pin into the hole.

Two basis blocks fitted one under the other: delta with upper beta and lower nu, over delta with upper nu and lower alpha.
In the book the body of a basis block looks empty, but §1.7 warns that it really holds 0…1…0 — that is, δ·κ. So Tessera keeps the basis label apart from the connector index, and the fitted pair reads δβν δνα: literally the three-step figure on p.18.

Press Simplify.

A single smooth block with no connectors: delta with upper beta and lower alpha.
A smooth block, with no connectors at all — the scalar promised back in section one.
⟨ẽβ, e⃗α is the duality condition: the result is the smooth block δβα, a number. §1.7, eq.1.8

One basis block against a tensor: a single component

Pair a basis block with a covector instead of with its dual, and you get P̃(e⃗α) = Pα — the α-th component. Drop P, drop e⃗, fit the pin into the hole.

The covector P with a basis-vector block fitted into its hole from below; the basis block's body reads delta with upper lambda and lower alpha.
The basis block wears its body openly: δλα, the 0…1…0 of §1.7. Both connectors are spent in the fit, so nothing is left free.

Press Simplify.

A single smooth block reading P with a lower alpha, with no connectors at all.
One smooth block: Pα. The α that survives sits in the body, where the basis block kept its own label — it is the name of a compartment, not a connector, and that is why the block is smooth.
P applied to e⃗α gives back ONE component: Pα, a number. Both connectors were spent in the fit and none is left — the index that remains is the name of a compartment, in the body, not a connector. §1.7, eq.1.4, eq.1.10

The same thing from the other side gives the components of a vector: V⃗(ẽα) = Vα (eq.1.10). Rank 2 and up is left alone: there the result is a slice with one index held fixed, which the book does not introduce here, and Tessera does not claim what the book has not said.

MORE Four more worth building

Same three moves — drop, fit, press a button. These are only bigger.

The covariant derivative, with Γ in plain sight

Build \nabla_{\mu} V^{\nu} and press Expand ∇.

Two terms: the partial derivative times V, plus the Christoffel block with V fitted into it.
μVν = ∂μVν + ΓνμλVλ (§4.14, eq.4.33): the partial plus one Christoffel term per index — for an upper index, −Γ for a lower one. Both are drawn dashed, because neither nor Γ is a tensor. The book leaves Γ implicit; here it shows, because hiding it is the habit the program exists to fight.

Ricci, as a contraction of Riemann

Open ready-made assemblies in the palette and pick the Ricci tensor.

The Ricci tensor on the left side, and on the right the Riemann tensor with its own pin plugged into its own third hole, marked by a dashed arc.
Rβν = Rμβμν (§5.13, eq.5.52). The dashed arc is a block contracted with itself — dragging cannot do that, because a block is rigid, so internal contractions come as a list when you click the block. In Riemann each option says whether it gives Ricci, −R or zero.

A condition: parallel transport

The gradient with the tangent vector U fitted into it, times V, equals a null block with one pin.
UV⃗ = 0 (§5.4, eq.5.18). Set to zero creates on the other side the null tensor with the same free connectors — without that the index balance would not close. Transport U⃗ itself instead of V⃗ and the same assembly is a geodesic.

Changing basis: one Λ per index

Click a block and choose change basis.

The tensor T with an upper and a lower index, with a basis converter fitted above and another below, both drawn with dashed outlines and primed indexes.
§3.1, eq.3.10 asks for as many Λ as upper indexes and as many as lower, so Tessera shoes one onto every free connector. The prime marks the new basis, and the dashes say Λ is not a tensor — the fit is a shoe, not an inner product. Shoe it again and the shoe comes off: the two matrices are inverse to each other.

Then press Simplify, and the shoes are absorbed:

A single block reading T with a primed upper alpha and a primed lower mu, its pin labelled with the primed basis vector and its hole with the primed basis covector.
Λα'α Tαμ … = Tα'μ' (eq.3.10). One block again, and the connectors say which basis you are in. Mind what the panel insists on: it is the same tensor — what changed are the components, not the object. Λ is not a tensor, and this was a change of description.

NEXT Where to go from here

Every figure on this page was drawn by Tessera itself, by the same code that draws the canvas in your browser — they are the assemblies, not screenshots of them.