# Project export: MUSES

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: With the intent of gamifying education through AI agents, our AI-powered music recommendation mobile app will help you learn your favourite songs and instrumentations!
- Devpost: https://devpost.com/software/muses-d2xfrt
- GitHub: https://github.com/Hecate946/Muses
- Video: https://www.youtube.com/embed/0n0Qx3LV82A?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 3 GitHub contributor(s) — Hecate (25 commits), lordboba (10 commits), rhaque1234 (7 commits)

## Devpost submission (written by the team)

### Inspiration

Our team wanted to address the Education Track Challenge presented by Zoom— in particular addressing music education. As avid lovers and musicians, all 3 of us in the team wanted to join in the process of gamifying education by using AI algorithms to aid learning an instrument or vocal singing.

### What it does

Our app will first display a tailored feed of music recommendations. They may choose to like, save, or scroll past each piece of music. The app will process data from likes, saves, and retention in a cosine similarity algorithm to determine musical repertoire recommendations for the user to practice and play.

### How we built it

Our team used Flutter for frontend development and SQL relational database for backend development. With Flutter, we ran both an IOS and Android simulator to see the UI / UX design element changes in real time. The SQL database was used to store all the songs and musical pieces in our mobile app, while OpenAI API was used to generate vector embeddings for our recommendation engine’s cosine similarity search. Hence, our tech stack included Dart in addition to algorithms in Python for data ingestion and C++ for app development.

### Challenges we ran into

We didn’t know how to create a recommendation system to match users with songs they might like, for which we want into challenges while generating and storing vector embeddings. In addition to navigating vector databases, our team struggled with merging the git commits and push-pull requests as working in a team in a hackathon was a new experience for all of us.

### Accomplishments we're proud of

The queue shuffler for songs on the home page of the mobile app is very enjoyable, as our AI LLM powered recommendation algorithm presents these songs to our users based on their favorite genres, previous liked and saved songs. Users have the ability to both save and like the songs recommended by our queue shuffler. The app also collects data from these interactions to fuel the recommendation algorithm.

### What we learned

All of us in the team learned how to code in Flutter and FlutterFlow for frontend mobile app development, which has been a very enjoyable and learning experience for us. From possessing the added flexibility to drag and drop design elements to our OS simulator to learning how to create complex screens with embedded media links, learning to code in Flutter has been the highlight of Treehacks for us. Additionally, we were able to utilize the new IDE developed by Codeium, Windsurf, whose Claude Sonnet-powered copilot has helped us brainstorm and plan complex algorithms.

### What's next

We have already started creating customer surveys for fellow hackers to gather user testimonials and interest. Based on the vast majority of our users listening to music through Spotify and YouTube Music, we plan to integrate Spotify song links into our mobile app’s homepage in addition to the YouTube Music integration. In the future after the hackathon ends, we plan to iterate MUSES and pivot if necessary to reach a bigger audience and spread the joy of learning music.

## README (from the GitHub repository)

# Muses - Music Learning Platform

Muses is a modern, interactive music learning platform that helps users discover and learn music through an engaging interface. Named after the Greek muse of music, Euterpe combines powerful music recommendation algorithms with an intuitive learning experience.

## Features

- 🎵 Interactive music discovery feed
- 💖 Like and save favorite tracks
- 🎯 Personalized music recommendations
- 👤 User profiles with learning history
- 📱 Responsive mobile-first design
- 🔄 Continuous playback queue

## Tech Stack

### Backend (Python)
- Flask web framework
- SQLAlchemy ORM
- PostgreSQL database
- RESTful API architecture
- YouTube API integration

### Frontend (Flutter/Dart)
- Flutter framework for cross-platform development
- Provider for state management
- HTTP package for API communication
- SharedPreferences for local storage
- Custom UI components

## Project Structure

```
euterpe/
├── backend/
│   ├── app/
│   │   ├── models/        # Database models
│   │   ├── routes/        # API endpoints
│   │   └── utils/         # Helper functions
│   ├── config.py          # Configuration settings
│   ├── requirements.txt   # Python dependencies
│   ├── seed_database.py   # Database seeding script
│   └── server.py         # Main server file
│
└── frontend/
    └── lib/
        ├── components/    # Reusable UI components
        ├── providers/     # State management
        ├── screens/       # App screens
        ├── services/      # API services
        └── main.dart     # Entry point
```

## Getting Started

### Backend Setup

1. Create a Python virtual environment:
   ```bash
   python -m venv venv
   source venv/bin/activate  # On Windows: venv\Scripts\activate
   ```

2. Install dependencies:
   ```bash
   cd backend
   pip install -r requirements.txt
   ```

3. Set up the database:
   ```bash
   python seed_database.py
   ```

4. Start the server:
   ```bash
   python server.py
   ```

### Frontend Setup

1. Install Flutter dependencies:
   ```bash
   cd frontend
   flutter pub get
   ```

2. Run the app:
   ```bash
   flutter run
   ```

## API Endpoints

- `POST /auth/register` - Register new user
- `POST /auth/login` - User login
- `POST /interactions/like` - Like a track
- `POST /interactions/unlike` - Unlike a track
- `GET /recommendations` - Get personalized recommendations
- `GET /saved-songs` - Get user's saved songs

## Contributing

2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

This project is licensed under the MIT License - see the LICENSE file for details.

## Acknowledgments

- Flutter team for the amazing cross-platform framework
- Flask team for the lightweight WSGI web application framework
- All contributors who have helped shape this project

## Detected evidence (automated analysis)

Indexed codebase: 72 recognized source files, 167 KB.
- C (language) — detected in the code
- C++ (language) — detected in the code
- Dart (language) — detected in the code
- Flask (technology) — detected in the code
- HTML (language) — detected in the code
- Kotlin (language) — detected in the code
- Python (language) — detected in the code
- Swift (language) — detected in the code
- OpenAI (technology) — claimed on Devpost, not found in the code
- SQL (language) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (120 of 131)

```
.gitignore
backend/app/__init__.py
backend/app/models.py
backend/app/routes/auth.py
backend/app/routes/db.py
backend/app/routes/interactions.py
backend/app/routes/playback.py
backend/app/routes/recommendations.py
backend/app/routes/search.py
backend/app/routes/user_routes.py
backend/app/services/recommendation_service.0
backend/app/services/recommendation_service.py
backend/app/utils/__init__.py
backend/app/utils/youtube_utils.py
backend/config.py
backend/database/schema.s
backend/requirements.txt
backend/run.sh
backend/seed_database.py
backend/server.py
backend/z.py
frontend/.gitignore
frontend/.metadata
frontend/analysis_options.yaml
frontend/android/.gitignore
frontend/android/app/build.gradle.kts
frontend/android/app/src/debug/AndroidManifest.xml
frontend/android/app/src/main/AndroidManifest.xml
frontend/android/app/src/main/kotlin/com/example/frontend/MainActivity.kt
frontend/android/app/src/main/res/drawable-v21/launch_background.xml
frontend/android/app/src/main/res/drawable/launch_background.xml
frontend/android/app/src/main/res/values-night/styles.xml
frontend/android/app/src/main/res/values/styles.xml
frontend/android/app/src/profile/AndroidManifest.xml
frontend/android/build.gradle.kts
frontend/android/gradle.properties
frontend/android/gradle/wrapper/gradle-wrapper.properties
frontend/android/settings.gradle.kts
frontend/ios/.gitignore
frontend/ios/Flutter/AppFrameworkInfo.plist
frontend/ios/Flutter/Debug.xcconfig
frontend/ios/Flutter/Release.xcconfig
frontend/ios/Podfile
frontend/ios/Podfile.lock
frontend/ios/Runner.xcodeproj/project.pbxproj
frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
frontend/ios/Runner.xcworkspace/contents.xcworkspacedata
frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
frontend/ios/Runner/AppDelegate.swift
frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard
frontend/ios/Runner/Base.lproj/Main.storyboard
frontend/ios/Runner/Info.plist
frontend/ios/Runner/Runner-Bridging-Header.h
frontend/ios/RunnerTests/RunnerTests.swift
frontend/lib/components/bottom_nav.dart
frontend/lib/components/muses_app_bar.dart
frontend/lib/components/music_card.dart
frontend/lib/main.dart
frontend/lib/providers/music_provider.dart
frontend/lib/screens/home_screen.dart
frontend/lib/screens/lesson_plan_screen.dart
frontend/lib/screens/login_screen.dart
frontend/lib/screens/profile_screen.dart
frontend/lib/screens/screen_manager.dart
frontend/lib/screens/search_screen.dart
frontend/lib/screens/signup_screen.dart
frontend/lib/screens/songs_to_learn_screen.dart
frontend/lib/services/api_service.dart
frontend/lib/services/db_service.dart
frontend/lib/utils/pdf_assets.dart
frontend/linux/.gitignore
frontend/linux/CMakeLists.txt
frontend/linux/flutter/CMakeLists.txt
frontend/linux/flutter/generated_plugin_registrant.cc
frontend/linux/flutter/generated_plugin_registrant.h
frontend/linux/flutter/generated_plugins.cmake
frontend/linux/runner/CMakeLists.txt
frontend/linux/runner/main.cc
frontend/linux/runner/my_application.cc
frontend/linux/runner/my_application.h
frontend/macos/.gitignore
frontend/macos/Flutter/Flutter-Debug.xcconfig
frontend/macos/Flutter/Flutter-Release.xcconfig
frontend/macos/Flutter/GeneratedPluginRegistrant.swift
frontend/macos/Podfile
frontend/macos/Runner.xcodeproj/project.pbxproj
frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
frontend/macos/Runner.xcworkspace/contents.xcworkspacedata
frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
frontend/macos/Runner/AppDelegate.swift
frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
frontend/macos/Runner/Base.lproj/MainMenu.xib
frontend/macos/Runner/Configs/AppInfo.xcconfig
frontend/macos/Runner/Configs/Debug.xcconfig
frontend/macos/Runner/Configs/Release.xcconfig
frontend/macos/Runner/Configs/Warnings.xcconfig
frontend/macos/Runner/DebugProfile.entitlements
frontend/macos/Runner/Info.plist
frontend/macos/Runner/MainFlutterWindow.swift
frontend/macos/Runner/Release.entitlements
frontend/macos/RunnerTests/RunnerTests.swift
frontend/pubspec.yaml
frontend/test/widget_test.dart
frontend/web/index.html
frontend/web/manifest.json
frontend/windows/.gitignore
frontend/windows/CMakeLists.txt
frontend/windows/flutter/CMakeLists.txt
frontend/windows/flutter/generated_plugin_registrant.cc
frontend/windows/flutter/generated_plugin_registrant.h
frontend/windows/flutter/generated_plugins.cmake
frontend/windows/runner/CMakeLists.txt
[11 more files omitted for size]
```

### Dependencies

- backend/requirements.txt: alembic@==1.14.1, bcrypt@==4.2.1, blinker@==1.9.0, cachetools@==5.5.1, certifi@==2025.1.31, charset-normalizer@==3.4.1, click@==8.1.8, Flask@==3.1.0, Flask-Bcrypt@==1.0.1, Flask-Cors@==5.0.0, Flask-SQLAlchemy@==3.1.1, greenlet@==3.1.1, idna@==3.10, itsdangerous@==2.2.0, Jinja2@==3.1.5, Mako@==1.3.9, MarkupSafe@==3.0.2, requests@==2.32.3, SQLAlchemy@==2.0.38, typing_extensions@==4.12.2, urllib3@==2.3.0, Werkzeug@==3.1.3, yt-dlp@==2025.1.26

### Recent commits (newest first)

- name change
- readme
- upload readme
- Merge pull request #12 from Hecate946/t-task-2
- Merge branch 'main' into t-task-2
- Merge pull request #11 from Hecate946/recs
- Merge branch 'main' into recs
- stuff
- stuff
- fixed nav bar issues
- working copy
- Add lesson plan features and Muses branding assets
- frontend updates/thumbnails
- Merge pull request #9 from Hecate946/titles-likes
- merge
- stuff
- updates
- merge resolutions
- requirements
- Merge pull request #8 from Hecate946/frontend-stuff

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

### backend/requirements.txt

```
alembic==1.14.1
bcrypt==4.2.1
blinker==1.9.0
cachetools==5.5.1
certifi==2025.1.31
charset-normalizer==3.4.1
click==8.1.8
Flask==3.1.0
Flask-Bcrypt==1.0.1
Flask-Cors==5.0.0
Flask-SQLAlchemy==3.1.1
greenlet==3.1.1
idna==3.10
itsdangerous==2.2.0
Jinja2==3.1.5
Mako==1.3.9
MarkupSafe==3.0.2
requests==2.32.3
SQLAlchemy==2.0.38
typing_extensions==4.12.2
urllib3==2.3.0
Werkzeug==3.1.3
yt-dlp==2025.1.26

```

### backend/server.py

```python
from app import create_app  # Import only after Flask has been fully set up

app = create_app()  # Call the function to initialize the app

if __name__ == "__main__":
    app.run(debug=True, port=5000)

```

### backend/run.sh

```shell
#!/bin/bash

export FLASK_APP=server.py
export FLASK_ENV=development

flask run

```

### backend/config.py

```python
import os

BASE_DIR = os.path.abspath(os.path.dirname(__file__))
DB_PATH = os.path.join(BASE_DIR, "database/music_discovery.db")

class Config:
    SQLALCHEMY_DATABASE_URI = f"sqlite:///{DB_PATH}"
    SQLALCHEMY_TRACK_MODIFICATIONS = False

```

### frontend/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

```

### backend/z.py

```python
# populate_db.py
from app import db
from app.models import User, Track, Listen, LikedSong, SavedSong
from datetime import datetime, timedelta

def populate_db():
    # Create a sample user
    user = User(username="Dean")
    user.set_password("password")
    db.session.add(user)
    db.session.flush()  # so we have user.id

    # Define some sample tracks (normally these might come from your catalog)
    track_titles = [
        "Blinding Lights", "Shape of You", "Dance Monkey", "Drivers License",
        "Uptown Funk", "Levitating", "Sugar", "Bad Guy", "Señorita", "Closer",
        "Shallow", "Roar", "Rolling in the Deep", "Counting Stars", "Believer",
        "Perfect", "Happier", "Girls Like You", "See You Again", "Sunflower",
        "All of Me", "Sucker", "Love Yourself", "Photograph", "Despacito",
        "Lovely", "Royals", "Cheap Thrills", "Roses", "Don't Start Now"
    ]
    track_dict = {}
    for title in track_titles:
        track = Track(title=title, instrumentation="default", source="populated")
        db.session.add(track)
        db.session.flush()  # to obtain track.id
        track_dict[title.lower()] = track

    # Log some listen events for Dean:
    # (For demonstration, we assume Dean listens to his top songs multiple times.)
    listen_events = [
        ("Blinding Lights", 5),
        ("Shape of You", 3),
        ("Dance Monkey", 4),
        ("Drivers License", 2),
        ("Uptown Funk", 3),
    ]
    for title, count in listen_events:
        for i in range(count):
            listen = Listen(
                user_id=user.id,
                track_id=track_dict[title.lower()].id,
                start_time=datetime.utcnow() - timedelta(minutes=5 * i),
                end_time=datetime.utcnow() - timedelta(minutes=5 * i - 3)  # assume 3-minute listens
            )
            db.session.add(listen)

    # Log some liked songs
    liked_titles = ["Shallow", "Roar", "Counting Stars", "Believer", "Perfect"]
    for title in liked_titles:
        like = LikedSong(user_id=user.id, track_id=track_dict[title.lower()].id)
        db.session.add(like)

    # Log some saved songs
    saved_titles = ["All of Me", "Sucker", "Love Yourself", "Photograph", "Despacito"]
    for title in saved_titles:
        save = SavedSong(user_id=user.id, track_id=track_dict[title.lower()].id)
        db.session.add(save)

    db.session.commit()
    print("Database populated with sample listens, likes, and saves!")

if __name__ == "__main__":
    populate_db()

```

### backend/seed_database.py

```python
from app import create_app, db
from app.models import Track

def seed_database():
    app = create_app()
    with app.app_context():
        # Clear existing tracks
        Track.query.delete()
        
        # Classical music tracks with proper titles and instrumentation
        tracks = [
            {
                'title': 'Symphony No. 40 in G minor',
                'instrumentation': 'Wolfgang Amadeus Mozart - Orchestra',
                'source': 'jgpJVI3tDbY'
            },
            {
                'title': 'Moonlight Sonata',
                'instrumentation': 'Ludwig van Beethoven - Piano',
                'source': 'c1iZXyWLnXg'
            },
            {
                'title': 'Violin Concerto in E major',
                'instrumentation': 'Johann Sebastian Bach - Violin & Orchestra',
                'source': '6JQm5aSjX6g'
            },
            {
                'title': 'String Quartet No. 14 in D minor',
                'instrumentation': 'Franz Schubert - Chamber Ensemble',
                'source': '13ygvpIg-S0'
            },
            {
                'title': 'Brandenburg Concerto No. 3',
                'instrumentation': 'Johann Sebastian Bach - Orchestra',
                'source': 'SaCheA6Njc4'
            },
            {
                'title': 'The Four Seasons - Spring',
                'instrumentation': 'Antonio Vivaldi - Violin & Orchestra',
                'source': 'mFWQgxXM_b8'
            },
            {
                'title': 'Nocturne in E-flat major',
                'instrumentation': 'Frédéric Chopin - Piano',
                'source': 'tV5U8kVYezM'
            },
            {
                'title': 'Symphony No. 5 in C minor',
                'instrumentation': 'Ludwig van Beethoven - Orchestra',
                'source': 'fOk8Tm815lE'
            },
            {
                'title': 'Clair de Lune',
                'instrumentation': 'Claude Debussy - Piano',
                'source': 'ea2WoUtbzuw'
            },
            {
                'title': 'The Nutcracker Suite',
                'instrumentation': 'Pyotr Ilyich Tchaikovsky - Orchestra',
                'source': 'M8J8urC_8Jw'
            }
        ]
        
        # Add tracks to database
        for track_data in tracks:
            track = Track(**track_data)
            db.session.add(track)
        
        # Commit changes
        db.session.commit()
        print("✅ Database seeded with classical music tracks!")

if __name__ == '__main__':
    seed_database()

```

### frontend/pubspec.yaml

```yaml
name: muses
description: "MUSES - Your Personal Classical Music Learning Companion"
# 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.7.0

# 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

  http: ^0.13.6

  # State management
  provider: ^6.0.5

  # Audio player
  audioplayers: ^6.1.2

  # Shared preferences
  shared_preferences: ^2.5.2

  # Url launcher
  url_launcher: ^6.3.1

  

  # PDF viewer
  flutter_pdfview: ^1.3.2
  path_provider: ^2.1.2

  # WebView for YouTube playback
  # flutter_webview_plugin: ^0.4.0

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

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



  # To add assets to your application, add an assets section, like this:
  assets:
    - assets/sheet_music.jpg
    - assets/images/muses_logo.png
    - assets/lesson_plans/moonlight_sonata_lesson.pdf
    - assets/lesson_plans/lose_yourself_lesson.pdf
  #   - images/a_dot_ham.jpeg

  # 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

```

### frontend/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)
}

```

### frontend/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.0" apply false
    id("org.jetbrains.kotlin.android") version "1.8.22" apply false
}

include(":app")

```

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