feat(app)!: no anonymous accounts on the device (ADR 0020, D4, D25)

Every account has a way in, so the apps make no anonymous account any
more. The start screen shows whenever nobody is signed in, a first
start included, and offers SimpleLogin, a password and GitHub for those
who have it, with no start without an account. An instance out of reach
is said so, with Try again, and one offering no way to create an account
too. An anonymous account's session left from before is deleted as the
app starts (D25), falling back to signing out on the device.

What only anonymous accounts needed goes: signing in anonymously, the
signed-out mark, adding GitHub to an account and switching to a GitHub
account from the Profile tab (with its Cancel, the only one), an
anonymous device's own keys, the warning that signing out deletes the
account, and the texts about keeping progress. Settings says on which
instance the account is signed in. Learn's publishing, reports and
suggestions and its learner count no longer ask whether the person has
an identity: everyone signed in has one.

The server still offers anonymous sign-in until the next commit, so
older apps keep working until v0.20.0 raises the minimum build.

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-24 14:50:55 +02:00
commit 5b9df73756
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 981 additions and 3339 deletions

View file

@ -27,16 +27,13 @@
"accountAdd": "Konto hinzufügen",
"accountAddSubtitle": "Wähle die Instanz für das Konto, das du hinzufügst.",
"accountSignedIn": "Angemeldet",
"accountAnonymous": "Anonym",
"accountRemoveTooltip": "Konto entfernen",
"accountRemoveTitle": "Konto entfernen?",
"accountRemoveMessage": "Entfernt das Konto auf {name} von diesem Gerät, mit allem, was das Gerät davon hat. Was es synchronisiert hat, bleibt auf {name}: Melde dich dort wieder an, um es wiederzuhaben. In ein anonymes Konto kann man sich nicht wieder anmelden.",
"accountRemoveMessage": "Entfernt das Konto auf {name} von diesem Gerät, mit allem, was das Gerät davon hat. Was es synchronisiert hat, bleibt auf {name}: Melde dich dort wieder an, um es wiederzuhaben.",
"accountRemoveConfirm": "Entfernen",
"accountSignedInOn": "Angemeldet auf {instance}",
"accountAnonymousOn": "Anonym auf {instance}",
"accountSwitch": "Konto wechseln",
"accountSignOut": "Abmelden",
"accountSignOutTitle": "Abmelden?",
"accountDelete": "Konto löschen",
"accountDeleteTitle": "Dein Konto löschen?",
"accountSignOutFailed": "Abmelden auf diesem Gerät hat nicht geklappt. Versuch es noch einmal.",
@ -48,16 +45,14 @@
"startSignedOut": "Abgemeldet",
"startOn": "Starte auf {instance}:",
"startWithGitHub": "Mit GitHub anmelden",
"startWithoutAccount": "Ohne Konto starten",
"startAnonymous": "Dein Fortschritt wird auf diesem Gerät gespeichert. Melde dich an, um ihn zu behalten.",
"startGitHubFailed": "Anmeldung mit GitHub fehlgeschlagen.",
"startNoGitHubAccount": "Noch kein Konto hier meldet sich mit diesem GitHub-Konto an.",
"startNoGitHubAccount": "Kein Konto hier meldet sich mit diesem GitHub-Konto an.",
"gitHubCreateAccountInstead": "Erstelle stattdessen ein Konto mit deiner E-Mail-Adresse und einem Passwort.",
"gitHubNoAccountSetUpPassword": "Noch kein Konto hier meldet sich mit diesem GitHub-Konto an. Richte stattdessen ein Passwort ein, um deinen Fortschritt zu behalten.",
"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.",
"gitHubDeprecated": "GitHub lässt sich nicht mehr als Anmeldeweg hinzufügen: Deine E-Mail-Adresse und dein Passwort sind es.",
"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",
"syncNow": "Jetzt synchronisieren",
"syncStateSyncing": "Wird synchronisiert…",

View file

@ -116,10 +116,9 @@
"accountAdd": "Add account",
"accountAddSubtitle": "Choose the instance for the account to add.",
"accountSignedIn": "Signed in",
"accountAnonymous": "Anonymous",
"accountRemoveTooltip": "Remove account",
"accountRemoveTitle": "Remove account?",
"accountRemoveMessage": "Removes the account on {name} from this device, with all the device holds of it. What it synced stays on {name}: sign in there again to have it. An anonymous account can't be signed into again.",
"accountRemoveMessage": "Removes the account on {name} from this device, with all the device holds of it. What it synced stays on {name}: sign in there again to have it.",
"@accountRemoveMessage": {
"placeholders": {
"name": {
@ -136,17 +135,8 @@
}
}
},
"accountAnonymousOn": "Anonymous on {instance}",
"@accountAnonymousOn": {
"placeholders": {
"instance": {
"type": "String"
}
}
},
"accountSwitch": "Switch account",
"accountSignOut": "Sign out",
"accountSignOutTitle": "Sign out?",
"accountDelete": "Delete account",
"accountDeleteTitle": "Delete your account?",
"accountSignOutFailed": "Couldn't sign out on this device. Try again.",
@ -165,22 +155,28 @@
}
},
"startWithGitHub": "Sign in with GitHub",
"startWithoutAccount": "Start without an account",
"startAnonymous": "Progress is saved on this device. Sign in to keep it.",
"startGitHubFailed": "Couldn't sign in with GitHub.",
"startNoGitHubAccount": "No account here signs in with this GitHub account yet.",
"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)."
},
"gitHubNoAccountSetUpPassword": "No account here signs in with this GitHub account yet. To keep your progress, set up a password instead.",
"@gitHubNoAccountSetUpPassword": {
"description": "An anonymous person signed in with a GitHub account nobody here has, where GitHub is added to nobody: the password set up below keeps their account."
"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.",
"gitHubDeprecated": "GitHub can't be added as a way to sign in any more: your email address and password are.",
"gitHubEnded": "Sign-in with GitHub has ended on this instance.",
"startOtherInstance": "Use another instance",
"startNoWay": "{instance} offers no way to create an account.",
"@startNoWay": {
"description": "On the start screen, where the instance offers neither SimpleLogin nor a password (ADR 0020, D4): nobody can make an account there.",
"placeholders": {
"instance": {
"type": "String"
}
}
},
"syncTitle": "Sync",
"syncNow": "Sync now",
"syncStateSyncing": "Syncing…",

View file

@ -265,12 +265,6 @@ abstract class HalkyonAppLocalizations {
/// **'Signed in'**
String get accountSignedIn;
/// No description provided for @accountAnonymous.
///
/// In en, this message translates to:
/// **'Anonymous'**
String get accountAnonymous;
/// No description provided for @accountRemoveTooltip.
///
/// In en, this message translates to:
@ -286,7 +280,7 @@ abstract class HalkyonAppLocalizations {
/// No description provided for @accountRemoveMessage.
///
/// In en, this message translates to:
/// **'Removes the account on {name} from this device, with all the device holds of it. What it synced stays on {name}: sign in there again to have it. An anonymous account can\'t be signed into again.'**
/// **'Removes the account on {name} from this device, with all the device holds of it. What it synced stays on {name}: sign in there again to have it.'**
String accountRemoveMessage(String name);
/// No description provided for @accountRemoveConfirm.
@ -301,12 +295,6 @@ abstract class HalkyonAppLocalizations {
/// **'Signed in on {instance}'**
String accountSignedInOn(String instance);
/// No description provided for @accountAnonymousOn.
///
/// In en, this message translates to:
/// **'Anonymous on {instance}'**
String accountAnonymousOn(String instance);
/// No description provided for @accountSwitch.
///
/// In en, this message translates to:
@ -319,12 +307,6 @@ abstract class HalkyonAppLocalizations {
/// **'Sign out'**
String get accountSignOut;
/// No description provided for @accountSignOutTitle.
///
/// In en, this message translates to:
/// **'Sign out?'**
String get accountSignOutTitle;
/// No description provided for @accountDelete.
///
/// In en, this message translates to:
@ -391,18 +373,6 @@ abstract class HalkyonAppLocalizations {
/// **'Sign in with GitHub'**
String get startWithGitHub;
/// No description provided for @startWithoutAccount.
///
/// In en, this message translates to:
/// **'Start without an account'**
String get startWithoutAccount;
/// No description provided for @startAnonymous.
///
/// In en, this message translates to:
/// **'Progress is saved on this device. Sign in to keep it.'**
String get startAnonymous;
/// No description provided for @startGitHubFailed.
///
/// In en, this message translates to:
@ -412,7 +382,7 @@ abstract class HalkyonAppLocalizations {
/// No description provided for @startNoGitHubAccount.
///
/// In en, this message translates to:
/// **'No account here signs in with this GitHub account yet.'**
/// **'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).
@ -421,11 +391,11 @@ abstract class HalkyonAppLocalizations {
/// **'Create an account with your email address and a password instead.'**
String get gitHubCreateAccountInstead;
/// An anonymous person signed in with a GitHub account nobody here has, where GitHub is added to nobody: the password set up below keeps their account.
/// 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:
/// **'No account here signs in with this GitHub account yet. To keep your progress, set up a password instead.'**
String get gitHubNoAccountSetUpPassword;
/// **'Continue with SimpleLogin to create one instead.'**
String get gitHubSimpleLoginInstead;
/// No description provided for @gitHubUsePassword.
///
@ -433,12 +403,6 @@ abstract class HalkyonAppLocalizations {
/// **'This account signs in with its email address and password now, not with GitHub.'**
String get gitHubUsePassword;
/// No description provided for @gitHubDeprecated.
///
/// In en, this message translates to:
/// **'GitHub can\'t be added as a way to sign in any more: your email address and password are.'**
String get gitHubDeprecated;
/// No description provided for @gitHubEnded.
///
/// In en, this message translates to:
@ -451,6 +415,12 @@ abstract class HalkyonAppLocalizations {
/// **'Use another instance'**
String get startOtherInstance;
/// On the start screen, where the instance offers neither SimpleLogin nor a password (ADR 0020, D4): nobody can make an account there.
///
/// In en, this message translates to:
/// **'{instance} offers no way to create an account.'**
String startNoWay(String instance);
/// No description provided for @syncTitle.
///
/// In en, this message translates to:

View file

@ -113,9 +113,6 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get accountSignedIn => 'Angemeldet';
@override
String get accountAnonymous => 'Anonym';
@override
String get accountRemoveTooltip => 'Konto entfernen';
@ -124,7 +121,7 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String accountRemoveMessage(String name) {
return 'Entfernt das Konto auf $name von diesem Gerät, mit allem, was das Gerät davon hat. Was es synchronisiert hat, bleibt auf $name: Melde dich dort wieder an, um es wiederzuhaben. In ein anonymes Konto kann man sich nicht wieder anmelden.';
return 'Entfernt das Konto auf $name von diesem Gerät, mit allem, was das Gerät davon hat. Was es synchronisiert hat, bleibt auf $name: Melde dich dort wieder an, um es wiederzuhaben.';
}
@override
@ -135,20 +132,12 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
return 'Angemeldet auf $instance';
}
@override
String accountAnonymousOn(String instance) {
return 'Anonym auf $instance';
}
@override
String get accountSwitch => 'Konto wechseln';
@override
String get accountSignOut => 'Abmelden';
@override
String get accountSignOutTitle => 'Abmelden?';
@override
String get accountDelete => 'Konto löschen';
@ -189,36 +178,25 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get startWithGitHub => 'Mit GitHub anmelden';
@override
String get startWithoutAccount => 'Ohne Konto starten';
@override
String get startAnonymous =>
'Dein Fortschritt wird auf diesem Gerät gespeichert. Melde dich an, um ihn zu behalten.';
@override
String get startGitHubFailed => 'Anmeldung mit GitHub fehlgeschlagen.';
@override
String get startNoGitHubAccount =>
'Noch kein Konto hier meldet sich mit diesem GitHub-Konto an.';
'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 gitHubNoAccountSetUpPassword =>
'Noch kein Konto hier meldet sich mit diesem GitHub-Konto an. Richte stattdessen ein Passwort ein, um deinen Fortschritt zu behalten.';
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 gitHubDeprecated =>
'GitHub lässt sich nicht mehr als Anmeldeweg hinzufügen: Deine E-Mail-Adresse und dein Passwort sind es.';
@override
String get gitHubEnded =>
'Die Anmeldung mit GitHub ist auf dieser Instanz beendet.';
@ -226,6 +204,11 @@ class HalkyonAppLocalizationsDe extends HalkyonAppLocalizations {
@override
String get startOtherInstance => 'Andere Instanz verwenden';
@override
String startNoWay(String instance) {
return '$instance bietet keinen Weg, ein Konto zu erstellen.';
}
@override
String get syncTitle => 'Synchronisierung';

View file

@ -113,9 +113,6 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get accountSignedIn => 'Signed in';
@override
String get accountAnonymous => 'Anonymous';
@override
String get accountRemoveTooltip => 'Remove account';
@ -124,7 +121,7 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String accountRemoveMessage(String name) {
return 'Removes the account on $name from this device, with all the device holds of it. What it synced stays on $name: sign in there again to have it. An anonymous account can\'t be signed into again.';
return 'Removes the account on $name from this device, with all the device holds of it. What it synced stays on $name: sign in there again to have it.';
}
@override
@ -135,20 +132,12 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
return 'Signed in on $instance';
}
@override
String accountAnonymousOn(String instance) {
return 'Anonymous on $instance';
}
@override
String get accountSwitch => 'Switch account';
@override
String get accountSignOut => 'Sign out';
@override
String get accountSignOutTitle => 'Sign out?';
@override
String get accountDelete => 'Delete account';
@ -187,42 +176,36 @@ class HalkyonAppLocalizationsEn extends HalkyonAppLocalizations {
@override
String get startWithGitHub => 'Sign in with GitHub';
@override
String get startWithoutAccount => 'Start without an account';
@override
String get startAnonymous =>
'Progress is saved on this device. Sign in to keep it.';
@override
String get startGitHubFailed => 'Couldn\'t sign in with GitHub.';
@override
String get startNoGitHubAccount =>
'No account here signs in with this GitHub account yet.';
'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 gitHubNoAccountSetUpPassword =>
'No account here signs in with this GitHub account yet. To keep your progress, set up a password instead.';
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 gitHubDeprecated =>
'GitHub can\'t be added as a way to sign in any more: your email address and password are.';
@override
String get gitHubEnded => 'Sign-in with GitHub has ended on this instance.';
@override
String get startOtherInstance => 'Use another instance';
@override
String startNoWay(String instance) {
return '$instance offers no way to create an account.';
}
@override
String get syncTitle => 'Sync';