DocsZones

Zone visibility

A zone’s visibility decides who can see what is inside it. This is the one place taybl does more than describe a scene — it is engine-enforced. Everywhere else, taybl trusts players to resolve the rules by hand; here, the server actively hides what a player isn’t entitled to see.

Two fields work together: view controls who can see the zone’s contents, and faceOnEnter controls how a component is turned when it lands in the zone.

view — who can see the contents

view defaults to public. The other two values hide contents based on who owns the zone instance (for a perSeat zone, the seated player it belongs to):

viewWho sees the contentsUse it for
publicEveryone (the default)The board, a face-up discard, a shared tableau .optional()
ownerThe owner only — hidden from everyone elseA private hand; pair with scope: perSeat so each player sees only their own
othersOnlyEveryone except the ownerHanabi-style hands — you hold cards you can’t see but everyone else can

This is enforced in server-side state redaction: before the game state is broadcast to each player, the contents of any zone that should be hidden from them are stripped out (the card face, its identity, and its position), leaving only a face-down placeholder and the count. A hidden card never crosses the wire to a player who shouldn’t see it, so even a curious or tampered client cannot recover it. (Activity-log snapshots and non-public reveals are redacted the same way, to close shuffle-correlation leaks.)

Because owner and othersOnly only mean something when a zone has an owner, they imply a per-seat hand: set scope: perSeat so each seated player owns their own copy — see zone scope.

It isn’t only cards this protects. A view: owner zone (plus scope: perSeat) holding a sheet is how you build a private notepad — a Clue deduction grid, a hidden score pad. The redaction above blanks the pad’s written-in values for everyone but its owner, so what a player writes on their own sheet is as private as the cards in their hand.

faceOnEnter — facing on entry

faceOnEnter (optional) sets which way a component turns the moment it enters the zone — drawn, dealt, or dragged in. It is about facing, while view is about who may see; the two often pair (a face-down draw pile, a face-up discard).

faceOnEnterTurns the component…
upFace up — front visibleA face-up discard or reveal area .optional()
downFace down — back showingA face-down draw pile or deck .optional()
ownerFront to the owner onlyDrawing into a private hand .optional()
othersOnlyFront to everyone except the ownerHanabi — held facing outward .optional()
keepLeave the component’s current facing untouchedThe default behaviour .optional()

keep at setup — the role default

At setup there is no "current facing" to keep: the component was minted moments earlier, and cards mint face-down. So on keep (or no faceOnEnter at all) the zone’s role decides, matching a physical table:

  • supply, discard, playface up. A stock of known goods, a spent pile, and a tableau all sit face-up. Without this a supply of cards would open face-down — and a view: public zone redacts face-down cards, so the pile would come up hidden, showing only its back.
  • draw, hand, and everything else → the creation default (face-down for a card, or a piece/token with back art).
  • arrangement: bag → always the creation default, whatever the role. A bag is concealed by definition, so a face-down reserve stays hidden.

Set faceOnEnter explicitly to override this — a face-down supply reserve just needs Face down. This applies only at setup: once the game is running, keep means keep, so dragging a face-down card into a discard leaves it face-down.

How to edit in the Studio

Open your game → Layout tab → select a zone. In the Properties card, the Visibility dropdown sets viewEveryone, Owner only, or Everyone except owner — and the Face on enter dropdown sets faceOnEnter. For an owner-only zone, also set Who uses it to Each player so every player owns their own private copy.

Sign in to ask Pip about building games.
Sign in