The cutest instant messenger in the [matrix]
Find a file
ggurdin 09e4741adf
Merge main into prod (#5167)
* update lemma meaning and phonetic transcription repos

* chore: simplify progress bar widget

* Remove instructions from chat view, and add profile explanation to course participant page

* Translate courseParticipantTooltip

* fix: in course chats list, sort activities by activity ID

* use different text in chat/course participant tooltips

* depress disabled toolbar buttons

* fix: load course images on course load

* fix: on add course plan to space, set m.space.child power level to 0

* chore: add label to emoji selector in vocab analytics

* chore: increase text sizes in activity summary

* fix: don't show open sessions if user has selected a role

* feat: add button to regenerate latest bot message

* chore: update morph meaning repo

* chore: increase text size and spacing in language selection page, consume language locale emojis

* feat: on first select lemma emoji, show snackbar with explanation

* chore: use builder to style pressable buttons based on height

* chore: add tooltips to each practice mode

* initial work to add shimmer to match activity options

* show word card in image toolbar mode

* use the same widget for word card and vocab details emoji pickers

* add shimmer background to match choices

* fix: close previous snackbar before opening new mode disabled snackbar

* fix: refresh course details when course ID changes in course details

* chore: keep message button depressed

* only show emoji selection shimmer if no emoji is selected

* don't show reaction picker in emoji mode

* lemma emoji picker style updates

* update loading indicators in word zoom card

* feat: show word card in vocab details page

* practice buttons shimmer

* fixed height audio player

* more practice mode updates

* more practice tweaks

* add space between rows of tokens in practice mode

* conditional top padding for practice tooltips

* feat: send message info in lemma info request

* chore: Focus on word meanings in reaction choices

* fix: restrict width of morph icon in practice token button

* chore: Expand word card for meanings

* chore: When first grammar question active, shimmer choices

* chore: Swap seed for hyphen for not-yet-chosen emojis in analytics

* chore: Level attention to emoji and audio icons

* fix: fix non-token vertical spacing in practice mode

* fix: close message overlay when screen size changes

* feat: While audio is playing, allow clicking of word to move audio to that spot

* feat: play audio on token click and on construct click in vocab analytics

* chore: snackbar close button

* feat: Stay in audio mode after end of audio

* chore: more word card spacing adjustments

* fix: use construct id json in route for analytics details page

* feat: custom SSO login/signup dialog

* chore: add content to distinguish system edit from manual edit

* Make input bar suggestion text vertically centered when shrinking

* Add Pangea comments

* Add background to make dark mode icon stand out in own message grammar
practice

* chore: re-style sso popup

* fix: progress bar min width

* fix: change how screen width metric changes are tracked

* simplify

* fix: fix carousel scroll issue

* fix: set emoji placeholder text colot

* fix: when not in column mode, don't add padding to top of practice tooltip

* chore: prevent running IGC on empty message

* fix: allow translation of bot audio transcripts

* feat: analytics database

* fix: update analytics profile room IDs on change, set via parameter in analytics room knock request (#4949)

* chore: center title in add a course page (#4950)

* fix: update spacing of activity participant indicators to make them narrower, make user activity summary highlight row scrollable (#4951)

* fix: remove clicked new token from new tokens cache immeadiatley instead of waiting for new token animation to finish (#4952)

* What now button takes user to top of course plan page (#4946)

* Add scrollController to course details pages

* Make what now button refresh details tab if needed, remove scrollController

* 4907 construct details changes (#4961)

* chore: remove delegation analytics page

* feat: vocab construct analytics level bar

* chore: analytics mobile navigation

* feat: cap construct XP

* Add background to regeneration request background (#4960)

* chore: reduce padding between lines of message in practice mode (#4962)

* chore: don't show message regeneration button if message has already been regenerated (#4963)

* fix: prevent request regeneration button from altering message height (#4964)

* fix: only animate top portion of activity status bar (#4965)

* fix: fix white box error and add opacity variation to construct levels in progress bar (#4966)

* fix: don't close word card on click (#4967)

* feat: after user exits IT three times, show them a popup with the option to disable automatic language assistance (#4968)

* feat: allow token feedback for word card in vocab analytics (#4900)

* feat: allow token feedback for word card in vocab analytics

* fix: remove duplicate global keys

* 4726 word card in arabic goes way to the side (#4970)

* fix: initial work for word card positioning on RTL system

* fix: fix practice mode animation for RTL languages

* chore: close lemma emoji snackbar on parent widget disposed (#4972)

* fix: remove user summary testing code (#4974)

* feat: On hover of the Nav Bar, expand to show current icon tooltip text (#4976)

* feat: On hover of the Nav Bar, expand to show current icon tooltip text

* animate menu transition

* chore: delete construct navigation (#4984)

* chore: Use hyphen instead of seed/sprout/flower in list view (#4985)

* chore: update analytics page on construct update (#4987)

* fix: fix word card overlay in mobile vocab details page (#4988)

* fix: Latest sent message sinks when clicked on Mobile (#4989)

* fix: don't highlight new tokens until analytics initialize (#4990)

* chore: calculate times closed out of IT based on all message in session (#4991)

* chore: add feedback response dialog (#4992)

* chore: move request generation button into message bubble (#4993)

* fix: show request regen button in overlay message (#4996)

* fix: separate block construct and update construct updates in vocab list view (#4998)

* feat: Do gold shimmer every 5 seconds on unselected emojis (#4999)

* simplify message token renderer (#4994)

* simplify message token renderer

* token rendering and new word collection for tokens in activity summary / menu

* make tokens hoverable

* Model key cleanup (#4983)

* refactor: Group redundant ModelKey entries

* Add python script to find and replace hardcoded ModelKey values

* Edited Python script to not automatically use ModelKey for files not
already using it

* refactor: Ran script and accepted obvious changes

* rename 'duration' model key

---------

Co-authored-by: ggurdin <ggurdin@gmail.com>

* fix: return bot local stt, ensure stt rep exists in request stt translation function (#5003)

* chore: set max lines for word card phonetic transcription (#5005)

* chore: Don't show shimmer for unavailable modes (#5006)

* chore: Delay until screen darkening (#5009)

* chore: add focus node to vocab list view search bar (#5011)

* chore: collapse navigation rail on navigate (#5013)

* When user saves course edits, return to details page (#5012)

* fix: don't lowercase construct keys in morph analytics list view (#5014)

* 4860 dms   all chats (#5015)

* feat: initial work for dms => all chats

* more navigation updates

* change all chats tooltip

* fix: set exact reactions length in overlay (#5016)

* fix: fix message list rendering (#5017)

* chore: disable lemma emoji selection for word card in token feedback dialog (#5026)

* fix: don't add XP update if no new construct uses were added (#5027)

* chore: hide request regeneration button in practice mode (#5028)

* chore: use root navigator for chat details dialogs (#5029)

* fix: rebuild word card on new word overlay dismissed (#5030)

* Ensure consistency of pressable button height after animation (#5025)

* Ensure consistency of pressable button height after animation

* Use variable instead of hardcoded value

* fix: fix overlay reactions bouncing around (#5031)

* fix: add horizontal padding to prevent choice animation cutoff (#5032)

* 4919 further optimizing message info (#5033)

* remove original sent from message content

* don't add null fields to message content JSON

* fix: only show disable language assistance popup is user manually closes IT (#5034)

* fix: only exclude xp gained analytics events if blocked constructs has entry (#5035)

* fix: on analytics DB init, don't clear DB unless stored userID doesn't match client userID (#5036)

* don't log missing POS error for POS 'other' (#5039)

* don't long missing POS error for POS 'other'

* don't long error for missing grammar copy if lemma is 'other'

* chore: rebuild input bar hint text on language update (#5042)

* fix: clear database on reinitialize (#5045)

* chore: default to reactions maxWidth null if not available (#5047)

* fix: remove duplicate navigator pop in member actions popup (#5048)

* Reduce gap between lines in practice modes (#5041)

* fix: prevent word card overflow in vocab details (#5049)

* chore: style tokens in transcription like other clickable tokens (#5055)

* fix: always align space nav rail children to the left (#5059)

* chore: update message analytics feedback popup background color (#5061)

* chore: increase padding in span card scroll view to prevent choice animation overflow (#5062)

* chore: Don't use dropdown if only one item (#5063)

* chore: Disable ability to send video/files (slash anything else that the bot doesn’t know what to do with) in bot chats (#5065)

* chore: show more specific error in audio recording dialog (#5068)

* chore: stack expanded space navigation menu over screen in one column mode (#5069)

* feat: when screen size gets too short, show warning dialog (#5070)

* 5053 can get points from lemma with max score (#5078)

* make uses a private field for ConstructUses

* expose capped list of uses in ConstructUses

* filter capped construct uses in getUses

* fix: don't show send button if error in recording dialog (#5079)

* chore: allow users to highlight main word in word card

* fix: in emoji picker, don't set selected emoji based on old stream data

* remove duplicate subscription cancel

* fix: fix recording dialog import error

* fix: disable new token collection for token not in L2

* chore: use activity plan CEFR level in saved activity display

* chore: apply border to dialog directly in delete space dialog (#5093)

* chore: hide nav rail item tooltips when expanded (#5094)

* chore: reduce min height of span card feedback section (#5095)

* chore: force span card to always go above input bar (#5096)

* fix: always enable small screen warning dialog on web (#5097)

* fix: add new blocks to merge table before fetching previous constructs when calculating points added by construct update (#5098)

* fix: remove reaction subscription to prevent overlay jumping (#5100)

* 4825 vocabulary practice (#4826)

* chore: move logic for lastUsedByActivityType into ConstructIdentifier

* feat: vocab practice

* add vocab activity progress bar

* fix: shuffle audio practice choices

* update UI of vocab practice

Added buttons, increased text size and change position, cards flip over and turn red/green on click and respond to hover input

* add xp sparkle, shimmering choice card placeholder

* spacing changes

fix padding, make choice cards spacing/sizing responsive to screen size, replace shimmer cards with stationary circle indicator

* don't include duplicate lemma choices

* use constructID and show lemma/emoji on choice cards

add method to clear cache in case the results was an error, and add a retry button on error

* gain xp immediately and take out continue session

also refactor the choice cards to have separate widgets for each type and a parent widget to give each an id for xp sparkle

* add practice finished page with analytics

* Color tweaks on completed page and time card placeholder

* add timer

* give XP for bonuses and change timer to use stopwatch

* simplify card logic, lock practice when few vocab words

* merge analytics changes and fix bugs

* reload on language change

- derive XP data from new analytics
- Don't allow any clicks after correct answer selected

* small fixes, added tooltip, added copy to l10

* small tweaks and comments

* formatting and import sorting

---------

Co-authored-by: avashilling <165050625+avashilling@users.noreply.github.com>

* feat: Directing to click messages with shimmer (#5106)

* fix: use standard loading dialog on submit delete space dialog (#5107)

* chore: don't show practice tooltip if mode is complete (#5108)

* chore: don't restrict token length (#5112)

* fix: in recording dialog, throw exception on permission denied (#5114)

* chore: remove margin from last entry in user activity summary list (#5115)

* chore: make emoji choice shimmer background match word card background (#5116)

* feat: allow users to update bot's voice settings (#5119)

* fix: hide ability to change bot chat settings from non-admins (#5120)

* fix: remove extra text from end of download file name (#5121)

* fix: remove invalid expanded widget (#5124)

* fix: add guard to prevent showing screen size popup when expanding screen after showing popup (#5127)

* chore: normalize accents in vocab search (#5128)

* chore: base level icon spacing on xp needed to reach level in vocab details (#5131)

* chore: add padding to bottom of vocab list view so practice button doesn't block last vocab entries (#5132)

* fix: fix practice record construct id assignment for morph activities (#5133)

* fix: coerce existing aggregate analytics database entries into correct format before merging to avoid data loss (#5136)

* feat: make construct aggregated case-insensitive (#5137)

* chore: prevent user from spamming disabled vocab practice button (#5138)

* fix: reset voice on langauge update (#5140)

* chore: make emoji base shimmer transparent (#5142)

* chore: update sort order in space participants list (#5144)

* chore: remove padding from last entry in activity list (#5146)

* fix: disable emoji setting for non-L2 constructs (#5148)

* fix: add reaction notifier to rebuild reaction picker and reaction display on reaction change (#5151)

* chore: decrease text sizes in vocab practice complete page in one column mode (#5152)

* chore: hide download button in download dialogs if download is complete (#5157)

* fix: show morph as unlocked in analytics if ever used (#5158)

* chore: reduce span card spacing to reduce unneeded scroll (#5160)

* chore: reduce span card spacing to reduce unneeded scroll

* remove debugging code

* fix: don't double space ID on navigation (#5163)

* chore: reduce negative points to 1 (#5162)

To eliminate the chance of having negative total, minimum upon completion now is 30XP

* fix: remove duplicates from answer choices (#5161)

* fix: use canonical activity time in display for completed activity (#5164)

* chore: refresh language cache to add voices (#5165)

* chore: don't show loading dialog on reaction redaction (#5166)

* build: bump version

---------

Co-authored-by: Kelrap <kel.raphael3@outlook.com>
Co-authored-by: Kelrap <99418823+Kelrap@users.noreply.github.com>
Co-authored-by: avashilling <165050625+avashilling@users.noreply.github.com>
2026-01-12 09:59:12 -05:00
.github fix: update release gh action flutter build step 2025-10-30 12:31:54 -04:00
.vscode Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
android Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
appimage code files 2023-11-08 12:27:18 -05:00
assets Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
docs Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
fdroid docs: Replace gitlab references 2023-07-15 08:51:09 +09:00
integration_test build: Upgrade to flutter 3.22 2025-05-21 08:06:52 +02:00
ios Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
lib Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
linux Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
macos Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
pangea_packages/fcm_shared_isolate Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
scripts Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
snap Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
test Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
test_driver sorted imports again? 2023-12-04 03:13:10 +01:00
web Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
windows Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
winuwp feat: implement retreiving widgets 2022-02-10 17:48:45 +01:00
.env Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
.gitignore Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
.mailmap add a .mailmap 2022-01-01 15:08:15 +02:00
.metadata Merge remote-tracking branch 'fluffychat/main' into auto-pr 2024-04-08 19:17:32 +02:00
analysis_options.yaml 1380 content challenges (#1391) 2025-01-09 14:19:01 -05:00
CHANGELOG.md Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
config.sample.json config and deploy 2023-12-09 17:50:51 +01:00
devtools_options.yaml refactor: Update to Matrix Dart SDK 0.29.9 2024-05-29 11:20:32 +02:00
Dockerfile Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
l10n.yaml fluffychat merge 2025-06-09 16:02:38 -04:00
LICENSE Add license and gitlab pages stuff 2020-01-02 13:42:49 +00:00
licenses.yaml Fluffychat merge (#2055) 2025-03-06 11:29:03 -05:00
PRIVACY.md Fluffychat merge (#2731) 2025-05-08 13:22:26 -04:00
pubspec.lock Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
pubspec.yaml Merge main into prod (#5167) 2026-01-12 09:59:12 -05:00
README.md Merge main into production (#4437) 2025-10-30 11:21:19 -04:00
sentry.properties Sentry using dart 2024-06-20 00:28:07 +02:00
TRANSLATORS_GUIDE.md code files 2023-11-08 12:27:18 -05:00

Overview

Pangea Chat is a web and mobile platform which lets students learn a language while texting their friends. Addressing the gap in communicative language teaching, especially for beginners lacking skill and confidence, Pangea Chat provides a low-stress, high-support environment for language learning through authentic conversations. By integrating human and artificial intelligence, the app enhances communicative abilities and supports educators. Pangea Chat has been grant funded by the National Science Foundation and Virginia Innovation Partnership Corporation based on its technical innovation and potential for broad social impact. Our mission is to build a global, decentralized learning network supporting intercultural learning and exchange.

Pangea Chat Client Setup

  • Download VSCode if you do not already have it installed. This is the preferred IDE for development with Pangea Chat.
  • Download flutter on your device using this guide: https://docs.flutter.dev/get-started/install
  • Test to make sure that flutter is properly installed by running “flutter version”
  • Ensure that Google Chrome is installed
  • Install the latest version of XCode
    • After downloading XCode, ensure that the iOS simulator runtime is installed. To do this, after initially downloading XCode, a screen will open where you can select the platforms you wish to develop for. Selected iOS and download from there.
  • Install the latest version of Android Studio
    • After downloading Android Studio, open Android Studio and go through setup wizard
  • In Android Studio, open settings -> Android SDK -> SDK tools, then click “Android SDK Command Line Tools” and click OK to run the download
  • If you do not have homebrew install on your device, install homebrew by follow the instructions here: https://brew.sh/
  • Run “brew install cocoapods” to install cocoapods
  • Run “flutter doctor” and for any missing components, follow the instructions from the print out to install / setup
  • Clone the client repo
  • Uncomment the lines in the pubspec.yaml file in the assets section with paths to .env file
  • To run on iOS:
    • Run “flutter precache --ios”
    • Go to the iOS folder and run “pod install”
  • To run on Android:
  • To run the app from VSCode terminal:
    • On web, run flutter run -d chrome --hot
    • Or as a web server (Usage with WSL or remote connect) flutter run --release -d web-server -web-port=3000
    • On mobile device or simulator, run flutter run hot -d <DEVICE_NAME>

Special thanks

  • Pangea Chat is a fork of FluffyChat which is a [matrix] client written in Flutter. You can support the primary maker of FluffyChat directly here.

  • Fabiyamada is a graphics designer and has made the fluffychat logo and the banner. Big thanks for her great designs.

  • Advocatux has made the Spanish translation with great love and care. He always stands by my side and supports my work with great commitment.

  • Thanks to MTRNord and Sorunome for developing.

  • Also thanks to all translators and testers! With your help, fluffychat is now available in more than 12 languages.

  • WoodenBeaver sound theme for the notification sound.

  • The Matrix Foundation for making and maintaining the emoji translations used for emoji verification, licensed Apache 2.0