Skip to content

Instantly share code, notes, and snippets.

@bizz84
Last active May 3, 2024 15:18
Show Gist options
  • Save bizz84/5c2ee79cd103bd43ce97b4d7fcfed103 to your computer and use it in GitHub Desktop.
Save bizz84/5c2ee79cd103bd43ce97b4d7fcfed103 to your computer and use it in GitHub Desktop.
An app release checklist template for Flutter app development
{
"template": "App Release",
"version": 3,
"epics": [
{
"id": "ff",
"epic": "Flutter Flavors",
"tasks": [
{ "id": "B2A42464", "name": "Add Dev, Stg, Prod flavors on iOS" },
{ "id": "C9FB1D58", "name": "Add Dev, Stg, Prod flavors on Android" },
{ "id": "C4F3EEAA", "name": "Flavored API keys (dart-define or Envied)" },
{ "id": "D88C0DA4", "name": "FlutterFire setup with Flavors" }
]
},
{
"id": "ai",
"epic": "App Icons",
"tasks": [
{ "id": "7DA5766A", "name": "Design your own icon (IconKitchen, Figma)" },
{ "id": "0A5EEB63", "name": "Generate it with flutter_launcher_icons" },
{ "id": "029C2183", "name": "Different icons for each flavor" }
]
},
{
"id": "em",
"epic": "Error Monitoring",
"tasks": [
{ "id": "0836A3B0", "name": "Install and configure Sentry or Crashlytics" },
{ "id": "6FEC4658", "name": "Handle uncaught exceptions" },
{ "id": "75644300", "name": "Capture User Feedback (user_feedback package)" },
{ "id": "1F7504F6", "name": "Start monitoring and fixing issues after launch" },
{ "id": "48B9817D", "name": "Enable error monitoring in production builds only (if desired)" },
{ "id": "1CCBEB7B", "name": "Test your error monitoring logic" }
]
},
{
"id": "aa",
"epic": "Analytics",
"tasks": [
{ "id": "364BC976", "name": "Install and configure an analytics SDK of choice" },
{ "id": "0B203CD9", "name": "Make a list of all the events you want to track" },
{ "id": "DFB4257F", "name": "Add the event tracking code" },
{ "id": "B93C09F8", "name": "Add custom properties to relevant events" },
{ "id": "1E8213E6", "name": "Provide way to opt-out of data collection" },
{ "id": "E873F9CE", "name": "Enable analytics in production builds only (if desired)" },
{ "id": "5A1AF839", "name": "Test your analytics logic" }
]
},
{
"id": "fu",
"epic": "Force Upgrade",
"tasks": [
{ "id": "062D761A", "name": "Simple Force Upgrade strategy with Upgrader package" },
{ "id": "6DAE72DE", "name": "Custom Force Upgrade strategy with Firebase Remote Config" },
{ "id": "5319AF1F", "name": "Advanced Force Upgrade strategy with Rolling Release Window" },
{ "id": "7232501C", "name": "Test your force upgrade logic (dev build)" },
{ "id": "9043CEA1", "name": "Test your force upgrade logic (production build)" }
]
},
{
"id": "se",
"epic": "About / Settings page",
"tasks": [
{ "id": "9AB92F0F", "name": "App configuration settings (light/dark mode, etc)" },
{ "id": "869E57CA", "name": "Links to your app website / privacy policy / terms of use" },
{ "id": "A5DD4B1E", "name": "Show OSS licenses" }
]
},
{
"id": "ir",
"epic": "In App Review Prompt",
"tasks": [
{ "id": "A1D55FA9", "name": "Add a button to your about/setting page so users can leave a review" },
{ "id": "1710AAC8", "name": "Use Analytics to track KPIs related to in-app review" },
{ "id": "B9EFA364", "name": "Trigger app store review prompt based on custom logic" }
]
},
{
"id": "ay",
"epic": "Accessibility",
"tasks": [
{ "id": "CF6E07E1", "name": "Install accessibility_tools package" },
{ "id": "CAF5B3BB", "name": "Do an accessibility audit" },
{ "id": "2AC342E8", "name": "Add semantic labels to your widgets" },
{ "id": "89F155C3", "name": "Support large fonts and text scaling" },
{ "id": "3A9D1367", "name": "Improve colors and contrast" },
{ "id": "770600E2", "name": "Test your app with VoiceOver" },
{ "id": "55B298EB", "name": "Test your app with TalkBack" },
{ "id": "B8664A67", "name": "Check navigation and touch targets size" },
{ "id": "28D3222B", "name": "Check accessibility trasversal" }
]
},
{
"id": "as",
"epic": "App Security",
"tasks": [
{ "id": "1514A2D8", "name": "Store secret API keys on the server, not the client" },
{ "id": "6BCC45A3", "name": "Obfuscate any API keys that are stored on the client" },
{ "id": "9187875D", "name": "Do not add API keys to Git" },
{ "id": "D3ECFE22", "name": "Minimize collection of personally identifiable information (PII)" },
{ "id": "63433236", "name": "Anonymize any PII that is stored on device" },
{ "id": "2A18874C", "name": "Encrypt any sensitive data that is stored on device" },
{ "id": "AED9819C", "name": "Avoid logging sensitive data" },
{ "id": "FAFEAC88", "name": "Implement strong authentication and authorization" },
{ "id": "5D0C8C6C", "name": "Secure data storage and transmission" },
{ "id": "1FFA3B20", "name": "Prevent user data loss or corruption" },
{ "id": "C41ED2EB", "name": "Have a data backup strategy" },
{ "id": "B9E5FFC3", "name": "Review and address common vulnerabilities (OWASP Top 10)" },
{ "id": "F46DC96D", "name": "Implement Flutter-specific security best practices" },
{ "id": "A31EBF78", "name": "Protect user privacy" }
]
},
{
"id": "we",
"epic": "Create your App Website",
"tasks": [
{ "id": "E1D761CF", "name": "Choose a template to create your app website" },
{ "id": "6EEE2634", "name": "Add your app screenshot, icon, metadata" },
{ "id": "9712573F", "name": "Add your privacy policy and terms of use" },
{ "id": "DCFBB2F9", "name": "Publish your website on a non-branded domain" },
{ "id": "73C526B8", "name": "Publish your website on your custom domain" },
{ "id": "5258B296", "name": "Add the App Store download button (when app is live)" },
{ "id": "79F5D584", "name": "Add the Play Store download button (when app is live)" }
]
},
{
"id": "io",
"epic": "Submit to the iOS App Store",
"tasks": [
{ "id": "5790E9E7", "name": "Create a new app and fill all the required metadata" },
{ "id": "6CED0569", "name": "Add a PrivacyInfo.xcprivacy to the iOS project" },
{ "id": "6F6DE4B7", "name": "Capture and upload your app screenshots" },
{ "id": "FB5FED80", "name": "Use a distribution certificate and provisioning profile for code signing" },
{ "id": "370297D5", "name": "Manually create a release build and upload it" },
{ "id": "30A70110", "name": "Submit your app for review" },
{ "id": "AE92D676", "name": "Address any app rejections and publish your app" }
]
},
{
"id": "gp",
"epic": "Submit to the Google Play Store",
"tasks": [
{ "id": "59B46DAA", "name": "Create a new app and fill all the required metadata" },
{ "id": "F1C93F59", "name": "Capture and upload your app screenshots" },
{ "id": "05F1B2A5", "name": "Generate a signed keystore for release" },
{ "id": "A0C32339", "name": "Manually create a release build and upload it" },
{ "id": "CA64B7A2", "name": "Submit your app for review" },
{ "id": "FDBF31FB", "name": "Address any app rejections and publish your app" }
]
},
{
"id": "ci",
"epic": "Automate your builds (CI/CD)",
"tasks": [
{ "id": "9B11C2CB", "name": "Choose a CI/CD system (GitHub Actions / Codemagic / Fastlane or others)" },
{ "id": "460C0896", "name": "Add workflow to analyze, build, and run tests" },
{ "id": "0803CB68", "name": "Add workflow to build for release, distribute to App Store (Publishing)" },
{ "id": "D81634F3", "name": "Add workflow to build for release, distribute to App Store (Testing)" },
{ "id": "57AC8E62", "name": "Add workflow to build for release, distribute to Play Store (Publishing)" },
{ "id": "71F285C8", "name": "Add workflow to build for release, distribute to Play Store (Testing)" },
{ "id": "0D98CC35", "name": "Automate the increment of the build number for each release" },
{ "id": "155A1531", "name": "Automate the screenshot generation" }
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment