Skip to content

Let a site opt out of the shared-identity confirm - #349

Open
dmnyc wants to merge 5 commits into
mainfrom
feat/always-active-account
Open

dmnyc wants to merge 5 commits into
mainfrom
feat/always-active-account

Conversation

@dmnyc

@dmnyc dmnyc commented Sep 22, 2026

Copy link
Copy Markdown
Owner

What this does

For users who run one client and switch identity in Sidecar rather than in the client: a per-host opt-out that stops the "which account is posting" confirm on shared-identity hosts. The reasoning (from the requesting user) holds — Sidecar cannot see which slot the client has selected, and they are volunteering to keep the two in step themselves.

  • Off everywhere until turned on, scoped to one host. Host-scoped rather than account-scoped on purpose: the confirm exists because of the site's login shape, not because of any one identity.
  • The control lives in the shared-site sheet, styled as the exception it is — the only control there that turns a safety confirm off, carrying a warn-colored one-line note ("Skips the confirm. Posts may not match the client.") rather than a paragraph.
  • Copy is capped by tests, measured not judged, so a future edit can't quietly put the wrapping back at panel width.

Relation to #340

Issue #340 (filed separately) asks for the explanatory note around these confirms to be silenceable. This branch is the deeper lever for the same audience — it removes the confirm itself, per host, deliberately. They compose: this opt-out takes precedence where set, #340 only quiets the note elsewhere.

Testing

1605 tests green on the branch (main's suite plus test/always-active-account.test.js). Merges cleanly into current main; overlaps PR #341 only in sidepanel.js/styles.css regions far from the composer, so whichever lands first rebases trivially.

Asked for by a user who runs one client, switches identity in Sidecar rather than
in the client, and would rather Sidecar sign as whatever is active than be asked
every time. Their reasoning holds: Sidecar cannot see which slot the client has
selected, and they are volunteering to keep the two in step themselves.

Off everywhere until turned on, and scoped to ONE HOST. Host-scoped rather than
per account is not an implementation detail: "do not ask me which account on this
host" is a claim about the host, and storing it per account would let A opt out
while B had not, on the one host where the whole point is that they share it.

IT SUPPRESSES THE CONFIRM AND NOTHING ELSE, which took two goes. sharedHost
drives both the shared-identity confirm and appDataAutoAllow, so the first cut
cleared sharedHost and would have made app-data signs start asking. More prompts
rather than fewer, exactly backwards. It gates sharedIdentity instead, and a test
pins that sharedHost is left alone.

It is also not a different choice, only a skipped question: the swap to the
global active account already ran before this existed and still runs either way,
and a block on the account it swaps to is still honored.

The row says what it costs in the same breath as what it saves, because a setting
that removes a safety prompt reads as a convenience toggle otherwise. Forgetting
a site, singly or in bulk, forgets this with it: an erased host must not keep a
standing instruction to skip the check.
The row borrowed .tg-input, .tg-track and .tg-thumb, which live in content.js's
CARD_CSS and do not exist in the panel stylesheet at all. So the switch rendered
as a bare browser checkbox and the two empty spans drew nothing. Nesting the
explanation inside the row on top of that squeezed it to one word per line.

The panel's own idiom is a .toggle-row carrying the switch and its label, with
the explanation as a SIBLING paragraph beneath, which is how every other setting
in here is built. This uses that, which also means it inherits the accent color
and the disabled state for free, and the stylesheet drops to a separator and its
spacing.

The toggle disables itself while the write is in flight, matching the dev
controls, so a fast second click cannot race the first.

Pinned: a test now fails if any of those four page-card class names come back.
As a plain checkbox row it read as one more preference, which is the wrong weight
for the only control in that sheet that turns a safety confirm off.

Tinted with .kind-warn's construction, --warn-rgb at 0.1 over a 0.3 border, since
this is the same class of thing that pattern already exists for: not a setting,
an exception the user is deliberately making. The label stays in --text so it
stays comfortably legible, and the consequence carries the warn color, because
that sentence is the reason the row is there at all.
Three things were wrong and they had one cause: it was built as its own thing
rather than as another row in a sheet that already had rows.

The leading checkbox pushed the wrapped label into a ragged indent. It sits at
the right edge now, with the text in the left column, which is exactly what the
account rows above it do.

The tint made a box inside a box. It carries a top rule instead, so it still
reads as a separate decision from the list without becoming its own panel. The
weight comes from the warn-colored note and the warn accent on the control.

And the explanation was a paragraph of small type repeating what the paragraph at
the top of the sheet already said. One line now, capped by a test so it cannot
grow back: "Skips the confirm. Posts may not match the client."
Three rewrites kept moving the layout when the problem was the strings. At this
width the text column is about 240px with the control at the right edge, so a
label over roughly 26 characters wraps and orphans its last word. The label was
38 and the note was 49, which is four lines of text beside one small checkbox.

  "Always sign as Sidecar's active account"  ->  "Don't ask which account"
  "Skips the confirm. Posts may not match the client."
                                             ->  "Posts may not match the client."

The sheet's opening paragraph went the same way: 275 characters over six lines,
describing what the list directly underneath it already shows. It is 103 now and
says the two things a reader needs, which are why the confirms are happening and
what stops them.

Every one of those strings is now capped by a test, measured rather than judged,
so the next edit cannot quietly put the wrapping back.
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