# Project export: Talk

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2025
- Tagline: Talk; Your 3-minute bridge to recovery support. Less pressure, more connection, better outcomes
- Devpost: https://devpost.com/software/talk-6vkz8d
- GitHub: https://github.com/danielodicho/Talk
- Video: https://www.youtube.com/embed/zugDT4EgJYo?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 2 GitHub contributor(s) — Daniel Odicho (1 commits), FlutterFlow (1 commits)

## Devpost submission (written by the team)

### Inspiration

Our personal longing for deeper, more authentic connections fueled the initial spark behind Talk. The real breakthrough, however, came when we spoke with my partner’s father, who is enrolled in a 12-step program. He shared how phone calls can be intimidating, yet he craved daily interactions to help him stay accountable. After hearing similar stories from others in recovery, people struggling with communication gaps, anxiety, and the need for quick support, we realized a simple yet powerful solution could bridge this gap. That realization led us to create Talk.

### What it does

Talk automates quick, daily voice or video calls among members of a 12-step recovery group by predicting each user’s availability. The platform cues users when they’re likely to be free, then starts a short, time-capped call to reduce call anxiety and encourage more frequent check-ins. In this way, Talk helps users maintain consistent accountability and support without the stress of scheduling or the pressure of long, daunting conversations.

### How we built it

We began experimenting with Flutterflow, but later pivoted away once we hit productivity bottlenecks. Rather than a linear build, our process has been a holistic journey centered on user needs and pain points. Along the way, we: Conducted customer interviews to uncover real-world communication struggles. Engaged in intense ideation and multiple design pivots to refine the user experience. Developed matchmaking algorithms to pair users intelligently. Crafted UI/UX prototypes and an accompanying Figma mockup for clarity and visual consistency. Integrated Twilio on the backend for robust voice call capabilities. Produced a compelling video demo, more of a short skit than a technical walkthrough, to show how Talk works in a relatable scenario.

### Challenges we ran into

Matchmaking Algorithm Complexity: Balancing real-time availability, user preferences, and short call formats proved tricky. API Costs: Hosting and scaling voice/video calls through third-party APIs like Twilio can become expensive, especially when aiming for sustainability and widespread adoption.

### Accomplishments we're proud of

We’re especially proud that Talk is more than a neat idea, it’s a platform we believe will truly serve its users. From the initial spark to our final integration, every step revolved around solving real challenges faced by those in recovery.

### What we learned

Through building Talk, we gained deep insight into the challenges faced by individuals with substance use disorders, and how overlooked these struggles often are by mainstream tech solutions. We also learned the importance of empathy-driven design, continuous user feedback, and staying flexible when refining our product vision. Most importantly, we discovered that focusing on human connection, not just technical features, leads to more impactful solutions.

### What's next

We want to revolutionize how people connect by moving beyond text-based interactions toward genuine, real-time voice or video calls. After refining and scaling Talk for 12-step communities, we plan to expand to broader social networks and circles, helping anyone, from families to remote teams, stay closely connected without the pressure or friction of traditional phone calls.

## README (from the GitHub repository)

# Talk

A new Flutter project.

## Getting Started

FlutterFlow projects are built to run on the Flutter _stable_ release.


## Detected evidence (automated analysis)

Indexed codebase: 60 recognized source files, 333 KB.
- C (language) — detected in the code
- Dart (language) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- Kotlin (language) — detected in the code
- Swift (language) — detected in the code
- Firebase (technology) — claimed on Devpost, not found in the code
- OpenAI (technology) — claimed on Devpost, not found in the code
- Python (language) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (97 of 97)

```
analysis_options.yaml
android/.gitignore
android/app/build.gradle
android/app/google-services.json
android/app/proguard-rules.pro
android/app/src/debug/AndroidManifest.xml
android/app/src/main/AndroidManifest.xml
android/app/src/main/kotlin/com/example/my_project/MainActivity.kt
android/app/src/main/res/drawable/launch_background.xml
android/app/src/main/res/values-night-v31/styles.xml
android/app/src/main/res/values-night/styles.xml
android/app/src/main/res/values-v31/styles.xml
android/app/src/main/res/values/strings.xml
android/app/src/main/res/values/styles.xml
android/app/src/profile/AndroidManifest.xml
android/build.gradle
android/gradle.properties
android/gradle/wrapper/gradle-wrapper.properties
android/settings.gradle
firebase/firebase.json
firebase/firestore.indexes.json
firebase/firestore.rules
firebase/functions/api_manager.js
firebase/functions/index.js
firebase/functions/package.json
firebase/storage.rules
ios/.gitignore
ios/Flutter/AppFrameworkInfo.plist
ios/Flutter/Debug.xcconfig
ios/Flutter/Release.xcconfig
ios/ImageNotification/Info.plist
ios/ImageNotification/NotificationService.swift
ios/Podfile
ios/Runner.xcodeproj/project.pbxproj
ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
ios/Runner.xcworkspace/contents.xcworkspacedata
ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
ios/Runner/AppDelegate.swift
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
ios/Runner/Base.lproj/LaunchScreen.storyboard
ios/Runner/Base.lproj/Main.storyboard
ios/Runner/GoogleService-Info.plist
ios/Runner/Info.plist
ios/Runner/PrivacyInfo.xcprivacy
ios/Runner/Runner-Bridging-Header.h
ios/Runner/Runner.entitlements
lib/auth/auth_manager.dart
lib/auth/base_auth_user_provider.dart
lib/auth/firebase_auth/anonymous_auth.dart
lib/auth/firebase_auth/apple_auth.dart
lib/auth/firebase_auth/auth_util.dart
lib/auth/firebase_auth/email_auth.dart
lib/auth/firebase_auth/firebase_auth_manager.dart
lib/auth/firebase_auth/firebase_user_provider.dart
lib/auth/firebase_auth/github_auth.dart
lib/auth/firebase_auth/google_auth.dart
lib/auth/firebase_auth/jwt_token_auth.dart
lib/backend/backend.dart
lib/backend/firebase/firebase_config.dart
lib/backend/schema/index.dart
lib/backend/schema/users_record.dart
lib/backend/schema/util/firestore_util.dart
lib/backend/schema/util/schema_util.dart
lib/flutter_flow/flutter_flow_button_tabbar.dart
lib/flutter_flow/flutter_flow_icon_button.dart
lib/flutter_flow/flutter_flow_model.dart
lib/flutter_flow/flutter_flow_theme.dart
lib/flutter_flow/flutter_flow_util.dart
lib/flutter_flow/flutter_flow_widgets.dart
lib/flutter_flow/form_field_controller.dart
lib/flutter_flow/keep_alive_wrapper.dart
lib/flutter_flow/lat_lng.dart
lib/flutter_flow/nav/nav.dart
lib/flutter_flow/nav/serialization_util.dart
lib/flutter_flow/place.dart
lib/flutter_flow/uploaded_file.dart
lib/index.dart
lib/main.dart
lib/pages/group_page/group_page_model.dart
lib/pages/group_page/group_page_widget.dart
lib/pages/home_page/home_page_model.dart
lib/pages/home_page/home_page_widget.dart
lib/pages/login_page/login_page_model.dart
lib/pages/login_page/login_page_widget.dart
pubspec.yaml
README.md
test/widget_test.dart
twilio_scrip
web/flutter_bootstrap.js
web/index.html
web/manifest.json
```

### Dependencies

- firebase/functions/package.json: @mux/mux-node@^7.3.3, @onesignal/node-onesignal@^2.0.1-beta2, axios@1.7.4, braintree@^3.6.0, eslint@^6.8.0, eslint-plugin-promise@^4.2.1, firebase-admin@^11.11.0, firebase-functions@^4.4.1, qs@^6.7.0, razorpay@^2.8.4, stripe@^8.0.1

### Recent commits (newest first)

- Create twilio_script
- First commit

## Key source files (fetched from GitHub, selected and truncated for size)

### firebase/functions/package.json

```
{
  "name": "cloud-functions",
  "description": "Firebase Cloud Functions",
  "dependencies": {
    "firebase-admin": "^11.11.0",
    "firebase-functions": "^4.4.1",
    "braintree": "^3.6.0",
    "@mux/mux-node": "^7.3.3",
    "stripe": "^8.0.1",
    "axios": "1.7.4",
    "razorpay": "^2.8.4",
    "qs": "^6.7.0",
    "@onesignal/node-onesignal": "^2.0.1-beta2"
  },
  "devDependencies": {
    "eslint": "^6.8.0",
    "eslint-plugin-promise": "^4.2.1"
  },
  "scripts": {
    "lint": "./node_modules/.bin/eslint --max-warnings=0 .",
    "serve": "firebase -P talk-qu5akx emulators:start --only functions",
    "shell": "firebase -P talk-qu5akx functions:shell",
    "start": "npm run shell",
    "logs": "firebase -P talk-qu5akx functions:log",
    "compile": "cp ../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json"
  },
  "engines": {
    "node": "18"
  },
  "private": true
}

```

### firebase/functions/index.js

```javascript
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.onUserDeleted = functions.auth.user().onDelete(async (user) => {
  let firestore = admin.firestore();
  let userRef = firestore.doc("users/" + user.uid);
  await firestore.collection("users").doc(user.uid).delete();
});

```

### analysis_options.yaml

```yaml



analyzer:
  exclude:
    - lib/custom_code/**
    - lib/flutter_flow/custom_functions.dart

```

### pubspec.yaml

```yaml
name: talk
description: A new Flutter project.

# The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=3.0.0 <4.0.0"

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  flutter_web_plugins:
    sdk: flutter
  auto_size_text: 3.0.0
  cached_network_image: 3.4.1
  cached_network_image_platform_interface: 4.1.1
  cached_network_image_web: 1.3.1
  cloud_firestore: 5.5.0
  cloud_firestore_platform_interface: 6.5.0
  cloud_firestore_web: 4.3.4
  collection: 1.19.0
  firebase_auth: 5.3.3
  firebase_auth_platform_interface: 7.4.9
  firebase_auth_web: 5.13.4
  firebase_core: 3.8.0
  firebase_core_platform_interface: 5.3.0
  firebase_core_web: 2.18.1
  firebase_performance: 0.10.0+10
  firebase_performance_platform_interface: 0.1.4+46
  firebase_performance_web: 0.1.7+4
  flutter_animate: 4.5.0
  flutter_cache_manager: 3.4.1
  font_awesome_flutter: 10.7.0
  from_css_color: 2.0.0
  go_router: 12.1.3
  google_fonts: 6.1.0
  google_sign_in: 6.2.1
  google_sign_in_android: 6.1.30
  google_sign_in_ios: 5.7.7
  google_sign_in_platform_interface: 2.4.5
  google_sign_in_web: 0.12.4+2
  intl: 0.19.0
  json_path: 0.7.2
  page_transition: 2.1.0
  path_provider: 2.1.4
  path_provider_android: 2.2.10
  path_provider_foundation: 2.4.0
  path_provider_linux: 2.2.1
  path_provider_platform_interface: 2.1.2
  path_provider_windows: 2.3.0
  plugin_platform_interface: 2.1.8
  provider: 6.1.2
  rxdart: 0.27.7
  shared_preferences: 2.3.2
  shared_preferences_android: 2.3.2
  shared_preferences_foundation: 2.5.2
  shared_preferences_linux: 2.4.1
  shared_preferences_platform_interface: 2.4.1
  shared_preferences_web: 2.4.2
  shared_preferences_windows: 2.4.1
  sign_in_with_apple: 6.1.2
  sign_in_with_apple_platform_interface: 1.1.0
  sign_in_with_apple_web: 2.1.0
  sqflite: 2.3.3+1
  sqflite_common: 2.5.4+3
  stream_transform: 2.1.0
  timeago: 3.6.1
  url_launcher: 6.3.0
  url_launcher_android: 6.3.10
  url_launcher_ios: 6.3.1
  url_launcher_linux: 3.2.0
  url_launcher_macos: 3.2.1
  url_launcher_platform_interface: 2.3.2
  url_launcher_web: 2.3.3
  url_launcher_windows: 3.1.2

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.0

dependency_overrides:
  http: 1.2.2
  uuid: ^4.0.0

dev_dependencies:
  flutter_launcher_icons: 0.13.1
  flutter_lints: 4.0.0
  image: 4.2.0
  lints: 4.0.0
  flutter_test:
    sdk: flutter


flutter_launcher_icons:
  android: true
  ios: true
  remove_alpha_ios: true
  web:
    generate: true
  image_path: 'assets/images/app_launcher_icon.png'


# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - assets/fonts/
    - assets/images/
    - assets/videos/
    - assets/audios/
    - assets/rive_animations/
    - assets/pdfs/
    - assets/jsons/



  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.dev/assets-and-images/#resolution-aware.

  # For details regarding adding assets from package dependencies, see
  # https://flutter.dev/assets-and-images/#from-packages

  # To add custom fonts to your application, add a fonts section here,
  # in this "flutter" section. Each entry in this list should have a
  # "family" key with the font family name, and a "fonts" key with a
  # list giving the asset and other descriptors for the font. For
  # example:
  # fonts:
  #   - family: Schyler
  #     fonts:
  #       - asset: fonts/Schyler-Regular.ttf
  #       - asset: fonts/Schyler-Italic.ttf
  #         style: italic
  #   - family: Trajan Pro
  #     fonts:
  #       - asset: fonts/TrajanPro.ttf
  #       - asset: fonts/TrajanPro_Bold.ttf
  #         weight: 700
  #
  # For details regarding fonts from package dependencies,
  # see https://flutter.dev/custom-fonts/#from-packages


```

### lib/index.dart

```dart
// Export pages
export '/pages/login_page/login_page_widget.dart' show LoginPageWidget;
export '/pages/home_page/home_page_widget.dart' show HomePageWidget;
export '/pages/group_page/group_page_widget.dart' show GroupPageWidget;

```

### web/flutter_bootstrap.js

```javascript
{{flutter_js}}
{{flutter_build_config}}

_flutter.loader.load(
    {
        onEntrypointLoaded: async function(engineInitializer) {
            // Initialize the Flutter engine
            let appRunner = await engineInitializer.initializeEngine({useColorEmoji: true,});
            // Run the app
            await appRunner.runApp();
          }
    }
);

```

### test/widget_test.dart

```dart
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility that Flutter provides. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.

import 'package:flutter_test/flutter_test.dart';

import 'package:talk/main.dart';

void main() {
  testWidgets('Counter increments smoke test', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(MyApp());
  });
}

```

### web/index.html

```html
<!DOCTYPE html>
<html>
<head>
  <!--
    If you are serving your web app in a path other than the root, change the
    href value below to reflect the base path you are serving from.

    The path provided below has to start and end with a slash "/" in order for
    it to work correctly.

    Alternatively, build your application passing the --base-href parameter
    specifying the new root path of your web app.

    Fore more details:
    * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
  -->
  <base href="$FLUTTER_BASE_HREF">

  <meta charset="UTF-8">
  <meta content="IE=Edge" http-equiv="X-UA-Compatible">

  <!-- iOS meta tags & icons -->
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="apple-mobile-web-app-title" content="Talk">

  

  <meta name="robots" content="noindex" />

  <!-- Favicon -->
  <link rel="icon" type="image/png" href="favicon.png" />

  <!-- Open Graph & SEO tags -->
  <meta property="og:title" content="Talk" />
  <meta property="og:description" content="Built with FlutterFlow." />
  <meta property="og:image" content="https://storage.googleapis.com/flutterflow-prod-hosting/og_splash_gradient.png" /> 
  <meta name="twitter:title" content="Talk" />
  <meta name="twitter:description" content="Built with FlutterFlow." />
  <meta name="twitter:image" content="https://storage.googleapis.com/flutterflow-prod-hosting/og_splash_gradient.png" />
  <meta name="twitter:card" content="summary_large_image" />

  <title> Talk </title>
  <meta name="description" content="Built with FlutterFlow." />
    

  <!-- Status Bar color in Safari browser (iOS) and PWA -->
  <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f1f4f8">
  <meta name="theme-color" media="(prefers-color-scheme: dark)"  content="#1d2428">

  <link rel="manifest" href="manifest.json">
  
</head>
<body>
  
  
  
  
  
  <script>
    {{flutter_bootstrap_js}}
  </script>
</body>
</html>

```

### lib/main.dart

```dart
import 'package:flutter/material.dart';

import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_web_plugins/url_strategy.dart';
import 'auth/firebase_auth/firebase_user_provider.dart';
import 'auth/firebase_auth/auth_util.dart';

import 'backend/firebase/firebase_config.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import 'flutter_flow/flutter_flow_util.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  GoRouter.optionURLReflectsImperativeAPIs = true;
  usePathUrlStrategy();

  await initFirebase();

  await FlutterFlowTheme.initialize();

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  // This widget is the root of your application.
  @override
  State<MyApp> createState() => _MyAppState();

  static _MyAppState of(BuildContext context) =>
      context.findAncestorStateOfType<_MyAppState>()!;
}

class _MyAppState extends State<MyApp> {
  ThemeMode _themeMode = FlutterFlowTheme.themeMode;

  late AppStateNotifier _appStateNotifier;
  late GoRouter _router;
  String getRoute([RouteMatch? routeMatch]) {
    final RouteMatch lastMatch =
        routeMatch ?? _router.routerDelegate.currentConfiguration.last;
    final RouteMatchList matchList = lastMatch is ImperativeRouteMatch
        ? lastMatch.matches
        : _router.routerDelegate.currentConfiguration;
    return matchList.uri.toString();
  }

  late Stream<BaseAuthUser> userStream;

  final authUserSub = authenticatedUserStream.listen((_) {});

  @override
  void initState() {
    super.initState();

    _appStateNotifier = AppStateNotifier.instance;
    _router = createRouter(_appStateNotifier);
    userStream = talkFirebaseUserStream()
      ..listen((user) {
        _appStateNotifier.update(user);
      });
    jwtTokenStream.listen((_) {});
    Future.delayed(
      Duration(milliseconds: 1000),
      () => _appStateNotifier.stopShowingSplashImage(),
    );
  }

  @override
  void dispose() {
    authUserSub.cancel();

    super.dispose();
  }

  void setThemeMode(ThemeMode mode) => safeSetState(() {
        _themeMode = mode;
        FlutterFlowTheme.saveThemeMode(mode);
      });

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      title: 'Talk',
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: const [Locale('en', '')],
      theme: ThemeData(
        brightness: Brightness.light,
        useMaterial3: false,
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        useMaterial3: false,
      ),
      themeMode: _themeMode,
      routerConfig: _router,
    );
  }
}

```

### ios/Runner/Runner-Bridging-Header.h

```c
#import "GeneratedPluginRegistrant.h"

```

[48 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]