gitextract_kx9s49de/ ├── .claude/ │ └── skills/ │ └── translate/ │ └── SKILL.md ├── .githooks/ │ └── pre-commit ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ ├── build-alpha-arm64.yml │ ├── manual-build.yml │ ├── on-release.yml │ └── release-alpha.yml ├── .gitignore ├── .gitmodules ├── .metadata ├── .vscode/ │ └── launch.json ├── LICENSE ├── README.md ├── analysis_options.yaml ├── android/ │ ├── .gitignore │ ├── app/ │ │ ├── build.gradle │ │ └── src/ │ │ ├── alpha/ │ │ │ └── res/ │ │ │ └── mipmap-anydpi-v26/ │ │ │ └── ic_launcher.xml │ │ ├── debug/ │ │ │ └── AndroidManifest.xml │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── example/ │ │ │ │ └── piggybank/ │ │ │ │ └── MainActivity.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ └── launch_background.xml │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ └── ic_launcher.xml │ │ │ ├── values/ │ │ │ │ └── styles.xml │ │ │ └── xml/ │ │ │ └── locales_config.xml │ │ └── profile/ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle/ │ │ └── wrapper/ │ │ └── gradle-wrapper.properties │ ├── gradle.properties │ ├── settings.gradle │ └── settings_aar.gradle ├── appium/ │ ├── .gitattributes │ ├── .gitignore │ ├── app/ │ │ ├── build.gradle │ │ └── src/ │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── github/ │ │ └── emavgl/ │ │ └── oinkoin/ │ │ └── tests/ │ │ └── appium/ │ │ ├── BaseTest.java │ │ ├── HomePageTest.java │ │ ├── NavigationBarTest.java │ │ ├── pages/ │ │ │ ├── BasePage.java │ │ │ ├── CategoriesPage.java │ │ │ ├── CategorySelectionPage.java │ │ │ ├── EditRecordPage.java │ │ │ ├── HomePage.java │ │ │ └── SettingsPage.java │ │ └── utils/ │ │ ├── CategoryType.java │ │ ├── Constants.java │ │ ├── RecordData.java │ │ ├── RepeatOption.java │ │ └── Utils.java │ ├── gradle/ │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── settings.gradle ├── assets/ │ └── locales/ │ ├── ar.json │ ├── ca.json │ ├── da.json │ ├── de.json │ ├── el.json │ ├── en-GB.json │ ├── en-US.json │ ├── es.json │ ├── fr.json │ ├── hr.json │ ├── it.json │ ├── ja.json │ ├── or-IN.json │ ├── pl.json │ ├── pt-BR.json │ ├── pt-PT.json │ ├── ru.json │ ├── ta-IN.json │ ├── tr.json │ ├── uk-UA.json │ ├── vec-IT.json │ └── zh-CN.json ├── build.sh ├── build_linux.sh ├── bump_new_version.py ├── create_release_blog_post.py ├── devtools_options.yaml ├── distribute_options.yaml ├── ios/ │ ├── Flutter/ │ │ └── ephemeral/ │ │ ├── flutter_lldb_helper.py │ │ └── flutter_lldbinit │ └── PLACEHOLDER ├── lib/ │ ├── categories/ │ │ ├── categories-grid.dart │ │ ├── categories-list.dart │ │ ├── categories-tab-page-edit.dart │ │ ├── categories-tab-page-view.dart │ │ ├── category-sort-option.dart │ │ └── edit-category-page.dart │ ├── components/ │ │ ├── category_icon_circle.dart │ │ ├── tag_chip.dart │ │ └── year-picker.dart │ ├── generated_plugin_registrant.dart │ ├── helpers/ │ │ ├── alert-dialog-builder.dart │ │ ├── color-utils.dart │ │ ├── date_picker_utils.dart │ │ ├── datetime-utility-functions.dart │ │ ├── first_day_of_week_localizations.dart │ │ ├── records-generator.dart │ │ └── records-utility-functions.dart │ ├── i18n/ │ │ └── i18n_helper.dart │ ├── i18n.dart │ ├── main.dart │ ├── models/ │ │ ├── backup.dart │ │ ├── category-icons.dart │ │ ├── category-type.dart │ │ ├── category.dart │ │ ├── model.dart │ │ ├── record-tag-association.dart │ │ ├── record.dart │ │ ├── records-per-category.dart │ │ ├── records-per-day.dart │ │ ├── records-summary-by-category.dart │ │ ├── recurrent-period.dart │ │ └── recurrent-record-pattern.dart │ ├── premium/ │ │ ├── splash-screen.dart │ │ └── util-widgets.dart │ ├── records/ │ │ ├── components/ │ │ │ ├── days-summary-box-card.dart │ │ │ ├── filter_modal_content.dart │ │ │ ├── records-day-list.dart │ │ │ ├── records-per-day-card.dart │ │ │ ├── styled_action_buttons.dart │ │ │ ├── styled_popup_menu_button.dart │ │ │ ├── tab_records_app_bar.dart │ │ │ ├── tab_records_date_picker.dart │ │ │ ├── tab_records_search_app_bar.dart │ │ │ └── tag_selection_dialog.dart │ │ ├── controllers/ │ │ │ └── tab_records_controller.dart │ │ ├── edit-record-page.dart │ │ ├── formatter/ │ │ │ ├── auto_decimal_shift_formatter.dart │ │ │ ├── calculator-normalizer.dart │ │ │ └── group-separator-formatter.dart │ │ └── records-page.dart │ ├── recurrent_record_patterns/ │ │ └── patterns-page-view.dart │ ├── services/ │ │ ├── backup-service.dart │ │ ├── csv-service.dart │ │ ├── database/ │ │ │ ├── database-interface.dart │ │ │ ├── exceptions.dart │ │ │ ├── sqlite-database.dart │ │ │ └── sqlite-migration-service.dart │ │ ├── locale-service.dart │ │ ├── logger.dart │ │ ├── platform-file-service.dart │ │ ├── recurrent-record-service.dart │ │ └── service-config.dart │ ├── settings/ │ │ ├── backup-page.dart │ │ ├── backup-restore-dialogs.dart │ │ ├── backup-retention-period.dart │ │ ├── clickable-customization-item.dart │ │ ├── components/ │ │ │ └── setting-separator.dart │ │ ├── constants/ │ │ │ ├── homepage-time-interval.dart │ │ │ ├── overview-time-interval.dart │ │ │ ├── preferences-defaults-values.dart │ │ │ ├── preferences-keys.dart │ │ │ └── preferences-options.dart │ │ ├── customization-page.dart │ │ ├── dropdown-customization-item.dart │ │ ├── feedback-page.dart │ │ ├── preferences-utils.dart │ │ ├── settings-item.dart │ │ ├── settings-page.dart │ │ ├── style.dart │ │ ├── switch-customization-item.dart │ │ └── text-input-customization-item.dart │ ├── shell.dart │ ├── statistics/ │ │ ├── aggregated-list-view.dart │ │ ├── balance-chart-models.dart │ │ ├── balance-comparison-chart.dart │ │ ├── balance-tab-page.dart │ │ ├── bar-chart-card.dart │ │ ├── base-statistics-page.dart │ │ ├── categories-pie-chart.dart │ │ ├── category-tag-balance-page.dart │ │ ├── category-tag-records-page.dart │ │ ├── group-by-dropdown.dart │ │ ├── overview-card.dart │ │ ├── record-filters.dart │ │ ├── statistics-calculator.dart │ │ ├── statistics-models.dart │ │ ├── statistics-page.dart │ │ ├── statistics-summary-card.dart │ │ ├── statistics-tab-page.dart │ │ ├── statistics-utils.dart │ │ ├── summary-models.dart │ │ ├── summary-rows.dart │ │ ├── tags-pie-chart.dart │ │ └── unified-balance-card.dart │ ├── style.dart │ ├── tags/ │ │ └── tags-page-view.dart │ └── utils/ │ └── constants.dart ├── linux/ │ ├── .gitignore │ ├── CMakeLists.txt │ ├── com.github.emavgl.oinkoin.desktop │ ├── flutter/ │ │ ├── CMakeLists.txt │ │ ├── generated_plugin_registrant.cc │ │ ├── generated_plugin_registrant.h │ │ └── generated_plugins.cmake │ ├── packaging/ │ │ ├── appimage/ │ │ │ └── make_config.yaml │ │ ├── deb/ │ │ │ └── make_config.yaml │ │ └── rpm/ │ │ └── make_config.yaml │ └── runner/ │ ├── CMakeLists.txt │ ├── main.cc │ ├── my_application.cc │ └── my_application.h ├── macos/ │ ├── Flutter/ │ │ └── GeneratedPluginRegistrant.swift │ └── PLACEHOLDER ├── metadata/ │ ├── ca/ │ │ ├── full_description.txt │ │ └── short_description.txt │ ├── en-US/ │ │ ├── changelogs/ │ │ │ ├── 6008.txt │ │ │ ├── 6009.txt │ │ │ ├── 6016.txt │ │ │ ├── 6017.txt │ │ │ ├── 6018.txt │ │ │ ├── 6019.txt │ │ │ ├── 6020.txt │ │ │ ├── 6021.txt │ │ │ ├── 6022.txt │ │ │ ├── 6023.txt │ │ │ ├── 6024.txt │ │ │ ├── 6025.txt │ │ │ ├── 6026.txt │ │ │ ├── 6027.txt │ │ │ ├── 6028.txt │ │ │ ├── 6029.txt │ │ │ ├── 6030.txt │ │ │ ├── 6031.txt │ │ │ ├── 6032.txt │ │ │ ├── 6033.txt │ │ │ ├── 6034.txt │ │ │ ├── 6035.txt │ │ │ ├── 6036.txt │ │ │ ├── 6037.txt │ │ │ ├── 6038.txt │ │ │ ├── 6039.txt │ │ │ ├── 6040.txt │ │ │ ├── 6041.txt │ │ │ ├── 6042.txt │ │ │ ├── 6043.txt │ │ │ ├── 6044.txt │ │ │ ├── 6045.txt │ │ │ ├── 6046.txt │ │ │ ├── 6047.txt │ │ │ ├── 6048.txt │ │ │ ├── 6049.txt │ │ │ ├── 6050.txt │ │ │ ├── 6051.txt │ │ │ ├── 6052.txt │ │ │ ├── 6053.txt │ │ │ ├── 6054.txt │ │ │ ├── 6055.txt │ │ │ ├── 6056.txt │ │ │ ├── 6057.txt │ │ │ ├── 6058.txt │ │ │ ├── 6059.txt │ │ │ ├── 6060.txt │ │ │ ├── 6061.txt │ │ │ ├── 6062.txt │ │ │ ├── 6063.txt │ │ │ ├── 6064.txt │ │ │ ├── 6065.txt │ │ │ ├── 6066.txt │ │ │ ├── 6067.txt │ │ │ ├── 6068.txt │ │ │ ├── 6069.txt │ │ │ ├── 6070.txt │ │ │ ├── 6071.txt │ │ │ ├── 6072.txt │ │ │ ├── 6073.txt │ │ │ ├── 6074.txt │ │ │ ├── 6075.txt │ │ │ ├── 6076.txt │ │ │ ├── 6077.txt │ │ │ ├── 6078.txt │ │ │ ├── 6079.txt │ │ │ ├── 6080.txt │ │ │ ├── 6081.txt │ │ │ ├── 6082.txt │ │ │ ├── 6083.txt │ │ │ ├── 6084.txt │ │ │ ├── 6085.txt │ │ │ ├── 6086.txt │ │ │ ├── 6087.txt │ │ │ ├── 6088.txt │ │ │ ├── 6089.txt │ │ │ ├── 6090.txt │ │ │ ├── 6091.txt │ │ │ ├── 6092.txt │ │ │ ├── 6093.txt │ │ │ ├── 6094.txt │ │ │ ├── 7095.txt │ │ │ ├── 7096.txt │ │ │ ├── 7097.txt │ │ │ ├── 7098.txt │ │ │ ├── 7099.txt │ │ │ ├── 7100.txt │ │ │ ├── 7101.txt │ │ │ ├── 7102.txt │ │ │ ├── 7103.txt │ │ │ ├── 7104.txt │ │ │ ├── 7105.txt │ │ │ ├── 7106.txt │ │ │ ├── 7107.txt │ │ │ ├── 7108.txt │ │ │ ├── 7109.txt │ │ │ ├── 7110.txt │ │ │ ├── 7111.txt │ │ │ ├── 7112.txt │ │ │ ├── 7113.txt │ │ │ ├── 7114.txt │ │ │ ├── 7115.txt │ │ │ └── 7116.txt │ │ ├── full_description.txt │ │ ├── short_description.txt │ │ └── title.txt │ ├── ja/ │ │ ├── full_description.txt │ │ └── short_description.txt │ └── ru/ │ ├── full_description.txt │ └── short_description.txt ├── privacy-policy.md ├── pubspec.yaml ├── scripts/ │ ├── oinkoin_from_csv_importer.py │ ├── update-submodules.sh │ └── update_en_strings.py ├── test/ │ ├── backup/ │ │ ├── README.md │ │ ├── backup_service_test.dart │ │ ├── backup_service_test.mocks.dart │ │ ├── database_interface.mocks.dart │ │ ├── import_tag_association_bug_test.dart │ │ ├── import_tag_association_bug_test.mocks.dart │ │ ├── user_data_import_verification_test.dart │ │ └── user_data_import_verification_test.mocks.dart │ ├── backup_import_tag_bug_test.dart │ ├── chart_ticks_test.dart │ ├── compute_number_of_intervals_test.dart │ ├── csv_service_test.dart │ ├── datetime_utility_functions_locale_test.dart │ ├── datetime_utility_functions_test.dart │ ├── formatter/ │ │ ├── auto_decimal_shift_formatter_test.dart │ │ └── formatter_integration_test.dart │ ├── future_records_integration_test.dart │ ├── future_recurrent_records_test.dart │ ├── helpers/ │ │ └── test_database.dart │ ├── locale_debug_test.dart │ ├── models/ │ │ ├── category.dart │ │ ├── record.dart │ │ └── recurrent_pattern.dart │ ├── overview_card_calculations_test.dart │ ├── record_filters_test.dart │ ├── recurrent_pattern_tags_integration_test.dart │ ├── recurrent_record_test.dart │ ├── show_future_records_preference_test.dart │ ├── statistics_drilldown_label_test.dart │ ├── tab_records_controller_test.dart │ ├── tag_management_test.dart │ └── test_database.dart └── website/ ├── .gitignore ├── DEPLOYMENT.md ├── QUICKSTART.md ├── README.md ├── astro.config.mjs ├── package.json ├── public/ │ ├── .assetsignore │ └── robots.txt ├── src/ │ ├── components/ │ │ ├── Download.astro │ │ ├── Features.astro │ │ ├── Footer.astro │ │ ├── Hero.astro │ │ ├── NavBar.astro │ │ └── Screenshots.astro │ ├── content/ │ │ ├── blog/ │ │ │ ├── linux-beta.md │ │ │ ├── release-1-1-10.md │ │ │ ├── release-1-1-7.md │ │ │ ├── release-1-1-8.md │ │ │ ├── release-1-1-9.md │ │ │ ├── release-1-2-0.md │ │ │ ├── release-1-2-1.md │ │ │ ├── release-1-3-0.md │ │ │ ├── release-1-3-1.md │ │ │ ├── release-1-3-2.md │ │ │ ├── release-1-3-3.md │ │ │ ├── release-1-4-0.md │ │ │ ├── release-1-4-1.md │ │ │ ├── release-1-4-2.md │ │ │ ├── release-1-5-0.md │ │ │ └── welcome.md │ │ └── config.ts │ ├── env.d.ts │ ├── layouts/ │ │ └── Layout.astro │ └── pages/ │ ├── blog/ │ │ ├── [...slug].astro │ │ └── index.astro │ ├── index.astro │ └── safety.astro ├── tailwind.config.mjs ├── tsconfig.json └── wrangler.jsonc