refactor(branding): rename app Tanemaki → Tane

Public name is now Tane (種, "seed"); Tanemaki (種まき, "to scatter seeds")
is kept only as etymology in the About screen and onboarding.

App not yet distributed, so format tokens rename cleanly with no migration:
backup extension .tanemaki→.tane, QR scheme tanemaki://→tane://, file
prefixes tane-*. Website link and species-catalog User-Agent →
tane.comunes.org. Android label capitalised to "Tane".

Identity/crypto constants already use org.comunes.tane (derivation, HKDF
backup, sync namespace, TANE1 recovery tag) — left untouched, so keys,
backups and sync are unaffected. Tests updated; analyze + full suite green.
This commit is contained in:
vjrj 2026-07-12 13:04:16 +02:00
parent 2c113cc17d
commit a534c14983
34 changed files with 180 additions and 180 deletions

View file

@ -6,10 +6,10 @@ import '../i18n/strings.g.dart';
import 'theme.dart';
/// The app's public website. Shown as a tappable row in [AboutScreen].
const String _websiteUrl = 'https://tanemaki.app';
const String _websiteUrl = 'https://tane.comunes.org';
/// The year Tanemaki's copyright starts. Ğ1nkgo uses its own first year (2023);
/// Tanemaki's is 2026.
/// The year Tane's copyright starts. Ğ1nkgo uses its own first year (2023);
/// Tane's is 2026.
const int _copyrightStartYear = 2026;
/// A single year (`2026`) until the calendar rolls over, then a range
@ -22,7 +22,7 @@ String _copyrightYears() {
}
/// An "about" screen à la Ğ1nkgo: brand header, the human explanation of what
/// Tanemaki is and where its name comes from, the app version, license, the
/// Tane is and where its name comes from, the app version, license, the
/// website, and the bundled open-source licenses page.
class AboutScreen extends StatelessWidget {
const AboutScreen({super.key});
@ -99,7 +99,7 @@ class AboutScreen extends StatelessWidget {
}
}
/// Brand block: the logo, the app name and its kanji.
/// Brand block: the logo, the app name and its kanji.
class _Header extends StatelessWidget {
const _Header();
@ -133,7 +133,7 @@ class _Header extends StatelessWidget {
}
}
/// The two explanatory paragraphs: what Tanemaki is, and the heritage of its
/// The two explanatory paragraphs: what Tane is, and the heritage of its
/// name (yui / tanomoshi / the paper Plantare).
class _Paragraph extends StatelessWidget {
const _Paragraph();

View file

@ -140,7 +140,7 @@ class BackupSection extends StatelessWidget {
title: t.backup.recoverySheetTitle,
intro: t.backup.recoveryIntro,
code: code,
suggestedName: 'tanemaki-recovery.pdf',
suggestedName: 'tane-recovery.pdf',
);
_show(messenger, saved ? t.backup.exportSaved : t.backup.cancelled);
} on Object {

View file

@ -26,7 +26,7 @@ class _Slide {
}
/// The first-run intro carousel (also reachable later from the drawer): a few
/// swipeable cards explaining what Tanemaki is, how privacy works, how sharing
/// swipeable cards explaining what Tane is, how privacy works, how sharing
/// works and the Plantare. [onDone] fires when the user skips or finishes, and
/// is where the caller marks the intro as seen and leaves the screen.
class IntroScreen extends StatefulWidget {

View file

@ -212,7 +212,7 @@ class InventoryListScreen extends StatelessWidget {
title: t.share.catalogTitle,
date: dateLabel,
suggestedName:
'tanemaki-catalog-${date.toIso8601String().substring(0, 10)}.pdf',
'tane-catalog-${date.toIso8601String().substring(0, 10)}.pdf',
rows: rows,
);
messenger.showSnackBar(

View file

@ -170,7 +170,7 @@ class _LabelPrintSheetState extends State<_LabelPrintSheet> {
final saved = await getIt<LabelSheetService>().saveLabels(
labels: labels,
format: _format,
suggestedName: 'tanemaki-labels-${_today()}.pdf',
suggestedName: 'tane-labels-${_today()}.pdf',
rtl: rtl,
);