Skip to content

Feat/team sync - #13

Merged
Zeikrom251 merged 23 commits into
mainfrom
feat/team-sync
Oct 8, 2026
Merged

Zeikrom251 merged 23 commits into
mainfrom
feat/team-sync

Conversation

@Zeikrom251

Copy link
Copy Markdown
Owner

No description provided.

Sign-in goes through the website with PKCE; the token stays in the OS
credential store and every API call is made in Rust, never by the
webview. Changes are saved locally, queued in the session file and sent
in order with an opId; the league's changes arrive as live events, and
one PC can stream its timing to the others.
Welcome, browser sign-in, subscription request, league picker and the
Team page, plus the sync state in the status bar, the league in the
title bar and Settings → Account to download or delete your data.
# Conflicts:
#	apps/desktop/src-tauri/src/incidents/mod.rs
The API is served on the website's own origin, so a release build has one
production address for both the sign-in pages and the API.
explorer.exe took the sign-in link for a folder and opened Documents, and
Windows never saw the dev build's Linux registration of stewardpad://.
Under WSL the app now opens links with rundll32.exe, registers the scheme
for the Windows user too (started through wsl.exe --exec), and reads a
link Windows handed over with a slash before its query.
Staff write it in Markdown in the back office; the app showed the source.
It is now rendered from marked's tokens as React elements, like the
website's preview: no HTML string is injected, and a link shows as its
text so a click can't take the app's window elsewhere.
reviewedBy named whoever edited last; reviewers keeps everyone who claimed
or edited the incident, in order. It is never typed, so it leaves the
editable fields.
A steward claims an incident to say they're on it; editing it claims it
too, and each steward removes only their own claim, so everyone who worked
on a decision is listed. The inspector and the Review page get Claim and
Unclaim, the incident lists show the stewards' initials, and the CSVs, the
Discord post and the decisions document list every name. In a league,
claims are claim/unclaim outbox operations, and an unsent claim stays on
top of a teammate's newer copy. Older files' single reviewedBy reads as
the first claim.
@Zeikrom251 Zeikrom251 self-assigned this Oct 7, 2026
A release build refused to start a stream from the simulator, but a
streamer could switch to it afterwards and the league then watched its
invented grid. No frame leaves a release build unless the source is the
game, and switching away ends the stream at once rather than leaving
teammates on a frozen clock until the API drops it.
… game

A teammate's stream replaces this PC's own data source, yet the status
bar gave both the same green dot. The standings now say where their
timing comes from (board 05), and the league's stream is blue in both
places.
A change refused for good (a closed session) left the queue, and the
next teammate edit of that incident overwrote it. It now stays on top
of the league's copy until this PC changes those fields again.

An answer the app couldn't read counted as offline and was sent again
forever, and a change the API keeps answering 500 to held up every
change behind it: the first now counts as sent, the second is kept on
this PC after about 8 minutes. A child the league deleted leaves an
unsent merge instead of getting the whole merge refused, and a field
that no longer fits no longer loses the others with it.
Signing out dropped every change not yet sent, with no way back. The
link now stays, as it does when a sign-in expires: signing in again
sends the queue, and another account still starts afresh, told how
many of the previous account's changes stay on this PC only.
Any 404 while loading made the app think it had left the league: a
session deleted while this PC was offline unlinked it and wiped its
queue. Only the league's own endpoints mean that now; a missing session
just unlinks the session.

A listener from before a league or session switch could still land its
snapshot (deleting the new session's incidents here) or its revisions
(skipping events): each listener now follows the league it started in,
and a snapshot applies only to the session it was read for. A
connection that ends at once backs off instead of reconnecting in a
tight loop, and a broken read or a failed roster refresh is logged
without the API's body.
The last streamed clock, standings and 'connected' stayed after a
stream ended, which also let this PC start a stream without the game.
They go now when the watched stream ends (live, or while away), and
another stream ending leaves the watched one alone. Leaving the league
or switching session while streaming ends the stream for the league at
once, and a sign-out during frame uploads signs the app out instead of
claiming the stream ended.
A PC that joined late didn't know which LMU contacts the league held,
so its own feed could bring back one a head steward had deleted. Every
league copy, deleted ones included, now marks its contact as seen.
An archive was a copy of the session file, so it kept the steward's
user id, the league and every change not yet sent, for good. It is now
written from the incidents alone.
Without a state, a stewardpad://signed-in link was taken as the answer
to whatever sign-in this window had started. PKCE already made a
stranger's code useless; the link must now name its own sign-in too.
Claims are shown by display name, and an unclaim removed every steward
with that name until the league's copy came back.
The development link handler wrote the distro and build path into one
registry command string; a quote in either could break out of it.
@Zeikrom251
Zeikrom251 merged commit 26f4181 into main Oct 8, 2026
2 checks passed
@Zeikrom251
Zeikrom251 deleted the feat/team-sync branch October 8, 2026 23:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant