Skip to content

Conversation

dt-iohk
Copy link
Contributor

@dt-iohk dt-iohk commented Sep 4, 2025

Description

  • Reimplements catalyst_compression with rust using flutter_rust_bridge.
  • Removes the old (web-only) implementation of catalyst_compression. The federated packages published to pub.dev will be discontinued, only catalyst_compression will remain active.
  • Follows a similar implementation path as for catalyst_key_derivation.
  • Builds on top of forked flutter_rust_bridge since the official version doesn't allow to run two packages built with the tool in the same app on the web platform. Each package exports global modules under window.wasm_bindgen and they conflict with each other. The fork added configuration options to differentiate between modules. The changes done in the fork will be moved to iohk owned repository once it is available. A PR will be opened to merge the changes from the fork to the official version.
  • Adds the flutter_rust_bridge boilerplate that must be committed into the repository. You can skip reviewing it (pattern for these files: **/cargokit/**).
  • rust version, lint rules and other configuration is synced with the rust template from catalyst-ci, every rust project including the ones built with flutter_rust_bridge is reusing the configuration.
  • Reviewed and fixed lint issues, re-enabled disabled targets in Earthfiles and Justfiles related to flutter_rust_bridge.
  • Updated pre-push tasks in all justfiles to make sure all necessary checks are run.
  • To build flutter web no cargo/rust setup needed. To build any native version working cargo/rust setup is needed. This can be mitigated with precompiled rust binaries but at the moment it was decided to skip it. You can install rust/cargo using rustup from here.
  • Dropped integration tests for packages built with flutter_rust_bridge, these tests were failing and disabled. Instead added tests in rust code and made sure they are run and passing in the CI. In the future when native assets are ready we might create regular dart unit tests running on the host machine instead of integration tests which require browser and are flaky.

Related Issue(s)

Closes #3266
Depends on input-output-hk/catalyst-ci#448

Please confirm the following checks

  • My code follows the style guidelines of this project
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream module

…ompression-with-rust

# Conflicts:
#	Earthfile
#	catalyst-gateway/event-db/Earthfile
#	catalyst-gateway/tests/Earthfile
#	catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/Earthfile
#	catalyst_voices/packages/libs/catalyst_key_derivation/Earthfile
#	catalyst_voices/utilities/uikit_example/Earthfile
#	docs/Earthfile
#	utilities/docs-preview/Earthfile
@dt-iohk dt-iohk self-assigned this Sep 4, 2025
@dt-iohk dt-iohk added this to Catalyst Sep 4, 2025
@dt-iohk dt-iohk added do not merge yet PR is not ready to be merged yet do not review yet Do not review yet squad: face Frontend Catalyst Experience Team labels Sep 4, 2025
@dt-iohk dt-iohk added the no-track Used to skip tracking in Swarmia analytics, etc. label Sep 4, 2025
@dt-iohk dt-iohk changed the base branch from main to feat/enable-mobile-support-voices September 4, 2025 09:11
@dt-iohk dt-iohk added the draft Draft label Sep 4, 2025
…ompression-with-rust

# Conflicts:
#	Earthfile
#	catalyst-gateway/Earthfile
#	catalyst-gateway/event-db/Earthfile
#	catalyst-gateway/tests/Earthfile
#	catalyst_voices/Earthfile
#	catalyst_voices/packages/libs/catalyst_cardano/catalyst_cardano/wallet-automation/Earthfile
#	catalyst_voices/packages/libs/catalyst_key_derivation/Earthfile
#	catalyst_voices/packages/libs/catalyst_key_derivation/rust/Earthfile
#	catalyst_voices/utilities/uikit_example/Earthfile
#	docs/Earthfile
#	utilities/docs-preview/Earthfile
@dt-iohk dt-iohk requested a review from Mr-Leshiy September 11, 2025 12:54
Copy link
Contributor

📚 Docs Preview

The docs for this PR can be previewed at the following URL:

https://docs.dev.projectcatalyst.io/voices/feat/catalyst-compression-with-rust

Copy link
Contributor

@LynxLynxx LynxLynxx left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From Dart perspective only formatting is mixed up a little bit. But I'm not sure if these files are generated and this the answer to that formatting problem

Copy link
Contributor

@damian-molinski damian-molinski left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was able to build and run same code on web android and iOS. Very important PR!

One small comment tho

LGTM

Copy link
Contributor

@Mr-Leshiy Mr-Leshiy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rust part LGTM, but dont forget to change cat-ci version to some release from feat/catalyst-compression-setup

@dt-iohk dt-iohk merged commit 3e59cbf into feat/enable-mobile-support-voices Sep 12, 2025
44 checks passed
@dt-iohk dt-iohk deleted the feat/catalyst-compression-with-rust branch September 12, 2025 14:04
@github-project-automation github-project-automation bot moved this from 👀 In review to ✅ Done in Catalyst Sep 12, 2025
dt-iohk added a commit that referenced this pull request Oct 8, 2025
* feat(cat-voices): update android config (#3298)

* feat: android app name

* chore: update gradle

* feat: transform groove to kotlin

* feat: adding icons

* feat: update background in loading in app splash for mobile

* feat: update app flavor and env selection

* feat: update grade-wrapper

* feat: use specific sdk version

* feat: update key derivation android config

* feat: update remote_widgets android config

* feat: update bundle id

* fix: spelling

* feat(cat-voices): update recommended settings and readme (#3321)

* feat: update recommended settings and readme

* fix: format

* fix: format

* feat: remove flavor from name

* feat(cat-voices): ios config (#3315)

* feat: podfile update

* feat: update icons

* feat: update pod file

* feat: update catalyst key derivation

* feat: update remote_widgets

* chore: remove Podfile.lock from tracking and to gitignore

* chore: update build targets

* chore: add files to earthlyignore

* refactor(cat-voices): split catalyst platform into operating system and form factor enums (#3317)

* refactor: split catalyst platform into os and form factor

* chore: cleanup

* refactor: unify mobile detection

* feat: allow embed builders on web only

* chore: cleanup tests

* chore: cleanup

* refactor: simplify the expression

* refactor: use data widget builder

* docs: clarify int constraints

* refactor: migrate api

* feat(cat-voices): permission handler  (#3337)

* chore: adding dependencies

* feat: adding permission for android

* feat: permission handler factory

* feat: exporting models

* feat: adding dependencies

* fix: android manifest format

* feat: adding catalyst operating system

* feat: adding catalyst operating system

* feat: refactor to used rationale and explanation exception

* feat: adding queue

* chore: remove android manifest permission

* fix: remove white space and sort intl

* chore: change location of permission_mixin

* chore: remove unused file

* feat(cat-voices): native drift (mobile) db (#3371)

* define native database and its paths

* docs: update README

* chore: markdown formatting

* fix: readme

* feat(cat-voices): io downloader  (#3361)

* chore: adding dependencies

* feat: adding permission for android

* feat: permission handler factory

* feat: exporting models

* feat: adding dependencies

* fix: android manifest format

* feat: adding catalyst operating system

* feat: adding catalyst operating system

* feat: refactor to used rationale and explanation exception

* feat: adding queue

* chore: remove android manifest permission

* fix: remove white space and sort intl

* feat: io downloader implementation

* chore: remove comments

* fix: spelling

* feat: extracting common logic

* chore: update logic for downloader class

* chore: remove unused mixin

* fix: format

* chore: review update

* chore: set default strategy

* chore: remove files

* chore: added permission

* chore: remove old files

* feat(cat-voices): uploader service (#3376)

* feat: uploader service

* chore: review update

* feat(cat-voices): Discovery Page mobile screen adjustment (#3380)

* feat: adjust discovery page to mobile screen

* feat: adding responsive_sized_box

* chore: review update

* chore: update docs

* feat(cat-voices): proposals page - mobile (#3377)

* single out single_select_dropdown.dart and clean up imports

* refactor: making ProposalsOrderDropdown little more flexible

* wrapping order dropdown

* fix selector List problem

* fix: divider and spacings

* chore: PaginatedGridView response alignment

* feat: response header and content padding

* chore: cleanup imports

* ripple borders

* feat(cat-voices): registration mobile - part 1 (#3393)

* chore: rename VoicesTwoPaneDialog to VoicesTwoPanelDialog

* add fullscreenDialog parameter

* chore: split RegistrationDialog into smaller widgets

* move constraints directly to Dialog parameter

* refactor: upload dialog splitted into smaller widgets

* chore: use spacing instead of separatedBy

* use Visibility.maintain

* use SizeBox-es instead of paddings

* chore: VoicesAlertDialog now uses BoxConstraints instead of SizedBox

* wip

* chore: vertical panels

* cleanup info container

* chore: update VoicesPanelsDialog docs and make it more generic

* Remove ResponsiveBreakpointKey.other

* loose constrains for mobile

* PR review updates

* chore: typo

* feat(cat-voices): Mobile support for category detail page (#3392)

* feat: initial screen adjustements

* feat: mobile support category detail page

* chore: review update

* chore: use sizeOf

* feat: registration mobile - part 2 (#3395)

* chore: rename VoicesTwoPaneDialog to VoicesTwoPanelDialog

* add fullscreenDialog parameter

* chore: split RegistrationDialog into smaller widgets

* move constraints directly to Dialog parameter

* refactor: upload dialog splitted into smaller widgets

* chore: use spacing instead of separatedBy

* use Visibility.maintain

* use SizeBox-es instead of paddings

* chore: VoicesAlertDialog now uses BoxConstraints instead of SizedBox

* wip

* chore: vertical panels

* cleanup info container

* chore: update VoicesPanelsDialog docs and make it more generic

* Remove ResponsiveBreakpointKey.other

* loose constrains for mobile

* PR review updates

* chore: typo

* chore: remove scroll from dialog vertical panels impl

* chore: registration is web only

* Enable importing SeedPhrase

* chore: minor adjustments

* fix: SeedPhrase test

* chore: cleanup func name

* feat(cat-voices): responsive account page (#3396)

* revert ResponsiveStateResolver to use width instead of shortestSide

* ColumnsRow updates

* AccountPage tiles responsive adjustments

* learn more button

* cleanup dialogs

* more adjustments

* discovery deleted confirm

* fix: failing test

* remove buttons global _launch in favour of LaunchUrlMixin

* simplify keychain delete low

* remove covariant

* fix proposals page for small screens (#3405)

* feat(cat-voices): workspace responsiveness  (#3401)

* feat: adding responsiveness to workspace

* chore: remove unused param

* chore: review update

* feat(cat-voices): catalyst compression with rust (#3370)

* chore: upgrade CI

* chore: generate code

* feat: generate catalyst_compression_native with flutter_rust_bridge

* feat: signatures for rust functions

* chore: regenerate

* feat: implement brotli decoder

* feat: add zstd algorithm

* chore: replace catalyst_compression with native rust implementation

* refactor: rename frb crates

* chore: rename compression native to compression

* refactor: cleanup unnecessary web prefix

* fix: web prefix

* feat: add wasm_bindgen module name

* fix: add missing param

* feat: update flutter_rust_bridge

* chore: pin flutter_rust_bridge to git hosted version

* feat: custom thread pool

* feat: custom thread pool in key derivation package

* chore: generated files

* feat: config

* chore: generate code

* chore: cleanup + lints

* chore: add compression rust tests

* chore: sync missing files

* chore: allow github repo

* chore: sync configs

* chore: fix lints, add code generation to pre-push

* chore: cleanup and lint issues

* chore: generate code

* fix: wrong type

* chore: docs and syntax fix

* fix: lint issues, regenerate

* fix: wasm_bindgen name

* fix: lint issues, missing docs

* fix: pre-push command fixes

* refactor: align naming with other targets

* fix: melos issues

* chore: cleanup

* fix: earthly targets

* fix: update pre-push tasks to avoid using melos

* chore: spelling

* chore: reformat

* feat(cat-voices): voting page responsiveness (#3407)

* fix(cat-voices): Ada symbol does not render on android (#3409)

* fix: google fonts unable to display ada symbol

* chore: reformat

* chore: reformat

* feat(cat-voices): proposal page responsiveness (#3410)

* feat: proposal responsiveness

* chore: review update

* feat(cat-voices): versioning from tags (#3399)

* test

* tag version without handling suffixes

* handling build_name suffixes

* remove debug prints

* docs

* refactor(cat-voices): responsive builder best matching breakpoint (#3421)

* refactor: attempt to find best matching breakpoint

* refactor: responsive builder usage and responsive padding

* refactor: remove other or fallback from responsive widgets

* chore: tests

* chore: cleanup

* refactor: reimplement responsive to allow const constructors

* chore: cleanup

* chore: reformat

* chore: cleanup

* chore: more tests

* feat(cat-voices): proposal builder responsiveness (#3432)

* feat: adding responsiveness

* chore: review update

* chore: remove unused widget

* feat(cat-voices): Responsive app bar (#3434)

* refactor: split into more widgets

* chore: reformat code

* feat: responsive appbar action buttons

* feat: update button ui

* fix(cat-voices): Running unit tests in earthly on macos (#3477)

* fix: running unit tests in earthly in mac on arm64

* fix: cleanup

* feat(cat-voices): switch to flutter_rust_bridge iohk fork (#3478)

* feat: switch to iohk fork of flutter_rust_bridge

* chore: sync cfg

* feat: update flutter_rust_bridge version

* feat: update flutter rust bridge

* feat: lock wasm-bindgen last working version

* fix: update flutter_rust_bridge version

* fix: ignore unused deps

* feat: regenerate code

* fix: running unit tests in earthly in mac on arm64

* fix: cleanup

* chore: cleanup

* chore: sync-cfg

* chore(cat-voices): update README with added Platforms mentioned (#3486)

* chore: update README with added Platforms mentioned

* chore: fix check-markdown

* fix: sentry auth token in docker target (#3487)

* chore: switch ci to versioned release

---------

Co-authored-by: Dominik Toton <166132265+dt-iohk@users.noreply.github.com>
Co-authored-by: Dominik Toton <dominik.toton@iohk.io>
Co-authored-by: Damian Moliński <47773413+damian-molinski@users.noreply.github.com>
Co-authored-by: Damian Molinski <damian.molinski@iohk.io>
dt-iohk added a commit that referenced this pull request Oct 9, 2025
* feat(cat-voices): update android config (#3298)

* feat: android app name

* chore: update gradle

* feat: transform groove to kotlin

* feat: adding icons

* feat: update background in loading in app splash for mobile

* feat: update app flavor and env selection

* feat: update grade-wrapper

* feat: use specific sdk version

* feat: update key derivation android config

* feat: update remote_widgets android config

* feat: update bundle id

* fix: spelling

* feat(cat-voices): update recommended settings and readme (#3321)

* feat: update recommended settings and readme

* fix: format

* fix: format

* feat: remove flavor from name

* feat(cat-voices): ios config (#3315)

* feat: podfile update

* feat: update icons

* feat: update pod file

* feat: update catalyst key derivation

* feat: update remote_widgets

* chore: remove Podfile.lock from tracking and to gitignore

* chore: update build targets

* chore: add files to earthlyignore

* refactor(cat-voices): split catalyst platform into operating system and form factor enums (#3317)

* refactor: split catalyst platform into os and form factor

* chore: cleanup

* refactor: unify mobile detection

* feat: allow embed builders on web only

* chore: cleanup tests

* chore: cleanup

* refactor: simplify the expression

* refactor: use data widget builder

* docs: clarify int constraints

* refactor: migrate api

* feat(cat-voices): permission handler  (#3337)

* chore: adding dependencies

* feat: adding permission for android

* feat: permission handler factory

* feat: exporting models

* feat: adding dependencies

* fix: android manifest format

* feat: adding catalyst operating system

* feat: adding catalyst operating system

* feat: refactor to used rationale and explanation exception

* feat: adding queue

* chore: remove android manifest permission

* fix: remove white space and sort intl

* chore: change location of permission_mixin

* chore: remove unused file

* feat(cat-voices): native drift (mobile) db (#3371)

* define native database and its paths

* docs: update README

* chore: markdown formatting

* fix: readme

* feat(cat-voices): io downloader  (#3361)

* chore: adding dependencies

* feat: adding permission for android

* feat: permission handler factory

* feat: exporting models

* feat: adding dependencies

* fix: android manifest format

* feat: adding catalyst operating system

* feat: adding catalyst operating system

* feat: refactor to used rationale and explanation exception

* feat: adding queue

* chore: remove android manifest permission

* fix: remove white space and sort intl

* feat: io downloader implementation

* chore: remove comments

* fix: spelling

* feat: extracting common logic

* chore: update logic for downloader class

* chore: remove unused mixin

* fix: format

* chore: review update

* chore: set default strategy

* chore: remove files

* chore: added permission

* chore: remove old files

* feat(cat-voices): uploader service (#3376)

* feat: uploader service

* chore: review update

* feat(cat-voices): Discovery Page mobile screen adjustment (#3380)

* feat: adjust discovery page to mobile screen

* feat: adding responsive_sized_box

* chore: review update

* chore: update docs

* feat(cat-voices): proposals page - mobile (#3377)

* single out single_select_dropdown.dart and clean up imports

* refactor: making ProposalsOrderDropdown little more flexible

* wrapping order dropdown

* fix selector List problem

* fix: divider and spacings

* chore: PaginatedGridView response alignment

* feat: response header and content padding

* chore: cleanup imports

* ripple borders

* feat(cat-voices): registration mobile - part 1 (#3393)

* chore: rename VoicesTwoPaneDialog to VoicesTwoPanelDialog

* add fullscreenDialog parameter

* chore: split RegistrationDialog into smaller widgets

* move constraints directly to Dialog parameter

* refactor: upload dialog splitted into smaller widgets

* chore: use spacing instead of separatedBy

* use Visibility.maintain

* use SizeBox-es instead of paddings

* chore: VoicesAlertDialog now uses BoxConstraints instead of SizedBox

* wip

* chore: vertical panels

* cleanup info container

* chore: update VoicesPanelsDialog docs and make it more generic

* Remove ResponsiveBreakpointKey.other

* loose constrains for mobile

* PR review updates

* chore: typo

* feat(cat-voices): Mobile support for category detail page (#3392)

* feat: initial screen adjustements

* feat: mobile support category detail page

* chore: review update

* chore: use sizeOf

* feat: registration mobile - part 2 (#3395)

* chore: rename VoicesTwoPaneDialog to VoicesTwoPanelDialog

* add fullscreenDialog parameter

* chore: split RegistrationDialog into smaller widgets

* move constraints directly to Dialog parameter

* refactor: upload dialog splitted into smaller widgets

* chore: use spacing instead of separatedBy

* use Visibility.maintain

* use SizeBox-es instead of paddings

* chore: VoicesAlertDialog now uses BoxConstraints instead of SizedBox

* wip

* chore: vertical panels

* cleanup info container

* chore: update VoicesPanelsDialog docs and make it more generic

* Remove ResponsiveBreakpointKey.other

* loose constrains for mobile

* PR review updates

* chore: typo

* chore: remove scroll from dialog vertical panels impl

* chore: registration is web only

* Enable importing SeedPhrase

* chore: minor adjustments

* fix: SeedPhrase test

* chore: cleanup func name

* feat(cat-voices): responsive account page (#3396)

* revert ResponsiveStateResolver to use width instead of shortestSide

* ColumnsRow updates

* AccountPage tiles responsive adjustments

* learn more button

* cleanup dialogs

* more adjustments

* discovery deleted confirm

* fix: failing test

* remove buttons global _launch in favour of LaunchUrlMixin

* simplify keychain delete low

* remove covariant

* fix proposals page for small screens (#3405)

* feat(cat-voices): workspace responsiveness  (#3401)

* feat: adding responsiveness to workspace

* chore: remove unused param

* chore: review update

* feat(cat-voices): catalyst compression with rust (#3370)

* chore: upgrade CI

* chore: generate code

* feat: generate catalyst_compression_native with flutter_rust_bridge

* feat: signatures for rust functions

* chore: regenerate

* feat: implement brotli decoder

* feat: add zstd algorithm

* chore: replace catalyst_compression with native rust implementation

* refactor: rename frb crates

* chore: rename compression native to compression

* refactor: cleanup unnecessary web prefix

* fix: web prefix

* feat: add wasm_bindgen module name

* fix: add missing param

* feat: update flutter_rust_bridge

* chore: pin flutter_rust_bridge to git hosted version

* feat: custom thread pool

* feat: custom thread pool in key derivation package

* chore: generated files

* feat: config

* chore: generate code

* chore: cleanup + lints

* chore: add compression rust tests

* chore: sync missing files

* chore: allow github repo

* chore: sync configs

* chore: fix lints, add code generation to pre-push

* chore: cleanup and lint issues

* chore: generate code

* fix: wrong type

* chore: docs and syntax fix

* fix: lint issues, regenerate

* fix: wasm_bindgen name

* fix: lint issues, missing docs

* fix: pre-push command fixes

* refactor: align naming with other targets

* fix: melos issues

* chore: cleanup

* fix: earthly targets

* fix: update pre-push tasks to avoid using melos

* chore: spelling

* chore: reformat

* feat(cat-voices): voting page responsiveness (#3407)

* fix(cat-voices): Ada symbol does not render on android (#3409)

* fix: google fonts unable to display ada symbol

* chore: reformat

* chore: reformat

* feat(cat-voices): proposal page responsiveness (#3410)

* feat: proposal responsiveness

* chore: review update

* feat(cat-voices): versioning from tags (#3399)

* test

* tag version without handling suffixes

* handling build_name suffixes

* remove debug prints

* docs

* refactor(cat-voices): responsive builder best matching breakpoint (#3421)

* refactor: attempt to find best matching breakpoint

* refactor: responsive builder usage and responsive padding

* refactor: remove other or fallback from responsive widgets

* chore: tests

* chore: cleanup

* refactor: reimplement responsive to allow const constructors

* chore: cleanup

* chore: reformat

* chore: cleanup

* chore: more tests

* feat(cat-voices): proposal builder responsiveness (#3432)

* feat: adding responsiveness

* chore: review update

* chore: remove unused widget

* feat(cat-voices): Responsive app bar (#3434)

* refactor: split into more widgets

* chore: reformat code

* feat: responsive appbar action buttons

* feat: update button ui

* feat: configure dart workspaces

* chore: refine example package name

* feat: migrate melos to workspaces

* chore: migrate licenses generator

* chore: reformat

* feat: migrate licenses

* chore: missing licenses, cleanup

* docs: update outdated docs

* feat: add missing requirements

* refactor: simplify version management

* feat: add missing requirements

* chore: update ci version

* feat: migration, allow concurrency in melos

* refactor: order dependents

* feat: more concurrency

* feat: concurrency

* fix: warnings

* fix: concurrency

* fix: reporters

* feat: no concurrency param

* fix: revert ffigen

* docs: fix markdown

* feat: update flutter rust bridge

* feat: migrate rust codegen

* fix: update flutter_rust_bridge to address wasm-bindgen-cli

* feat: update frb

* fix: downgrade frb

* fix(cat-voices): Running unit tests in earthly on macos (#3477)

* fix: running unit tests in earthly in mac on arm64

* fix: cleanup

* feat(cat-voices): switch to flutter_rust_bridge iohk fork (#3478)

* feat: switch to iohk fork of flutter_rust_bridge

* chore: sync cfg

* feat: update flutter_rust_bridge version

* feat: update flutter rust bridge

* feat: lock wasm-bindgen last working version

* fix: update flutter_rust_bridge version

* fix: ignore unused deps

* feat: regenerate code

* fix: running unit tests in earthly in mac on arm64

* fix: cleanup

* chore: cleanup

* chore: sync-cfg

* fix: missing workspace resolution

* fix: incompatible ffigen version

* fix: pre-push command

* Apply suggestion from @LynxLynxx

Co-authored-by: Ryszard Schossler <51096731+LynxLynxx@users.noreply.github.com>

* chore: revert docs

* chore: use versioned CI version

---------

Co-authored-by: Ryszard Schossler <51096731+LynxLynxx@users.noreply.github.com>
Co-authored-by: Damian Moliński <47773413+damian-molinski@users.noreply.github.com>
Co-authored-by: Damian Molinski <damian.molinski@iohk.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dart Pull requests that update Dart code F15 review me PR is ready for review squad: face Frontend Catalyst Experience Team

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

First

4 participants