tabulata calculates and aggregates list-based data. Its function expressions are versatile and easy to read and use.

Currently, tabulata exists as a functional prototype to explore some ideas I had to improve on the current spreadsheet metaphor. It takes some inspiration from LastCalc and Soulver, but the basic idea existed before I even knew about these products and was developed back in 2007.

Instead of work sheets with arbitrary coordinates-based addressing, tabulata forces you to name everything which can be referenced and has an explicit concept of lists.

›› Open up the application now. It already contains some examples.
›› Note: Bookmark the URL you are redirected to for later retrieval.

Read further to learn how tabulata lets you manipulate lists, values and expressions.

Key Concepts

A block is a collection of lists and singulars. It is displayed on the home screen in condensed form, as shown here. Selecting the block opens it for editing.

In a block, calculated values are displayed, the expression generating the value can be edited when the calculated value is activated by clicking or tapping.

A singular associates one name with one expression generating one resulting value. When the singular is starred, it appears in the condensed block on the home screen. To edit a singular, click the value.

A list is named and consists of named columns. A column contains either values or an expression. Columns and rows are appended using the „+“-buttons.


The heart of tabulata are the expressions which calculate singulars and expression columns. Any existing or calculated data is referenced exclusively by name, spaces are omitted, so Tax Rate as a name is referenced using the symbol TaxRate.

In an expression,  ListName.ColumnName references the contained or calculated data in list form. On that list representation functions like sum, count and select are called using ListName.ColumnName.functionName.

A column expression is calculated for each row of the list. ColumnName accesses the corresponding value in the same row, ColumnName.above the value one row above. Singulars can be referenced. A simple example would be, for the column Tax the expression Price * TaxRate.

A list aggregation is created using an expression which returns a list as the first column. Examples for expressions which return a list are uniques and select. List.Column.uniques returns a list with each distinct value of Column contained once. Aggregated data is then calculated in the other columns by using select and sum on arbitrary other columns.

Include External Data

Using includes, external data sources can be directly accessed inside a block. Currently implemented for arbitrary JSON APIs, once mapped to a name, the data inside the object tree can be used for creating and manipulating lists. See the Currency Portfolio example.

›› Open up the application now. It contains the example outlined here.
›› Note: Bookmark the URL you are redirected to for later retrieval.

Source Code, Licence

Tabulata is released under the GNU Affero General Public License.
Find it here: tabulata on github.

Current Status, Contact

Tabulata is a side project of Samuel Rutishauser to play around with technologies and ideas.

I have a Twitter and E-Mail.