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.
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.
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.
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.
-
Get Artavolo running
One Docker command, or PHP and MySQL on ordinary hosting - see Download. Log in as the administrator you created. (2 minutes)
-
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) -
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, orhttp://localhost:3000while 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.
-
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 callcreateEmbedToken(), 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.
-
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_CODEis the code in the base’s own address bar. Load the page: your users are looking at their data, and never saw a login. -
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 referenceShipping 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
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
Self-hosted Enterprise
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
Embed it in your product
Per developer, never per end user. Your customers’ growth costs you nothing.
Developer
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
Team
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
OEM
per year, unlimited deployments
Shipping it to your customers under your own name.
- Everything in Team
- Deploy and redistribute without limit
- White-label: your name, logo, e-mails, webhook headers
- No “powered by” anywhere
- Perpetual option available
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.