Skip to content
Cloudtifact docs

Guest writes

Visitors who aren't signed in add data, through statements you publish: sign-ups, votes, feedback, scores.

When to use it: Visitors who aren't signed in add data: a sign-up sheet, a vote, feedback, a high score. Save it in the database.

Status: Live. Turned on: Off by default. An admin turns on "Pages can save data for people who are not signed in" in the space's Settings, under Guests. Public spaces only.

How

Publish named statements in db/guest-writes.sql ("-- name: vote", then one INSERT, UPDATE or DELETE; $guest and $guest_id are filled in by the server). In the page, hide the form when (await cloudtifact.ready).guestWrites === false; null means try. Then cloudtifact.guest.set(name) once and cloudtifact.db.run("vote", params) on submit.

-- db/guest-writes.sql, next to the page. Publishing replaces the whole set.
-- name: vote
INSERT INTO votes (idea_id, voter, bucket) SELECT ?, $guest, substr($guest_id, 1, 4)
  WHERE (SELECT count(*) FROM votes WHERE bucket = substr($guest_id, 1, 4)) < 3;
<form id="vote" hidden><button name="idea" value="1">Vote</button></form>
<script>
  async function vote(ideaId, name) {
    const { guestWrites } = await cloudtifact.ready;
    if (guestWrites === false) return;
    await cloudtifact.guest.set(name);
    await cloudtifact.db.run("vote", [ideaId]);
  }
  cloudtifact.ready.then(({ guestWrites }) => {
    if (guestWrites === false) return;
    document.getElementById("vote").hidden = false;
  });
</script>

Limits

  • Public spaces only; off until an admin turns it on.
  • 120 writes per browser and 300 per address every 10 minutes.
  • Params are strings up to 4 KB, numbers, booleans or null. Every write is logged with who and roughly where from.
  • Visitors can read every table, so never store $guest_id itself; keep a short prefix if you need a bucket for caps.

Errors

A failed call rejects with an Error whose code is one of:

CodeWhen
no_guestCall cloudtifact.guest.set(name) first.
forbiddenGuest writes are off for this space, or the page was opened by a private link (no guests there). The bridge refuses it before the page tries. Hide the form when ready's guestWrites is false; unanswered (null) still try.
rate_limitedToo many writes from this browser or address; wait a few minutes.
bad_requestNo statement with that name, or the params don't fit it.
networkThe request didn't reach Cloudtifact (offline, blocked).
timeoutNo answer in time; try again.

Cost

Included in every plan.