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:
Enabledis true and the Paid edition is disabled.PrimaryDisplayPathmatches the Workspace model.AuthorizedUserscontains your own Roblox account information.DefaultUTCOffsetMinutesmatches the timezone normally used for commands.- 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.
- Prepare the countdown with the set commands.
- Run
/countdown statusand inspect the local display. - Run
/countdown pushto review the exact target and update text. - Run
/countdown push confirmwithin 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
CountdownTextis shown. - Update text and images appear after non-empty update text is configured.
- The format changes from
DD:HH:MM:SStoHH:MM:SS, thenMM:SSas 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.
