# Project export: GlobeGreet

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: UC Berkeley AI Hackathon 2025
- Tagline: Duolingo for cultural norms: one-minute daily micro-puzzles teach local etiquette. Greetings, tipping, gestures, taboos all so you arrive confident, respectful, and connection-ready anywhere.
- Devpost: https://devpost.com/software/globegreet
- GitHub: https://github.com/austindelic/social_outcast
- Team: 3 GitHub contributor(s) — pe_tanman (32 commits), Austin Delic (28 commits), NanoMars (5 commits)

## Devpost submission (written by the team)

### Overview

🌍✨

### Inspiration

✈️ Recent International Travel: 🦉 Duolingo: a game changing language learning app, with creative and effective strategies for language learning that we were inspired by. 🗺️ Recent international travel: Our team is fully international, with cultures different from the US. 🤝 Meeting people from different cultures & recent cultural exchange programs 🤖📚 What It Does 🧩 Interactive, bite-sized lessons powered by AI to help you master cultural norms before you travel. 🛠️💻 How We Built It 🚀 Built with Flutter. 🧩⚡ Challenges We Ran Into 🔍 These were technologies we were new to, leading us to adapt and course-correct our strategy. 👶 Half of our team were first-time hackathon participants. 🏅🎉 Accomplishments That We're Proud Of 🎨 Artistic design: We went with a cozy and welcoming hand drawn art style in our app design, creating a comfortable and inviting environment for users to learn. 🐶 Interactive mascots: We used interactive mascots to bring our AI to life, providing our audience with a fun and personalized experience when learning. 📖🧠 What We Learned 🧑‍💻 Hard skills: 🌐 Picked up new languages and frameworks from scratch 🤖 Explored how AI can unlocked personalized learning 🤝 Soft skills: 👥 Teamwork under pressure 🤝 Smooth, clear collaboration 🗣️ Open, effective communication 💪 Resilience, we almost gave up, but pushed through and shipped it! 🚀🔮 What's Next for GlobeGreet 🌱We’re excited to keep growing GlobeGreet: 🔥 Add streaks to keep motivated 🧑‍🤝‍🧑 Build a friends system to encourage fun collaboration 🌏 Connect travelers with locals before their trip for real-life practice 🌐🧳 Where This Would Be Used 💼 Business Travels: Imagine you're going on a business trip in an international country, and you want to blend in and show respect for local customs with confidence. GlobeGreet can quickly and efficiently catch you up to speed on local customs, such that you can conduct business with ease. 🧑‍🧑‍🧒‍🧒 Family Trips: The friendly, gamified design of GlobeGreet allows for the whole family to engage in learning before the trip, bringing families together in a fun and fruitful way. 🎒International Studies: For those seeking to move for longer periods, Globegreet helps you connect to people from all around the world and ensures that you’ll be able to make friends wherever you go!

## README (from the GitHub repository)

# social_outcast

A new Flutter project.

## Getting Started

This project is a starting point for a Flutter application.

A few resources to get you started if this is your first Flutter project:

- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)

For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

cd into project and then run:
`flutter clean && flutter pub get && flutter run`


## Detected evidence (automated analysis)

Indexed codebase: 43 recognized source files, 118 KB.
- C (language) — detected in the code
- Dart (language) — detected in the code
- Kotlin (language) — detected in the code
- Swift (language) — detected in the code
- OpenAI (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (72 of 72)

```
.gitignore
.metadata
.vscode/tasks.json
all_commits_with_stats.txt
analysis_options.yaml
android/.gitignore
android/app/build.gradle.kts
android/app/src/debug/AndroidManifest.xml
android/app/src/main/AndroidManifest.xml
android/app/src/main/kotlin/com/example/social_outcast/MainActivity.kt
android/app/src/main/res/drawable-v21/launch_background.xml
android/app/src/main/res/drawable/launch_background.xml
android/app/src/main/res/values-night/styles.xml
android/app/src/main/res/values/styles.xml
android/app/src/profile/AndroidManifest.xml
android/build.gradle.kts
android/gradle.properties
android/gradle/wrapper/gradle-wrapper.properties
android/settings.gradle.kts
culture_lessons/lib/culture_lessons.dart
culture_lessons/lib/src/models.dart
culture_lessons/lib/src/utils.dart
culture_lessons/pubspec.lock
culture_lessons/pubspec.yaml
ios/.gitignore
ios/Flutter/AppFrameworkInfo.plist
ios/Flutter/Debug.xcconfig
ios/Flutter/Release.xcconfig
ios/Podfile
ios/Podfile.lock
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/Info.plist
ios/Runner/Runner-Bridging-Header.h
ios/RunnerTests/RunnerTests.swift
lib/components/overlay_progress_bar.dart
lib/components/stepping_stone_map.dart
lib/data/trip_data.dart
lib/main.dart
lib/providers/preference_provider.dart
lib/screens/account_screen.dart
lib/screens/chat_screen.dart
lib/screens/country_list_screen.dart
lib/screens/dashboard_screen.dart
lib/screens/lesson_menu_screen.dart
lib/screens/lesson_preferences_screen.dart
lib/screens/map.dart
lib/screens/story_screen.dart
lib/utilities/database_helper.dart
lib/utilities/llm_helper.dart
lib/utilities/prefs_helper.dart
pubspec.lock
pubspec.yaml
README.md
test/widget_test.dart
visual_novel/lib/character_sprite.dart
visual_novel/lib/visual_novel_reader.dart
visual_novel/lib/visual_novel.dart
visual_novel/pubspec.lock
visual_novel/pubspec.yaml
```

### Dependencies

No dependency index available.

### Recent commits (newest first)

- Merge branch 'dev' of https://github.com/austindelic/social_outcast
- Merge branch 'master' of https://github.com/austindelic/social_outcast
- Merge branch 'story_improvement' of https://github.com/austindelic/social_outcast into dev
- helllllllllloooooooooo
- Merge branch 'master' into story_improvement
- story db
- Merge branch 'austin' of https://github.com/austindelic/social_outcast into austin
- git ignore
- Update README.md with project setup instructions
- model error debug
- Merge branch 'master' of https://github.com/austindelic/social_outcast
- add curricular generation
- Merge branch 'austin' of https://github.com/austindelic/social_outcast
- Refactor constructors to use shorthand syntax and enhance help functionality in StoryScreen
- Add quiz functionality to StoryScreen with answer validation and feedback
- Revert "Merge branch 'integrate_menu_map'"
- messy
- Merge branch 'integrate_menu_map'
- Add Puzzle unitId field, refactor database helpers, and implement TripData for country mapping
- Add help feature to StoryScreen and VisualNovelReader for enhanced user assistance

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

### analysis_options.yaml

```yaml
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.

# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml

linter:
  # The lint rules applied to this project can be customized in the
  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
  # included above or to enable additional rules. A list of all available lints
  # and their documentation is published at https://dart.dev/lints.
  #
  # Instead of disabling a lint rule for the entire project in the
  # section below, it can also be suppressed for a single line of code
  # or a specific dart file by using the `// ignore: name_of_lint` and
  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
  # producing the lint.
  rules:
    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

```

### pubspec.yaml

```yaml
# pubsec.yaml for social_outcast
name: social_outcast
description: "A new Flutter project."
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter 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 is used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.0.0+1

environment:
  sdk: ^3.8.1

# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  google_fonts: ^6.0.0
  cupertino_icons: ^1.0.8
  dio: ^5.4.3 # (or latest version)
  npdart: ^0.3.0
  visual_novel:
    path: ./visual_novel
  culture_lessons:
    path: ./culture_lessons
  sqflite: ^2.4.2
  flutter_riverpod: ^2.6.1
  shared_preferences: ^2.5.3
  http: ^1.4.0
  flutter_dotenv: ^5.2.1
  game_levels_scrolling_map: ^0.0.7
  level_map: ^0.2.0

dev_dependencies:
  flutter_test:
    sdk: flutter

  # The "flutter_lints" package below contains a set of recommended lints to
  # encourage good coding practices. The lint set provided by the package is
  # activated in the `analysis_options.yaml` file located at the root of your
  # package. See that file for information about deactivating specific lint
  # rules and activating additional ones.
  flutter_lints: ^5.0.0

# 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 packages.
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

  assets:
    - assets/images/backgrounds/japan_1.png

    - assets/images/sprites/otter/otter_default.png
    - assets/images/sprites/otter/otter_thinking_1.png
    - assets/images/backgrounds/map_background.png
    - assets/images/backgrounds/deactivated_stage.png
    - assets/images/backgrounds/activated_stage.png
    - assets/images/sprites/otter/otter_thinking_2.png
    - assets/images/sprites/otter/otter_thinking_3.png

    - assets/images/sprites/dawg/dawg_default.png
    - assets/images/sprites/dawg/dawg_thinking_1.png
    - assets/images/backgrounds/pngegg.png
    - assets/images/sprites/dawg/dawg_thinking_2.png
    - assets/images/sprites/dawg/dawg_thinking_3.png

    - assets/images/sprites/platypus/platypus_default.png

    - .env

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

  # For details regarding adding assets from package dependencies, see
  # https://flutter.dev/to/asset-from-package

  # 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/to/font-from-package

```

### visual_novel/pubspec.yaml

```yaml
name: visual_novel
description: My visual novel engine!
version: 0.0.1
environment:
  sdk: ">=3.0.0 <4.0.0"
dependencies:
  flutter:
    sdk: flutter

```

### culture_lessons/pubspec.yaml

```yaml
# pubse c.yaml for culture_lessons package

name: culture_lessons
description: A reusable package for culture and etiquette lessons data models.
version: 0.0.1
environment:
  sdk: '>=2.19.0 <4.0.0'

dependencies:
  flutter:
    sdk: flutter
```

### android/build.gradle.kts

```kotlin
allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
rootProject.layout.buildDirectory.value(newBuildDir)

subprojects {
    val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
    project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
    project.evaluationDependsOn(":app")
}

tasks.register<Delete>("clean") {
    delete(rootProject.layout.buildDirectory)
}

```

### android/settings.gradle.kts

```kotlin
pluginManagement {
    val flutterSdkPath = run {
        val properties = java.util.Properties()
        file("local.properties").inputStream().use { properties.load(it) }
        val flutterSdkPath = properties.getProperty("flutter.sdk")
        require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
        flutterSdkPath
    }

    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id("dev.flutter.flutter-plugin-loader") version "1.0.0"
    id("com.android.application") version "8.7.3" apply false
    id("org.jetbrains.kotlin.android") version "2.1.0" apply false
}

include(":app")

```

### 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 in the flutter_test package. 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/material.dart';
import 'package:flutter_test/flutter_test.dart';

import 'package:social_outcast/main.dart';

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

    // Verify that our counter starts at 0.
    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);

    // Tap the '+' icon and trigger a frame.
    await tester.tap(find.byIcon(Icons.add));
    await tester.pump();

    // Verify that our counter has incremented.
    expect(find.text('0'), findsNothing);
    expect(find.text('1'), findsOneWidget);
  });
}

```

### lib/main.dart

```dart
import 'package:flutter/material.dart';
import 'screens/account_screen.dart';
import 'screens/story_screen.dart';
import 'screens/map.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:social_outcast/screens/country_list_screen.dart';
import 'package:social_outcast/screens/lesson_menu_screen.dart';
import 'package:social_outcast/screens/lesson_preferences_screen.dart';
import 'package:google_fonts/google_fonts.dart';

Future<void> main() async {
  runApp(ProviderScope(child: const MyApp()));
  await dotenv.load(fileName: ".env");
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    final baseLight = ThemeData.light();
    // (If you use dark mode, you can do the same with ThemeData.dark())

    return MaterialApp(
      home: const MainTabs(),
      debugShowCheckedModeBanner: false,
      theme: baseLight.copyWith(
        textTheme: GoogleFonts.gamjaFlowerTextTheme(baseLight.textTheme),
        primaryTextTheme: GoogleFonts.gamjaFlowerTextTheme(
          baseLight.primaryTextTheme,
        ),
        // Optionally also:
        // accentTextTheme: GoogleFonts.gamjaFlowerTextTheme(baseLight.accentTextTheme),
        // scaffoldBackgroundColor: ...,  etc.
      ),
      routes: {
        LessonPreferencesScreen.routeName: (_) =>
            const LessonPreferencesScreen(),
        LessonMenuScreen.routeName: (_) => const LessonMenuScreen(),
        MapScreen.routeName: (_) => const MapScreen(),
      },
    );
  }
}

class MainTabs extends StatefulWidget {
  const MainTabs({super.key});
  @override
  State<MainTabs> createState() => _MainTabsState();
}

class _MainTabsState extends State<MainTabs> {
  int _selectedIndex = 0;

  final List<Widget> _pages = [
    CountryListScreen(),
    StoryScreen(),
    AccountScreen(),
    LessonMenuScreen(),
    LessonPreferencesScreen(),
  ];

  void _onItemTapped(int idx) {
    setState(() => _selectedIndex = idx);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _pages[_selectedIndex],
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _selectedIndex,
        onTap: _onItemTapped,
        backgroundColor: Colors.black.withValues(
          alpha: 0.1,
          red: 0.0,
          green: 0.0,
          blue: 0.0,
        ),
        selectedItemColor: Colors.amber,
        unselectedItemColor: Colors.grey, // Icon colour
        selectedLabelStyle: const TextStyle(color: Colors.amber),
        unselectedLabelStyle: const TextStyle(
          color: Colors.grey,
        ), // <-- Add this line
        items: const [
          BottomNavigationBarItem(
            icon: Icon(Icons.dashboard),
            label: 'Dashboard',
          ),
          BottomNavigationBarItem(icon: Icon(Icons.map), label: 'Map'),
          BottomNavigationBarItem(icon: Icon(Icons.book), label: 'Lessons'),
          BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Account'),
        ],
      ),
    );
  }
}

```

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

```c
#import "GeneratedPluginRegistrant.h"

```

### culture_lessons/lib/culture_lessons.dart

```dart
// culture_lessons.dart

library;

export 'src/models.dart';

```

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