Skip to content

Content

A text cell on the timer screen doesn’t hold fixed text. It points at a named content item, and that item decides what — and whether — to draw.

Every content item has three parts:

  • Name — what you pick it by, e.g. clock, blinds, player count
  • Value — the text shown on the timer, which can pull in live tournament data
  • Condition — an optional test; while it’s false, any cell using this content hides itself

Separating the three is what lets one layout work all tournament long. The built-in ante item, for example, is conditioned on the level actually having a standard ante — so the ante line simply isn’t there during levels without one, and you don’t have to build a different screen for each phase of the tournament.

From edit mode:

  • Tap +Content to insert a text cell and choose its content in one step.
  • Select an existing text cell and open its Content setting to point it somewhere else, or to tap Edit and change the item itself.
  • Manage content, from that same setting, opens the full list — every item in the tournament, whether or not the timer currently uses it.
The Content setting expanded in the editing panel, listing content items by name with their values beneath, the selected one checked and carrying an Edit button

Inside Value, double curly braces insert live tournament data. Everything outside the braces is shown as-is, so you can mix the two freely:

Chips in play {{ totalChipsInPlay }}

Anything between the braces is an expression, so it can do arithmetic and formatting, not just name a value:

Level {{ blindLevelNumber }} of {{ blindLevelCount }}
{{ (secondsLeftInLevel * 1000).toCompactTimeDurationString }}

A footer under the field always shows the rendered result, so you can see exactly what the timer will draw. See Scripting for the language and Tournament data for everything you can reference.

The Condition field takes the same expressions, but without the braces, and it must come out true or false. Leave it empty and the content always shows.

hasChipLeader
currentLevel.ante > 0 && currentLevel.bigBlind == 0

Both fields use the same editor: syntax highlighting, line and column readout, and autocomplete. Start typing a name and matching tournament values are offered with their descriptions.

The content editor for bb ante: a Name field, a tip above the Condition field which reads Result: true, and a tip above the Value field, with Output: BB Ante 30 pinned at the bottom

The { } Script explorer button in the app bar is the fastest way to find something. It lists every value available with a description and its current value, lets you drill into objects like a player or a level, and copies a name to the clipboard with one tap.

If an expression is wrong, the editor says so in red underneath rather than failing silently. A condition that produces something other than true or false is rejected with Condition must evaluate to true or false.

The list mixes two kinds of item, and the ones this tournament has its own version of are shown in bold — whether you created them from scratch or edited a built-in.

The Manage content screen listing every content item alphabetically with its value beneath, with the edited bb ante item shown in bold

Bold means this tournament has its own copy, and those are the ones you can swipe left in Manage content to delete. If the timer is currently using an item, the app warns you and names it before removing it.

  • Items you create are bold from the start.
  • Built-in items start plain, and can’t be deleted while they’re plain. Edit one and it turns bold — the tournament now has its own version, which shadows the shipped one.

Names must be unique within a tournament, and are checked against the built-in names too. So you can’t make a second clock — either edit clock itself, or create one under a different name like clock big and point the cell at that.

Content items belong to the tournament they’re created in. Two things carry them elsewhere: Import customizations, which copies a whole look across, and saving a widget, which bundles the content its cells reference so the widget still works wherever you drop it.

These are ordinary content items — open any of them to see how it’s put together, or copy the approach into your own.

NameValueCondition
tournament title{{ title }}always
title{{ currentLevel.title }}always
break titleBreakisBreakLevel && currentLevel.title.isEmpty
level numberLevel {{ blindLevelNumber }} of {{ blindLevelCount }}isBlindsLevel
clock{{ (secondsLeftInLevel * 1000).toCompactTimeDurationString }}always
blindssmall / big blind, compactly formattedcurrentLevel.bigBlind > 0
anteAnte {{ (currentLevel.ante).toCompactDecimalString }}standard antes only
bb anteBB Ante {{ … }}big-blind antes only
next level blindsthe next level’s blindsnextLevel.bigBlind > 0
next break time, break in {{ (secondsUntilNextBreak / 60).round }} min.a break is coming
player count{{ currentPlayerCount }} of {{ totalPlayerCount }} playersalways
chips per playerAvg stack {{ averageChipsPerPlayer.round.toCompactDecimalString }}always
BBs in playaverage and total stacks in big blindsactiveBigBlind > 0
current time{{ now().toTimeString }}always
chip leaderleader’s name and stackhasChipLeader
high handthe hand’s owner, name, and cardshasHighHand
separatoralways

Breaks are levels too, so levelIndex counts them — with a break between them, level 4 is followed by level 6. To number only the blind levels, use blindLevelNumber and blindLevelCount, which is what the built-in level number item does. Its condition is isBlindsLevel, so the cell hides during breaks rather than holding at the level that just finished.