Leaving Airtable? Bring your bases to Artavolo, checked record by record. See how

For software teams

Put spreadsheets your users control inside your product

Tables they can sort, filter and reshape. Boards, calendars and forms over the same records. Building that properly is a year of work; embedding it is an afternoon, and your customers never leave your product to do it.

Through an assistant

The same data, asked for in a sentence

Your instance speaks the Model Context Protocol, so Claude, ChatGPT or anything else that speaks it can read and change the records your customer may already reach. It connects to your server directly. Nothing is copied anywhere else.

Changes an assistant proposed in a table of tasks, each with the old value, the new value and its reason, waiting for a person to accept or reject them.
It acts as the person who connected it Their permissions, their hidden sheets stay hidden, and every read and write is in the audit log under their name.
Connecting is a button, not a pasted key OAuth 2.1 with PKCE. They sign in to your product and choose which bases it may reach. Withdrawing takes one click.
You decide whether it may write Reading only is a setting. So is switching the connector off for the whole instance.
The page your users get

What you are embedding

A working application, not a widget.

Views your users build

Grid, cards, kanban and calendar over the same records, with filtering, sorting, grouping and hidden columns in the toolbar.

Real relations

Point a column at another sheet, pick from its records, and let the choice fill the columns that come with it. Not a flat table pretending to be a database.

Automations and webhooks

Scheduled and event-driven rules, outgoing webhooks with your own header names, and a REST API for everything else.

Forms

Public or authenticated submission forms, validation, file uploads, optional password.

Permissions that hold up

Workspace, base and per-sheet visibility; owner, contributor and read-only; guests. Enforced on the server, on every request.

An audit trail

Append-only log of who changed which cell, when, from where - including actions taken inside your embedded views, under your own user names.

Step by step

From nothing to an embedded view

Six steps, about twenty minutes, no SDK to install and no build step. Follow them in order the first time; after that it is three lines of your own code.

  1. Get Artavolo running

    One Docker command, or PHP and MySQL on ordinary hosting - see Download. Log in as the administrator you created. (2 minutes)

  2. Decide who the embedded view acts as

    An embed token always names a real Artavolo user, and can never do more than that user may. Create one on purpose - Administration → Members - for example embed@yourcompany.com, then open the base you want to embed and give that user exactly the access your customers should have: read-only, or contributor. (3 minutes)

  3. Switch embedding on

    Administration → Settings → Embedding: tick Accept embed tokens, add the address your application runs on under Allowed host origins (for example https://app.yourcompany.com, or http://localhost:3000 while you develop), and copy the signing secret. Keep that secret on your server. (2 minutes)

    The same screen has a Try it now box: pick one of your bases and it gives you a link to open and an iframe to paste, so you can see an embedded view before you write a line of this.

  4. Sign a token in your own back end

    Four lines. This is the only Artavolo-specific code you will write - or install the Node client that comes with your download (npm install ./deploy/packages/artavolo-embed) and call createEmbedToken(), which does the same thing with React and Vue components included.

    $payload = json_encode([
      'v'    => 1,
      'mid'  => 42,                      // the Artavolo user from step 2
      'did'  => 7,                       // which base
      'tid'  => 0,                       // the sheet to open, or 0 for the whole base
      'mode' => 'write',                 // or 'read'
      'exp'  => time() + 600,            // valid for ten minutes
      'act'  => 'jane@yourcompany.com',  // your user, for the audit log
      'jti'  => bin2hex(random_bytes(8)),
    ]);
    
    $b64   = fn($d) => rtrim(strtr(base64_encode($d), '+/', '-_'), '=');
    $token = 'ARTE1.' . $b64($payload) . '.'
           . $b64(hash_hmac('sha256', $payload, $secret, true));

    The same four lines in Node, Python or anything else - it is only base64url and HMAC-SHA256. Sign the exact bytes you send.

  5. Put it in your page
    <iframe
      id="artavolo"
      src="https://data.yourcompany.com/base/BASE_CODE/embed?et=<?= $token ?>"
      style="width:100%;border:0"></iframe>

    BASE_CODE is the code in the base’s own address bar. Load the page: your users are looking at their data, and never saw a login.

  6. Listen for two messages

    So the frame sizes itself and your own screen stays in step.

    window.addEventListener('message', (event) => {
      if (event.origin !== 'https://data.yourcompany.com') return;
      const message = event.data;
      if (!message || message.source !== 'artavolo') return;
    
      if (message.type === 'height')
        frame.style.height = message.payload.height + 'px';
    
      if (message.type === 'rows.changed')
        refreshMyOwnView();
    });
It can only ever do less than the account it names

An embedded session is restricted to the base or sheet named in the token, to a fixed list of data actions - no settings, no members, no administration - and to reading unless the token says write. Point it at an account with exactly the rights your customers should have, and that ceiling is enforced on every request.

A working example

Complete host applications you can run straight away: one file in PHP or Node (embed-host), a Vite app (embed-vite) and an Electron desktop app (embed-electron).

The embedding reference

Every message, every token field, the security model and a troubleshooting table: docs/embedding.md in the release.

The REST API

Every endpoint and parameter, for when you want to drive the data rather than show it.

Open the API reference
Shipping a desktop application?

It works the same in Electron, Tauri and WebView2 - there is a running Electron example in deploy/examples/embed-electron/. One thing differs: a window whose page is loaded from file:// has no origin, so it cannot be allowed to frame anything. Serve your window from a custom scheme or a local address and allow that. docs/embedding-desktop.md has the measured results for each.

If something does not appear
  • Blank frame - your address is not in Allowed host origins.
  • “Signature does not match” - wrong secret, or the JSON was rebuilt after signing.
  • “Token has expired” - check the clock on your server.
  • “Read-only” - the token says mode: read.

Licences

From €490 a developer, a year. Never per end user - your customers' growth costs you nothing.

Run it yourself

For your own organisation. One installation, your servers, your data.

Community

€0

free, for ever

Evaluating, internal use and non-commercial projects.

  • Unlimited rows, users and bases
  • All views, forms and automations
  • REST API and webhooks
  • Docker or plain LAMP
  • Community support
Download

Self-hosted Enterprise

€1,490

per instance, per year, unlimited users

Your whole organisation on one licence, however many people use it.

  • Unlimited users - never priced per seat
  • Everything in Community
  • Single sign-on (OpenID Connect)
  • Audit log export
  • Scheduled encrypted backups
  • One non-production instance
  • E-mail support, 2 business days
Request a quote

Embed it in your product

Per developer, never per end user. Your customers’ growth costs you nothing.

Developer

€490

per developer, per year

Building and testing with Artavolo inside your product.

  • Embedding and the REST API
  • Unlimited rows, users and bases
  • Development and test deployments
  • E-mail support, 2 business days
  • All updates while the licence runs
Request a quote

Team

€1,490

up to 5 developers, per year

A team shipping it as part of your product.

  • Everything in Developer
  • Five developer seats
  • Priority e-mail support
  • Upgrade to OEM at any time
Request a quote

Prices exclude VAT. Perpetual licences (bought once, with a year of updates) are available for every tier - ask. A free, unlimited Community edition is available for evaluation and for non-commercial use: no seat limits, no row limits, no sign-up.

Start with the code, not a sales call

Download it, run it with one Docker command, embed it in a throw-away page, and decide. If you then want a licence, one e-mail is enough.