Update Counter Free

Official Update Counter Free documentation for installing a Roblox SurfaceGui countdown, configuring private admin commands and publishing one synchronized timer across an experience.

On this page

Before you install

Update Counter Free is internally named Astro Countdown Free. Keep those supplied object names because the runtime uses them to locate its server modules, client script and display.

Enable either the Free or Paid edition when both use /countdown and /count. Running both editions with the same aliases creates conflicting command handlers. Check Config.Enabled in both packages before publishing.

Live global synchronization works across every server and place inside one Roblox experience. Separate experiences do not share Roblox DataStores or MessagingService topics.

Installation

The supplied files belong at these locations:

ServerScriptService
└── Astro Countdown Free
    ├── Config
    ├── CountdownAPI
    ├── GlobalState
    ├── TimeParser
    ├── CountdownServer
    └── CommandServer

StarterPlayer
└── StarterPlayerScripts
    └── Free Countdown Client

Workspace
└── Astro Countdown Free
    └── AnchorPart
        ├── Countdown
        └── Text

The standard SurfaceGui display hierarchy is:

AnchorPart
├── Countdown
│   └── SurfaceGui
│       └── Frame
│           └── CountdownText
└── Text
    └── SurfaceGui
        └── Frame
            ├── UpdateText
            ├── BackImage
            └── FrontImage

The legacy layout with Countdown and Text directly below the model remains supported. For a new installation, use the AnchorPart hierarchy above.

Open ServerScriptService["Astro Countdown Free"].Config and confirm:

  1. Enabled is true and the Paid edition is disabled.
  2. PrimaryDisplayPath matches the Workspace model.
  3. AuthorizedUsers contains your own Roblox account information.
  4. DefaultUTCOffsetMinutes matches the timezone normally used for commands.
  5. The DataStore and MessagingService names are unique to this system.

Studio stays local-only by default. Test production synchronization in a published test experience.

Admin access

Configure exact UserId and username pairs:

Config.AuthorizedUsers = {
    { UserId = 123456789, Username = "ExactRobloxUsername" },
}

Both values must match the current Player. If the account changes username, update the configured username before commands will work again. AllowExperienceOwner can also authorize the owner of a user-owned experience.

This is an identity consistency check for one Roblox account. Unauthorized users receive no command response and cannot preview or publish countdown state.

Commands

The primary command is /countdown; /count is a shorter alias.

Command Purpose
/countdown help Show the command reference
/countdown status Show published and draft state
/countdown set 10pm tomorrow Set a target using natural time syntax
/countdown set 6pm Friday Set the next named weekday
/countdown set 20:00 09/06/2027 +02:00 Set a dated target and UTC offset
/countdown set text Update 21 Set the optional update line
/countdown set ending SOON Change the text shown when time reaches zero
/countdown set image rbxassetid://78005926902888 Set the update image asset
/countdown stop Stop the current draft timer
/countdown clear Clear the draft state
/countdown cancel Discard the draft and restore the published state
/countdown push Review a global publish request
/countdown push confirm Confirm and publish globally

Modern Roblox chat uses TextChatCommand, which intercepts authorized commands and sends feedback only to the sender’s system channel. A legacy fallback keeps commands available in some Studio or legacy chat sessions, but legacy chat cannot always hide the original command input.

Draft and publish

Setting a time, update name, ending text or image changes only the issuing server’s draft preview. It does not immediately alter other servers.

  1. Prepare the countdown with the set commands.
  2. Run /countdown status and inspect the local display.
  3. Run /countdown push to review the exact target and update text.
  4. Run /countdown push confirm within 60 seconds.

Any edit made after requesting confirmation invalidates that request. /countdown cancel restores the current published state. To remove a published countdown, run /countdown clear, then /countdown push, then /countdown push confirm.

An untouched draft with no target cannot be pushed accidentally.

Display states

  • With no timer, all four display elements are hidden.
  • With only a timer, only CountdownText is shown.
  • Update text and images appear after non-empty update text is configured.
  • The format changes from DD:HH:MM:SS to HH:MM:SS, then MM:SS as the target approaches.
  • At zero, the ending message replaces the timer and update text or images hide by default.

Global synchronization

The published state is saved with DataStoreService.UpdateAsync. MessagingService notifies active servers immediately, and each server reads the DataStore again every 60 seconds to recover a missed message.

Every server calculates remaining time from the same Unix timestamp. It does not reduce a locally stored number once per second, so accumulated timer drift is avoided.

New public, reserved and VIP servers load the current published record when they start. A player joining an existing server sees that server’s current rendered state without making an individual DataStore request.

When the timer finishes, Running becomes false, Finished becomes true and CountdownFinished fires. The finished record remains available until an administrator publishes or clears a new state.

Multiple displays

Add display paths in Config when their locations are known at startup:

Config.AdditionalDisplayPaths = {
    "Workspace/Lobby/Astro Countdown Free",
    "Workspace/SecondArea/Astro Countdown Free",
}

Every display must use the standard Free hierarchy. You can also register a display at runtime:

local API = require(
    game.ServerScriptService["Astro Countdown Free"].CountdownAPI
)

API.RegisterDisplay(workspace.SecondFreeDisplay)

Server API

Trusted server scripts can read state, subscribe to changes and register displays:

local API = require(
    game.ServerScriptService["Astro Countdown Free"].CountdownAPI
)

local state = API.GetState()

local connection = API.Subscribe(function(newState, source)
    print(newState.updateText, newState.targetUnix, source)
end)

API.RegisterDisplay(workspace.SecondFreeDisplay)

For custom LocalScripts, ReplicatedStorage.AstroCountdownFreeState exposes read-only attributes including TargetUnix, UpdateText, Image, EndDisplayText, CountdownText, Running, Finished, Visible, Revision, UpdatedAt and UpdatedByUsername.

Clients can observe these values but do not receive authority to publish countdown state.

Configuration

Setting Purpose
PushConfirmationSeconds Length of the confirmation window
DefaultUTCOffsetMinutes Default timezone when a command has no explicit offset
GlobalEnabled Enables persistent cross-server state
EnableStudioGlobalState Allows Studio to touch cloud state when deliberately enabled
GlobalResyncSeconds Interval for recovering missed messages
EndDisplayText Default text displayed at zero
MaxEndingMessageLength Maximum accepted finished message length
HideUpdateTextOnFinish Hides update text and images at zero
EyeMaxDistance Maximum player-facing display distance
EyeCheckInterval Frequency of display-facing checks
AdditionalDisplayPaths Extra display models registered at startup
PrintStartupMessages Enables concise startup summaries
DebugLogging Enables detailed state and display diagnostics

Keep DataStore reads and writes disabled in Studio unless access to real experience data is intentional. External website integrations require a secure backend using Roblox Open Cloud. Never place an Open Cloud secret in a LocalScript or browser-delivered JavaScript.

Troubleshooting

Commands do not respond

Confirm the edition is enabled and both the configured UserId and current username match. If the Paid edition is installed, ensure it is not using the same aliases while enabled.

The display is missing

Check PrimaryDisplayPath, AnchorPart and the required SurfaceGui hierarchy. Keep the supplied object names and check Output for the first clear startup warning.

Studio does not update other servers

This is expected with EnableStudioGlobalState = false. A confirmed push remains local during Studio testing. Use a published test experience for real DataStore and MessagingService behavior.

An update is not visible immediately

Confirm the draft was pushed and then confirmed. Active servers normally receive the message quickly; a missed message is recovered by the next reconciliation read.