Before you install
Update Counter is internally named Astro Countdown for its server folder and Astro Countdown Paid for its Workspace display. Keep those names unless you also update every reference in the supplied code.
Enable only one edition when Free and Paid share the /countdown and /count aliases. Confirm Config.Enabled in both packages before publishing.
The product synchronizes every server and place within one Roblox experience. Separate experiences need a secure Open Cloud or external backend bridge because Roblox Engine DataStores and MessagingService do not cross experience boundaries.
Installation
The supplied files belong at these locations:
ServerScriptService
└── Astro Countdown
├── Config
├── CountdownAPI
├── GlobalState
├── TimeParser
├── ColorParser
├── CharacterPatterns
├── BlockRenderer
├── CountdownServer
└── CommandServer
StarterPlayer
└── StarterPlayerScripts
└── Paid Countdown Client
Workspace
└── Astro Countdown Paid
└── AnchorPart
AnchorPart is required and controls the generated display position. GeneratedDisplay is created automatically. An optional BasePart named BlockTemplate may be used as the base cube; otherwise the renderer creates ordinary Parts.
Open ServerScriptService["Astro Countdown"].Config and confirm:
- Paid
Enabledis true and Free is disabled. PrimaryDisplayPathpoints toWorkspace/Astro Countdown Paid.AuthorizedUserscontains your Roblox account information.DefaultUTCOffsetMinutesmatches the timezone normally used for commands.- The display offset, cube sizes and gaps suit the location.
- Studio cloud state remains disabled unless production access is deliberate.
Physical display
The renderer builds numbers, uppercase letters, colons, hyphens and spaces from reusable physical cubes. Most characters use a 3 by 5 pattern. Naturally wider letters such as M and W use wider patterns, while the renderer grows each reusable character pool only when needed.
The countdown automatically changes format:
DD:HH:MM:SSwhile days remain.HH:MM:SSbelow one day.MM:SSbelow one hour.- The configured ending message when time reaches zero.
CountdownCubeSize and UpdateTextCubeSize independently scale the two lines. Their supplied defaults are 1 and 0.7. CharacterGap controls normal character spacing, while ColonSideGap controls space on both sides of each colon.
Each complete character floats vertically and slightly in depth. Individual cubes rotate gently around their own centres. Horizontal drift is deliberately disabled so the character spacing stays stable.
The supplied cubes are anchored, non-colliding, non-querying and do not cast shadows. Disappearing cubes use a short shrink-and-fade animation.
Admin access
Add exact Roblox account pairs to Config:
Config.AuthorizedUsers = {
{ UserId = 123456789, Username = "ExactRobloxUsername" },
}
Both values must match the Player. A username change blocks access until Config is updated. AllowExperienceOwner can separately authorize the owner of a user-owned experience.
Unauthorized users receive no reply and cannot change the local draft or published countdown.
Commands
/countdown is the primary command and /count is its short alias.
Time and content
/countdown help
/countdown status
/countdown set 10pm tomorrow
/countdown set 6pm Friday
/countdown set 20:00 09/06/2027 +02:00
/countdown set text Update 21
/countdown set ending SOON
Cube sizing
/countdown size
/countdown set size countdown 1
/countdown set size text 0.7
Colours and gradients
/countdown set color countdown #FF6600
/countdown set color text 0,170,255
/countdown set gradient countdown static #FF0000 #FFFF00 #00FF00 direction 0
/countdown set gradient text moving #FF00FF #00FFFF direction 90 speed 1
/countdown set gradient countdown moving blue red direction 45 speed 0.5
/countdown set gradient countdown off
Draft control
/countdown stop
/countdown clear
/countdown cancel
/countdown push
/countdown push confirm
Modern chat intercepts these commands through TextChatCommand and displays replies only to the sender. Normal feedback is private, successful global pushes are shown in green and errors are shown in red.
Colours and gradients
Countdown and update text have independent visual settings. A solid colour may be supplied as a hex value, RGB value or supported colour name.
Static gradients distribute multiple colours across the display. Moving gradients travel through the cubes and loop from the final colour back to the first without a hard visual cutoff.
Gradient direction uses degrees:
0produces a horizontal direction.90produces a vertical direction.- Intermediate values create diagonal movement.
Moving-gradient speed is measured in seconds per cube. A speed of 1 moves a colour by one cube each second. Lower values move faster.
Physical tile colour comes from the selected solid colour or gradient. A stable spatial pattern adds mild dark and bright variations without flickering or replacing the chosen hue. TileMaterial defaults to SmoothPlastic. Outlines are configured but fully transparent by default; lower OutlineTransparency toward zero to make them visible.
Draft and publish
Commands first update a local draft preview in the current server. They do not modify other servers until the staged publish is completed.
- Set the target, update text, sizes, colours and gradients.
- Use
/countdown statusand inspect the local preview. - Run
/countdown pushto review the target and content. - Run
/countdown push confirmwithin 60 seconds.
Editing after requesting confirmation invalidates the request. /countdown cancel discards the draft and restores published state. To remove a published countdown, clear the draft and complete the same push confirmation sequence.
At zero, the countdown changes to the configured ending message and the update-text line hides by default. The finished state remains synchronized until a new state is published.
Global synchronization
Confirmed state is saved through DataStoreService.UpdateAsync, then broadcast to active servers with MessagingService. Each server performs a reconciliation read every 60 seconds to recover a missed best-effort message.
Every server derives its remaining time from the same Unix target timestamp. New public, reserved and VIP servers load the latest published state at startup. Players joining an existing server use that server’s current render and do not cause another DataStore read.
Studio is local-only while EnableStudioGlobalState is false. Commands and confirmed pushes can still be tested as local previews without touching live DataStore or MessagingService state.
Multiple displays and API
Register displays at startup with Config paths:
Config.AdditionalDisplayPaths = {
"Workspace/Lobby/Astro Countdown Paid",
"Workspace/SecondWorld/Astro Countdown Paid",
}
Each display needs a BasePart named AnchorPart. You can also register a model at runtime:
local API = require(
game.ServerScriptService["Astro Countdown"].CountdownAPI
)
API.RegisterDisplay(workspace.SecondDisplay)
Trusted server integrations may read and subscribe to state:
local state = API.GetState()
local connection = API.Subscribe(function(newState, source)
print(newState.updateText, newState.targetUnix, source)
end)
API.ApplyState changes the current server view for a trusted integration, but it does not perform a confirmed global push. Administrative global writes should continue through the command workflow or a purpose-built secured backend.
ReplicatedStorage.AstroCountdownPaidState exposes read-only attributes for custom LocalScripts, including target time, update text, ending text, cube sizes, rendered text, running state, revision and updater information. Clients never control publishing authority.
Configuration
| Setting group | Controls |
|---|---|
AuthorizedUsers, AllowExperienceOwner |
Command access |
DataStoreName, MessagingTopic, GlobalResyncSeconds |
Cross-server state |
PrimaryDisplayPath, AdditionalDisplayPaths |
Display registration |
BlockSize, cube sizes and gap settings |
Physical layout |
DisplayOffset, CenterDisplay |
Placement around AnchorPart |
| Material, outline and variation settings | Cube appearance |
| Rotation and float settings | Character motion |
| Gradient direction, speed and update rate | Animated colour behavior |
EyeMaxDistance, interval and pitch |
Player-facing display limits |
| Ending text and finished-state settings | Behavior at zero |
PrintStartupMessages, DebugLogging |
Output detail |
The supplied startup summary does not print configured usernames or UserIds. Disable it with PrintStartupMessages = false; use DebugLogging only when detailed runtime messages are needed.
External website control requires a secure backend using Roblox Open Cloud Data Stores and Messaging. Never expose an Open Cloud key or OAuth secret in a LocalScript or public website JavaScript.
Troubleshooting
The display does not generate
Confirm the Workspace model contains a BasePart named AnchorPart and that PrimaryDisplayPath matches. If BlockTemplate exists, it must also be a BasePart.
Commands do not respond
Check that Paid is enabled, Free is not handling the same aliases, and the UserId and current username both match the authorized pair.
Colours update but spacing looks wrong
Review CountdownCubeSize, UpdateTextCubeSize, CharacterGap, ColonSideGap and the base BlockSize. Use the local draft before publishing changes globally.
Studio does not synchronize globally
This is expected with the safe default EnableStudioGlobalState = false. Test global publishing inside a published test experience.
Another server shows an older state
Confirm the push was completed with /countdown push confirm. MessagingService normally updates active servers quickly, and the 60-second reconciliation read repairs a missed message.
