Tinh tế mobile apps built with Flutter for evaluation purposes.
Google Play Store: Open Beta Testing
Apple App Store: TestFlight
Or check the PR / commit comments, this repo has GitHub Actions setup to build and upload the apps to GCS (automatically deleted after 30 days).
- Supported platforms: Android, iOS, Linux, macOS, Windows
- State management with provider
- Apple login via sign_in_with_apple
- Google login via google_sign_in
- Store authentication token with flutter_secure_storage
- Render HTML with flutter_widget_from_html
- Push notification via firebase_messaging
- Dark mode: on / off / auto
- Developer hidden menu (tap version in about dialog thrice)
- Android, iOS domain association with built-in deep link support
Screenshots
| Wide | Narrow |
|---|---|
![]() |
![]() |
| Normal thread | With post replies | Poll |
|---|---|---|
![]() |
![]() |
![]() |
| Tinhte Fact | Background post |
|---|---|
![]() |
![]() |
| Compare | Galleria | YouTube |
|---|---|---|
![]() |
![]() |
![]() |
All credentials are encrypted so you won't be able to compile the app immediately after a git pull. You have to replace the files mentioned in .gitattributes to build.
For example, lib/config.encrypted.dart should look like below:
import 'package:the_app/src/config.dart';
class Config extends ConfigBase {
@override
final apiRoot = 'https://domain.com/community/api/index.php';
@override
final clientId = 'abc';
@override
final clientSecret = 'xyz';
@override
final siteRoot = 'https://domain.com/community';
}See How to use another package name? for more information to rename the app.
- Translate the
lib/l10n/intl_messages.arbinto your new language. Save it as/lib/l10n/intl_(language_code).arb. - Execute
./tool/l10n_2.shto generate l10n files - Update
supportedLocalesparam inlib/main.dart - Update
isSupportedmethod inlib/src/intl.dart - Update
CFBundleLocalizationsinios/Runner/Info.plistto include the new language code
Pick a unique package name across Play Store and App Store then update these files:
.github/workflows/flutter.ymlGCS_BUCKET, GCS_URLandroid/app/build.gradleapplicationId, signingConfigs.releaseandroid/app/src/main/AndroidManifest.xmlpackage, android:labelandroid/app/src/main/res/values/strings.xmlapp_nameandroid/fastlane/metadata/android/en-US/title.txt, full_description.txt, short_description.txtandroid/fastlane/Appfilefirebase/.firebasercprojects.defaultios/Runner.xcodeproj/project.pbxprojPRODUCT_BUNDLE_IDENTIFIER x2, PROVISIONING_PROFILE_SPECIFIER x2ios/Runner/Info.plistCFBundleName, CFBundleURLSchemesios/fastlane/Appfileios/fastlane/Fastfilexcargs (PROVISIONING_PROFILE_SPECIFIER), manifest (appURL, displayImageURL, fullSizeImageURL)ios/fastlane/Matchfilelinux/CMakeLists.txtAPPLICATION_IDmacos/Runner/Configs/AppInfo.xcconfigmacos/Runner.xcodeproj/project.pbxprojPROVISIONING_PROFILE_SPECIFIER x3macos/fastlane/Appfilemacos/fastlane/Fastfilenotarizemacos/fastlane/Matchfilewindows/runner/Runner.rcpubspec.yamlmsix_config>identity_name- Re-run
flutterfire configureto update Firebase apps
You will also need to move the files within android/app/src/main/java/com/daohoangson/flutter_ttdemo to another directory to match the new Android package.
For Firebase Messaging, execute these commands to set the proper config variables:
firebase functions:config:set websub.hub=https://domain.com/xenforo/api/index.php\?subscriptions
firebase functions:config:set websub.url=https://region-project.cloudfunctions.net/websub








