Projekt in leafittome umbenannt (App-Name LeafItToMe, Bundle-ID dev.leafittome.app)

- pubspec, Paket-Imports, App-Klasse, ARB-Titel, iOS/Android-Konfiguration
- README und Doku auf neuen Namen und Repo leafittome umgestellt

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
cschlaefke 2026-07-18 22:25:41 +02:00
parent c7b22a6f86
commit a5b79193dd
17 changed files with 35 additions and 35 deletions

View file

@ -1,4 +1,4 @@
# Planty 🌱 # LeafItToMe 🌱
App zur Verwaltung und Pflege von Pflanzen — für den eigenen Haushalt und Pflanzen-Sitter. App zur Verwaltung und Pflege von Pflanzen — für den eigenen Haushalt und Pflanzen-Sitter.
@ -36,4 +36,4 @@ flutter analyze # Statische Analyse
- **Firebase** (Auth, Firestore, Storage, Cloud Functions, FCM) — Anbindung folgt im nächsten Block - **Firebase** (Auth, Firestore, Storage, Cloud Functions, FCM) — Anbindung folgt im nächsten Block
- **KI hybrid:** PlantNet (kostenlose Arterkennung) + Claude (Pflegetexte, Diagnose) über Cloud Functions - **KI hybrid:** PlantNet (kostenlose Arterkennung) + Claude (Pflegetexte, Diagnose) über Cloud Functions
- **i18n:** Alle Texte liegen in `lib/l10n/app_de.arb`; Englisch ist später nur eine zweite ARB-Datei - **i18n:** Alle Texte liegen in `lib/l10n/app_de.arb`; Englisch ist später nur eine zweite ARB-Datei
- Bundle-ID: vorläufig `dev.planty.app` — wird vor dem ersten TestFlight-Upload final gesetzt - Bundle-ID: vorläufig `dev.leafittome.app` — wird vor dem ersten TestFlight-Upload final gesetzt

View file

@ -6,7 +6,7 @@ plugins {
} }
android { android {
namespace = "dev.planty.planty" namespace = "dev.leafittome.app"
compileSdk = flutter.compileSdkVersion compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion ndkVersion = flutter.ndkVersion
@ -21,7 +21,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "dev.planty.planty" applicationId = "dev.leafittome.app"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config. // For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion minSdk = flutter.minSdkVersion

View file

@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application <application
android:label="planty" android:label="LeafItToMe"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher">
<activity <activity

View file

@ -1,4 +1,4 @@
package dev.planty.planty package dev.leafittome.app
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity

View file

@ -1,6 +1,6 @@
# Architektur & Projektstruktur # Architektur & Projektstruktur
Dieses Dokument erklärt den Aufbau des Planty-Codes — auch als Blaupause für weitere Flutter-Apps. Dieses Dokument erklärt den Aufbau des LeafItToMe-Codes — auch als Blaupause für weitere Flutter-Apps.
## Ordnerstruktur ## Ordnerstruktur

View file

@ -6,7 +6,7 @@ Firebase ist Googles „Backend als Dienst": Es liefert uns Login (**Auth**), Da
## Was wofür? (Überblick) ## Was wofür? (Überblick)
| Baustein | Aufgabe in Planty | | Baustein | Aufgabe in LeafItToMe |
| --- | --- | | --- | --- |
| **Authentication** | Login mit E-Mail+Passwort, Google und Apple | | **Authentication** | Login mit E-Mail+Passwort, Google und Apple |
| **Cloud Firestore** | Datenbank: Haushalte, Pflanzen, Stellplätze, Bestätigungen — synchronisiert in Echtzeit auf alle Geräte des Haushalts | | **Cloud Firestore** | Datenbank: Haushalte, Pflanzen, Stellplätze, Bestätigungen — synchronisiert in Echtzeit auf alle Geräte des Haushalts |
@ -17,7 +17,7 @@ Firebase ist Googles „Backend als Dienst": Es liefert uns Login (**Auth**), Da
## Schritt 1: Firebase-Projekt anlegen (machst du, ~10 Minuten) ## Schritt 1: Firebase-Projekt anlegen (machst du, ~10 Minuten)
1. Öffne <https://console.firebase.google.com> und melde dich mit deinem Google-Konto an. 1. Öffne <https://console.firebase.google.com> und melde dich mit deinem Google-Konto an.
2. **„Projekt hinzufügen"** → Name: `planty` → Google Analytics kannst du **deaktivieren** (brauchen wir nicht). 2. **„Projekt hinzufügen"** → Name: `leafittome` → Google Analytics kannst du **deaktivieren** (brauchen wir nicht).
3. Nach dem Anlegen bist du in der Projekt-Übersicht. Fertig für heute — Apps registrieren wir gemeinsam per CLI (Schritt 3). 3. Nach dem Anlegen bist du in der Projekt-Übersicht. Fertig für heute — Apps registrieren wir gemeinsam per CLI (Schritt 3).
## Schritt 2: Auf den Blaze-Tarif umstellen (machst du, ~5 Minuten) ## Schritt 2: Auf den Blaze-Tarif umstellen (machst du, ~5 Minuten)

View file

@ -90,11 +90,11 @@ FORGEJO__server__ROOT_URL=https://git.deine-domain.de/
- **2FA aktivieren:** Einstellungen → Sicherheit → Zwei-Faktor-Authentifizierung (z. B. mit derselben Authenticator-App wie für Coolify). - **2FA aktivieren:** Einstellungen → Sicherheit → Zwei-Faktor-Authentifizierung (z. B. mit derselben Authenticator-App wie für Coolify).
- **Kontrolle Registrierung:** Site Administration → Configuration — „Registrierung deaktiviert" muss aktiv sein (kommt aus der Umgebungsvariable). - **Kontrolle Registrierung:** Site Administration → Configuration — „Registrierung deaktiviert" muss aktiv sein (kommt aus der Umgebungsvariable).
- Da Forgejo nur über den Coolify-Proxy (HTTPS) und Port 2222 (Git-SSH mit Schlüssel) erreichbar ist, ist die Angriffsfläche damit klein: kein offenes Web-Registrierungsformular, keine Passwort-Logins über SSH. - Da Forgejo nur über den Coolify-Proxy (HTTPS) erreichbar ist (Git-SSH auf Port 2222 nur, falls du Variante B nutzt), ist die Angriffsfläche klein: kein offenes Web-Registrierungsformular, keine Passwort-Logins über SSH.
## 5. Repository anlegen und Planty pushen ## 5. Repository anlegen und LeafItToMe pushen
In der Web-UI **Neues Repository** → Name `planty` → **ohne** README/Lizenz initialisieren (das Repo existiert lokal schon). In der Web-UI **Neues Repository** → Name `leafittome` → **ohne** README/Lizenz initialisieren (das Repo existiert lokal schon).
### Variante A: HTTPS mit Zugriffs-Token (empfohlen — kein extra Port nötig) ### Variante A: HTTPS mit Zugriffs-Token (empfohlen — kein extra Port nötig)
@ -103,7 +103,7 @@ In der Web-UI **Neues Repository** → Name `planty` → **ohne** README/Lizenz
```bash ```bash
cd ~/Documents/Projekte/Planty cd ~/Documents/Projekte/Planty
git remote add origin https://git.deine-domain.de/<dein-nutzer>/planty.git git remote add origin https://git.deine-domain.de/<dein-nutzer>/leafittome.git
git push -u origin main git push -u origin main
``` ```
@ -121,10 +121,10 @@ Die Forgejo-Vorlage hat kein Port-Mapping in der Coolify-UI, aber jede Service-V
Zusätzlich als Umgebungsvariablen `FORGEJO__server__SSH_DOMAIN=git.deine-domain.de` und `FORGEJO__server__SSH_PORT=2222` setzen (für korrekte Clone-URLs), Port 2222 in der Hetzner-Firewall öffnen, Service neu deployen. Dann in Forgejo unter **Einstellungen → SSH/GPG-Schlüssel** den Inhalt von `~/.ssh/id_ed25519.pub` hinterlegen und als Remote nutzen: Zusätzlich als Umgebungsvariablen `FORGEJO__server__SSH_DOMAIN=git.deine-domain.de` und `FORGEJO__server__SSH_PORT=2222` setzen (für korrekte Clone-URLs), Port 2222 in der Hetzner-Firewall öffnen, Service neu deployen. Dann in Forgejo unter **Einstellungen → SSH/GPG-Schlüssel** den Inhalt von `~/.ssh/id_ed25519.pub` hinterlegen und als Remote nutzen:
```bash ```bash
git remote add origin ssh://git@git.deine-domain.de:2222/<dein-nutzer>/planty.git git remote add origin ssh://git@git.deine-domain.de:2222/<dein-nutzer>/leafittome.git
``` ```
Ab dann genügt nach jedem Arbeitsstand ein `git push`. Test: Die Dateien erscheinen unter `https://git.deine-domain.de/<dein-nutzer>/planty`. Ab dann genügt nach jedem Arbeitsstand ein `git push`. Test: Die Dateien erscheinen unter `https://git.deine-domain.de/<dein-nutzer>/leafittome`.
## 6. Backups ## 6. Backups

View file

@ -369,7 +369,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = dev.planty.planty; PRODUCT_BUNDLE_IDENTIFIER = dev.leafittome.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -385,7 +385,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.planty.planty.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = dev.leafittome.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -402,7 +402,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.planty.planty.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = dev.leafittome.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@ -417,7 +417,7 @@
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = dev.planty.planty.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = dev.leafittome.app.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
@ -549,7 +549,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = dev.planty.planty; PRODUCT_BUNDLE_IDENTIFIER = dev.leafittome.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@ -572,7 +572,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = dev.planty.planty; PRODUCT_BUNDLE_IDENTIFIER = dev.leafittome.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;

View file

@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>Planty</string> <string>LeafItToMe</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@ -13,7 +13,7 @@
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>planty</string> <string>leafittome</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>

View file

@ -6,8 +6,8 @@ import 'core/settings/settings_provider.dart';
import 'core/theme/app_theme.dart'; import 'core/theme/app_theme.dart';
import 'l10n/generated/app_localizations.dart'; import 'l10n/generated/app_localizations.dart';
class PlantyApp extends ConsumerWidget { class LeafItToMeApp extends ConsumerWidget {
const PlantyApp({super.key}); const LeafItToMeApp({super.key});
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {

View file

@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
/// Planty-Grün als Ausgangsfarbe für das gesamte Farbschema. /// LeafItToMe-Grün als Ausgangsfarbe für das gesamte Farbschema.
const _seedColor = Color(0xFF2E7D32); const _seedColor = Color(0xFF2E7D32);
ThemeData buildAppTheme({ ThemeData buildAppTheme({

View file

@ -1,6 +1,6 @@
{ {
"@@locale": "de", "@@locale": "de",
"appTitle": "Planty", "appTitle": "LeafItToMe",
"menuToday": "Heute", "menuToday": "Heute",
"menuPlants": "Meine Pflanzen", "menuPlants": "Meine Pflanzen",
"menuLocations": "Stellplätze", "menuLocations": "Stellplätze",

View file

@ -97,7 +97,7 @@ abstract class AppLocalizations {
/// No description provided for @appTitle. /// No description provided for @appTitle.
/// ///
/// In de, this message translates to: /// In de, this message translates to:
/// **'Planty'** /// **'LeafItToMe'**
String get appTitle; String get appTitle;
/// No description provided for @menuToday. /// No description provided for @menuToday.

View file

@ -9,7 +9,7 @@ class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale); AppLocalizationsDe([String locale = 'de']) : super(locale);
@override @override
String get appTitle => 'Planty'; String get appTitle => 'LeafItToMe';
@override @override
String get menuToday => 'Heute'; String get menuToday => 'Heute';

View file

@ -11,7 +11,7 @@ Future<void> main() async {
runApp( runApp(
ProviderScope( ProviderScope(
overrides: [sharedPreferencesProvider.overrideWithValue(prefs)], overrides: [sharedPreferencesProvider.overrideWithValue(prefs)],
child: const PlantyApp(), child: const LeafItToMeApp(),
), ),
); );
} }

View file

@ -1,5 +1,5 @@
name: planty name: leafittome
description: "Planty App zur Verwaltung und Pflege von Pflanzen." description: "LeafItToMe App zur Verwaltung und Pflege von Pflanzen."
# The following line prevents the package from being accidentally published to # The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages. # pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev publish_to: 'none' # Remove this line if you wish to publish to pub.dev

View file

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:planty/app.dart'; import 'package:leafittome/app.dart';
import 'package:planty/core/settings/settings_provider.dart'; import 'package:leafittome/core/settings/settings_provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
Future<Widget> buildTestApp() async { Future<Widget> buildTestApp() async {
@ -10,7 +10,7 @@ Future<Widget> buildTestApp() async {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
return ProviderScope( return ProviderScope(
overrides: [sharedPreferencesProvider.overrideWithValue(prefs)], overrides: [sharedPreferencesProvider.overrideWithValue(prefs)],
child: const PlantyApp(), child: const LeafItToMeApp(),
); );
} }