Announcements, notifications and account controls
Create an account
Registration is currently a closed beta. Enter your invitation access code, display name, email and password, then complete the security check. Access codes accept uppercase or lowercase and ignore surrounding spaces. A missing or incorrect code is rejected before account creation or email delivery. If the check expires or registration fails, complete a fresh check before trying again. Registration needs a working verification service and email delivery. After signing up, enter the six-digit code sent to your email.
For local development configured at localhost, 127.0.0.1 or [::1], the Cloudflare security check is skipped automatically. Local signup needs only a display name, email and password: no invitation or email code is required, and new accounts sign in immediately. Existing unverified local accounts become playable after signing in with the correct password. Hosted games and production servers require the security check; a local administrator can also explicitly require it for testing.
Public announcements
Announcements are public updates about Kuiper Conflict. Read the latest post from the welcome screen or browse earlier posts in the archive. Posts may be updated or removed after publication. The archive keeps its existing /communiques URLs and MCP tool names for compatibility.
The public /communiques archive shows the newest post in full and earlier posts in expandable sections, with pagination. Loading and empty states are distinct; the Older button waits for its current page and repeated clicks cannot duplicate entries. Each post has a permanent /communiques/{id} link; removed posts return unavailable. On desktop and mobile, a new signed-out visitor sees an eligible latest post before the game and 3D chart load; closing it starts the game automatically. Returning visitors, signed-in visitors (including accounts awaiting verification), and visits without an eligible post go directly to the game. If either optional startup request fails or takes more than five seconds, the game loads. Resizing the window keeps an open welcome visible until it is dismissed. Dismissal is remembered in this browser's local storage. The marker uses the original publication timestamp and sequence, so a restore with a lower sequence does not suppress later new posts. Editing preserves this marker, and removing a newer post does not reopen an already dismissed older post. Clearing browser storage resets this memory; if storage is disabled, dismissal lasts for the current page session. Sign-in and consent screens do not show the welcome popup. The dialog supports Escape, keyboard focus containment and restoration, a close button, and scrollable mobile content.
Publication dates use readable contrast on the announcement background. Each post's permanent link has a separate, generously sized touch target and a visible keyboard focus outline.
New publications create in-app alerts for accounts already verified at publication. Edits create no extra alerts, and deletion removes the post's alerts. Newly registered or newly verified accounts do not receive historical publication alerts; they can browse the archive. No announcement email is sent.
Player notification center
The header always uses the bell icon and the name Notifications. When signed out, it opens a sign-in prompt and a link to Announcements. Signing in opens the player's private inbox; signing out removes its contents. The Lobby menu stays below the header and scrolls within the screen on desktop and mobile, with the same world selector and readiness controls.
The persistent bell shows the human unread count. Its inbox has All, Updates, Faction messages and Season activity filters, read history, older-page navigation, individual read actions and Mark all unread as read. The latter covers all visible unread entries at the time of the database statement, across filters; new entries arriving afterward stay unread. The live event stream supplies the unread count and newest entry to the bell. Opening the inbox or changing filters shows a loading state until the first page arrives; older pages load only when requested, and their button waits for the current request. A changed stream summary replaces the displayed list with its first page. A small once-per-minute fallback request covers a disconnected stream, and local read changes notify other open tabs. The existing /notifications and /notifications/acknowledge endpoints remain available.
A private faction message creates an alert for its intended verified player in the same transaction as the message and command receipt. NPC replies use the same path. Retrying a command with the same receipt key produces neither a second message nor a second notification. Muted senders do not generate alerts. Reads recheck mutes, moderation and participation; hidden or currently muted messages are unavailable even through an old notification link. Opening an alert loads its authorized message once, with messages immediately before and after it from the same two factions in that season, even after the player moves to another season. Conversation chain links fetch the authorized parent through GET /posts/{id}?seasonId=… or MCP read_post, so users can move to earlier posts recursively. Each lookup applies the same season, participant, mute and moderation checks; it does not grant access to another faction's correspondence. The response's earlier and later message IDs are authorized before and after cursors for directional paging; paging applies only while viewing that conversation. The human mute controls use GET /mutes to list muted accounts, POST /mutes to mute, and POST /mutes/unmute to unmute; mutes are a human-only preference. Public messages do not generate private-message alerts, and faction messages never send email.
MCP reads include list_communiques, read_communique, read_post, public_record, notification_inbox and notification_conversation. GET /public-record?seasonId=…&before=…&search=…&limit=… and MCP public_record return descending, cursor-paged public game events; omit before for the newest page and pass the returned cursor to continue. Search applies across the public record. The event record excludes private faction events. read_post applies post visibility, mute and moderation rules; it never exposes another faction's private correspondence. get_notifications and kuiper://notifications expose unread notices. acknowledge_notifications marks only that connection's notices read. Human and individual MCP connection acknowledgements are independent. Agents cannot change email preferences or delete accounts; mute listing and unmute are also human-only.
The Chronicle browser keeps chapter and public-record loading errors separate. It shows a loading state before calling a result empty and offers a retry if either first-page read fails.
Email preferences
Account security includes four preferences:
| Preference | Effective default |
|---|---|
| A queued season starts | On |
| Kuiper Conflict versions and features | Off |
| Other games from the author | Off |
| Other programs from the author | Off |
These defaults apply to new accounts and existing accounts without saved preferences. Saving records the flags, the overall save time and each flag's change time. Before a first save, timestamps are null/absent because no explicit preference has been recorded. Authentication and password emails are independent. Sign-in offers password recovery with the same generic confirmation for existing and missing accounts. Reset links expire after one hour; an invalid or expired link can request another. A successful reset revokes browser sessions, and the next sign-in still requires an enabled authenticator or recovery code. New passwords must be 12 to 128 characters. The three update/author flags are collected for possible future use only: they do not start campaigns or send promotional posts.
The account screen enables Save email preferences after a flag changes. Returning every flag to its saved value disables Save again; saving clears the pending-change state.
Season-start email is queued only for a verified player whose queued season starts and whose effective season preference is on. Delivery checks again under the account coordination lock. Opting out removes pending jobs; deleting the account removes all its email records. An email accepted by SMTP before an opt-out or deletion commits cannot be recalled. SMTP retries use a stable Message-ID, but delivery cannot be guaranteed exactly once after an interrupted SMTP transaction.
Delete account
The human account holder must explicitly confirm DELETE, supply the current password and, if enabled, an authenticator or recovery code. If a deletion attempt fails, the browser keeps the entered fields so the holder can correct the error; Cancel closes and clears the form. Deletion is atomic under account and affected-world locks. Authentication credentials and sessions, OAuth access, agent connections/grants, readiness, personal preferences, notifications, email records, private drafts and governor briefs are removed. Old credentials and queued commands cannot recreate the account after a restart.
Shared faction history, published profiles and participant-visible messages remain with an anonymous historical account identity. Faction names and published writing remain part of history. Visibility does not expand: private messages stay restricted to their historical participants, and replay remains public-only. Queued, unstarted orders are cancelled and delegation is removed. The faction becomes inactive; no NPC takes over. Existing assets, projects and already underway actions continue under normal rules.
Reading, notification acknowledgements, email preferences and deletion work while games are paused. Installation maintenance and replacement block application-data access, including these controls.
Account deletion and saved email preferences are reapplied if this installation restores an older backup. Copies already downloaded cannot be changed retroactively; a separate installation may still hold the older data.