Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
2644ec1
feat: initialize new Shorebird weather sample project with multi-plat…
AbhishekDoshi26 Jul 2, 2026
92bc5f2
refactor: replace shorebird_weather sample with clear_skies project s…
AbhishekDoshi26 Jul 8, 2026
f620e69
feat: add shorebird.yaml configuration file for clear_skies sample
AbhishekDoshi26 Jul 8, 2026
5887118
feat: add Clear Skies weather application with Bloc architecture and …
AbhishekDoshi26 Jul 8, 2026
df96364
feat: implement weather-based suggestions and refactor code for bette…
AbhishekDoshi26 Jul 8, 2026
1ffda70
feat: implement favorites BLoC and add back navigation to search bar
AbhishekDoshi26 Jul 8, 2026
1de9c93
refactor: migrate project structure to feature-first architecture
AbhishekDoshi26 Jul 8, 2026
d1526c1
test: add comprehensive test suite for features and core components a…
AbhishekDoshi26 Jul 8, 2026
08967b1
feat: add flutter_launcher_icons to automate app icon generation and …
AbhishekDoshi26 Jul 8, 2026
86ba868
feat: add WelcomeHeroWidget and update weather screen UI with dynamic…
AbhishekDoshi26 Jul 8, 2026
8285277
feat: integrate geolocator for automatic weather fetching and add int…
AbhishekDoshi26 Jul 8, 2026
c7e9510
feat: add geocoding to resolve and display city names based on user c…
AbhishekDoshi26 Jul 8, 2026
f987c52
docs: update README with project description, feature list, and setup…
AbhishekDoshi26 Jul 8, 2026
b004973
docs: add Clear Skies sample application to README
AbhishekDoshi26 Jul 8, 2026
1aa63cd
feat: added bugs and did shorebird release
AbhishekDoshi26 Jul 9, 2026
5010270
Merge main into feat/shorebird_weather
AbhishekDoshi26 Jul 9, 2026
4655577
chore: remove deleted firebase_test from README
AbhishekDoshi26 Jul 9, 2026
a9a6d86
feat: add clear_skies demo guide and integrate into CI/CD pipeline
AbhishekDoshi26 Jul 9, 2026
6a1e494
test: update fog icon emoji in weather helper tests
AbhishekDoshi26 Jul 9, 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
Binary file added .DS_Store
Binary file not shown.
17 changes: 17 additions & 0 deletions .github/workflows/shorebird_ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ jobs:
my_flutter_module: ${{ steps.filter.outputs.my_flutter_module }}
progressive_rollout_demo: ${{ steps.filter.outputs.progressive_rollout_demo }}
shorebird_fintech_wallet: ${{ steps.filter.outputs.shorebird_fintech_wallet }}
clear_skies: ${{ steps.filter.outputs.clear_skies }}
steps:
- uses: actions/checkout@v7
with:
Expand All @@ -42,6 +43,8 @@ jobs:
- progressive_rollout_demo/**
shorebird_fintech_wallet:
- shorebird_fintech_wallet/**
clear_skies:
- clear_skies/**

flavors:
needs: changes
Expand Down Expand Up @@ -108,6 +111,19 @@ jobs:
flutter_version: ""
has_integration_tests: false

clear_skies:
needs: changes
if: needs.changes.outputs.clear_skies == 'true'
uses: ./.github/workflows/_shorebird_ci_flutter.yaml
with:
package_name: clear_skies
package_path: clear_skies
has_bloc_lint: false
has_unit_tests: true
subpackages: ""
flutter_version: ""
has_integration_tests: false

required:
name: required
if: ${{ always() }}
Expand All @@ -118,6 +134,7 @@ jobs:
- my_flutter_module
- progressive_rollout_demo
- shorebird_fintech_wallet
- clear_skies
runs-on: ubuntu-latest
steps:
- name: Check required jobs
Expand Down
148 changes: 148 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "clear_skies",
"cwd": "clear_skies",
"request": "launch",
"type": "dart"
},
{
"name": "clear_skies (profile mode)",
"cwd": "clear_skies",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "clear_skies (release mode)",
"cwd": "clear_skies",
"request": "launch",
"type": "dart",
"flutterMode": "release"
},
{
"name": "firebase_test",
"cwd": "firebase_test",
"request": "launch",
"type": "dart"
},
{
"name": "firebase_test (profile mode)",
"cwd": "firebase_test",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "firebase_test (release mode)",
"cwd": "firebase_test",
"request": "launch",
"type": "dart",
"flutterMode": "release"
},
{
"name": "flavors",
"cwd": "flavors",
"request": "launch",
"type": "dart"
},
{
"name": "flavors (profile mode)",
"cwd": "flavors",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "flavors (release mode)",
"cwd": "flavors",
"request": "launch",
"type": "dart",
"flutterMode": "release"
},
{
"name": "multi_dimensional_flavors",
"cwd": "multi_dimensional_flavors",
"request": "launch",
"type": "dart"
},
{
"name": "multi_dimensional_flavors (profile mode)",
"cwd": "multi_dimensional_flavors",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "multi_dimensional_flavors (release mode)",
"cwd": "multi_dimensional_flavors",
"request": "launch",
"type": "dart",
"flutterMode": "release"
},
{
"name": "progressive_rollout_demo",
"cwd": "progressive_rollout_demo",
"request": "launch",
"type": "dart"
},
{
"name": "progressive_rollout_demo (profile mode)",
"cwd": "progressive_rollout_demo",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "progressive_rollout_demo (release mode)",
"cwd": "progressive_rollout_demo",
"request": "launch",
"type": "dart",
"flutterMode": "release"
},
{
"name": "shorebird_fintech_wallet",
"cwd": "shorebird_fintech_wallet",
"request": "launch",
"type": "dart"
},
{
"name": "shorebird_fintech_wallet (profile mode)",
"cwd": "shorebird_fintech_wallet",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "shorebird_fintech_wallet (release mode)",
"cwd": "shorebird_fintech_wallet",
"request": "launch",
"type": "dart",
"flutterMode": "release"
},
{
"name": "my_flutter_module",
"cwd": "add_to_app/my_flutter_module",
"request": "launch",
"type": "dart"
},
{
"name": "my_flutter_module (profile mode)",
"cwd": "add_to_app/my_flutter_module",
"request": "launch",
"type": "dart",
"flutterMode": "profile"
},
{
"name": "my_flutter_module (release mode)",
"cwd": "add_to_app/my_flutter_module",
"request": "launch",
"type": "dart",
"flutterMode": "release"
}
]
}
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Below is a list of the available samples. Each directory contains a specific use
| [**Add-to-App**](./add_to_app) | Shows how to seamlessly patch a Shorebird Flutter module embedded inside a native Android or iOS application. |
| [**Progressive Rollout Demo**](./progressive_rollout_demo) | Illustrates how to mitigate risk by performing percentage-based patch rollouts using Shorebird tracks. |
| [**Shorebird Fintech Wallet**](./shorebird_fintech_wallet) | An enterprise-grade example of a logic-level hotfix using a decoupled Reactive Store + BLoC architecture. |
| [**Clear Skies**](./clear_skies) | A beautifully designed, premium weather application with dynamic glassmorphic UI. |

## 🛠 Getting Started

Expand Down
45 changes: 45 additions & 0 deletions clear_skies/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
/coverage/

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
45 changes: 45 additions & 0 deletions clear_skies/.metadata
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
revision: "9f9f19aaac8f092532e59f3447c501b4d4089efb"
channel: "[user-branch]"

project_type: app

# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
base_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
- platform: android
create_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
base_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
- platform: ios
create_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
base_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
- platform: linux
create_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
base_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
- platform: macos
create_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
base_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
- platform: web
create_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
base_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
- platform: windows
create_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb
base_revision: 9f9f19aaac8f092532e59f3447c501b4d4089efb

# User provided section

# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
86 changes: 86 additions & 0 deletions clear_skies/FLUTTERCON_DEMO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# 🦅 Shorebird FlutterCon USA Live Demo Guide

This guide provides step-by-step instructions for the team on stage to execute the **Clear Skies** live OTA update demo using Shorebird.

---

## 🛠️ Step 1: Pre-requisites & Setup (Before the Demo)

1. **Clone the Repository**
Ensure you have the latest code pulled on your presentation machine:
```bash
git clone https://github.com/shorebirdtech/samples.git
cd samples/clear_skies
flutter pub get
```

2. **Install the Buggy Release APK**
We have already pre-built the Shorebird release containing the intentional bugs and pushed it to the repository. The APK is located specifically at `samples/clear_skies/output/app-release.apk`.

You can either drag and drop this file into your emulator, or install it via terminal:
```bash
# Make sure your device/emulator is connected
adb install output/app-release.apk
```

---

## 🎤 Step 2: The Presentation (On Stage)

### 1. Show the "Broken" Production App
1. Open the **Unclear Skies** app on the projector.
2. Point out the hilarious bugs we accidentally shipped to production:
- The app title says **"Unclear Skies - Discover the world's worst weather"**.
- The background is a glaring, toxic Neon Green and Bright Red gradient.
- Tap the **"Tokyo"** popular destination chip, and show how it incorrectly fetches the weather for **Antarctica**.
3. **The Hook:** *"Normally, fixing this means a 2-day wait for App Store / Play Store review. Let's fix this right now with Shorebird."*

### 2. Fix the Code Live
Open your IDE (VS Code / Android Studio) and use **Global Search** for the keyword:
👉 `TODO(Demo)`

This will instantly take you to the three bugs. Revert them back to their correct state:

- **Bug 1: `lib/core/constants/app_strings.dart`**
```diff
- static const String appName = 'Unclear Skies';
+ static const String appName = 'Clear Skies';

- static const String welcomeTitle = 'Welcome to Unclear Skies';
- static const String welcomeSubtitle = 'Discover the world\'s worst weather';
+ static const String welcomeTitle = 'Welcome to Clear Skies';
+ static const String welcomeSubtitle = 'Discover the world\'s weather';
```

- **Bug 2: `lib/core/constants/app_colors.dart`**
```diff
- Color(0xFF39FF14), // Neon Green
- Color(0xFFF0FF00), // Toxic Yellow
- Color(0xFFFF0000), // Bright Red
+ Color(0xFF4CA1AF), // Vibrant Sky Blue
+ Color(0xFF90C8D1), // Mid Cyan
+ Color(0xFFC4E0E5), // Soft Horizon Cyan
```

- **Bug 3: `lib/features/weather/ui/widgets/welcome_hero_widget.dart`**
```diff
- widget.onCityTapped!('Antarctica');
+ widget.onCityTapped!(city);
```

### 3. Push the Patch via Shorebird
In your terminal, run the patch command to send the fix over the air:

```bash
shorebird patch android
```
*(Wait a few seconds for the patch to build and upload).*

### 4. The Magic Moment 🪄
1. Once the patch is published, go back to the demo device.
2. Force-close the app (swipe it away from recents) and open it again.
3. **Boom!** The toxic green is gone, the title is "Clear Skies", and Tokyo brings up Tokyo's weather. No app store update required!

> [!TIP]
> **Need to run the demo multiple times?**
> If you need to practice or do the demo again for a different audience, you can easily downgrade the app on the device by uninstalling it and re-running the `adb install` command with the original buggy APK (Step 1.2), then reverting your local code changes back to the buggy state.
Loading