[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9300":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":34,"readmeContent":35,"aiSummary":36,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":37,"discoverSource":38},9300,"admin-portal","invoiceninja\u002Fadmin-portal","invoiceninja","Invoice Ninja: Desktop\u002Fmobile admin portal built with Flutter","https:\u002F\u002Fdemo.invoiceninja.com",null,"Dart",1746,579,54,72,0,2,4,1,21.29,"Other",false,"master",true,[26,27,28,29,30,31,32,33],"android","flutter","invoice","ios","linux","macos","redux","windows","2026-06-12 02:02:05","# Invoice Ninja\n\nClient application for [Invoice Ninja](https:\u002F\u002Fgithub.com\u002Finvoiceninja\u002Finvoiceninja).\n\n#### Desktop Apps\n- [Windows](https:\u002F\u002Fapps.microsoft.com\u002Fstore\u002Fdetail\u002Finvoice-ninja\u002F9N3F2BBCFDR6)\n- [macOS](https:\u002F\u002Fapps.apple.com\u002Fapp\u002Fid1503970375?platform=mac)\n- [Linux - Snap](https:\u002F\u002Fsnapcraft.io\u002Finvoiceninja)\n- [Linux - Flatpak](https:\u002F\u002Fflathub.org\u002Fapps\u002Fcom.invoiceninja.InvoiceNinja)\n\n#### Mobile Apps\n- [iOS](https:\u002F\u002Fapps.apple.com\u002Fapp\u002Fid1503970375?platform=iphone)\n- [Android](https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.invoiceninja.app)\n- [F-Droid](https:\u002F\u002Ff-droid.org\u002Fen\u002Fpackages\u002Fcom.invoiceninja.app)\n\n\u003Cp align=\"center\">\n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Finvoiceninja\u002Fflutter-mobile\u002Fblob\u002Fmaster\u002Fsamples\u002Fscreenshots\u002F1.png\" alt=\"Dashboard\" width=\"200\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Finvoiceninja\u002Fflutter-mobile\u002Fblob\u002Fmaster\u002Fsamples\u002Fscreenshots\u002F2.png\" alt=\"View Invoice\" width=\"200\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Finvoiceninja\u002Fflutter-mobile\u002Fblob\u002Fmaster\u002Fsamples\u002Fscreenshots\u002F3.png\" alt=\"List Invoice\" width=\"200\"\u002F>\n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Finvoiceninja\u002Fflutter-mobile\u002Fblob\u002Fmaster\u002Fsamples\u002Fscreenshots\u002F4.png\" alt=\"New Invoice\" width=\"200\"\u002F>\n\u003C\u002Fp>\n\n# Table of Contents\n\n- [Setting up the app](#setting-up-the-app)\n- [Steps to remove non-FOSS code](#steps-to-remove-non-foss-code)\n- [Application Architecture](#application-architecture)\n    - [Package Structure](#package-structure)\n    - [Blog Posts](#blog-posts)\n- [Code generation](#code-generation)\n- [Tests](#tests)\n- [Code signing](#code-signing)\n- [Credits](#credits)\n- [Contributions](#contributions)\n\n---\n\n## Setting up the app\n\n- Initialize the config file\n\n    `cp lib\u002F.env.dart.example lib\u002F.env.dart`\n\n- Support running the code unsigned on Android\n\n    `cp android\u002Fapp\u002Fbuild.gradle.dev.kts android\u002Fapp\u002Fbuild.gradle.kts`\n\n- Run the app\n\n    `flutter run`\n\nNote: if you don't have an Invoice Ninja backend setup you can test the app with these credentials:\n\n- Email: `demo@invoiceninja.com`\n- Password: `Password0`\n- URL: `demo.invoiceninja.com`\n\n## Steps to remove non-FOSS code\n\n```\ncp lib\u002Futils\u002Foauth.dart.foss lib\u002Futils\u002Foauth.dart\ncp lib\u002Futils\u002Fapp_review.dart.foss lib\u002Futils\u002Fapp_review.dart\ncp lib\u002Fui\u002Fapp\u002Fupgrade_dialog.dart.foss lib\u002Fui\u002Fapp\u002Fupgrade_dialog.dart\ncp lib\u002Fui\u002Fapp\u002Fpinput.dart.foss lib\u002Fui\u002Fapp\u002Fpinput.dart\ncp android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.foss.xml android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml\ncp android\u002Fsettings.gradle.foss.kts android\u002Fsettings.gradle.kts\ncp pubspec.foss.yaml pubspec.yaml \nrm pubspec.lock\n```\n\n## Application Architecture\n\nThe application was created using the [Flutter Redux Starter](https:\u002F\u002Fgithub.com\u002Fhillelcoren\u002Fflutter-redux-starter).\n\nThe architecture is based off these two projects:\n\n- [Redux Sample](https:\u002F\u002Fgithub.com\u002Fbrianegan\u002Fflutter_architecture_samples\u002Ftree\u002Fmaster\u002Fredux) - [Brian Egan](https:\u002F\u002Ftwitter.com\u002Fbrianegan)\n- [inKino](https:\u002F\u002Fgithub.com\u002Froughike\u002FinKino) - [Iiro Krankka](https:\u002F\u002Ftwitter.com\u002Fkoorankka)\n\n### File Structure\n\nA High-level overview of the project structure:\n```\n\nlib\u002F                     # Root Package\n|\n├─ data\u002F                 # For data handling\n│  ├─ mock\u002F              # sample used for testing\n│  ├─ models\u002F            # Objects representing data\n│  ├─ repositories\u002F      # Source of data\n|\n├─ redux\u002F                # manages app state\n│  ├─ component\u002F         # app building block\n│     ├─ actions         # methods to update app state\n|     ├─ middleware      # run in response to actions, execute before reducer\n|     ├─ reducer         # intercepts actions, responsible for updating the state\n|     ├─ selectors       # read data from the state, queries against your 'state database'\n|     ├─ state           # immutable object that lives at the top of the widget hierarchy\n|\n├─ ui\u002F                   # app views\n│  ├─ component\u002F         # views for different components\n│    ├─ view\u002F            # generel view for component\n│    ├─ edit\u002F            # change values on the views fields\n|\n├─ utils\u002F                # Utility classes\n\n```\n\nThe ui and redux folders contain components that are paired together.\nPut simply you will find an 'auth' folder in both the ui and redux folders.\n\nFor additional information on [Redux architecture](https:\u002F\u002Fblog.logrocket.com\u002Fflutter-redux-complete-tutorial-with-examples\u002F)\n\n\n\n### Blog Posts\n- [Intro to Google Flutter](https:\u002F\u002Fhillel.dev\u002F2018\u002F05\u002F18\u002Fflutter-is-darts-killer-app\u002F)\n- [Using Redux to manage state](https:\u002F\u002Fhillel.dev\u002F2018\u002F06\u002F01\u002Fbuilding-a-large-flutter-app-with-redux\u002F)\n- [Handling complex forms](https:\u002F\u002Fhillel.dev\u002F2018\u002F06\u002F18\u002Fflutter-using-redux-to-manage-complex-forms-with-multiple-tabs-and-relationships\u002F)\n- [Architectural review](https:\u002F\u002Fhillel.dev\u002F2018\u002F08\u002F10\u002Fan-architectural-review-of-the-invoice-ninja-flutter-app\u002F)\n- [Additional thoughts](https:\u002F\u002Fhillel.dev\u002F2018\u002F08\u002F24\u002Fongoing-adventures-with-flutter-and-redux\u002F)\n\n## Code generation\n- Run `flutter packages pub run build_runner build --delete-conflicting-outputs` to regenerate the model files. It will also remove the old generated files so conflicts are avoided..\n\n## Tests\n- Run `flutter drive --target=test_driver\u002Fall_it.dart` to run the tests\n    \n## Credits\n\n[https:\u002F\u002Fgithub.com\u002Finvoiceninja\u002Finvoiceninja#credits](https:\u002F\u002Fgithub.com\u002Finvoiceninja\u002Finvoiceninja\u002Ftree\u002Fv5-develop#credits)\n\n## Contributions\n\nWe gladly accept contributions! If you'd like to get involved with development please join our [Slack group](http:\u002F\u002Fslack.invoiceninja.com\u002F) or [Discord Server](https:\u002F\u002Fdiscord.gg\u002FZwEdtfCwXA).\n","Invoice Ninja 是一个基于 Flutter 构建的桌面和移动管理门户，用于发票管理和客户关系维护。该项目使用 Dart 语言开发，支持 Redux 架构模式，提供跨平台的解决方案，可以在 Windows、macOS、Linux、iOS 和 Android 上运行。其核心功能包括创建和管理发票、查看客户信息以及处理支付等。适合需要高效管理财务流程的小型企业或自由职业者使用，尤其适用于希望在不同设备上保持一致用户体验的用户。","2026-06-11 03:22:05","top_language"]