feat(base,app)!: GitHub signs nobody in any more (ADR 0020, D36)

Every account signs in with SimpleLogin or a password now, so GitHub
goes from the module, the shared app package, Learn and Todo, ahead of
ADR 0017's GITHUB_SIGN_IN_ENDS.

- halkyon_base: no `gitHubSignIn` endpoint, GitHub identity provider or
  GitHub refusals; no `githubClientId`/`githubClientSecret`, no
  `GITHUB_SIGN_IN_ENDS` and no `forgetGitHubAccounts`; the register
  loses `account-with-github`. `SignInWays.gitHub`, the basics'
  `gitHubClientId` and `gitHubSignInEnds`, and `PasswordRefusal`'s
  `signInAgain` and `noAddress` go. A first password takes a code
  mailed to the person's own address; an account without one sets none
  (`wrongCredentials`).
- Learn's server: `instance.info()` without `gitHubClientId`, the
  pruning without GitHub, and `minimumAppBuild` 24, as builds up to 23
  (v0.20.0) require `SignInWays.gitHub`: the server deploys with the
  release of build 24.
- halkyon_app: no GitHub button or problems on the start screen, no
  password offered after a GitHub sign-in, and `ServerpodAuthGateway`
  without the browser half only GitHub used (`(client, base:)`). The
  account section offers a first password only to an account with an
  address. `LoopbackWebAuth` and the apps' schemes stay, SimpleLogin's
  ways back.
- Learn's Profile lists no GitHub; the texts go (English, German).
- Serverpod's `serverpod_auth_idp_github_account` stays, as its
  migrations make it; a row goes with its account, and ADR 0020's D36
  gives operators the SQL to delete those left.
- deploy/: compose.yaml and .env.example without GitHub. The READMEs,
  AGENTS.md files and ADR 0017 amended.

BREAKING CHANGE: builds up to 23 can't read the instance's answers
about an account's ways in; minimumAppBuild is 24.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-25 12:52:52 +01:00
commit 4e33133733
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 564 additions and 3570 deletions

View file

@ -44,13 +44,6 @@
"personDataFailed": "Die Daten dieses Geräts konnten nicht geöffnet werden.",
"startSignedOut": "Abgemeldet",
"startOn": "Starte auf {instance}:",
"startWithGitHub": "Mit GitHub anmelden",
"startGitHubFailed": "Anmeldung mit GitHub fehlgeschlagen.",
"startNoGitHubAccount": "Kein Konto hier meldet sich mit diesem GitHub-Konto an.",
"gitHubCreateAccountInstead": "Erstelle stattdessen ein Konto mit deiner E-Mail-Adresse und einem Passwort.",
"gitHubSimpleLoginInstead": "Mit SimpleLogin kannst du stattdessen eins erstellen.",
"gitHubUsePassword": "Dieses Konto meldet sich jetzt mit seiner E-Mail-Adresse und seinem Passwort an, nicht mehr mit GitHub.",
"gitHubEnded": "Die Anmeldung mit GitHub ist auf dieser Instanz beendet.",
"startOtherInstance": "Andere Instanz verwenden",
"startNoWay": "{instance} bietet keinen Weg, ein Konto zu erstellen.",
"syncTitle": "Synchronisierung",
@ -70,7 +63,6 @@
"syncMismatchMore": "Mehr",
"startSignIn": "Anmelden",
"startCreateAccount": "Konto erstellen",
"startGitHubEnds": "Die Anmeldung mit GitHub endet am {date}.",
"passwordAddress": "E-Mail-Adresse",
"passwordPassword": "Passwort",
"passwordNewPassword": "Neues Passwort",
@ -158,7 +150,6 @@
"passwordResetStarted": "Dein Konto kann ab dem {date} zurückgesetzt werden. Wir haben dir eine E-Mail geschickt: Warst du es nicht, melde dich vorher mit deinem Passwort an, um es zu stoppen.",
"passwordSectionTitle": "Passwort und Authenticator",
"passwordSectionFailed": "Wie dein Konto sich anmeldet, konnte nicht gelesen werden.",
"passwordSectionGitHubEnds": "Die Anmeldung mit GitHub endet am {date}. Richte bis dahin ein Passwort ein, um dein Konto zu behalten.",
"passwordSectionSetUp": "Passwort einrichten",
"passwordSectionSetUpHint": "Melde dich mit deiner E-Mail-Adresse, einem Passwort und einer Authenticator-App an.",
"passwordSectionUnfinished": "Fertig einrichten: Authenticator hinzufügen",
@ -189,7 +180,6 @@
"passwordNoReset": "Für diese Adresse wartet kein Zurücksetzen.",
"passwordExists": "Das Konto dieser Adresse hat schon ein Passwort. Melde dich damit an oder komm zurück in dein Konto, falls du es vergessen hast.",
"passwordAddressTaken": "Diese Adresse gehört zu einem anderen Konto.",
"passwordNoAddress": "Dein Konto hat noch keine E-Mail-Adresse.",
"passwordNoPassword": "Dieses Konto hat kein Passwort.",
"passwordWrongCode": "Dieser Code stimmt nicht. Gib den ein, den deine App gerade zeigt.",
"passwordLastAuthenticator": "Dein letzter Authenticator kann nicht weg: Jede Anmeldung braucht einen.",
@ -220,11 +210,6 @@
"passwordAddressUnknown": "Gib die E-Mail-Adresse deines Kontos ein: Dorthin geht der Code.",
"passwordDeleteIntroByMail": "Dein Konto wird mit allem darin gelöscht, in jedem Dienst dieser Instanz. Keiner seiner Authenticators funktioniert gerade, daher bestätigt es ein Code per E-Mail: Gib dein Passwort ein, dann den Code, den wir an deine Adresse schicken.",
"passwordDeleteSendCode": "Code per E-Mail schicken",
"passwordSignInAgain": "Um einem Konto, das sich mit GitHub anmeldet, ein Passwort zu geben, melde dich erst wieder mit GitHub an: Es ist mehr als ein paar Minuten her.",
"passwordSignInWithGitHubAgain": "Wieder mit GitHub anmelden",
"passwordOfferTitle": "Richte ein Passwort ein",
"passwordOfferBody": "Die Anmeldung mit GitHub endet. Richte ein Passwort und eine Authenticator-App ein, um dein Konto zu behalten.",
"passwordOfferLater": "Später",
"passwordAuthenticatorPasswordIntro": "Bestätige zum Hinzufügen mit deinem Passwort, dass du es bist.",
"passwordWarningTitle": "Jemand hat dein Passwort ausprobiert",
"passwordWarningBody": "Am {date} hat ein bei deinem Konto angemeldetes Gerät zehnmal hintereinander ein falsches Passwort oder einen falschen Code gesendet und wurde abgemeldet. Warst du das nicht, hat vielleicht jemand anderes dieses Gerät oder seine Sitzung: Ändere dein Passwort.",
@ -236,7 +221,6 @@
"passwordResetsCallOff": "Absagen",
"passwordCallOffTitle": "Zurücksetzen absagen",
"passwordCallOffIntro": "Dein Passwort und ein Code sagen jedes anstehende Zurücksetzen ab.",
"passwordSectionGitHubEndsDeletes": "Die Anmeldung mit GitHub endet am {date}. Richte bis dahin ein Passwort ein: Ein Konto ohne wird 30 Tage später mit allem darin gelöscht.",
"passwordSignedInBefore": "Nur ein seitdem angemeldetes Gerät kann diese Warnung ausblenden: Melde dich auf diesem neu an oder ändere dein Passwort.",
"simpleLoginContinue": "Weiter mit SimpleLogin",
"simpleLoginNote": "SimpleLogin ist die Anmeldung von Proton, und ein Proton-Konto funktioniert dort auch. SimpleLogin erfährt, dass du {instance} nutzt, und {instance} speichert nur deine SimpleLogin-ID: Dein Name schlägt einmal ein Handle vor, sonst wird nichts gespeichert.",

View file

@ -154,19 +154,6 @@
}
}
},
"startWithGitHub": "Sign in with GitHub",
"startGitHubFailed": "Couldn't sign in with GitHub.",
"startNoGitHubAccount": "No account here signs in with this GitHub account.",
"gitHubCreateAccountInstead": "Create an account with your email address and a password instead.",
"@gitHubCreateAccountInstead": {
"description": "Said after a GitHub account nobody on the instance signs in with, where people sign in with a password and GitHub is added to nobody (ADR 0017)."
},
"gitHubSimpleLoginInstead": "Continue with SimpleLogin to create one instead.",
"@gitHubSimpleLoginInstead": {
"description": "Said after a GitHub account nobody on the instance signs in with, where the instance offers SimpleLogin (ADR 0020): GitHub makes no account."
},
"gitHubUsePassword": "This account signs in with its email address and password now, not with GitHub.",
"gitHubEnded": "Sign-in with GitHub has ended on this instance.",
"startOtherInstance": "Use another instance",
"startNoWay": "{instance} offers no way to create an account.",
"@startNoWay": {
@ -229,14 +216,6 @@
"syncMismatchMore": "More",
"startSignIn": "Sign in",
"startCreateAccount": "Create an account",
"startGitHubEnds": "Sign-in with GitHub ends on {date}.",
"@startGitHubEnds": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordAddress": "Email address",
"passwordPassword": "Password",
"passwordNewPassword": "New password",
@ -394,14 +373,6 @@
},
"passwordSectionTitle": "Password and authenticator",
"passwordSectionFailed": "Couldn't read how your account signs in.",
"passwordSectionGitHubEnds": "Sign-in with GitHub ends on {date}. Set up a password before then to keep your account.",
"@passwordSectionGitHubEnds": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordSectionSetUp": "Set up a password",
"passwordSectionSetUpHint": "Sign in with your email address, a password and an authenticator app.",
"passwordSectionUnfinished": "Finish setting up: add an authenticator",
@ -446,7 +417,6 @@
"passwordNoReset": "No reset waits for this address.",
"passwordExists": "This address's account has a password already. Sign in with it, or get back in if you've forgotten it.",
"passwordAddressTaken": "This address belongs to another account.",
"passwordNoAddress": "Your account has no email address yet.",
"passwordNoPassword": "This account has no password.",
"passwordWrongCode": "This code isn't right. Enter the one your app shows now.",
"passwordLastAuthenticator": "Your last authenticator can't go: every sign-in needs one.",
@ -498,11 +468,6 @@
"passwordAddressUnknown": "Enter your account's email address: the code goes there.",
"passwordDeleteIntroByMail": "Your account goes with everything in it, in every service of this instance. None of its authenticators works now, so a code by mail confirms it: type your password, then the code we email to your address.",
"passwordDeleteSendCode": "Email me a code",
"passwordSignInAgain": "To give an account that signs in with GitHub its password, sign in with GitHub again first: it has been more than a few minutes.",
"passwordSignInWithGitHubAgain": "Sign in with GitHub again",
"passwordOfferTitle": "Set up a password",
"passwordOfferBody": "Sign-in with GitHub is ending. Set up a password and an authenticator app to keep your account.",
"passwordOfferLater": "Later",
"passwordAuthenticatorPasswordIntro": "To add it, confirm it is you with your password.",
"passwordWarningTitle": "Someone tried your password",
"passwordWarningBody": "On {date}, a device signed in to your account sent a wrong password or code ten times in a row, and was signed out. If that wasn't you, someone else may have that device or its session: change your password.",
@ -535,14 +500,6 @@
"passwordResetsCallOff": "Call it off",
"passwordCallOffTitle": "Call off the reset",
"passwordCallOffIntro": "Your password and a code call off every reset waiting.",
"passwordSectionGitHubEndsDeletes": "Sign-in with GitHub ends on {date}. Set up a password before then: an account without one is deleted 30 days later, with everything in it.",
"@passwordSectionGitHubEndsDeletes": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"passwordSignedInBefore": "Only a device signed in since then can dismiss this warning: sign in again on this one, or change your password.",
"simpleLoginContinue": "Continue with SimpleLogin",
"simpleLoginNote": "SimpleLogin is Proton's sign-in, and a Proton account works there too. It learns that you use {instance}, which keeps only your SimpleLogin ID: your name suggests a handle once, and nothing else is kept.",

View file

@ -367,48 +367,6 @@ abstract class HalkyonAppLocalizations {
/// **'Start on {instance}:'**
String startOn(String instance);
/// No description provided for @startWithGitHub.
///
/// In en, this message translates to:
/// **'Sign in with GitHub'**
String get startWithGitHub;
/// No description provided for @startGitHubFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t sign in with GitHub.'**
String get startGitHubFailed;
/// No description provided for @startNoGitHubAccount.
///
/// In en, this message translates to:
/// **'No account here signs in with this GitHub account.'**
String get startNoGitHubAccount;
/// Said after a GitHub account nobody on the instance signs in with, where people sign in with a password and GitHub is added to nobody (ADR 0017).
///
/// In en, this message translates to:
/// **'Create an account with your email address and a password instead.'**
String get gitHubCreateAccountInstead;
/// Said after a GitHub account nobody on the instance signs in with, where the instance offers SimpleLogin (ADR 0020): GitHub makes no account.
///
/// In en, this message translates to:
/// **'Continue with SimpleLogin to create one instead.'**
String get gitHubSimpleLoginInstead;
/// No description provided for @gitHubUsePassword.
///
/// In en, this message translates to:
/// **'This account signs in with its email address and password now, not with GitHub.'**
String get gitHubUsePassword;
/// No description provided for @gitHubEnded.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub has ended on this instance.'**
String get gitHubEnded;
/// No description provided for @startOtherInstance.
///
/// In en, this message translates to:
@ -523,12 +481,6 @@ abstract class HalkyonAppLocalizations {
/// **'Create an account'**
String get startCreateAccount;
/// No description provided for @startGitHubEnds.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub ends on {date}.'**
String startGitHubEnds(String date);
/// No description provided for @passwordAddress.
///
/// In en, this message translates to:
@ -1051,12 +1003,6 @@ abstract class HalkyonAppLocalizations {
/// **'Couldn\'t read how your account signs in.'**
String get passwordSectionFailed;
/// No description provided for @passwordSectionGitHubEnds.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub ends on {date}. Set up a password before then to keep your account.'**
String passwordSectionGitHubEnds(String date);
/// No description provided for @passwordSectionSetUp.
///
/// In en, this message translates to:
@ -1237,12 +1183,6 @@ abstract class HalkyonAppLocalizations {
/// **'This address belongs to another account.'**
String get passwordAddressTaken;
/// No description provided for @passwordNoAddress.
///
/// In en, this message translates to:
/// **'Your account has no email address yet.'**
String get passwordNoAddress;
/// No description provided for @passwordNoPassword.
///
/// In en, this message translates to:
@ -1423,36 +1363,6 @@ abstract class HalkyonAppLocalizations {
/// **'Email me a code'**
String get passwordDeleteSendCode;
/// No description provided for @passwordSignInAgain.
///
/// In en, this message translates to:
/// **'To give an account that signs in with GitHub its password, sign in with GitHub again first: it has been more than a few minutes.'**
String get passwordSignInAgain;
/// No description provided for @passwordSignInWithGitHubAgain.
///
/// In en, this message translates to:
/// **'Sign in with GitHub again'**
String get passwordSignInWithGitHubAgain;
/// No description provided for @passwordOfferTitle.
///
/// In en, this message translates to:
/// **'Set up a password'**
String get passwordOfferTitle;
/// No description provided for @passwordOfferBody.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub is ending. Set up a password and an authenticator app to keep your account.'**
String get passwordOfferBody;
/// No description provided for @passwordOfferLater.
///
/// In en, this message translates to:
/// **'Later'**
String get passwordOfferLater;
/// No description provided for @passwordAuthenticatorPasswordIntro.
///
/// In en, this message translates to:
@ -1519,12 +1429,6 @@ abstract class HalkyonAppLocalizations {
/// **'Your password and a code call off every reset waiting.'**
String get passwordCallOffIntro;
/// No description provided for @passwordSectionGitHubEndsDeletes.
///
/// In en, this message translates to:
/// **'Sign-in with GitHub ends on {date}. Set up a password before then: an account without one is deleted 30 days later, with everything in it.'**
String passwordSectionGitHubEndsDeletes(String date);
/// No description provided for @passwordSignedInBefore.
///
/// In en, this message translates to:

View file

@ -175,32 +175,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
return 'Starte auf $instance:';
}
@override
String get startWithGitHub => 'Mit GitHub anmelden';
@override
String get startGitHubFailed => 'Anmeldung mit GitHub fehlgeschlagen.';
@override
String get startNoGitHubAccount =>
'Kein Konto hier meldet sich mit diesem GitHub-Konto an.';
@override
String get gitHubCreateAccountInstead =>
'Erstelle stattdessen ein Konto mit deiner E-Mail-Adresse und einem Passwort.';
@override
String get gitHubSimpleLoginInstead =>
'Mit SimpleLogin kannst du stattdessen eins erstellen.';
@override
String get gitHubUsePassword =>
'Dieses Konto meldet sich jetzt mit seiner E-Mail-Adresse und seinem Passwort an, nicht mehr mit GitHub.';
@override
String get gitHubEnded =>
'Die Anmeldung mit GitHub ist auf dieser Instanz beendet.';
@override
String get startOtherInstance => 'Andere Instanz verwenden';
@ -278,11 +252,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get startCreateAccount => 'Konto erstellen';
@override
String startGitHubEnds(String date) {
return 'Die Anmeldung mit GitHub endet am $date.';
}
@override
String get passwordAddress => 'E-Mail-Adresse';
@ -597,11 +566,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
String get passwordSectionFailed =>
'Wie dein Konto sich anmeldet, konnte nicht gelesen werden.';
@override
String passwordSectionGitHubEnds(String date) {
return 'Die Anmeldung mit GitHub endet am $date. Richte bis dahin ein Passwort ein, um dein Konto zu behalten.';
}
@override
String get passwordSectionSetUp => 'Passwort einrichten';
@ -713,9 +677,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
String get passwordAddressTaken =>
'Diese Adresse gehört zu einem anderen Konto.';
@override
String get passwordNoAddress => 'Dein Konto hat noch keine E-Mail-Adresse.';
@override
String get passwordNoPassword => 'Dieses Konto hat kein Passwort.';
@ -834,23 +795,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get passwordDeleteSendCode => 'Code per E-Mail schicken';
@override
String get passwordSignInAgain =>
'Um einem Konto, das sich mit GitHub anmeldet, ein Passwort zu geben, melde dich erst wieder mit GitHub an: Es ist mehr als ein paar Minuten her.';
@override
String get passwordSignInWithGitHubAgain => 'Wieder mit GitHub anmelden';
@override
String get passwordOfferTitle => 'Richte ein Passwort ein';
@override
String get passwordOfferBody =>
'Die Anmeldung mit GitHub endet. Richte ein Passwort und eine Authenticator-App ein, um dein Konto zu behalten.';
@override
String get passwordOfferLater => 'Später';
@override
String get passwordAuthenticatorPasswordIntro =>
'Bestätige zum Hinzufügen mit deinem Passwort, dass du es bist.';
@ -892,11 +836,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
String get passwordCallOffIntro =>
'Dein Passwort und ein Code sagen jedes anstehende Zurücksetzen ab.';
@override
String passwordSectionGitHubEndsDeletes(String date) {
return 'Die Anmeldung mit GitHub endet am $date. Richte bis dahin ein Passwort ein: Ein Konto ohne wird 30 Tage später mit allem darin gelöscht.';
}
@override
String get passwordSignedInBefore =>
'Nur ein seitdem angemeldetes Gerät kann diese Warnung ausblenden: Melde dich auf diesem neu an oder ändere dein Passwort.';

View file

@ -173,31 +173,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
return 'Start on $instance:';
}
@override
String get startWithGitHub => 'Sign in with GitHub';
@override
String get startGitHubFailed => 'Couldn\'t sign in with GitHub.';
@override
String get startNoGitHubAccount =>
'No account here signs in with this GitHub account.';
@override
String get gitHubCreateAccountInstead =>
'Create an account with your email address and a password instead.';
@override
String get gitHubSimpleLoginInstead =>
'Continue with SimpleLogin to create one instead.';
@override
String get gitHubUsePassword =>
'This account signs in with its email address and password now, not with GitHub.';
@override
String get gitHubEnded => 'Sign-in with GitHub has ended on this instance.';
@override
String get startOtherInstance => 'Use another instance';
@ -274,11 +249,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get startCreateAccount => 'Create an account';
@override
String startGitHubEnds(String date) {
return 'Sign-in with GitHub ends on $date.';
}
@override
String get passwordAddress => 'Email address';
@ -584,11 +554,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
String get passwordSectionFailed =>
'Couldn\'t read how your account signs in.';
@override
String passwordSectionGitHubEnds(String date) {
return 'Sign-in with GitHub ends on $date. Set up a password before then to keep your account.';
}
@override
String get passwordSectionSetUp => 'Set up a password';
@ -697,9 +662,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get passwordAddressTaken => 'This address belongs to another account.';
@override
String get passwordNoAddress => 'Your account has no email address yet.';
@override
String get passwordNoPassword => 'This account has no password.';
@ -816,23 +778,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get passwordDeleteSendCode => 'Email me a code';
@override
String get passwordSignInAgain =>
'To give an account that signs in with GitHub its password, sign in with GitHub again first: it has been more than a few minutes.';
@override
String get passwordSignInWithGitHubAgain => 'Sign in with GitHub again';
@override
String get passwordOfferTitle => 'Set up a password';
@override
String get passwordOfferBody =>
'Sign-in with GitHub is ending. Set up a password and an authenticator app to keep your account.';
@override
String get passwordOfferLater => 'Later';
@override
String get passwordAuthenticatorPasswordIntro =>
'To add it, confirm it is you with your password.';
@ -874,11 +819,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
String get passwordCallOffIntro =>
'Your password and a code call off every reset waiting.';
@override
String passwordSectionGitHubEndsDeletes(String date) {
return 'Sign-in with GitHub ends on $date. Set up a password before then: an account without one is deleted 30 days later, with everything in it.';
}
@override
String get passwordSignedInBefore =>
'Only a device signed in since then can dismiss this warning: sign in again on this one, or change your password.';