Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c39b03c
feat(design): Add tonal design system and shared page header
nfebe May 20, 2026
97e33bc
enh(entities): Reshape parties, wallets, categories, groups as a list…
nfebe May 20, 2026
bf33f30
feat(stats): Add Month-in-Review recap and rich reports surface
nfebe May 20, 2026
e7bd2a8
enh(auth): Refresh login, onboarding and theme toggle
nfebe May 21, 2026
408023b
enh(home): Brand-mark drawer trigger, profile hero, orange nav accent
nfebe May 21, 2026
d9394a4
enh(transactions): Tonal segmented type picker on add-transaction
nfebe May 21, 2026
648a980
enh(transactions): Polish add-transaction form controls
nfebe May 21, 2026
488dc5a
enh(transactions): Tonal filter chips on history
nfebe May 21, 2026
9e691c5
enh(settings): Adopt shared header across settings, transfers and sav…
nfebe May 21, 2026
1920c8a
test: Regression coverage for design tokens, recap, reports and page bar
nfebe May 21, 2026
cca3793
feat(ai): Add AI chat tab with conversation history
nfebe May 22, 2026
7ed2911
ui(decor): Apply shared icon background decoration to landing pages
nfebe May 22, 2026
0b9b44b
ui(home): Add profile avatar entry to home app bar
nfebe May 22, 2026
10187f0
feat(transactions): Inline transfer as third segment in add flow
nfebe May 22, 2026
efd7db4
fix(theme): Restore visible input borders in dark mode
nfebe May 22, 2026
cd32c07
fix(profile): Show back button on profile screen
nfebe May 22, 2026
1b98756
feat(budgets): Add budget tracking with periods, targets, and progress
nfebe May 22, 2026
c9dc643
refactor(i18n): Extract 39 hardcoded strings to localization
austin047 May 26, 2026
cd52f76
refactor(database): Rename budgetables table to budget targets
austin047 May 26, 2026
91dc7fa
refactor(architecture): Add use cases for AI Chat and Budget features
austin047 May 27, 2026
34dfb6e
feat(budgets): Local progress compute self heal and currency handling
austin047 Jun 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions assets/images/onboarding/importer.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/images/onboarding/insights.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/images/onboarding/ready.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/images/onboarding/wallet.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/images/sparkles.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/trakli-logo-white.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
173 changes: 172 additions & 1 deletion assets/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,18 @@
"groupCreateGroup": "Gruppe erstellen",
"statistics": "Statistiken",
"profile": "Profil",
"ai": "KI",
"aiChatTitle": "Trakli fragen",
"aiChatEmptyHint": "Frag alles über deine Finanzen",
"aiChatComposerPlaceholder": "Stelle eine Frage…",
"aiChatNewChat": "Neuer Chat",
"aiChatThinking": "Denkt nach…",
"aiChatError": "Etwas ist schiefgelaufen. Versuche es erneut.",
"aiChatHistory": "Chatverlauf",
"aiChatUntitled": "Chat ohne Titel",
"aiChatNoSessions": "Noch keine Konversationen",
"aiChatNoSessionsHint": "Starte einen neuen Chat, um ihn hier zu sehen.",
"aiChatDeleteConfirm": "Diese Konversation löschen? Dies kann nicht rückgängig gemacht werden.",
"settings": "Einstellungen",
"typeHere": "Hier tippen",
"balanceAmountWithCurrency": "{}",
Expand Down Expand Up @@ -190,6 +202,7 @@
"about": "Über",
"switchDefaultGroup": "Standardgruppe wechseln",
"walletTransfer": "Wallet-Überweisung",
"transfer": "Transfer",
"walletTransferDefaultDescription": "Geldtransfer von {fromCurrency}-Wallet zu {toCurrency}-Wallet",
"sourceWallet": "Quell-Wallet",
"orangeMoney": "Orange money",
Expand Down Expand Up @@ -569,5 +582,163 @@
"groupsDesc": "Zusammengehörige Transaktionen bündeln",
"partiesDesc": "Personen und Organisationen, mit denen Sie Transaktionen durchführen",
"walletsDesc": "Konten, über die sich Geld bewegt",
"cancelled": "Abgebrochen"
"cancelled": "Abgebrochen",
"budget": "Budget",
"budgets": "Budgets",
"addBudget": "Budget hinzufügen",
"createBudget": "Budget erstellen",
"editBudget": "Budget bearbeiten",
"deleteBudget": "Budget löschen",
"deleteBudgetConfirm": "Dies entfernt \"{name}\" aus Ihren Budgets. Diese Aktion kann nicht rückgängig gemacht werden.",
"deleteBudgetSuccess": "Budget gelöscht",
"deleteBudgetError": "Budget konnte nicht gelöscht werden",
"closeBudgetPeriod": "Zeitraum schließen",
"closePeriod": "Aktuellen Zeitraum schließen",
"closePeriodConfirm": "Zeitraum schließen",
"closePeriodSuccess": "Zeitraum geschlossen",
"closePeriodError": "Zeitraum konnte nicht geschlossen werden",
"budgetAmount": "Budgetbetrag",
"budgetPeriod": "Budgetzeitraum",
"budgetTargets": "Ziele",
"budgetPeriodHistory": "Zeitraumverlauf",
"budgetStatus": "Status",
"budgetRemaining": "Verbleibend",
"budgetProjected": "Prognostiziert",
"budgetRefunds": "Rückerstattungen",
"budgetRollover": "Übertrag",
"budgetRolloverIn": "Übertrag auf",
"importAiSuggested": "KI schlägt vor: {}",
"importAmount": "Betrag",
"importAnalysisFailed": "Analyse fehlgeschlagen",
"importAnalysisFailedHint": "Bei der Verarbeitung des Dokuments ist ein Fehler aufgetreten. Versuchen Sie, es erneut hochzuladen.",
"importAnalyze": "Analysieren",
"importAnalyzing": "Dokument wird analysiert…",
"importAutoCreateCategories": "Fehlende Kategorien automatisch erstellen",
"importAutoCreateMissingHint": "{} Element(e) ohne Auswahl — werden aus dem KI-Vorschlag erstellt.",
"importAutoCreateNoneNeeded": "Alle akzeptierten Elemente haben bereits eine Auswahl.",
"importAutoCreateParties": "Fehlende Parteien automatisch erstellen",
"importAutoCreateWallets": "Fehlende Geldbörsen automatisch erstellen",
"importCategory": "Kategorie",
"importCheckingDuplicates": "Prüfung auf Duplikate…",
"importConfirm": "Import bestätigen",
"importConfirmSheetTitle": "{} von {} Vorschläge bestätigen?",
"importCreateTransactions": "Transaktionen erstellen",
"importCreatedCount": "{} Transaktion(en) importiert.",
"importDate": "Datum",
"importDescription": "Beschreibung",
"importDocBankStatement": "Kontoauszug",
"importDocInvoice": "Rechnung",
"importDocPayStub": "Gehaltsabrechnung",
"importDocReceipt": "Quittung",
"importDocTypeLabel": "Dokumenttyp",
"importDocUtilityBill": "Nebenkosten",
"importEnriching": "Extrahierte Daten werden bereinigt…",
"importExtracting": "Dokument wird gelesen…",
"importNoAcceptedSuggestions": "Wählen Sie mindestens einen Vorschlag zur Bestätigung.",
"importNoActivity": "Noch keine Importe. Beginnen Sie mit einer der obigen Aktionen.",
"importNoSuggestions": "Keine Vorschläge aus diesem Dokument extrahiert.",
"importNoSuggestionsClose": "Schließen",
"importNoSuggestionsTitle": "Keine Vorschläge",
"importNoTransactionsFound": "Keine Transaktionen gefunden",
"importParty": "Partei",
"importRecentActivity": "Aktuelle Aktivität",
"importReviewSuggestions": "Vorschläge überprüfen",
"importScanDocument": "Dokument scannen",
"importScanDocumentDesc": "KI-gestützte Extraktion aus PDFs, Bildern und CSVs",
"importSourceCamera": "Kamera",
"importSourceCameraDesc": "Schnelles Scannen",
"importSourceFile": "Datei",
"importSourceFileDesc": "PDF, Bild oder CSV",
"importSourceGallery": "Galerie",
"importSourceGalleryDesc": "Fotobibliothek",
"importSourceLabel": "Quelle",
"importType": "Typ",
"importWallet": "Geldbörse",
"imports": "Importe",
"importsDesc": "Transaktionen aus Dateien oder Dokumenten importieren",
"budgetPeriodOpen": "Offen",
"closePeriodMessage": "Dies sperrt die Ausgaben des aktuellen Zeitraums und startet einen neuen. Der ungenutzte Betrag wird in den nächsten Zeitraum übertragen.",
"closePeriodTitle": "Diesen Zeitraum schließen?",
"budgetStatusOverBudget": "BUDGET ÜBERSCHRITTEN",
"budgetStatusForecastBreach": "PROGNOSE-VERSTOESS",
"budgetStatusNearLimit": "NÄHE DER GRENZE",
"budgetStatusOnTrack": "IM PLAN",
"budgetStatusAwaitingSync": "SYNCHRONISIERUNG AUSSTEHEND",
"budgetPeriodWeekly": "Wöchentlich · ab",
"budgetPeriodMonthly": "Monatlich · ab",
"budgetPeriodYearly": "Jährlich · ab",
"budgetKpiRemaining": "Verbleibend",
"budgetKpiProjected": "Prognostiziert",
"budgetKpiRefunds": "Rückerstattungen",
"budgetKpiRolloverIn": "Übertrag auf",
"budgetTargetCategory": "Kategorie",
"budgetTargetWallet": "Geldbörse",
"budgetTargetGroup": "Gruppe",
"budgetTargetsLabel": "Ziele",
"budgetPeriodHistoryLabel": "Zeitraumverlauf",
"budgetTargetsApplyAll": "Gilt für alle Transaktionen in diesem Zeitraum.",
"budgetNoPeriods": "Noch keine geschlossenen Zeiträume.",
"budgetNoProgress": "Der Fortschritt wird verfügbar sein, sobald dieses Budget mit dem Server synchronisiert ist.",
"budgetTargetUnnamed": "(unbenannt)",
"newBudget": "New budget",
"period": "Period",
"startDate": "Start date",
"endDate": "End date",
"target": "target",
"targets": "targets",
"selected": "selected",
"budgetRolloverDescription": "Carry leftover budget into next period",
"budgetForecastAlerts": "Forecast alerts",
"budgetForecastAlertsDescription": "Warn me if I'm projected to overspend",
"active": "Active",
"saveChanges": "Save changes",
"budgetNameRequired": "Please enter a name",
"budgetAmountRequired": "Please enter a valid amount",
"budgetCurrencyRequired": "Currency must be 3 letters",
"nameHint": "e.g. Groceries",
"amountHint": "0.00",
"periodWeekly": "Weekly",
"periodMonthly": "Monthly",
"periodYearly": "Yearly",
"periodCustom": "Custom",
"selectDate": "Select date",
"selectEndDate": "Select end date",
"alertAtThreshold": "Alert at {0}% used",
"description": "Description (optional)",
"selectTargets": "Select targets",
"done": "Done",
"categories": "Categories",
"wallets": "Wallets",
"groups": "Groups",
"noCategoriesYet": "No categories yet",
"noWalletsYet": "No wallets yet",
"noGroupsYet": "No groups yet",
"budgetPageTitle": "Budgets",
"searchBudgets": "Search budgets",
"filterAll": "All",
"filterActive": "Active",
"periodWeeklyShort": "/wk",
"periodMonthlyShort": "/mo",
"periodYearlyShort": "/yr",
"scopeAllTransactions": "All transactions",
"targetTypeCategorySingular": "category",
"targetTypeWalletSingular": "wallet",
"targetTypeGroupSingular": "group",
"edit": "Edit",
"delete": "Delete",
"statusInactive": "Inactive",
"noBudgetsYet": "No budgets yet",
"noBudgetsDescription": "Track your spending against a target.\nSet a limit and we'll watch it for you.",
"noBudgetsMatchFilter": "No budgets match this filter.",
"noMatchesForQuery": "No matches for \"{0}\".",
"budgetSuffix": " budget",
"drawerBudgets": "Budgets",
"drawerEveryday": "EVERYDAY",
"drawerOrganize": "ORGANIZE",
"drawerMore": "MORE",
"supportEmail": "support@trakli.app",
"supportEmailSubject": "Trakli Support Request",
"supportEmailCopied": "{0} (copied to clipboard)",
"defaultUserName": "Trakli",
"appTitle": "Trakli"
}
132 changes: 127 additions & 5 deletions assets/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
"onboardTitle1": "Simplified personal finance",
"onboardDesc1": "Trakli focuses on the basics and gives just what you need to see where your money is coming from or going to.",
"onboardTitle2": "Automated",
"onboardDesc2": "Let us automatically pick up transactions from your SMS and fill your income and expense report before you even open the app. You can also share statements with us, such as emails.",
"onboardTitle3": "Free and open source",
"onboardDesc3": "It does not cost anything to use Trakli",
"onboardDesc2": "AI reads your receipts, PDFs, CSV and XLS statements. Connect Plaid, MCP and other providers to keep balances and transactions in sync.",
"onboardTitle3": "Open source",
"onboardDesc3": "Yours to inspect, host and trust. Audit the code, run your own server, keep your data on your terms.",
"skip": "Skip",
"login": "Login",
"loginGoogle": "Sign in with Google",
Expand All @@ -33,7 +33,7 @@
"home": "Home",
"history": "History",
"wallet": "Wallet",
"transactionHistory": "Transaction History",
"transactionHistory": "Transaction history",
"addTransaction": "Add transaction",
"addGroup": "Add group",
"myGroup": "My group",
Expand Down Expand Up @@ -102,6 +102,18 @@
"groupCreateGroup": "Create group",
"statistics": "Statistics",
"profile": "Profile",
"ai": "AI",
"aiChatTitle": "Ask Trakli",
"aiChatEmptyHint": "Ask anything about your finances",
"aiChatComposerPlaceholder": "Ask a question…",
"aiChatNewChat": "New chat",
"aiChatThinking": "Thinking…",
"aiChatError": "Something went wrong. Try again.",
"aiChatHistory": "Chat history",
"aiChatUntitled": "Untitled chat",
"aiChatNoSessions": "No conversations yet",
"aiChatNoSessionsHint": "Start a new chat to see it here.",
"aiChatDeleteConfirm": "Delete this conversation? This can't be undone.",
"settings": "Settings",
"typeHere": "Type here",
"balanceAmountWithCurrency": "{}",
Expand Down Expand Up @@ -188,6 +200,7 @@
"about": "About",
"switchDefaultGroup": "Switch default group",
"walletTransfer": "Wallet transfer",
"transfer": "Transfer",
"walletTransferDefaultDescription": "Money transfer from {fromCurrency} wallet to {toCurrency} wallet",
"sourceWallet": "Source wallet",
"orangeMoney": "Orange money",
Expand Down Expand Up @@ -618,5 +631,114 @@
"importConfirmSheetTitle": "Confirm {} of {} suggestions?",
"importCreateTransactions": "Create transactions",
"importAutoCreateMissingHint": "{} item(s) without a selection — will be created from the AI suggestion.",
"importAutoCreateNoneNeeded": "All accepted items already have a selection."
"importAutoCreateNoneNeeded": "All accepted items already have a selection.",
"budget": "Budget",
"budgets": "Budgets",
"addBudget": "Add budget",
"createBudget": "Create budget",
"editBudget": "Edit budget",
"deleteBudget": "Delete budget",
"deleteBudgetConfirm": "This will remove \"{name}\" from your budgets. This cannot be undone.",
"deleteBudgetSuccess": "Budget deleted",
"deleteBudgetError": "Failed to delete budget",
"closeBudgetPeriod": "Close period",
"closePeriod": "Close current period",
"closePeriodConfirm": "Close period",
"closePeriodSuccess": "Period closed",
"closePeriodError": "Failed to close period",
"budgetAmount": "Budget amount",
"budgetPeriod": "Budget period",
"budgetTargets": "Targets",
"budgetPeriodHistory": "Period history",
"budgetStatus": "Status",
"budgetRemaining": "Remaining",
"budgetProjected": "Projected",
"budgetRefunds": "Refunds",
"budgetRollover": "Rollover",
"budgetRolloverIn": "Rollover in",
"budgetPeriodOpen": "Open",
"closePeriodMessage": "This will lock the current period's spending and start a new one. Unused amount will roll into the next period.",
"closePeriodTitle": "Close this period?",
"budgetStatusOverBudget": "OVER BUDGET",
"budgetStatusForecastBreach": "FORECAST BREACH",
"budgetStatusNearLimit": "NEAR LIMIT",
"budgetStatusOnTrack": "ON TRACK",
"budgetStatusAwaitingSync": "AWAITING SYNC",
"budgetPeriodWeekly": "Weekly · starting",
"budgetPeriodMonthly": "Monthly · starting",
"budgetPeriodYearly": "Yearly · starting",
"budgetKpiRemaining": "Remaining",
"budgetKpiProjected": "Projected",
"budgetKpiRefunds": "Refunds",
"budgetKpiRolloverIn": "Rollover in",
"budgetTargetCategory": "Category",
"budgetTargetWallet": "Wallet",
"budgetTargetGroup": "Group",
"budgetTargetsLabel": "Targets",
"budgetPeriodHistoryLabel": "Period history",
"budgetTargetsApplyAll": "Applies to all transactions in this period.",
"budgetNoPeriods": "No closed periods yet.",
"budgetNoProgress": "Progress will be available once this budget syncs with the server.",
"budgetTargetUnnamed": "(unnamed)",
"newBudget": "New budget",
"period": "Period",
"startDate": "Start date",
"endDate": "End date",
"target": "target",
"targets": "targets",
"selected": "selected",
"budgetRolloverDescription": "Carry leftover budget into next period",
"budgetForecastAlerts": "Forecast alerts",
"budgetForecastAlertsDescription": "Warn me if I'm projected to overspend",
"active": "Active",
"saveChanges": "Save changes",
"budgetNameRequired": "Please enter a name",
"budgetAmountRequired": "Please enter a valid amount",
"budgetCurrencyRequired": "Currency must be 3 letters",
"nameHint": "e.g. Groceries",
"amountHint": "0.00",
"periodWeekly": "Weekly",
"periodMonthly": "Monthly",
"periodYearly": "Yearly",
"periodCustom": "Custom",
"selectDate": "Select date",
"selectEndDate": "Select end date",
"alertAtThreshold": "Alert at {0}% used",
"description": "Description (optional)",
"selectTargets": "Select targets",
"done": "Done",
"categories": "Categories",
"wallets": "Wallets",
"groups": "Groups",
"noCategoriesYet": "No categories yet",
"noWalletsYet": "No wallets yet",
"noGroupsYet": "No groups yet",
"budgetPageTitle": "Budgets",
"searchBudgets": "Search budgets",
"filterAll": "All",
"filterActive": "Active",
"periodWeeklyShort": "/wk",
"periodMonthlyShort": "/mo",
"periodYearlyShort": "/yr",
"scopeAllTransactions": "All transactions",
"targetTypeCategorySingular": "category",
"targetTypeWalletSingular": "wallet",
"targetTypeGroupSingular": "group",
"edit": "Edit",
"delete": "Delete",
"statusInactive": "Inactive",
"noBudgetsYet": "No budgets yet",
"noBudgetsDescription": "Track your spending against a target.\nSet a limit and we'll watch it for you.",
"noBudgetsMatchFilter": "No budgets match this filter.",
"noMatchesForQuery": "No matches for \"{0}\".",
"budgetSuffix": " budget",
"drawerBudgets": "Budgets",
"drawerEveryday": "EVERYDAY",
"drawerOrganize": "ORGANIZE",
"drawerMore": "MORE",
"supportEmail": "support@trakli.app",
"supportEmailSubject": "Trakli Support Request",
"supportEmailCopied": "{0} (copied to clipboard)",
"defaultUserName": "Trakli",
"appTitle": "Trakli"
}
Loading
Loading