Coming soon

Write a pane. Drop it on the grid.

Dotpane is a dotted canvas for small HTML, CSS and JS components. Each one can call your APIs while your keys stay on the server.

Home
Weather · Lisbon
21°
Sunny · feels like 22°
Now
21°
14
22°
16
22°
18
20°
Today
Lo-fi focus
Playlist · 42 tracks
1:123:40
Keep it logically awesome.
Uptime, 30 days
99.98%

From an idea to a live pane in three steps.

Step 1

Write it

A pane is plain HTML, CSS and JS. Write it in the built-in editor with a live preview, or start from a template.

Step 2

Place it

Drop panes on a 12-column dotted grid. Move and resize them; they snap to the dots and never overlap.

Step 3

Connect it

Bind a secret to the pane. Its calls go through Dotpane’s servers, which add your key.

Change the code. The pane changes with it.

The editor keeps a live preview beside your code. Props turn one pane into many: the same code with different settings on each canvas. Try it here.

component.js
// label: "Coffees today" · step: 1
const { label, step } = dash.props;
let n = (await dash.storage.get('n')) ?? 0;
plus.onclick = () => save(n + step);
minus.onclick = () => save(n - step);
function save(v) {
out.textContent = n = v;
dash.storage.set('n', n);
}
Coffees today
3
Props for this canvas
Accent

If it runs in a browser, it can be a pane.

Charts, players, timers, forms, small games. A pane is your own code, so there is no widget catalogue to wait for.

Launch boardClick a card to move it on
To do3
Doing2
Done2
Traffic by source
42%Direct
DeploysSorted by deployed
jobsBuilding21 sJust now
apiLive48 s2 min ago
webLive1 m 32 s14 min ago
usercontentLive37 s1 h ago
egressFailed12 s3 h ago
Synth
Playtap a pad
Deploy log
$ deploy api --env staging
building image…
✓ built in 48 s
running migrations…
✓ 7 migrations applied
health check /healthz
✓ 200 in 31 ms
✓ live
Local time
10:09:30
Requests per second, live
352peak 386
Pixel pad

These eight are running. Move a card, sort the table, play a note, paint a pixel, pause the live chart.

Your keys never reach the browser.

Pane code is treated as untrusted, including your own. It can ask Dotpane to make a call, and that is all it can do with a secret.

How it is secured

An encrypted vault

Secrets are encrypted with AES-256-GCM, and the keys that protect them live in a separate key service.

Sandboxed panes

Every pane runs in a sandboxed frame on its own domain, away from your session and from other panes.

Only the hosts you allow

A secret is sent only to the hosts you list for it. Calls to anything else, or to private addresses, are refused.

Follow one API call

  1. Step 1Pane calls dash.fetchIts code holds a placeholder, not the key.
  2. Step 2Dotpane checks the hostapi.github.com is on this secret's list.
  3. Step 3Dotpane adds the keyDecrypted on the server, for this call only.
  4. Step 4API answersThe response goes back to the pane.
What the pane sends
GET https://api.github.com/user
authorization: Bearer {{secrets.GITHUB_TOKEN}}
What the API receives
authorization: Bearer ghp_••••••••a1f4
200 OK · 184 ms
20
canvases
100
panes of your own
50
secrets in the vault
100,000
API calls a month

This is what the Pro plan includes. See pricing

Opening soon.

Dotpane is not open yet. When it is, you can try it for 14 days without a card, and Pro is $9 a month.